1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     dlp_FakeClient.h
4 
5   Copyright (C)2009 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 
14  *---------------------------------------------------------------------------*/
15 #ifndef NN_DLP_CTR_DLP_FAKE_CLIENT_H_
16 #define NN_DLP_CTR_DLP_FAKE_CLIENT_H_
17 
18 #include <nn/dlp/CTR/dlp_Type.h>
19 
20 #ifdef __cplusplus
21 
22 namespace nn {
23 namespace dlp {
24 namespace CTR {
25 
26 /*!--------------------------------------------------------------------------*
27     @brief ダウンロードプレイの擬似クライアントのクラスです。
28  *--------------------------------------------------------------------------*/
29 class FakeClient
30 {
31 private:
FakeClient()32     FakeClient() {};
~FakeClient()33     ~FakeClient() {};
34 
35 public:
36     /*!--------------------------------------------------------------------------*
37     @brief        擬似クライアントの初期化に必要なバッファのサイズを取得します。
38 
39     @param[in]    scanNum       一度のスキャン要求で受信可能な子機プログラム数を指定します。最大で MAX_SCAN_NUM です。
40 
41     @return       バッファのサイズを返します。
42 
43      *--------------------------------------------------------------------------*/
44         static size_t GetBufferSize(u8 scanNum);
45 
46 
47     /*!--------------------------------------------------------------------------*
48       @brief        擬似クライアントを初期化します。
49 
50                     pBuffer に GetBufferSize() で指定されたサイズの 4096 Byte 境界 のバッファを指定してください。バッファにデバイスメモリを使用しないでください。<BR>
51                     本関数は長時間ブロックする可能性があります。これはバックグラウンドでの通信処理を終了させ、DLP ライブラリが通信デバイスを占有する処理を行うためです。<BR>
52                     なお、通信デバイスの占有は Finalize() を呼ぶまで続きます。
53 
54       @param[in]    scanNum       一度のスキャン要求で受信可能な子機プログラム数を指定します。最大で MAX_SCAN_NUM です。
55       @param[in]    eventHandle   ダウンロードプレイからのシグナルを待つ nn::os::Event のハンドルを指定します。 Event はアプリケーションで初期化してください。また、イベントの情報は GetEventDesc で取得します。
56       @param[in]    pBuffer       DLP の作業バッファへのポインタ。4096 バイト境界にしてください。
57       @param[in]    bufferSize    作業バッファのサイズ。4096 バイト境界にしてください。
58 
59       @return       処理の結果として以下の Result が返ってきます。
60       @retval       ResultSuccess                         初期化に成功しました。
61       @retval       ResultInvalidPointer                  pBuffer が NULL か 4096 バイト境界でないです。
62       @retval       ResultOutOfRange                      scanNum あるいは bufferSize が不正です。
63       @retval       ResultInvalidHandle                   eventHandle が不正です。
64       @retval       ResultAlreadyOccupiedWirelessDevice   無線デバイスが既に他の用途で占有されています。 他の無線処理を終了してください。
65       @retval       ResultWirelessOff                     通信できない状態(スリープあるいは Wifi ボタンが OFF)です。
66       @retval       ResultInternalError                   内部に回復不可のエラーが発生しました。
67 
68      *--------------------------------------------------------------------------*/
69         static nn::Result Initialize(u8 scanNum, nn::Handle eventHandle, void* pBuffer, const size_t bufferSize);
70 
71 
72     /*!--------------------------------------------------------------------------*
73       @brief        疑似クライアントを終了します。
74 
75       @return       処理の結果が返ってきます。
76       @retval       ResultSuccess                         終了が成功しました。
77 
78      *--------------------------------------------------------------------------*/
79         static nn::Result Finalize();
80 
81 
82     /*!--------------------------------------------------------------------------*
83       @brief        到着しているイベントをキューから取得します。
84 
85                     現在のキューのサイズはイベント32個分です。キューがいっぱいになると、古いイベントから消去され新しいイベントが追加されます。<BR>
86                     イベントがない場合、本API はブロックせず ResultNoData() の返すエラーコードを 返します。<BR>
87                     なお、 イベントを取得しなくても各種状態取得 API を利用すれば処理を行えます。
88 
89       @param[out]   pEventDesc   イベントを読み込み先を指定します。
90 
91       @return       処理の結果として以下の Result が返ってきます。
92       @retval       ResultSuccess                   イベントの取得が成功しました。
93       @retval       ResultNoData                    イベントがありません。
94      *--------------------------------------------------------------------------*/
95         static nn::Result GetEventDesc(EventDesc* pEventDesc);
96 
97 
98     /*!--------------------------------------------------------------------------*
99       @brief        サーバのスキャンを開始します。
100 
101                     前回のスキャン結果をクリアしてスキャンを行います。 StopScan() が呼ばれるまでスキャンを行います。<BR>
102                     スキャン中も GetServerInfo()、GetTitleInfo() でスキャン結果を取得できます。
103 
104       @param[in]    uniqueId            スキャン結果を絞り込む Unique ID を指定します。 0 を指定すると絞込みを行いません。
105       @param[in]    childIndex          スキャン結果を絞り込む childIndex を指定します。 UniqueId が 0 のときは無効です。
106       @param[in]    pMac                スキャン結果を絞り込むサーバの MAC アドレスを指定します。 NULL を指定すると MAC ID で絞込みを行いません。
107 
108       @return       処理の結果として以下の Result が返ってきます。
109       @retval       ResultSuccess                   スキャンの開始が成功しました。
110       @retval       ResultInvalidState              状態が不正です。 CLIENT_STATE_DISCONNECTED_NETWORK で使用してください。
111 
112     *--------------------------------------------------------------------------*/
113         static nn::Result StartScan(u32 uniqueId = 0, u8 childIndex = 0, const u8* pMac = NULL);
114 
115 
116     /*!--------------------------------------------------------------------------*
117       @brief        サーバのスキャンを停止します。
118 
119                     スキャン結果は StartScan() を呼ぶまで保持されています。
120 
121       @return       処理の結果として以下の Result が返ってきます。
122       @retval       ResultSuccess                   スキャンの停止が成功しました。
123 
124     *--------------------------------------------------------------------------*/
125         static nn::Result StopScan();
126 
127 
128     /*!--------------------------------------------------------------------------*
129       @brief        スキャン結果からサーバ情報を取得します。
130 
131                     linkLevel、nodeNum、nodeInfo の動的に変化する情報はスキャン中(CLIENT_STATE_SCANNING)しか更新されません <BR>
132                     サーバに接続している間(CLIENT_STATE_WAITING_INVITE から  CLIENT_STATE_REBOOTING)、これらの情報は GetConnectingNodes()、 <BR>
133                     GetNodeInfo()、GetLinkLevel() で取得してください。
134 
135       @param[out]   pServerInfo     サーバー情報を返します。
136       @param[in]    pMac            サーバの MAC アドレスを指定します。
137 
138       @return       処理の結果として以下の Result が返ってきます。
139       @retval       ResultSuccess                   サーバの情報の取得が成功しました。
140       @retval       ResultInvalidState              状態が不正です。 CLIENT_STATE_INVALID、CLIENT_STATE_ERROR では使用しないでください。
141       @retval       ResultNoData                    指定された MAC アドレスのサーバがありません。
142 
143     *--------------------------------------------------------------------------*/
144         static nn::Result GetServerInfo(ServerInfo* pServerInfo, const u8* pMac);
145 
146 
147     /*!--------------------------------------------------------------------------*
148       @brief        スキャン結果から子機プログラム情報を取得します。
149 
150       @param[out]   pTitleInfo    子機プログラムの情報を返します。
151       @param[in]    pMac          子機プログラムを配信しているサーバの MAC アドレスを指定します。
152       @param[in]    uniqueId      子機プログラムの Unique ID を指定します。
153       @param[in]    childIndex    子機プログラムの childIndex を指定します。
154 
155       @return       処理の結果として以下の Result が返ってきます。
156       @retval       ResultSuccess                   子機プログラム情報の取得が成功しました。
157       @retval       ResultInvalidState              状態が不正です。 CLIENT_STATE_INVALID、CLIENT_STATE_ERROR では使用しないでください。
158       @retval       ResultNoData                    指定された MAC アドレス、 Unique ID、Child index の子機プログラムがありません。
159 
160     *--------------------------------------------------------------------------*/
161         static nn::Result GetTitleInfo(TitleInfo* pTitleInfo, const u8* pMac, u32 uniqueId, u8 childIndex);
162 
163 
164     /*!--------------------------------------------------------------------------*
165       @brief        スキャン結果から子機プログラム情報を取得します。
166 
167                     先頭から順に子機プログラムの情報を取得します。取得の際にリストの末尾に到達しているか子機プログラムの情報がない場合<BR>
168                     ブロックせずに ResultNoData を返します。<BR>
169                     (スキャン中は新しく子機プログラムを発見するとリストの最後尾に子機プログラム情報が追加されます。)<BR>
170                     先頭を取得する場合は、isReset を true にします。
171 
172       @param[out]   pTitleInfo    子機プログラムの情報を返します。
173       @param[in]    isReset       先頭を取得する場合、 true にします。
174 
175       @return       処理の結果として以下の Result が返ってきます。
176       @retval       ResultSuccess                   子機プログラム情報の取得が成功しました。
177       @retval       ResultInvalidState              状態が不正です。 CLIENT_STATE_INVALID、CLIENT_STATE_ERROR では使用しないでください。
178       @retval       ResultNoData                    スキャン結果のリストが空か、リストの末尾に到達しています。
179 
180     *--------------------------------------------------------------------------*/
181         static nn::Result GetTitleInfo(TitleInfo* pTitleInfo, bool isReset = false);
182 
183 
184     /*!--------------------------------------------------------------------------*
185       @brief        指定されたサーバのスキャン情報(サーバ情報と子機プログラム情報)をスキャン結果から削除します。
186 
187       @param[in]    pMac        スキャン情報を削除するサーバの MAC アドレスを指定します。
188 
189       @return       処理の結果として以下の Result が返ってきます。
190       @retval       ResultSuccess                   スキャン情報の削除に成功しました。
191       @retval       ResultInvalidState              状態が不正です。 CLIENT_STATE_DISCONNECTED_NETWORK か CLIENT_STATE_SCANNING で使用してください。
192       @retval       ResultNoData                    指定されたサーバは存在しません。
193 
194      *--------------------------------------------------------------------------*/
195         static nn::Result DeleteScanInfo(const u8* pMac);
196 
197 
198     /*!--------------------------------------------------------------------------*
199       @brief        ダウンロードセッションへダウンロードなしで参加します。
200 
201       @param[in]    pMac          参加するセッションを持つサーバの MAC アドレスを指定します。
202       @param[in]    uniqueId      子機プログラムの Unique ID を指定します。
203       @param[in]    childIndex    子機プログラムの childIndex を指定します。
204 
205       @return       処理の結果として以下の Result が返ってきます。
206       @retval       ResultSuccess                            ダウンロードセッションへの参加が成功しました。
207       @retval       ResultInvalidState                       状態が不正です。 CLIENT_STATE_DISCONNECTED_NETWORK 状態で使用してください。
208       @retval       ResultNoData                             指定された MAC アドレス、Unique ID、Child index の子機プログラムがありません。
209       @retval       ResultWirelessOff                        通信できない状態(スリープあるいは Wifi ボタンが OFF)です。
210       @retval       ResultNotFoundServer                     接続対象のサーバが見つかりませんでした。
211       @retval       ResultServerIsFull                       サーバのクライアント数が最大接続数に達していました。クライアント数が減少しない限り接続できません。
212       @retval       ResultDeniedFromServer                   サーバに接続を拒否されました。
213       @retval       ResultConnectionTimeout                  一定時間以内に接続が成立しませんでした。電波状況が悪い場合や、通信過負荷時に返ります。
214       @retval       ResultInternalError                      システム内で不整合が起きました。
215 
216     *--------------------------------------------------------------------------*/
217         static nn::Result StartFakeSession(const u8* pMac, u32 uniqueId, u8 childIndex);
218 
219 
220     /*!--------------------------------------------------------------------------*
221       @brief        対戦子機として親機に再接続する際に使用する UDS パスフレーズを取得します。
222 
223       @param[out]   pPassphrase       パスフレーズを返します。パスフレーズを格納するバッファのサイズは MAX_CHILD_UDS_PASSPHRASE_LENGTH 以上にしてください。
224 
225       @return       処理の結果として以下の Result が返ってきます。
226       @retval       ResultSuccess                       パスフレーズの取得に成功しました。
227       @retval       ResultInvalidState                  状態が不正です。 CLIENT_STATE_REBOOTING 状態でしか使用できません。
228 
229     *--------------------------------------------------------------------------*/
230         static nn::Result GetPassphrase(char* pPassphrase);
231 
232 
233     /*!--------------------------------------------------------------------------*
234       @brief        参加中のセッションを終了します。
235 
236       @return       処理の結果として以下の Result が返ってきます。
237       @retval       ResultSuccess                           セッションの終了が成功しました。
238 
239     *--------------------------------------------------------------------------*/
240         static nn::Result StopFakeSession();
241 
242 
243     /*!--------------------------------------------------------------------------*
244       @brief        自身の状態、ダウンロードの進捗などを取得します。
245 
246       @param[out]   pStatus   状態、ダウンロードの進捗などを返します。
247 
248       @return       処理の結果として以下の Result が返ってきます。
249       @retval       ResultSuccess                       状態の取得が成功しました。
250 
251      *--------------------------------------------------------------------------*/
252         static nn::Result  GetMyStatus(ClientStatus* pStatus);
253 
254 
255     /*!--------------------------------------------------------------------------*
256       @brief        ネットワークに接続中のノードIDを取得します。
257 
258       @param[out]   pNum          pNodeIds に格納されたノード ID の数を返します。
259       @param[out]   pNodeIds      ノードIDを返します。
260       @param[in]    size          pNodeIds の配列の個数を指定します。
261 
262       @return       処理の結果として以下の Result が返ってきます。
263       @retval       ResultSuccess       ノード ID の取得が成功しました。
264       @retval       ResultInvalidState  状態が不正です。サーバに接続している状態(CLIENT_STATE_WAITING_INVITE から  CLIENT_STATE_REBOOTING)で使用してください。
265 
266     *--------------------------------------------------------------------------*/
267         static nn::Result GetConnectingNodes(u8* pNum, u16* pNodeIds, u16 size);
268 
269 
270     /*!--------------------------------------------------------------------------*
271       @brief        ネットワークに接続しているノードの情報を取得します。
272 
273       @param[out]   pNodeInfo       ノードの情報を返します。
274       @param[in]    nodeId          ノードIDを指定します。
275 
276       @return       処理の結果として以下の Result が返ってきます。
277       @retval       ResultSuccess       ノード情報の取得が成功しました。
278       @retval       ResultInvalidState  状態が不正です。サーバに接続している状態(CLIENT_STATE_WAITING_INVITE から  CLIENT_STATE_REBOOTING)で使用してください。
279       @retval       ResultNoData        指定されたノード ID のノードがありません。
280 
281     *--------------------------------------------------------------------------*/
282         static nn::Result  GetNodeInfo(NodeInfo* pNodeInfo, u16 nodeId);
283 
284 
285     /*!--------------------------------------------------------------------------*
286       @brief        リンクレベルを取得します。
287 
288       @param[out]   pLinkLevel     リンクレベルを返します。
289 
290       @return       処理の結果として以下の Result が返ってきます。
291       @retval       ResultSuccess       リンクレベルの取得が成功しました。
292 
293     *--------------------------------------------------------------------------*/
294         static nn::Result GetLinkLevel(nn::uds::LinkLevel* pLinkLevel);
295 
296 
297     // (非公開関数)
298     /*!--------------------------------------------------------------------------*
299       :private
300       @brief        スキャンで使用できるチャンネルのビットマップを返します。
301 
302       @param[out]   pChannels   チャンネルのビットマップを返します。 最下位  bit が 1ch になります。
303 
304       @return       処理の結果として以下の Result が返ってきます。
305       @retval       ResultSuccess                   チャンネルのビットマップの取得が成功しました。
306 
307      *--------------------------------------------------------------------------*/
308         static nn::Result GetChannels(bit16* pChannels);
309 
310 
311     /*!--------------------------------------------------------------------------*
312       :private
313       @brief        サーバのスキャンを開始します。
314 
315                     前回のスキャン結果をクリアしてスキャンを行います。 StopScan() が呼ばれるまでスキャンを行います。<BR>
316                     スキャン中も GetServerInfo()、GetTitleInfo() でスキャン結果を取得できます。
317 
318       @param[in]    channels            スキャンするチャンネルをビットマップで指定します。スキャンできるチャンネルは GetChannels() で取得してください。
319       @param[in]    uniqueId            スキャン結果を絞り込む Unique ID を指定します。 0 を指定すると絞込みを行いません。
320       @param[in]    childIndex          スキャン結果を絞り込む childIndex を指定します。 UniqueId が 0 のときは無効です。
321       @param[in]    pMac                スキャン結果を絞り込むサーバの MAC アドレスを指定します。 NULL を指定すると MAC ID で絞込みを行いません。
322       @param[in]    isReconnecting      リブート後の再接続でスキャンする際は true にしてください。
323 
324       @return       処理の結果として以下の Result が返ってきます。
325       @retval       ResultSuccess                   スキャンの開始が成功しました。
326       @retval       ResultInvalidState              状態が不正です。 CLIENT_STATE_DISCONNECTED_NETWORK で使用してください。
327       @retval       ResultOutOfRange                channels の値が不正です。
328 
329     *--------------------------------------------------------------------------*/
330         static nn::Result StartScan(bit16 channels, u32 uniqueId = 0, u8 childIndex = 0, const u8* pMac = NULL);
331 
332 };
333 
334 } // namespace CTR
335 } // namespace dlp
336 } // namespace nn
337 
338 #endif // __cplusplus
339 #endif  // ifndef NN_DLP_CTR_DLP_FAKE_CLIENT_H_
340