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 
41     @return       処理の結果が返ってきます。
42 
43      *--------------------------------------------------------------------------*/
44         static size_t GetBufferSize(u8 maxClientNum);
45 
46 
47     /*!--------------------------------------------------------------------------*
48     @brief        サーバを初期化します。
49 
50                   pBuffer に GetBufferSize() で指定されたサイズの 4096 Byte 境界 のバッファを指定してください。バッファにデバイスメモリを使用しないでください。<BR>
51                   配信できるタイトルのサイズは 最大で 16MB です。<BR>
52 
53     @param[in]    eventHandle           ダウンロードプレイからのシグナルを待つ nn::os::Event のハンドルを指定します。 Event はアプリケーションで初期化してください。また、イベントの情報は GetEventDesc で取得します。
54     @param[in]    maxClientNum          サーバに接続可能なクライアントの最大数(1 ~ MAX_CLIENT_NUM)を指定します。
55     @param[in]    programId             配信するタイトルの プログラム ID を指定してください。
56     @param[in]    pBuffer               DLP の作業バッファへのポインタ。4096 バイト境界にしてください。
57     @param[in]    bufferSize            作業バッファのサイズ。4096 バイト境界にしてください。
58 
59     @return       処理の結果が返ってきます。
60     *--------------------------------------------------------------------------*/
61         static nn::Result Initialize(
62                         nn::Handle eventHandle,
63                         u8 maxClientNum,
64                         nn::ProgramId programId,
65                         void* pBuffer,
66                         size_t bufferSize);
67 
68 
69     /*!--------------------------------------------------------------------------*
70     @brief        サーバを終了します。
71 
72     @return       処理の結果が返ってきます。
73     *--------------------------------------------------------------------------*/
74         static nn::Result Finalize();
75 
76 
77     /*!--------------------------------------------------------------------------*
78       @brief        サーバの状態を取得します。
79 
80         @param[out]   pState   サーバの状態を返します。
81 
82         @return       処理の結果が返ってきます。
83     *--------------------------------------------------------------------------*/
84         static nn::Result GetState(ServerState* pState);
85 
86 
87     /*!--------------------------------------------------------------------------*
88       @brief        到着しているイベントをキューから取得します。
89 
90                     現在のキューのサイズはイベント32個分です。キューがいっぱいになると、古いイベントから消去され新しいイベントが追加されます。<BR>
91                     イベントがない場合、本API はブロックせず ResultNoData() の返すエラーコードを 返します。<BR>
92                     なお、 イベントを取得しなくても各種状態取得 API を利用すれば処理を行えます。
93 
94       @param[out]   pEventDesc   イベントを読み込み先を指定します。
95 
96       @return       処理の結果が返ってきます。
97     *--------------------------------------------------------------------------*/
98         static nn::Result GetEventDesc(EventDesc* pEventDesc);
99 
100 
101     /*!--------------------------------------------------------------------------*
102     @brief        ダウンロードセッションを開始します。
103 
104     @param[in]    isManualAccept          true : AcceptClient でクライアントの接続を許可します。 false : 無条件に接続を許可します。
105 
106     @return       処理の結果が返ってきます。
107      *--------------------------------------------------------------------------*/
108         static nn::Result OpenSessions(bool isManualAccept = false);
109 
110 
111     /*!--------------------------------------------------------------------------*
112     @brief        クライアントの接続を許可します。
113 
114                   SERVER_STATE_OPENED_SESSIONS 状態(OpenSessions() を呼んでから StartDistribute() を呼ぶまで) で使用できます。<BR>
115                   isManualAccept 引数 を true で OpenSession() を呼ぶと、クライアントは接続後に CLIENT_STATE_WAITING_ACCEPT 状態になり<BR>
116                   サーバからの許可を待ち続けます。このクライアントの接続を許可するには本 API を呼んでください。<BR>
117                   呼び出し後、クライアントは CLIENT_STATE_WAITING_INVITE 状態へ遷移します。なお、接続を拒否する場合、DisconnectClient() でクライアントを切断してください。
118 
119     @param[in]    nodeId        クライアントのノード ID を指定します。
120 
121     @return       処理の結果が返ってきます。
122      *--------------------------------------------------------------------------*/
123         static nn::Result AcceptClient(u16 nodeId);
124 
125 
126     /*!--------------------------------------------------------------------------*
127     @brief        クライアントのネットワーク接続を強制的に切断します。
128 
129                   SERVER_STATE_OPENED_SESSIONS 状態(OpenSessions() を呼んでから StartDistribute() を呼ぶまで) において<BR>
130                   接続しているクライアントをネットワークから切断します。
131 
132     @param[in]    nodeId        クライアントのノード ID を指定します。
133 
134     @return       処理の結果が返ってきます。
135      *--------------------------------------------------------------------------*/
136         static nn::Result DisconnectClient(u16 nodeId);
137 
138 
139     /*!--------------------------------------------------------------------------*
140     @brief        全てのダウンロードセッションのデータ配信を開始します。
141 
142                   OpenSessions() の後に使用します。本 API 呼び出し以降、クライアントは接続できません。<BR>
143                   CLIENT_STATE_WAITING_ACCEPT 状態のクライアントは切断します。<BR>
144                   サーバはシステムアップデートを行ったクライアントがリブート後に再接続してくるのを待ち続けます。<BR>
145                   しかし、クライアントが必ず再接続するとは限りませんので、ユーザがいつでも配信をキャンセルできるように配慮してください。
146 
147     @return       処理の結果が返ってきます。
148     *--------------------------------------------------------------------------*/
149         static nn::Result StartDistribute();
150 
151 
152     /*!--------------------------------------------------------------------------*
153     @brief        全てのクライアントをリブートします。
154 
155                   ダウンロードを完了(SERVER_STATE_COMPLETE_DISTRIBUTION)状態で、接続している全てのクライアント<BR>
156                   をリブートします。
157 
158     @return       処理の結果が返ってきます。
159      *--------------------------------------------------------------------------*/
160         static nn::Result RebootAllClient();
161 
162 
163     /*!--------------------------------------------------------------------------*
164     @brief        ダウンロードセッションを停止します。
165 
166     @return       処理の結果が返ってきます。
167     *--------------------------------------------------------------------------*/
168         static nn::Result CloseSessions();
169 
170 
171     /*!--------------------------------------------------------------------------*
172     @brief        接続しているクライアントの数を取得します。
173 
174                   OpenSessions() が成功した後、SERVER_STATE_ERROR 状態でない限り使用できます。
175 
176     @param[out]   pNum          pClients に格納されたクライアント ID の数を返します。
177     @param[out]   pClients      クライアントのノードIDを返します。
178     @param[in]    size          pClients の配列の個数を指定します。
179 
180     @return       処理の結果が返ってきます。
181     *--------------------------------------------------------------------------*/
182         static nn::Result GetConnectingClients(u16* pNum, u16* pClients, u16 size);
183 
184 
185     /*!--------------------------------------------------------------------------*
186     @brief        クライアントの情報を取得します。
187 
188                   OpenSessions() が成功した後、SERVER_STATE_ERROR 状態でない限り使用できます。
189 
190     @param[out]   pNodeInfo       クライアントの情報を返します。
191     @param[in]    nodeId          クライアントのノードIDを指定します。
192 
193     @return       処理の結果が返ってきます。
194     *--------------------------------------------------------------------------*/
195         static nn::Result  GetClientInfo(
196                                 NodeInfo*       pClientInfo,
197                                 u16             nodeId);
198 
199 
200     /*!--------------------------------------------------------------------------*
201     @brief        クライアントの状態、ダウンロードの進捗などを取得します。
202 
203                   OpenSessions() が成功した後、SERVER_STATE_ERROR 状態でない限り使用できます。
204 
205     @param[out]   pClientStatus   クライアントの情報、状態、ダウンロードの進捗などを返します。
206     @param[in]    nodeId          クライアントのノードIDを指定します。
207 
208     @return       処理の結果が返ってきます。
209     *--------------------------------------------------------------------------*/
210         static nn::Result  GetClientStatus(
211                                 ClientStatus*    pClientStatus,
212                                 u16              nodeId);
213 
214 
215     /*!--------------------------------------------------------------------------*
216     @brief        クライアントに子機のバージョンを無視して強制的にダウンロードさせます。
217 
218                   通常、クライアントは自身の持っていない子機か、自身にインポートされているものより新しい子機をダウンロードしますが、<BR>
219                   クライアントのインポート状態に関わらず子機をダウンロードさせます。本API は SERVER_STATE_INITIALIZED 状態で使用してください。 <BR>
220                   本API はデバッグ用の API です。開発実機以外で用いても強制的にダウンロードさせることはできません。
221 
222     @param[in]    enable    true のとき強制的にダウンロードさせます。false のときは通常のダウンロード方法に戻します。
223 
224     @return       処理の結果が返ってきます。
225     *--------------------------------------------------------------------------*/
226         static nn::Result  ForceClientToDownload(bool enable=true);
227 
228 };
229 
230 } // namespace CTR
231 } // namespace dlp
232 } // namespace nn
233 
234 
235 #endif // __cplusplus
236 #endif  // ifndef NN_DLP_CTR_DLP_SERVER_H_
237 
238