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