1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     ngc_IProfanityFilter.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_BASE_H_
17 #define NN_NGC_CTR_PROFANITY_FILTER_BASE_H_
18 
19 #include <nn/cfg/CTR/cfg_RegionCode.h>
20 
21 namespace nn
22 {
23 namespace ngc
24 {
25 namespace CTR
26 {
27 
28 /*!
29    @brief NGワードフィルタの基底クラスです。
30 
31           メモリ消費量と速度のトレードオフで、将来的に異なるバージョンの
32           NGワードフィルタがリリースされる可能性があり、このクラスはその基底となります。
33  */
34 class ProfanityFilterBase
35 {
36 public:
37     /*!
38       @brief デストラクタです。
39      */
~ProfanityFilterBase()40     virtual ~ProfanityFilterBase(){}
41 
42     /*!
43       @brief 現在本体にインストールされているNGワードパターンファイルのバージョン番号を取得します。
44       @return インストールされているバージョン番号が返ります。バージョンは1から始まり、数が大きいほど新しいことを示します。取得に失敗した場合0が返ります。
45      */
46     virtual u32 GetContentVersion() = 0;
47 
48     /*!
49       @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題がある語句かどうかを、全てのパターンリストについて確認します。
50 
51              この処理は時間がかかる場合があります(ブロックします)。
52              ゲームフレーム処理に干渉しないように別のスレッドで行ってください。
53              この関数は複数の文字列を同時に確認することができます。
54              一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。
55 
56              各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。
57              これは、ビットフラグ値になっており、どのパターンセットで問題が発生したかを知ることが出来ます。
58              1をProfanityFilterPatternList列挙体の定数値分だけ左シフトした値とANDを取って調べてください。
59              なお、全てのパターンリストにおいて問題がない文字列の場合は値が0になります。
60 
61              どのパターンリストに対してチェックを行わなければならないという決まりについては、
62              最新のUGCガイドラインを参照してください。
63 
64              メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、
65              常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、
66              数字が多く含まれている文字列については問題のある語句としては検出されません。
67              このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。
68 
69       @param [out] pCheckResults    問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。
70       @param [in]  ppWords          調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。
71       @param [in]  nWordCount       調査対象の文字列の数を指定します。
72      */
73     virtual nn::Result CheckProfanityWords( bit32* pCheckResults, const wchar_t** ppWords, size_t nWordCount ) = 0;
74 
75     /*!
76       @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題ある語句かどうかを、パターンリスト指定されたパターンリストについて確認します。
77 
78              この処理は時間がかかる場合があります(ブロックします)。
79              ゲームフレーム処理に干渉しないように別のスレッドで行ってください。
80              この関数は複数の文字列を同時に確認することができます。
81              一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。
82 
83              各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。
84              1をnPatternCodeで指定した値で左シフトした値とANDを取って調べてください。
85              nPatternCodeで指定したリストについて問題がないと判断された場合は値が0になります。
86 
87              どのパターンリストに対してチェックを行わなければならないという決まりについては、
88              最新のUGCガイドラインを参照してください。
89 
90              メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、
91              常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、
92              数字が多く含まれている文字列については問題のある語句としては検出されません。
93              このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。
94 
95       @param [out] pCheckResults    問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。
96       @param [in]  nPatternCode     どのパターンリストに対してチェックを行うのかを指定します。
97       @param [in]  ppWords          調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。
98       @param [in]  nWordCount       調査対象の文字列の数を指定します。
99      */
100     virtual nn::Result CheckProfanityWords( bit32* pCheckResults, ProfanityFilterPatternList nPatternCode, const wchar_t** ppWords, size_t nWordCount ) = 0;
101 
102     /*!
103       @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題ある語句かどうかを、
104              本体のリージョンおよび言語設定を取得したうえで、UGCガイドラインで指定されたパターンリストについて確認します。
105 
106              この処理は時間がかかる場合があります(ブロックします)。
107              ゲームフレーム処理に干渉しないように別のスレッドで行ってください。
108              この関数は複数の文字列を同時に確認することができます。
109              一度に複数の文字列をチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。
110 
111              この関数を実行するためにはcfgライブラリが初期化されている必要があります。
112              この関数を実行すると、内部的に現在の本体リージョン及び言語設定を参照し、
113              その組み合わせからチェックが必要とされるパターンリストを自動的に選び出してNGワードチェックを行います。
114 
115              各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。
116              これは、ビットフラグ値になっており、どのパターンセットで問題が発生したかを知ることが出来ます。
117              1をProfanityFilterPatternList列挙体の定数値分だけ左シフトした値とANDを取って調べてください。
118              なお、全てのパターンリストにおいて問題がない文字列の場合は値が0になります。
119 
120              メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、
121              常に問題のある語句として検出されます。ただし、電話番号などの表示に利用される可能性がある、
122              数字が多く含まれている文字列については問題のある語句としては検出されません。
123              このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。
124 
125       @param [out] pCheckResults                    問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。
126       @param [in]  bCommunicateWithOtherRegions     アプリケーションが他のリージョンとのデータ交換を行うかどうかを指定してください。これによってチェック対象のリストが変わります(現在は参照されません)。
127       @param [in]  ppWords                          調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。
128       @param [in]  nWordCount                       調査対象の文字列の数を指定します。
129      */
130     virtual nn::Result CheckProfanityWords( bit32* pCheckResults, bool bCommunicateWithOtherRegions, const wchar_t** ppWords, size_t nWordCount ) = 0;
131 
132 protected:
133     void GetPatternListsFromRegion( ProfanityFilterPatternList* pPatternLists, int *pListNum, bool bCommunicateWithOtherRegions );
134     void ConvertTargetWord( wchar_t* pConvertedWord, const wchar_t* pWord );
135     bool IsIncludesAtSign( const wchar_t* pWord );
136 
137 private:
138     /*!
139       @brief カタカナの大きい文字(ア)と小さい文字(ァ)のマッピングです。
140      */
141     typedef struct SmallMap
142     {
143         //! 小さい文字(ァ)
144         wchar_t small;
145 
146         //! 大きい文字(ア)
147         wchar_t big;
148     } SmallMap;
149 
150     /*!
151       @brief カタカナの半角文字と全角文字のマッピングです。
152      */
153     typedef struct HalfwidthMap
154     {
155         //! 半角文字
156         wchar_t half;
157 
158         //! 全角文字
159         wchar_t full;
160     } HalfwidthMap;
161 
162     void ConvertKatakanaToBig( wchar_t *pKana );
163     bool ConvertHalfwidthKatakanaToFullwidth( wchar_t *pBuffer, wchar_t half, const HalfwidthMap* pMapping, int mapNum );
164 
165 private:
166     static const SmallMap s_SmallMapping[];
167     static const HalfwidthMap s_HalfMapping[];
168     static const HalfwidthMap s_VoicedMapping[];
169     static const HalfwidthMap s_SemiVoicedMapping[];
170 };
171 
172 }   // namespace CTR
173 }   // namespaec ngc
174 }   // namespace nn
175 
176 #endif // NN_NGC_CTR_PROFANITY_FILTER_BASE_H_
177