1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     dlp_Server.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_SERVER_H_
16 #define NN_DLP_CTR_DLP_SERVER_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 Server
30 {
31 private:
Server()32     Server() {};
~Server()33     ~Server() {};
34 
35 public:
36     /*!--------------------------------------------------------------------------*
37       @brief        サーバの初期化に必要なバッファのサイズを取得します。
38 
39       @param[in]    maxClientNum        サーバに接続可能なクライアントの最大数(1 ~ MAX_CLIENT_NUM)を指定します。
40       @param[in]    blockBufferSize     ファイルから読みだしたデータを送信前にためるブロックバッファのサイズです。<BR>
41                                         MIN_NETWORK_BLOCK_BUFFER_SIZE 以上 MAX_NETWORK_BLOCK_BUFFER_SIZE 以下を指定してください。
42       @param[in]    blockBufferNum      ブロックバッファの数です。<BR>
43                                         MIN_NETWORK_BLOCK_BUFFER_NUM 以上 MAX_NETWORK_BLOCK_BUFFER_NUM 以下を指定してください。
44 
45       @return       バッファのサイズを返します。
46 
47      *--------------------------------------------------------------------------*/
48         static size_t GetBufferSize(u8 maxClientNum, size_t blockBufferSize = MIN_NETWORK_BLOCK_BUFFER_SIZE * 2, size_t blockBufferNum = MIN_NETWORK_BLOCK_BUFFER_NUM);
49 
50 
51     /*!--------------------------------------------------------------------------*
52       @brief        サーバを初期化します。
53 
54                     pBuffer に GetBufferSize() で指定されたサイズの 4096 Byte 境界 のバッファを指定してください。バッファにデバイスメモリを使用しないでください。<BR>
55                     配信できる子機プログラムのサイズは 最大で 32 MB です。<BR>
56                     バックグラウンドでの通信処理を終了させ、Finalize() を実行するまで DLP ライブラリが通信デバイスを占有する処理を行うため、長時間ブロックする可能性があります。
57 
58       @param[in]    eventHandle           ダウンロードプレイからのシグナルを待つ nn::os::Event のハンドルを指定します。 Event はアプリケーションで初期化してください。また、イベントの情報は GetEventDesc で取得します。
59       @param[in]    maxClientNum          サーバに接続可能なクライアントの最大数(1 ~ MAX_CLIENT_NUM)を指定します。
60       @param[in]    childIndex            配信する子機プログラムのインデックス(rsf の ChildIndex)を指定してください。 0 ~ 255 まで指定できます。(サーバは子機を 256 個まで持つことができます。)
61       @param[in]    pBuffer               DLP の作業バッファへのポインタ。4096 バイト境界にしてください。
62       @param[in]    bufferSize            作業バッファのサイズ。4096 バイト境界にしてください。
63       @param[in]    blockBufferSize       ファイルから読みだしたデータを送信前にためるブロックバッファのサイズです。MIN_NETWORK_BLOCK_BUFFER_SIZE 以上 MAX_NETWORK_BLOCK_BUFFER_SIZE 以下を指定してください。
64       @param[in]    blockBufferNum        ブロックバッファの数です。MIN_NETWORK_BLOCK_BUFFER_NUM 以上 MAX_NETWORK_BLOCK_BUFFER_NUM 以下を指定してください。
65 
66       @return       処理の結果として以下の Result が返ってきます。
67       @retval       ResultSuccess                         初期化が成功しました。
68       @retval       ResultInvalidPointer                  pBuffer が NULL か 4096 バイト境界でないです。
69       @retval       ResultOutOfRange                      maxClientNum、bufferSize、blockBufferSize、blockBufferNum が不正です。
70       @retval       ResultInvalidHandle                   eventHandle が不正です。
71       @retval       ResultAlreadyOccupiedWirelessDevice   無線デバイスが既に他の用途で占有されています。 他の無線処理を終了してください。
72       @retval       ResultInternalError                   内部に回復不可のエラーが発生しました。
73       @retval       ResultWirelessOff                     通信できない状態(スリープあるいは Wifi ボタンが OFF)です。
74       @retval       ResultInvalidMediaType                親機のメディアタイプがサポートされていません。
75       @retval       ResultFailedToAccessMedia             メディアにアクセスできませんでした。子機プログラムが正しく親機に組み込まれていないか、カード抜けの可能性があります。
76       @retval       ResultChildTooLarge                   子機プログラムのインポートサイズが規定 ( MAX_CHILD_IMPORT_SIZE ) を超えています。
77       @retval       ResultInvalidRegion                   子機プログラムのリージョンが本体リージョンと異なります。
78 
79     *--------------------------------------------------------------------------*/
80         static nn::Result Initialize(
81                         nn::Handle eventHandle,
82                         u8 maxClientNum,
83                         u8 childIndex,
84                         void* pBuffer,
85                         size_t bufferSize,
86                         size_t blockBufferSize = MIN_NETWORK_BLOCK_BUFFER_SIZE * 2,
87                         size_t blockBufferNum = MIN_NETWORK_BLOCK_BUFFER_NUM);
88 
89 
90     /*!--------------------------------------------------------------------------*
91       @brief        サーバを終了します。
92 
93       @return       処理の結果が返ってきます。
94       @retval       ResultSuccess                         終了が成功しました。
95 
96     *--------------------------------------------------------------------------*/
97         static nn::Result Finalize();
98 
99 
100     /*!--------------------------------------------------------------------------*
101       @brief        サーバの状態を取得します。
102 
103       @param[out]   pState   サーバの状態を返します。
104 
105       @return       処理の結果として以下の Result が返ってきます。
106       @retval       ResultSuccess                       状態の取得が成功しました。
107 
108     *--------------------------------------------------------------------------*/
109         static nn::Result GetState(ServerState* pState);
110 
111 
112     /*!--------------------------------------------------------------------------*
113       @brief        到着しているイベントをキューから取得します。
114 
115                     現在のキューのサイズはイベント32個分です。キューがいっぱいになると、古いイベントから消去され新しいイベントが追加されます。<BR>
116                     イベントがない場合、本API はブロックせず ResultNoData() の返すエラーコードを 返します。<BR>
117                     なお、 イベントを取得しなくても各種状態取得 API を利用すれば処理を行えます。
118 
119       @param[out]   pEventDesc   イベントを読み込み先を指定します。
120 
121       @return       処理の結果として以下の Result が返ってきます。
122       @retval       ResultSuccess                   イベントの取得が成功しました。
123       @retval       ResultNoData                    イベントがありません。
124 
125     *--------------------------------------------------------------------------*/
126         static nn::Result GetEventDesc(EventDesc* pEventDesc);
127 
128 
129     /*!--------------------------------------------------------------------------*
130       @brief        ダウンロードセッションを開始します。
131 
132       @param[in]    isManualAccept          true : AcceptClient でクライアントの接続を許可します。 false : 無条件に接続を許可します。
133       @param[in]    channel                 チャンネルを0(自動選択)、1、6、11 から指定してください。製品機 では 0 が強制的に選ばれます。
134 
135       @return       処理の結果として以下の Result が返ってきます。
136       @retval       ResultSuccess                   セッションの開始が成功しました。
137       @retval       ResultOutOfRange                不正なチャンネルを指定しています。
138       @retval       ResultInvalidState              状態が不正です。 SERVER_STATE_INITIALIZED で使用してください。
139       @retval       ResultWirelessOff               通信できない状態(スリープあるいは Wifi ボタンが OFF)です。
140 
141      *--------------------------------------------------------------------------*/
142         static nn::Result OpenSessions(bool isManualAccept = false, u8 channel = 0);
143 
144 
145     /*!--------------------------------------------------------------------------*
146       @brief        クライアントの接続を許可します。
147 
148                     isManualAccept 引数 を true で OpenSession() を呼ぶと、クライアントは接続後に CLIENT_STATE_WAITING_ACCEPT 状態になり<BR>
149                     サーバからの許可を待ち続けます。このクライアントの接続を許可するには本 API を呼んでください。<BR>
150                     呼び出し後、クライアントは CLIENT_STATE_WAITING_INVITE 状態へ遷移します。なお、接続を拒否する場合、DisconnectClient() でクライアントを切断してください。
151 
152       @param[in]    nodeId        クライアントのノード ID を指定します。
153 
154       @return       処理の結果として以下の Result が返ってきます。
155       @retval       ResultSuccess                   接続許可が成功しました。
156       @retval       ResultInvalidState              状態が不正です。 SERVER_STATE_OPENED_SESSIONS 状態(OpenSessions() が成功した後) で使用してください。
157       @retval       ResultNoData                    指定されたノード ID を持つノードは接続されていません。
158 
159      *--------------------------------------------------------------------------*/
160         static nn::Result AcceptClient(u16 nodeId);
161 
162 
163     /*!--------------------------------------------------------------------------*
164       @brief        クライアントのネットワーク接続を強制的に切断します。
165 
166                     接続しているクライアントをネットワークから切断します。
167 
168       @param[in]    nodeId        クライアントのノード ID を指定します。
169 
170       @return       処理の結果として以下の Result が返ってきます。
171       @retval       ResultSuccess                   切断が成功しました。
172       @retval       ResultInvalidState              状態が不正です。 SERVER_STATE_OPENED_SESSIONS 状態(OpenSessions() が成功した後) で使用してください。
173       @retval       ResultWirelessOff               通信できない状態(スリープあるいは Wifi ボタンが OFF)です。
174 
175      *--------------------------------------------------------------------------*/
176         static nn::Result DisconnectClient(u16 nodeId);
177 
178 
179     /*!--------------------------------------------------------------------------*
180       @brief        ダウンロードセッションを開始します。
181 
182                     本 API の呼び出し以降、新たにクライアントの接続は行えません。また、本 API の呼び出し時に CLIENT_STATE_WAITING_ACCEPT 状態のクライアントは切断されます。<BR>
183                     サーバは子機プログラムだけでなく子機プログラムのブートに必要なシステムを配信することがあります。サーバは、システムをダウンロードしたクライアントがリブートし<BR>
184                     再接続して来るのを、永遠に SERVER_STATE_WAITING_RECONNECT 状態で待ち続けます。<BR>
185                     しかし、クライアント側がダウンロードをキャンセルしたり、無線 OFF や電源断、通信品質の低下により親機との通信ができない状態になるなど<BR>
186                     クライアントが必ず再接続してくるとは限りませんので、ユーザがいつでもダウンロードデータセッションを停止できるようにしてください。
187 
188       @return       処理の結果として以下の Result が返ってきます。
189       @retval       ResultSuccess                       セッションの開始が成功しました。
190       @retval       ResultInvalidState                  状態が不正か、AcceptClient()されたクライアントがいません。SERVER_STATE_OPENED_SESSIONS 状態(OpenSessions() が成功した後) で使用してください。
191       @retval       ResultWirelessOff                   通信できない状態(スリープあるいは Wifi ボタンが OFF)です。
192       @retval       ResultFailedToAccessMedia           メディアにアクセスできませんでした。カード抜けの可能性があります。
193 
194     *--------------------------------------------------------------------------*/
195         static nn::Result StartDistribute();
196 
197 
198     /*!--------------------------------------------------------------------------*
199       @brief        全てのクライアントへリブート要求を出します。
200 
201                     リブート後にダウンロードセッションに参加した CTR だけを接続したい場合、passPharase で UDS のパスフレーズを指定してください。<BR>
202                     パスフレーズを指定する場合、ダウンロードセッションごとにパスフレーズを変えてください。<BR>
203                     本 API 呼び出し後、全てのクライアントが切断されてから CloseSessions() と Finalize() を呼んでください。<BR>
204                     クライアントの切断は、GetConnectingClients() のクライアント数から判断してください。<BR>
205                     クライアントがリブート後に子機として再接続してくる保証はありません。親機として子機を待ち受ける場合は注意してください。
206 
207       @param[in]    passpharase                     再接続時の UDS パスフレーズです。長さは、MAX_CHILD_UDS_PASSPHRASE_LENGTH までです。
208       @return       処理の結果として以下の Result が返ってきます。
209       @retval       ResultSuccess                   リブート要求をクライアントへ出しました。
210       @retval       ResultInvalidState              状態が不正です。ダウンロードが完了した状態 (SERVER_STATE_COMPLETE_DISTRIBUTION) で使用してください。
211 
212      *--------------------------------------------------------------------------*/
213         static nn::Result RebootAllClients(const char passpharase[] = NULL);
214 
215 
216     /*!--------------------------------------------------------------------------*
217       @brief        ダウンロードセッションを停止します。
218 
219       @return       処理の結果として以下の Result が返ってきます。
220       @retval       ResultSuccess                   停止が成功しました。
221 
222     *--------------------------------------------------------------------------*/
223         static nn::Result CloseSessions();
224 
225 
226     /*!--------------------------------------------------------------------------*
227       @brief        接続しているクライアントの数を取得します。
228 
229       @param[out]   pNum          clients に格納されたクライアント ID の数を返します。
230       @param[out]   clients       クライアントのノードIDを返します。
231       @param[in]    size          clients の配列の個数を指定します。
232 
233       @return       処理の結果として以下の Result が返ってきます。
234       @retval       ResultSuccess                   クライアント数の取得が成功しました。
235       @retval       ResultInvalidState              状態が不正です。OpenSessions() が成功した( SERVER_STATE_OPENED_SESSIONS ) 以降、SERVER_STATE_ERROR 状態でない限り使用できます。
236 
237     *--------------------------------------------------------------------------*/
238         static nn::Result GetConnectingClients(u16* pNum, u16 clients[], u16 size);
239 
240 
241     /*!--------------------------------------------------------------------------*
242       @brief        クライアントの情報を取得します。
243 
244 
245       @param[out]   pNodeInfo       クライアントの情報を返します。
246       @param[in]    nodeId          クライアントのノードIDを指定します。
247 
248       @return       処理の結果として以下の Result が返ってきます。
249       @retval       ResultSuccess                   クライアント情報の取得が成功しました。
250       @retval       ResultInvalidState              状態が不正です。OpenSessions() が成功した( SERVER_STATE_OPENED_SESSIONS ) 以降、SERVER_STATE_ERROR 状態でない限り使用できます。
251       @retval       ResultNoData                    指定されたノード ID を持つクライアントは接続されていません。
252 
253     *--------------------------------------------------------------------------*/
254         static nn::Result  GetClientInfo(
255                                 NodeInfo*       pClientInfo,
256                                 u16             nodeId);
257 
258 
259     /*!--------------------------------------------------------------------------*
260       @brief        クライアントの状態、ダウンロードの進捗などを取得します。
261 
262       @param[out]   pClientStatus   クライアントの情報、状態、ダウンロードの進捗などを返します。
263       @param[in]    nodeId          クライアントのノードIDを指定します。
264 
265       @return       処理の結果として以下の Result が返ってきます。
266       @retval       ResultSuccess                   クライアントの状態取得が成功しました。
267       @retval       ResultInvalidState              状態が不正です。OpenSessions() が成功した( SERVER_STATE_OPENED_SESSIONS ) 以降、SERVER_STATE_ERROR 状態でない限り使用できます。
268       @retval       ResultNoData                    指定されたノード ID を持つクライアントは接続されていません。
269 
270     *--------------------------------------------------------------------------*/
271         static nn::Result  GetClientStatus(
272                                 ClientStatus*    pClientStatus,
273                                 u16              nodeId);
274 
275     /*!--------------------------------------------------------------------------*
276       @brief        クライアントのうち、最も弱いリンクレベルを返します。
277 
278       @param[out]   pLinkLevel     リンクレベルを返します。
279 
280       @return       処理の結果として以下の Result が返ってきます。
281       @retval       ResultSuccess       リンクレベルの取得が成功しました。
282 
283     *--------------------------------------------------------------------------*/
284         static nn::Result GetLinkLevel(nn::uds::LinkLevel* pLinkLevel);
285 
286 };
287 
288 } // namespace CTR
289 } // namespace dlp
290 } // namespace nn
291 
292 
293 #endif // __cplusplus
294 #endif  // ifndef NN_DLP_CTR_DLP_SERVER_H_
295 
296