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