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: 30667 $ 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 このクラスを利用するためには、あらかじめnn::fs::Initialize関数を呼び出して、fsライブラリを初期化しておく必要があります。 44 */ 45 class ProfanityFilter : public ProfanityFilterBase 46 { 47 public: 48 49 /*! 50 @brief 初期化処理を一切行わないコンストラクタです。 51 52 このクラスを利用する前に初期化処理を行う必要があります。 53 */ 54 ProfanityFilter(); 55 56 /*! 57 @brief 初期化処理を行うコンストラクタです。 58 59 ワーキングメモリ領域として、MemoryBlockから領域を確保して利用します。 60 このメモリブロックは ProfanityFilter::WORKMEMORY_SIZE バイト分のメモリを使用します。 61 */ ProfanityFilter(const nn::WithInitialize &)62 ProfanityFilter( const nn::WithInitialize& ) { Initialize(); } 63 64 65 /*! 66 @brief 初期化処理を行うコンストラクタです。 67 68 指定されたメモリ領域をワーキングエリアとして利用します。 69 利用されている最中は、このワーキングエリアへの書き込みは行わないでください。 70 メモリは ProfanityFilter::WORKMEMORY_SIZE バイト確保されている必要があります。 71 72 @param [in] pWorkMemory ワーキングメモリ領域の先頭へのポインタを指定します。 73 */ ProfanityFilter(uptr pWorkMemory)74 ProfanityFilter( uptr pWorkMemory ) { Initialize( pWorkMemory ); } 75 76 /*! 77 @brief 終了処理を行います。 78 79 MemoryBlockからワーキングメモリ領域を確保している場合は、その領域を開放します。 80 */ ~ProfanityFilter()81 virtual ~ProfanityFilter(){ Finalize(); } 82 83 /*! 84 @brief NGワードフィルタリングクラスを初期化します。 85 86 ワーキングメモリ領域として、MemoryBlockから領域を確保して利用します。 87 メモリは ProfanityFilter::WORKMEMORY_SIZE バイト使用されます。 88 */ 89 nn::Result Initialize(); 90 91 /*! 92 @brief NGワードフィルタリングクラスを初期化します。 93 94 指定されたメモリ領域をワーキングエリアとして利用します。 95 利用されている最中は、このワーキングエリアへの書き込みは行わないでください。 96 メモリは ProfanityFilter::WORKMEMORY_SIZE バイト確保されている必要があります。 97 98 @param [in] pWorkMemory ワーキングメモリ領域の先頭へのポインタを指定します。 99 100 @return 初期化処理に対する戻り値が返ります。 101 */ 102 nn::Result Initialize( uptr pWorkMemory ); 103 104 /*! 105 @brief NGワードフィルタリングクラスの使用を終了します。 106 107 MemoryBlockからワーキングメモリ領域を確保している場合は、その領域を開放します。 108 109 @return 終了処理に対する戻り値が返ります。 110 */ 111 nn::Result Finalize(); 112 113 /*! 114 @brief 現在本体にインストールされているNGワードパターンファイルのバージョン番号を取得します。 115 @return インストールされているバージョン番号が返ります。バージョンは1から始まり、数が大きいほど新しいことを示します。取得に失敗した場合0が返ります。 116 */ 117 virtual u32 GetContentVersion(); 118 119 /*! 120 @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題がある語句かどうかを、全てのパターンリストについて確認します。 121 122 この処理は時間がかかる場合があります(ブロックします)。 123 ゲームフレーム処理に干渉しないように別のスレッドで行ってください。 124 この関数は複数の文字列を同時に確認することができます。 125 一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。 126 127 各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。 128 これは、ビットフラグ値になっており、どのパターンセットで問題が発生したかを知ることが出来ます。 129 1をProfanityFilterPatternList列挙体の定数値分だけ左シフトした値とANDを取って調べてください。 130 なお、全てのパターンリストにおいて問題がない文字列の場合は値が0になります。 131 132 どのパターンリストに対してチェックを行わなければならないという決まりについては、 133 最新のUGCガイドラインを参照してください。 134 135 メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、 136 常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、 137 数字が多く含まれている文字列については問題のある語句としては検出されません。 138 このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。 139 140 @param [out] pCheckResults 問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。 141 @param [in] ppWords 調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。 142 @param [in] nWordCount 調査対象の文字列の数を指定します。 143 */ 144 virtual nn::Result CheckProfanityWords( bit32* pCheckResults, const wchar_t** ppWords, size_t nWordCount ); 145 146 /*! 147 @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題ある語句かどうかを、パターンリスト指定されたパターンリストについて確認します。 148 149 この処理は時間がかかる場合があります(ブロックします)。 150 ゲームフレーム処理に干渉しないように別のスレッドで行ってください。 151 この関数は複数の文字列を同時に確認することができます。 152 一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。 153 154 各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。 155 1をnPatternCodeで指定した値で左シフトした値とANDを取って調べてください。 156 nPatternCodeで指定したリストについて問題がないと判断された場合は値が0になります。 157 158 どのパターンリストに対してチェックを行わなければならないという決まりについては、 159 最新のUGCガイドラインを参照してください。 160 161 メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、 162 常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、 163 数字が多く含まれている文字列については問題のある語句としては検出されません。 164 このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。 165 166 @param [out] pCheckResults 問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。 167 @param [in] nPatternCode どのパターンリストに対してチェックを行うのかを指定します。 168 @param [in] ppWords 調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。 169 @param [in] nWordCount 調査対象の文字列の数を指定します。 170 */ 171 virtual nn::Result CheckProfanityWords( bit32* pCheckResults, ProfanityFilterPatternList nPatternCode, const wchar_t** ppWords, size_t nWordCount ); 172 173 /*! 174 @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題ある語句かどうかを、 175 本体のリージョンおよび言語設定を取得したうえで、UGCガイドラインで指定されたパターンリストについて確認します。 176 177 この処理は時間がかかる場合があります(ブロックします)。 178 ゲームフレーム処理に干渉しないように別のスレッドで行ってください。 179 この関数は複数の文字列を同時に確認することができます。 180 一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。 181 182 この関数を実行するためにはcfgライブラリが初期化されている必要があります。 183 この関数を実行すると、内部的に現在の本体リージョン及び言語設定を参照し、 184 その組み合わせからチェックが必要とされるパターンリストを自動的に選び出してNGワードチェックを行います。 185 186 各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。 187 これは、ビットフラグ値になっており、どのパターンセットで問題が発生したかを知ることが出来ます。 188 1をProfanityFilterPatternList列挙体の定数値分だけ左シフトした値とANDを取って調べてください。 189 なお、全てのパターンリストにおいて問題がない文字列の場合は値が0になります。 190 191 メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、 192 常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、 193 数字が多く含まれている文字列については問題のある語句としては検出されません。 194 このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。 195 196 @param [out] pCheckResults 問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。 197 @param [in] bCommunicateWithOtherRegions アプリケーションが他のリージョンとのデータ交換を行うかどうかを指定してください。これによってチェック対象のリストが変わります(現在は参照されません)。 198 @param [in] ppWords 調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。 199 @param [in] nWordCount 調査対象の文字列の数を指定します。 200 */ 201 virtual nn::Result CheckProfanityWords( bit32* pCheckResults, bool bCommunicateWithOtherRegions, const wchar_t** ppWords, size_t nWordCount ); 202 203 public: 204 /*! 205 @brief 定数値を宣言します。 206 */ 207 enum 208 { 209 //! チェックするために必要なメモリ領域サイズです。 210 WORKMEMORY_SIZE = 64 * 1024 211 }; 212 213 private: 214 void SetupMemoryArea(); 215 nn::Result MountSharedContents(); 216 nn::Result CheckArguments( bit32* pCheckResults, const wchar_t** ppWords, size_t nWordCount ); 217 nn::Result CheckProfanityWords_Impl( bit32* pCheckResults, nn::fs::FileInputStream* pFileStream, const wchar_t** ppWords, size_t nWordCount ); 218 void CheckWords( const wchar_t *pPattern, size_t nLength ); 219 220 private: 221 //! メモリブロック 222 nn::os::MemoryBlock m_MemoryBlock; 223 224 //! メモリブロックを利用しているかどうかを示します。 225 bool m_bIsUsingMemoryBlock; 226 227 //! マウント処理が行われた状態であるかどうかを示します。 228 bool m_bContentMounted; 229 230 //! 現在チェック中の情報:チェック対象パターンリスト 231 ProfanityFilterPatternList m_nPatternList; 232 233 //! パディング 234 NN_PADDING1; 235 236 //! ワーキングメモリ領域先頭へのポインタ 237 uptr m_pWorkingHead; 238 239 //! パターン情報→オートマトンへの変換に利用する領域です。 240 uptr m_pTempPoolHead; 241 242 //! パターンをNANDから読み込んだデータを保管するための領域です。 243 uptr m_pPatternsHead; 244 245 //! マウントするための作業用領域です。 246 uptr m_pMountWorkingArea; 247 248 //! ユーザーが入力した文字列を内部処理形式に変換するための領域です。 249 wchar_t* m_pConvertedWord; 250 251 //! 現在チェック中の情報:チェック対象単語数 252 size_t m_nWordCount; 253 254 //! 現在チェック中の情報:書き出し先へのポインタ 255 u32* m_pCheckResults; 256 }; 257 258 } // namespace CTR 259 } // namespaec ngc 260 } // namespace nn 261 262 #endif // NN_NGC_CTR_PROFANITY_FILTER_H_ 263