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