1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     dlp_Type.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_TYPE_H_
16 #define NN_DLP_CTR_DLP_TYPE_H_
17 
18 #include <nn/Handle.h>
19 #include <nn/Result.h>
20 #include <nn/types.h>
21 #include <nn/cfg.h>
22 #include <nn/uds.h>
23 
24 namespace nn {
25 namespace dlp {
26 namespace CTR {
27 /*!--------------------------------------------------------------------------*
28     @name   サイズ、数の定義
29     @{
30   *--------------------------------------------------------------------------*/
31 const s32       SHORT_TITLE_NAME_LENGTH         = 64;                   //!< 1 行タイトル名の文字長
32 const s32       LONG_TITLE_NAME_LENGTH          = 128;                  //!< 2 行タイトル名の文字長
33 const s32       ICON_HEIGHT_PIXEL               = 48;                   //!< アイコンのピクセル高
34 const s32       ICON_WIDTH_PIXEL                = 48;                   //!< アイコンのピクセル幅
35 const s32       ICON_PIXEL_COUNT                = ICON_WIDTH_PIXEL * ICON_HEIGHT_PIXEL; //!< アイコンのピクセル数
36 const s32       RATING_INFO_SIZE                = 16;                   //!< ペアレンタルコントロールの情報サイズ
37 const size_t    NETWORK_BLOCK_BUFFER_SIZE       = 102400;               //!< 通信ブロックのサイズ
38 const u16       MAX_NODE_NUM                    = nn::uds::NODE_MAX;    //!< サーバを含むネットワークに存在する最大のノード数
39 const u16       MAX_CLIENT_NUM                  = MAX_NODE_NUM - 1;     //!< サーバに接続可能なクライアントの最大台数
40 const u8        MAX_SCAN_NUM                    = 16;                   //!< クライアントにおいて一度にスキャンできるタイトルの最大数
41 /*!
42      @}
43  */
44 
45 
46 /*!--------------------------------------------------------------------------*
47     @name   ダウンロードセッションの種類
48  *--------------------------------------------------------------------------*/
49 enum SessionType
50 {
51     SESSION_TYPE_INVALID            = 0,
52     SESSION_TYPE_TITLE              = 1,        //!< タイトルのダウンロードセッション
53     SESSION_TYPE_SYSTEM             = 2         //!< タイトルを起動するのに必要なシステムのダウンロードセッション
54 };
55 
56 
57 /*!--------------------------------------------------------------------------*
58   @brief        クライアントの状態
59  *---------------------------------------------------------------------------*/
60 enum ClientState
61 {
62     CLIENT_STATE_INVALID                        = 0x00,
63     CLIENT_STATE_DISCONNECTED_NETWORK           = 0x01,    //!< サーバでこの状態を認識できません。ネットワークに接続していない 状態です。
64     CLIENT_STATE_SCANNING                       = 0x02,    //!< サーバでこの状態を認識できません。スキャン中の状態です。
65     CLIENT_STATE_WAITING_CONNECT                = 0x03,    //!< サーバでこの状態を認識できません。ネットワークへの接続を待っています。
66     CLIENT_STATE_WAITING_INVITE                 = 0x04,    //!< ネットワークに接続しました。サーバからのINVITEコマンドを待っています。
67     CLIENT_STATE_JOINED_SESSION                 = 0x05,    //!< セッションへ 参加しています。
68     CLIENT_STATE_DOWNLOADING                    = 0x06,    //!< ダウンロード中です。ただし、サーバからデータが出ていない場合も含みます。
69     CLIENT_STATE_DOWNLOAD_COMPLETE              = 0x07,    //!< ダウンロードが完了した状態です。
70     CLIENT_STATE_RECONNECTING_NETWORK           = 0x08,    //!< システムのダウンロード後に、アプリケーションの再接続処理を待っている状態です。
71     CLIENT_STATE_REBOOTING                      = 0x09,    //!< サーバでこの状態を認識できません。ダウンロード後に、アプリケーションのリブート処理を待っている状態です。
72     CLIENT_STATE_ERROR                          = 0x80,    //!< サーバでこの状態を認識できません。エラーが発生し再初期化しないといけない状態です。
73     CLIENT_STATE_WAITING_ACCEPT                 = 0x40,    //!< クライアントでこの状態を認識できません。ネットワークに接続していますが、サーバの ACCEPT を待っています。
74     CLIENT_STATE_CONFIRMING_DOWNLOAD_PROGRESS   = 0x41     //!< クライアントでこの状態を認識できません。ダウンロードの進捗を確認しています。
75 };
76 
77 
78 /*!--------------------------------------------------------------------------*
79   @brief        サーバの状態
80  *---------------------------------------------------------------------------*/
81 enum ServerState
82 {
83     SERVER_STATE_INVALID = 0,
84     SERVER_STATE_INITIALIZED,                       //!< 初期化が完了した状態です。
85     SERVER_STATE_OPENED_SESSIONS,                   //!< セッションへの参加を受け付けている状態です。
86     SERVER_STATE_PREPARING_FOR_SYTEM_DISTRIBUTION,  //!< システム配信を行う前の状態です。
87     SERVER_STATE_DISTRIBUTING_SYSTEM,               //!< システムを配信している状態です。
88     SERVER_STATE_WAITING_RECONNECT,                 //!< システム配信後にリブートしたクライアントが再接続してくるのを待っている状態です。クライアントは必ず再接続するとは限らないので 、ユーザが ダウンロードプレイを中断できるようにしてください。
89     SERVER_STATE_PREPARING_FOR_TITLE_DISTRIBUTION,  //!< サーバがタイトル配信を行う前の状態です。
90     SERVER_STATE_DISTRIBUTING_TITLE,                //!< サーバがタイトルを配信している状態です。
91     SERVER_STATE_COMPLETE_DISTRIBUTION,             //!< サーバがシステム、タイトルの配信を完了した状態です。
92     SERVER_STATE_REBOOTING_CLIENTS,                 //!< サーバがクライアントのリブートを行っている状態です。全てのクライアントの切断を確認したら、ダウンロードプレイを終了してください。 その後、 ローカル通信を行う場合は、UDS でクライアントの接続を待ってください。ただし、クライアントは必ず再接続するとは限らないので注意してください。
93     SERVER_STATE_ERROR                              //!< エラーが発生し再初期化しないといけない状態です。
94 };
95 
96 
97 /*!--------------------------------------------------------------------------*
98   @brief        通知されるイベントの種類
99  *---------------------------------------------------------------------------*/
100 enum EventType
101 {
102     EVENT_TYPE_INVALID = 0,
103     // SERVER
104     EVENT_TYPE_SERVER_STATE_PREPARING_FOR_SYTEM_DISTRIBUTION,  //!< サーバにおいて SERVER_STATE_PREPARING_FOR_SYTEM_DISTRIBUTION 状態に遷移したときのイベント
105     EVENT_TYPE_SERVER_STATE_DISTRIBUTING_SYSTEM,               //!< サーバにおいて SERVER_STATE_DISTRIBUTING_SYSTEM 状態に遷移したときのイベント
106     EVENT_TYPE_SERVER_STATE_WAITING_RECONNECT,                 //!< サーバにおいて SERVER_STATE_WAITING_RECONNECT 状態に遷移したときのイベント
107     EVENT_TYPE_SERVER_STATE_PREPARING_FOR_TITLE_DISTRIBUTION,  //!< サーバにおいて SERVER_STATE_PREPARING_FOR_TITLE_DISTRIBUTION 状態に遷移したときのイベント
108     EVENT_TYPE_SERVER_STATE_DISTRIBUTING_TITLE,                //!< サーバにおいて SERVER_STATE_DISTRIBUTING_TITLE 状態に遷移したときのイベント
109     EVENT_TYPE_SERVER_STATE_COMPLETE_DISTRIBUTION,             //!< サーバにおいて SERVER_STATE_COMPLETE_DISTRIBUTION 状態に遷移したときのイベント
110     EVENT_TYPE_SERVER_STATE_ERROR,                             //!< サーバにおいて SERVER_STATE_ERROR 状態に遷移したときのイベント
111 
112     // CLIENT
113     EVENT_TYPE_CLIENT_DISCOVERED_SERVER,                        //!< クライアントにおいて サーバーが発見されましたときのイベント
114     EVENT_TYPE_CLIENT_SCAN_BUFFER_FULL,                         //!< クライアントにおいて スキャンバッファがいっぱいになったときのイベント(サーバーの情報の更新は続けられます。)
115     EVENT_TYPE_CLIENT_DISCOVERED_TITLE,                         //!< クライアントにおいて タイトルが発見されたときのイベント
116     EVENT_TYPE_CLIENT_STATE_WAITING_INVITE,                     //!< クライアントにおいて CLIENT_STATE_WAITING_INVITE 状態に遷移したときのイベント
117     EVENT_TYPE_CLIENT_STATE_JOINED_SESSION,                     //!< クライアントにおいて CLIENT_STATE_JOINED_SESSION 状態に遷移したときのイベント
118     EVENT_TYPE_CLIENT_STATE_DOWNLOADING,                        //!< クライアントにおいて CLIENT_STATE_DOWNLOADING 状態に遷移したときのイベント
119     EVENT_TYPE_CLIENT_STATE_DOWNLOAD_COMPLETE,                  //!< クライアントにおいて CLIENT_STATE_DOWNLOAD_COMPLETE 状態に遷移したときのイベント
120     EVENT_TYPE_CLIENT_STATE_RECONNECTING_NETWORK,               //!< クライアントにおいて CLIENT_STATE_RECONNECTING_NETWORK 状態に遷移したときのイベント
121     EVENT_TYPE_CLIENT_STATE_REBOOTING,                          //!< クライアントにおいて CLIENT_STATE_REBOOTING 状態に遷移したときのイベント
122     EVENT_TYPE_CLIENT_STATE_DISCONNECTED_NETWORK,               //!< クライアントにおいて CLIENT_STATE_DISCONNECTED_NETWORK 状態に遷移したときのイベント
123     EVENT_TYPE_CLIENT_STATE_ERROR                               //!< クライアントにおいて CLIENT_STATE_ERROR 状態に遷移したときのイベント
124 };
125 
126 
127 /*!--------------------------------------------------------------------------*
128   @brief        EventDesc の type が EVENT_TYPE_CLIENT_DISCOVERED_SERVER のときのイベント情報です。
129  *---------------------------------------------------------------------------*/
130 typedef struct
131 {
132     u8 mac[6];                                  //!< スキャンによって発見されたサーバの MAC アドレスです。
133     NN_PADDING2;
134 } ClientDiscoveredServer;
135 
136 
137 /*!--------------------------------------------------------------------------*
138   @brief        EventDesc の type が EVENT_TYPE_CLIENT_DISCOVERED_TITLE のときのイベント情報です。
139  *---------------------------------------------------------------------------*/
140 typedef struct
141 {
142     nn::ProgramId   programId;                  //!< スキャンによって発見されたタイトルのプログラム ID です。
143     u8              mac[6];                     //!< スキャンによって発見されたタイトルを持つサーバの MAC アドレスです。
144     u16             programVersion;             //!< スキャンによって発見されたタイトルのプログラムバージョンです。
145 } ClientDiscoveredTitle;
146 
147 
148 /*!--------------------------------------------------------------------------*
149   @brief        EventDesc の type が EVENT_TYPE_CLIENT_STATE_WAITING_INVITE のときのイベント情報です。
150  *---------------------------------------------------------------------------*/
151 typedef struct
152 {
153     u16 nodeId;                                 //!< 自分の ノード ID です。
154     NN_PADDING2;
155 } ClientStateWaitingInvite;
156 
157 
158 /*!--------------------------------------------------------------------------*
159   @brief        DLP 内で発生したイベントを通知します。 type メンバによって情報が変わります。
160  *---------------------------------------------------------------------------*/
161 typedef struct
162 {
163     EventType                       type;
164     NN_PADDING3;
165     NN_PADDING4;
166     union{
167         // Client
168         ClientDiscoveredServer      clientDiscoveredServer;
169         ClientDiscoveredTitle       clientDiscoveredTitle;
170         ClientStateWaitingInvite    clientStateWaitingInvite;
171 
172         u8 placeHolder[16]; // IPC 用
173     } ;
174 } EventDesc;
175 
176 
177 /*!--------------------------------------------------------------------------*
178   @brief        ノードの情報
179  *---------------------------------------------------------------------------*/
180 typedef nn::uds::NodeInformation NodeInfo;
181 
182 
183 /*!--------------------------------------------------------------------------*
184   @brief        クライアントの状態、ダウンロードの進捗
185  *---------------------------------------------------------------------------*/
186 typedef struct
187 {
188     u16                             nodeId;                   //!< ノードID
189     SessionType                     sessionType;              //!< 参加しているダウンロードセッションの種類
190     ClientState                     state;                    //!< クライアントの状態
191     u16                             totalBlockNum;            //!< ダウンロードしなくてはならない総ブロック数 ( ブロックとはダウンロードプレイ独自の通信単位でサイズは NETWORK_BLOCK_BUFFER_SIZE です。)
192     u16                             downloadedBlockNum;       //!< ダウンロード済みのブロック数
193 } ClientStatus;
194 
195 
196 /*!--------------------------------------------------------------------------*
197   @brief        アイコンの情報
198  *---------------------------------------------------------------------------*/
199 typedef struct
200 {
201    bit16                            image[ICON_PIXEL_COUNT];    //!< アイコンの画像データ
202 } IconInfo;
203 
204 
205 /*!--------------------------------------------------------------------------*
206   @brief        タイトルの情報
207  *---------------------------------------------------------------------------*/
208 typedef struct
209 {
210     nn::ProgramId                   programId;                                  //!< プログラムID
211     u8                              mac[6];                                     //!< サーバのMACアドレス
212     u16                             programVersion;                             //!< プログラムのバージョン
213     bit8                            ratingInfo[RATING_INFO_SIZE];               //!< レーティング情報
214     wchar_t                         shortTitleName[SHORT_TITLE_NAME_LENGTH];    //!< 1 行のタイトル名
215     wchar_t                         longTitleName[LONG_TITLE_NAME_LENGTH];      //!< 2 行のタイトル名
216     IconInfo                        icon;                                       //!< アイコン情報
217     u32                             importSize;                                 //!< インポートに必要な NAND のバイトサイズ
218     nn::cfg::CfgRegionCode          region;                                     //!< リージョン
219     bool                            ulcd;                                       //!< ULCD表示をするか
220     NN_PADDING2;
221 } TitleInfo;
222 
223 
224 /*!--------------------------------------------------------------------------*
225   @brief        サーバの情報
226  *---------------------------------------------------------------------------*/
227 typedef struct
228 {
229     u8                                  mac[6];                         //!< サーバのMACアドレス
230     u8                                  channel;                        //!< サーバの存在するチャンネル
231     nn::uds::LinkLevel                  linkLevel;                      //!< リンクレベル、スキャンしている間(CLIENT_STATE_SCANNING状態)だけ更新されます。
232     u8                                  maxNodeNum;                     //!< サーバを含む接続可能な最大ノード数
233     u8                                  nodeNum;                        //!< サーバを含む現在の接続しているノード数、スキャンしている間(CLIENT_STATE_SCANNING状態)だけ更新されます。
234     NN_PADDING2;
235     bit32                               dlpVersion;                     //!< ダウンロードプレイのバージョン
236     NodeInfo                            nodeInfo[MAX_NODE_NUM];         //!< サーバに接続しているノードの情報、スキャンしている間(CLIENT_STATE_SCANNING状態)だけ更新されます。
237 } ServerInfo;
238 
239 
240 /*!--------------------------------------------------------------------------*
241   @brief        リブート後に親機に再接続するための情報を格納するための構造体
242  *---------------------------------------------------------------------------*/
243 typedef struct
244 {
245     u8                                  bssid[6];                       //!< サーバの BSSID (MAC アドレス) が格納されます
246     NN_PADDING2;
247     u64                                 friendCode;                     //!< サーバのフレンドコードが格納されます
248 } RebootInfo;
249 
250 
251 const u8        DUMMY_MAC[6]                                = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
252 const size_t    CLIENT_COMMAND_RECEIVE_DESC_NUM             = 10;
253 const size_t    UDS_SCAN_BUFFER_SIZE                        = 1024 * 1;
254 const size_t    SERVER_RECEIVE_COMMAND_NUM_PER_CLIENT       = 1;
255 const size_t    SERVER_SEND_COMMAND_NUM_PER_CLIENT          = 1;
256 
257 const size_t    REQUIRED_TITLE_DESC_SIZE                    = 1024 * 7 + 512;
258 const size_t    REQUIRED_SERVER_DESC_SIZE                   = 1024 * 1;
259 const size_t    REQUIRED_RECEIVE_PACKET_DESC_SIZE           = 1024 * 2;
260 const size_t    REQUIRED_SEND_PACKET_DESC_SIZE              = 1024 * 2;
261 const size_t    REQUIRED_SCAN_SHARED_MEMORY_SIZE            = REQUIRED_SERVER_DESC_SIZE + REQUIRED_TITLE_DESC_SIZE + UDS_SCAN_BUFFER_SIZE;  // 8K
262 #define         DLP_DEBUG_POINT                             NN_TLOG_("l.%d:%s > \n", __LINE__, __func__)
263 #define         DLP_DEBUG_PRINT( ... )                      NN_TLOG_("l.%d:%s > ", __LINE__, __func__);NN_LOG(__VA_ARGS__)
264 #define         DLP_DEBUG_PRINT_SIMPLE( ... )               NN_TLOG_(__VA_ARGS__)
265 #define         DLP_ROUNDUP(x, base)                        (((x) + ((base)-1)) & ~((base)-1))
266 
267 } // end of namespace CTR
268 } // end of namespace dlp
269 } // end of namespace nn
270 
271 #endif  // ifndef NN_DLP_CTR_DLP_TYPE_H_
272