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