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