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: 26069 $
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              検出されません。このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。
67 
68       @param [out] pCheckResults    問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。
69       @param [in]  ppWords          調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。
70       @param [in]  nWordCount       調査対象の文字列の数を指定します。
71      */
72     virtual nn::Result CheckProfanityWords( bit32* pCheckResults, const wchar_t** ppWords, size_t nWordCount ) = 0;
73 
74     /*!
75       @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題ある語句かどうかを、パターンリスト指定されたパターンリストについて確認します。
76 
77              この処理は時間がかかる場合があります(ブロックします)。
78              ゲームフレーム処理に干渉しないように別のスレッドで行ってください。
79              この関数は複数の文字列を同時に確認することができます。
80              一度にチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。
81 
82              チェックした結果は pCheckResults 配列に格納されます。
83              問題がある文字列の場合値が非0値になり、問題がない文字列の場合は0になります。
84 
85              どのパターンリストに対してチェックを行わなければならないという決まりについては、
86              最新のUGCガイドラインを参照してください。
87 
88              メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、
89              常に問題のある語句として検出されます。ただし、数字が多く含まれている文字列は問題のある語句としては
90              検出されません。このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。
91 
92       @param [out] pCheckResults    問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。
93       @param [in]  nPatternCode     どのパターンリストに対してチェックを行うのかを指定します。
94       @param [in]  ppWords          調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。
95       @param [in]  nWordCount       調査対象の文字列の数を指定します。
96      */
97     virtual nn::Result CheckProfanityWords( bit32* pCheckResults, ProfanityFilterPatternList nPatternCode, const wchar_t** ppWords, size_t nWordCount ) = 0;
98 
99     /*!
100       @brief 指定された複数の文字列がスクリーン上に表示される文字列として問題ある語句かどうかを、UGCガイドラインで規定されているパターンリストで判定します。
101 
102              この処理は時間がかかる場合があります(ブロックします)。
103              ゲームフレーム処理に干渉しないように別のスレッドで行ってください。
104              この関数は複数の文字列を同時に確認することができます。
105              一度にチェックすることで、1つずつ個別にチェックするよりも短い時間で調査が終了します。
106 
107              この関数を実行するためにはcfgライブラリが初期化されている必要があります。
108              この関数を実行すると、内部的に現在の本体リージョン及び言語設定を参照し、
109              その組み合わせから必要とされるパターンリストを自動的に判別してNGワードチェックを行います。
110 
111              各文字列ごとのチェックした結果は、 pCheckResults 配列に格納されます。
112              これは、ビットフラグ値になっており、どのパターンセットで問題が発生したかを知ることが出来ます。
113              1をProfanityFilterPatternList列挙体の定数値分だけ左シフトした値とANDを取って調べてください。
114              なお、全てのパターンリストにおいて問題がない文字列の場合は値が0になります。
115 
116              メールアドレスの表記に使われる可能性のあるアットマーク記号が含まれている場合、
117              常に問題のある語句として検出されます。ただし、数字が多く含まれている文字列は問題のある語句としては
118              検出されません。このチェックにはnn::ngc::CTR::CountNumbers関数を用いてください。
119 
120       @param [out] pCheckResults                    問題があったかどうかの判定を格納するためのバッファを指定します。nWordCountで指定した個数の配列が必要です。
121       @param [in]  bCommunicateWithOtherRegions     アプリケーションが他のリージョンとのデータ交換を行うかどうかを指定してください。これによってチェック対象が変わります。
122       @param [in]  ppWords                          調査対象となるNULL終端文字列の配列を指定します。文字コードはUTF16リトルエンディアンにしてください。
123       @param [in]  nWordCount                       調査対象の文字列の数を指定します。
124      */
125     virtual nn::Result CheckProfanityWords( bit32* pCheckResults, bool bCommunicateWithOtherRegions, const wchar_t** ppWords, size_t nWordCount ) = 0;
126 
127 protected:
128     void GetPatternListsFromRegion( ProfanityFilterPatternList* pPatternLists, int *pListNum, bool bCommunicateWithOtherRegions );
129     void ConvertTargetWord( wchar_t* pConvertedWord, const wchar_t* pWord );
130     bool IsIncludesAtSign( const wchar_t* pWord );
131 
132 private:
133     /*!
134       @brief カタカナの大きい文字(ア)と小さい文字(ァ)のマッピングです。
135      */
136     typedef struct SmallMap
137     {
138         //! 小さい文字(ァ)
139         wchar_t small;
140 
141         //! 大きい文字(ア)
142         wchar_t big;
143     } SmallMap;
144 
145     /*!
146       @brief カタカナの半角文字と全角文字のマッピングです。
147      */
148     typedef struct HalfwidthMap
149     {
150         //! 半角文字
151         wchar_t half;
152 
153         //! 全角文字
154         wchar_t full;
155     } HalfwidthMap;
156 
157     void ConvertKatakanaToBig( wchar_t *pKana );
158     bool ConvertHalfwidthKatakanaToFullwidth( wchar_t *pBuffer, wchar_t half, const HalfwidthMap* pMapping, int mapNum );
159 
160 private:
161     static const SmallMap s_SmallMapping[];
162     static const HalfwidthMap s_HalfMapping[];
163     static const HalfwidthMap s_VoicedMapping[];
164     static const HalfwidthMap s_SemiVoicedMapping[];
165 };
166 
167 }   // namespace CTR
168 }   // namespaec ngc
169 }   // namespace nn
170 
171 #endif // NN_NGC_CTR_PROFANITY_FILTER_BASE_H_
172