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