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