1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: ngc_ProfanityFilter.h 4 5 Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 33689 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_NGC_CTR_PROFANITY_FILTER_H_ 17 #define NN_NGC_CTR_PROFANITY_FILTER_H_ 18 19 #if !defined( NN_NGC_CTR_PROFANITY_FILTER_PATTERN_LIST_H_ ) || !defined( NN_NGC_CTR_PROFANITY_FILTER_BASE_H_ ) 20 # error include error 21 #endif 22 23 namespace nn 24 { 25 26 namespace fs 27 { 28 class FileInputStream; 29 } // namespace fs 30 31 namespace ngc 32 { 33 namespace CTR 34 { 35 36 /*! 37 @brief NGワードフィルタリングを行うためのクラスです。 38 39 NGワードフィルタリングをいつのタイミングでどのように実行すべきかは、 40 最新のUGCガイドラインを参照してください。 41 WiiのDWCライブラリなどとは異なり、サーバを仲介せずに問題のある語句かどうかを調査することが出来ます。 42 43 このクラスはfsライブラリに依存しています。 44 そのため、このクラスを利用するためには、あらかじめnn::fs::Initialize関数を呼び出して、fsライブラリを初期化しておく必要があります。 45 また、スリープ問い合わせコールバックに ACCEPT を返してからスリープ復帰コールバックが来るまでの間は、 46 fsライブラリへのアクセスが禁止されているため、このクラスの利用も行うことができません。 47 */ 48 class ProfanityFilter : public ProfanityFilterBase 49 { 50 public: 51 52 /*! 53 @brief 初期化処理を一切行わないコンストラクタです。 54 55 このクラスを利用する前に初期化処理を行う必要があります。 56 */ 57 ProfanityFilter(); 58 59 /*! 60 @brief 初期化処理を行うコンストラクタです。 61 62 ワーキングメモリ領域として、MemoryBlockから領域を確保して利用します。 63 このメモリブロックは ProfanityFilter::WORKMEMORY_SIZE バイト分のメモリを使用します。 64 */ ProfanityFilter(const nn::WithInitialize &)65 ProfanityFilter( const nn::WithInitialize& ) { Initialize(); } 66 67 68 /*! 69 @brief 初期化処理を行うコンストラクタです。 70 71 指定されたメモリ領域をワーキングエリアとして利用します。 72 利用されている最中は、このワーキングエリアへの書き込みは行わないでください。 73 メモリは ProfanityFilter::WORKMEMORY_SIZE バイト確保されていて、 74 4バイトアライメントになっている必要があります。 75 76 @param [in] pWorkMemory ワーキングメモリ領域の先頭へのポインタを指定します。 77 */ ProfanityFilter(uptr pWorkMemory)78 ProfanityFilter( uptr pWorkMemory ) { Initialize( pWorkMemory ); } 79 80 /*! 81 @brief 終了処理を行います。 82 83 MemoryBlockからワーキングメモリ領域を確保している場合は、その領域を開放します。 84 */ ~ProfanityFilter()85 virtual ~ProfanityFilter(){ Finalize(); } 86 87 /*! 88 @brief NGワードフィルタリングクラスを初期化します。 89 90 ワーキングメモリ領域として、MemoryBlockから領域を確保して利用します。 91 メモリは ProfanityFilter::WORKMEMORY_SIZE バイト使用されます。 92 */ 93 nn::Result Initialize(); 94 95 /*! 96 @brief NGワードフィルタリングクラスを初期化します。 97 98 指定されたメモリ領域をワーキングエリアとして利用します。 99 利用されている最中は、このワーキングエリアへの書き込みは行わないでください。 100 メモリは ProfanityFilter::WORKMEMORY_SIZE バイト確保されている必要があります。 101 102 @param [in] pWorkMemory ワーキングメモリ領域の先頭へのポインタを指定します。 103 104 @return 初期化処理に対する戻り値が返ります。 105 */ 106 nn::Result Initialize( uptr pWorkMemory ); 107 108 /*! 109 @brief NGワードフィルタリングクラスの使用を終了します。 110 111 MemoryBlockからワーキングメモリ領域を確保している場合は、その領域を開放します。 112 113 @return 終了処理に対する戻り値が返ります。 114 */ 115 nn::Result Finalize(); 116 117 /*! 118 @brief 現在本体にインストールされているNGワードパターンファイルのバージョン番号を取得します。 119 @return インストールされているバージョン番号が返ります。バージョンは1から始まり、数が大きいほど新しいことを示します。取得に失敗した場合0が返ります。 120 */ 121 virtual u32 GetContentVersion(); 122 123 /*! 124 @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題がある語句かどうかを、全てのパターンリストについて確認します。 125 126 この処理は時間がかかる場合があります(ブロックします)。処理時間はシステムのバージョンにより変化する可能性があります。 127 メインスレッドで実行するとフレームレートを低下させるおそれがあるため、別スレッドでの実行を推奨します。 128 この関数は最大NN_NGC_MAX_WORD_NUM個の文字列を同時に確認することができます。 129 一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。 130 131 各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。 132 これは、ビットフラグ値になっており、どのパターンセットで問題が発生したかを知ることが出来ます。 133 1をProfanityFilterPatternList列挙体の定数値分だけ左シフトした値とANDを取って調べてください。 134 なお、全てのパターンリストにおいて問題がない文字列の場合は値が0になります。 135 136 どのパターンリストに対してチェックを行わなければならないという決まりについては、 137 最新のUGCガイドラインを参照してください。 138 139 メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、 140 常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、 141 数字が多く含まれている文字列については問題のある語句としては検出されません。 142 このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。 143 144 @param [out] pCheckResults 問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。 145 @param [in] ppWords 調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。 146 @param [in] nWordCount 調査対象の文字列の数を指定します。最大数はNN_NGC_MAX_WORD_NUMです。 147 */ 148 virtual nn::Result CheckProfanityWords( bit32* pCheckResults, const wchar_t** ppWords, size_t nWordCount ); 149 150 /*! 151 @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題ある語句かどうかを、パターンリスト指定されたパターンリストについて確認します。 152 153 この処理は時間がかかる場合があります(ブロックします)。処理時間はシステムのバージョンにより変化する可能性があります。 154 メインスレッドで実行するとフレームレートを低下させるおそれがあるため、別スレッドでの実行を推奨します。 155 この関数は最大NN_NGC_MAX_WORD_NUM個の文字列を同時に確認することができます。 156 一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。 157 158 各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。 159 1をnPatternCodeで指定した値で左シフトした値とANDを取って調べてください。 160 nPatternCodeで指定したリストについて問題がないと判断された場合は値が0になります。 161 162 どのパターンリストに対してチェックを行わなければならないという決まりについては、 163 最新のUGCガイドラインを参照してください。 164 165 メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、 166 常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、 167 数字が多く含まれている文字列については問題のある語句としては検出されません。 168 このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。 169 170 @param [out] pCheckResults 問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。 171 @param [in] nPatternCode どのパターンリストに対してチェックを行うのかを指定します。 172 @param [in] ppWords 調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。 173 @param [in] nWordCount 調査対象の文字列の数を指定します。最大数はNN_NGC_MAX_WORD_NUMです。 174 */ 175 virtual nn::Result CheckProfanityWords( bit32* pCheckResults, ProfanityFilterPatternList nPatternCode, const wchar_t** ppWords, size_t nWordCount ); 176 177 /*! 178 @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題ある語句かどうかを、 179 本体のリージョンおよび言語設定を取得したうえで、UGCガイドラインで指定されたパターンリストについて確認します。 180 181 この処理は時間がかかる場合があります(ブロックします)。処理時間はシステムのバージョンにより変化する可能性があります。 182 メインスレッドで実行するとフレームレートを低下させるおそれがあるため、別スレッドでの実行を推奨します。 183 この関数は最大NN_NGC_MAX_WORD_NUM個の文字列を同時に確認することができます。 184 一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。 185 186 この関数を実行するためにはcfgライブラリが初期化されている必要があります。 187 この関数を実行すると、内部的に現在の本体リージョン及び言語設定を参照し、 188 その組み合わせからチェックが必要とされるパターンリストを自動的に選び出してNGワードチェックを行います。 189 190 各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。 191 これは、ビットフラグ値になっており、どのパターンセットで問題が発生したかを知ることが出来ます。 192 1をProfanityFilterPatternList列挙体の定数値分だけ左シフトした値とANDを取って調べてください。 193 なお、全てのパターンリストにおいて問題がない文字列の場合は値が0になります。 194 195 メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、 196 常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、 197 数字が多く含まれている文字列については問題のある語句としては検出されません。 198 このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。 199 200 @param [out] pCheckResults 問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。 201 @param [in] bCommunicateWithOtherRegions アプリケーションが他のリージョンとのデータ交換を行うかどうかを指定してください。これによってチェック対象のリストが変わります(現在は参照されません)。 202 @param [in] ppWords 調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。 203 @param [in] nWordCount 調査対象の文字列の数を指定します。最大数はNN_NGC_MAX_WORD_NUMです。 204 */ 205 virtual nn::Result CheckProfanityWords( bit32* pCheckResults, bool bCommunicateWithOtherRegions, const wchar_t** ppWords, size_t nWordCount ); 206 207 public: 208 /*! 209 @brief 定数値を宣言します。 210 */ 211 enum 212 { 213 //! チェックするために必要なメモリ領域サイズです。 214 WORKMEMORY_SIZE = 64 * 1024 215 }; 216 217 private: 218 void SetupMemoryArea(); 219 nn::Result MountSharedContents(); 220 nn::Result CheckArguments( bit32* pCheckResults, const wchar_t** ppWords, size_t nWordCount ); 221 nn::Result CheckProfanityWords_Impl( bit32* pCheckResults, nn::fs::FileInputStream* pFileStream, const wchar_t** ppWords, size_t nWordCount ); 222 void CheckWords( const wchar_t *pPattern, size_t nLength ); 223 224 private: 225 //! メモリブロック 226 nn::os::MemoryBlock m_MemoryBlock; 227 228 //! メモリブロックを利用しているかどうかを示します。 229 bool m_bIsUsingMemoryBlock; 230 231 //! マウント処理が行われた状態であるかどうかを示します。 232 bool m_bContentMounted; 233 234 //! 現在チェック中の情報:チェック対象パターンリスト 235 ProfanityFilterPatternList m_nPatternList; 236 237 //! パディング 238 NN_PADDING1; 239 240 //! ワーキングメモリ領域先頭へのポインタ 241 uptr m_pWorkingHead; 242 243 //! パターン情報→オートマトンへの変換に利用する領域です。 244 uptr m_pTempPoolHead; 245 246 //! パターンをNANDから読み込んだデータを保管するための領域です。 247 uptr m_pPatternsHead; 248 249 //! マウントするための作業用領域です。 250 uptr m_pMountWorkingArea; 251 252 //! ユーザーが入力した文字列を内部処理形式に変換するための領域です。 253 wchar_t* m_pConvertedWord; 254 255 //! 現在チェック中の情報:チェック対象単語数 256 size_t m_nWordCount; 257 258 //! 現在チェック中の情報:書き出し先へのポインタ 259 u32* m_pCheckResults; 260 }; 261 262 } // namespace CTR 263 } // namespaec ngc 264 } // namespace nn 265 266 #endif // NN_NGC_CTR_PROFANITY_FILTER_H_ 267