1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: dlp_FakeClient.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_FAKE_CLIENT_H_ 16 #define NN_DLP_CTR_DLP_FAKE_CLIENT_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 FakeClient 30 { 31 private: FakeClient()32 FakeClient() {}; ~FakeClient()33 ~FakeClient() {}; 34 35 public: 36 /*!--------------------------------------------------------------------------* 37 @brief 擬似クライアントの初期化に必要なバッファのサイズを取得します。 38 39 @param[in] scanNum 一度のスキャン要求で受信可能な子機プログラム数を指定します。最大で MAX_SCAN_NUM です。 40 41 @return バッファのサイズを返します。 42 43 *--------------------------------------------------------------------------*/ 44 static size_t GetBufferSize(u8 scanNum); 45 46 47 /*!--------------------------------------------------------------------------* 48 @brief 擬似クライアントを初期化します。 49 50 pBuffer に GetBufferSize() で指定されたサイズの 4096 Byte 境界 のバッファを指定してください。バッファにデバイスメモリを使用しないでください。<BR> 51 本関数は長時間ブロックする可能性があります。これはバックグラウンドでの通信処理を終了させ、DLP ライブラリが通信デバイスを占有する処理を行うためです。<BR> 52 なお、通信デバイスの占有は Finalize() を呼ぶまで続きます。 53 54 @param[in] scanNum 一度のスキャン要求で受信可能な子機プログラム数を指定します。最大で MAX_SCAN_NUM です。 55 @param[in] eventHandle ダウンロードプレイからのシグナルを待つ nn::os::Event のハンドルを指定します。 Event はアプリケーションで初期化してください。また、イベントの情報は GetEventDesc で取得します。 56 @param[in] pBuffer DLP の作業バッファへのポインタ。4096 バイト境界にしてください。 57 @param[in] bufferSize 作業バッファのサイズ。4096 バイト境界にしてください。 58 59 @return 処理の結果として以下の Result が返ってきます。 60 @retval ResultSuccess 初期化に成功しました。 61 @retval ResultInvalidPointer pBuffer が NULL か 4096 バイト境界でないです。 62 @retval ResultOutOfRange scanNum あるいは bufferSize が不正です。 63 @retval ResultInvalidHandle eventHandle が不正です。 64 @retval ResultAlreadyOccupiedWirelessDevice 無線デバイスが既に他の用途で占有されています。 他の無線処理を終了してください。 65 @retval ResultWirelessOff 通信できない状態(スリープあるいは Wifi ボタンが OFF)です。 66 @retval ResultInternalError 内部に回復不可のエラーが発生しました。 67 68 *--------------------------------------------------------------------------*/ 69 static nn::Result Initialize(u8 scanNum, nn::Handle eventHandle, void* pBuffer, const size_t bufferSize); 70 71 72 /*!--------------------------------------------------------------------------* 73 @brief 疑似クライアントを終了します。 74 75 @return 処理の結果が返ってきます。 76 @retval ResultSuccess 終了が成功しました。 77 78 *--------------------------------------------------------------------------*/ 79 static nn::Result Finalize(); 80 81 82 /*!--------------------------------------------------------------------------* 83 @brief 到着しているイベントをキューから取得します。 84 85 現在のキューのサイズはイベント32個分です。キューがいっぱいになると、古いイベントから消去され新しいイベントが追加されます。<BR> 86 イベントがない場合、本API はブロックせず ResultNoData() の返すエラーコードを 返します。<BR> 87 なお、 イベントを取得しなくても各種状態取得 API を利用すれば処理を行えます。 88 89 @param[out] pEventDesc イベントを読み込み先を指定します。 90 91 @return 処理の結果として以下の Result が返ってきます。 92 @retval ResultSuccess イベントの取得が成功しました。 93 @retval ResultNoData イベントがありません。 94 *--------------------------------------------------------------------------*/ 95 static nn::Result GetEventDesc(EventDesc* pEventDesc); 96 97 98 /*!--------------------------------------------------------------------------* 99 @brief サーバのスキャンを開始します。 100 101 前回のスキャン結果をクリアしてスキャンを行います。 StopScan() が呼ばれるまでスキャンを行います。<BR> 102 スキャン中も GetServerInfo()、GetTitleInfo() でスキャン結果を取得できます。 103 104 @param[in] uniqueId スキャン結果を絞り込む Unique ID を指定します。 0 を指定すると絞込みを行いません。 105 @param[in] childIndex スキャン結果を絞り込む childIndex を指定します。 UniqueId が 0 のときは無効です。 106 @param[in] pMac スキャン結果を絞り込むサーバの MAC アドレスを指定します。 NULL を指定すると MAC ID で絞込みを行いません。 107 108 @return 処理の結果として以下の Result が返ってきます。 109 @retval ResultSuccess スキャンの開始が成功しました。 110 @retval ResultInvalidState 状態が不正です。 CLIENT_STATE_DISCONNECTED_NETWORK で使用してください。 111 112 *--------------------------------------------------------------------------*/ 113 static nn::Result StartScan(u32 uniqueId = 0, u8 childIndex = 0, const u8* pMac = NULL); 114 115 116 /*!--------------------------------------------------------------------------* 117 @brief サーバのスキャンを停止します。 118 119 スキャン結果は StartScan() を呼ぶまで保持されています。 120 121 @return 処理の結果として以下の Result が返ってきます。 122 @retval ResultSuccess スキャンの停止が成功しました。 123 124 *--------------------------------------------------------------------------*/ 125 static nn::Result StopScan(); 126 127 128 /*!--------------------------------------------------------------------------* 129 @brief スキャン結果からサーバ情報を取得します。 130 131 linkLevel、nodeNum、nodeInfo の動的に変化する情報はスキャン中(CLIENT_STATE_SCANNING)しか更新されません <BR> 132 サーバに接続している間(CLIENT_STATE_WAITING_INVITE から CLIENT_STATE_REBOOTING)、これらの情報は GetConnectingNodes()、 <BR> 133 GetNodeInfo()、GetLinkLevel() で取得してください。 134 135 @param[out] pServerInfo サーバー情報を返します。 136 @param[in] pMac サーバの MAC アドレスを指定します。 137 138 @return 処理の結果として以下の Result が返ってきます。 139 @retval ResultSuccess サーバの情報の取得が成功しました。 140 @retval ResultInvalidState 状態が不正です。 CLIENT_STATE_INVALID、CLIENT_STATE_ERROR では使用しないでください。 141 @retval ResultNoData 指定された MAC アドレスのサーバがありません。 142 143 *--------------------------------------------------------------------------*/ 144 static nn::Result GetServerInfo(ServerInfo* pServerInfo, const u8* pMac); 145 146 147 /*!--------------------------------------------------------------------------* 148 @brief スキャン結果から子機プログラム情報を取得します。 149 150 @param[out] pTitleInfo 子機プログラムの情報を返します。 151 @param[in] pMac 子機プログラムを配信しているサーバの MAC アドレスを指定します。 152 @param[in] uniqueId 子機プログラムの Unique ID を指定します。 153 @param[in] childIndex 子機プログラムの childIndex を指定します。 154 155 @return 処理の結果として以下の Result が返ってきます。 156 @retval ResultSuccess 子機プログラム情報の取得が成功しました。 157 @retval ResultInvalidState 状態が不正です。 CLIENT_STATE_INVALID、CLIENT_STATE_ERROR では使用しないでください。 158 @retval ResultNoData 指定された MAC アドレス、 Unique ID、Child index の子機プログラムがありません。 159 160 *--------------------------------------------------------------------------*/ 161 static nn::Result GetTitleInfo(TitleInfo* pTitleInfo, const u8* pMac, u32 uniqueId, u8 childIndex); 162 163 164 /*!--------------------------------------------------------------------------* 165 @brief スキャン結果から子機プログラム情報を取得します。 166 167 先頭から順に子機プログラムの情報を取得します。取得の際にリストの末尾に到達しているか子機プログラムの情報がない場合<BR> 168 ブロックせずに ResultNoData を返します。<BR> 169 (スキャン中は新しく子機プログラムを発見するとリストの最後尾に子機プログラム情報が追加されます。)<BR> 170 先頭を取得する場合は、isReset を true にします。 171 172 @param[out] pTitleInfo 子機プログラムの情報を返します。 173 @param[in] isReset 先頭を取得する場合、 true にします。 174 175 @return 処理の結果として以下の Result が返ってきます。 176 @retval ResultSuccess 子機プログラム情報の取得が成功しました。 177 @retval ResultInvalidState 状態が不正です。 CLIENT_STATE_INVALID、CLIENT_STATE_ERROR では使用しないでください。 178 @retval ResultNoData スキャン結果のリストが空か、リストの末尾に到達しています。 179 180 *--------------------------------------------------------------------------*/ 181 static nn::Result GetTitleInfo(TitleInfo* pTitleInfo, bool isReset = false); 182 183 184 /*!--------------------------------------------------------------------------* 185 @brief 指定されたサーバのスキャン情報(サーバ情報と子機プログラム情報)をスキャン結果から削除します。 186 187 @param[in] pMac スキャン情報を削除するサーバの MAC アドレスを指定します。 188 189 @return 処理の結果として以下の Result が返ってきます。 190 @retval ResultSuccess スキャン情報の削除に成功しました。 191 @retval ResultInvalidState 状態が不正です。 CLIENT_STATE_DISCONNECTED_NETWORK か CLIENT_STATE_SCANNING で使用してください。 192 @retval ResultNoData 指定されたサーバは存在しません。 193 194 *--------------------------------------------------------------------------*/ 195 static nn::Result DeleteScanInfo(const u8* pMac); 196 197 198 /*!--------------------------------------------------------------------------* 199 @brief ダウンロードセッションへダウンロードなしで参加します。 200 201 @param[in] pMac 参加するセッションを持つサーバの MAC アドレスを指定します。 202 @param[in] uniqueId 子機プログラムの Unique ID を指定します。 203 @param[in] childIndex 子機プログラムの childIndex を指定します。 204 205 @return 処理の結果として以下の Result が返ってきます。 206 @retval ResultSuccess ダウンロードセッションへの参加が成功しました。 207 @retval ResultInvalidState 状態が不正です。 CLIENT_STATE_DISCONNECTED_NETWORK 状態で使用してください。 208 @retval ResultNoData 指定された MAC アドレス、Unique ID、Child index の子機プログラムがありません。 209 @retval ResultWirelessOff 通信できない状態(スリープあるいは Wifi ボタンが OFF)です。 210 @retval ResultNotFoundServer 接続対象のサーバが見つかりませんでした。 211 @retval ResultServerIsFull サーバのクライアント数が最大接続数に達していました。クライアント数が減少しない限り接続できません。 212 @retval ResultDeniedFromServer サーバに接続を拒否されました。 213 @retval ResultConnectionTimeout 一定時間以内に接続が成立しませんでした。電波状況が悪い場合や、通信過負荷時に返ります。 214 @retval ResultInternalError システム内で不整合が起きました。 215 216 *--------------------------------------------------------------------------*/ 217 static nn::Result StartFakeSession(const u8* pMac, u32 uniqueId, u8 childIndex); 218 219 220 /*!--------------------------------------------------------------------------* 221 @brief 対戦子機として親機に再接続する際に使用する UDS パスフレーズを取得します。 222 223 @param[out] pPassphrase パスフレーズを返します。パスフレーズを格納するバッファのサイズは MAX_CHILD_UDS_PASSPHRASE_LENGTH 以上にしてください。 224 225 @return 処理の結果として以下の Result が返ってきます。 226 @retval ResultSuccess パスフレーズの取得に成功しました。 227 @retval ResultInvalidState 状態が不正です。 CLIENT_STATE_REBOOTING 状態でしか使用できません。 228 229 *--------------------------------------------------------------------------*/ 230 static nn::Result GetPassphrase(char* pPassphrase); 231 232 233 /*!--------------------------------------------------------------------------* 234 @brief 参加中のセッションを終了します。 235 236 @return 処理の結果として以下の Result が返ってきます。 237 @retval ResultSuccess セッションの終了が成功しました。 238 239 *--------------------------------------------------------------------------*/ 240 static nn::Result StopFakeSession(); 241 242 243 /*!--------------------------------------------------------------------------* 244 @brief 自身の状態、ダウンロードの進捗などを取得します。 245 246 @param[out] pStatus 状態、ダウンロードの進捗などを返します。 247 248 @return 処理の結果として以下の Result が返ってきます。 249 @retval ResultSuccess 状態の取得が成功しました。 250 251 *--------------------------------------------------------------------------*/ 252 static nn::Result GetMyStatus(ClientStatus* pStatus); 253 254 255 /*!--------------------------------------------------------------------------* 256 @brief ネットワークに接続中のノードIDを取得します。 257 258 @param[out] pNum pNodeIds に格納されたノード ID の数を返します。 259 @param[out] pNodeIds ノードIDを返します。 260 @param[in] size pNodeIds の配列の個数を指定します。 261 262 @return 処理の結果として以下の Result が返ってきます。 263 @retval ResultSuccess ノード ID の取得が成功しました。 264 @retval ResultInvalidState 状態が不正です。サーバに接続している状態(CLIENT_STATE_WAITING_INVITE から CLIENT_STATE_REBOOTING)で使用してください。 265 266 *--------------------------------------------------------------------------*/ 267 static nn::Result GetConnectingNodes(u8* pNum, u16* pNodeIds, u16 size); 268 269 270 /*!--------------------------------------------------------------------------* 271 @brief ネットワークに接続しているノードの情報を取得します。 272 273 @param[out] pNodeInfo ノードの情報を返します。 274 @param[in] nodeId ノードIDを指定します。 275 276 @return 処理の結果として以下の Result が返ってきます。 277 @retval ResultSuccess ノード情報の取得が成功しました。 278 @retval ResultInvalidState 状態が不正です。サーバに接続している状態(CLIENT_STATE_WAITING_INVITE から CLIENT_STATE_REBOOTING)で使用してください。 279 @retval ResultNoData 指定されたノード ID のノードがありません。 280 281 *--------------------------------------------------------------------------*/ 282 static nn::Result GetNodeInfo(NodeInfo* pNodeInfo, u16 nodeId); 283 284 285 /*!--------------------------------------------------------------------------* 286 @brief リンクレベルを取得します。 287 288 @param[out] pLinkLevel リンクレベルを返します。 289 290 @return 処理の結果として以下の Result が返ってきます。 291 @retval ResultSuccess リンクレベルの取得が成功しました。 292 293 *--------------------------------------------------------------------------*/ 294 static nn::Result GetLinkLevel(nn::uds::LinkLevel* pLinkLevel); 295 296 297 // (非公開関数) 298 /*!--------------------------------------------------------------------------* 299 :private 300 @brief スキャンで使用できるチャンネルのビットマップを返します。 301 302 @param[out] pChannels チャンネルのビットマップを返します。 最下位 bit が 1ch になります。 303 304 @return 処理の結果として以下の Result が返ってきます。 305 @retval ResultSuccess チャンネルのビットマップの取得が成功しました。 306 307 *--------------------------------------------------------------------------*/ 308 static nn::Result GetChannels(bit16* pChannels); 309 310 311 /*!--------------------------------------------------------------------------* 312 :private 313 @brief サーバのスキャンを開始します。 314 315 前回のスキャン結果をクリアしてスキャンを行います。 StopScan() が呼ばれるまでスキャンを行います。<BR> 316 スキャン中も GetServerInfo()、GetTitleInfo() でスキャン結果を取得できます。 317 318 @param[in] channels スキャンするチャンネルをビットマップで指定します。スキャンできるチャンネルは GetChannels() で取得してください。 319 @param[in] uniqueId スキャン結果を絞り込む Unique ID を指定します。 0 を指定すると絞込みを行いません。 320 @param[in] childIndex スキャン結果を絞り込む childIndex を指定します。 UniqueId が 0 のときは無効です。 321 @param[in] pMac スキャン結果を絞り込むサーバの MAC アドレスを指定します。 NULL を指定すると MAC ID で絞込みを行いません。 322 @param[in] isReconnecting リブート後の再接続でスキャンする際は true にしてください。 323 324 @return 処理の結果として以下の Result が返ってきます。 325 @retval ResultSuccess スキャンの開始が成功しました。 326 @retval ResultInvalidState 状態が不正です。 CLIENT_STATE_DISCONNECTED_NETWORK で使用してください。 327 @retval ResultOutOfRange channels の値が不正です。 328 329 *--------------------------------------------------------------------------*/ 330 static nn::Result StartScan(bit16 channels, u32 uniqueId = 0, u8 childIndex = 0, const u8* pMac = NULL); 331 332 }; 333 334 } // namespace CTR 335 } // namespace dlp 336 } // namespace nn 337 338 #endif // __cplusplus 339 #endif // ifndef NN_DLP_CTR_DLP_FAKE_CLIENT_H_ 340