/*---------------------------------------------------------------------------* Project: Horizon File: dlp_Server.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. *---------------------------------------------------------------------------*/ #ifndef NN_DLP_CTR_DLP_SERVER_H_ #define NN_DLP_CTR_DLP_SERVER_H_ #include #ifdef __cplusplus namespace nn { namespace dlp { namespace CTR { /*!--------------------------------------------------------------------------* @brief ダウンロードプレイのサーバのクラスです。 *--------------------------------------------------------------------------*/ class Server { private: Server() {}; ~Server() {}; public: /*!--------------------------------------------------------------------------* @brief サーバの初期化に必要なバッファのサイズを取得します。 @param[in] maxClientNum サーバに接続可能なクライアントの最大数(1 ~ MAX_CLIENT_NUM)を指定します。 @param[in] blockBufferSize ファイルから読みだしたデータを送信前にためるブロックバッファのサイズです。
MIN_NETWORK_BLOCK_BUFFER_SIZE 以上 MAX_NETWORK_BLOCK_BUFFER_SIZE 以下を指定してください。 @param[in] blockBufferNum ブロックバッファの数です。
MIN_NETWORK_BLOCK_BUFFER_NUM 以上 MAX_NETWORK_BLOCK_BUFFER_NUM 以下を指定してください。 @return バッファのサイズを返します。 *--------------------------------------------------------------------------*/ static size_t GetBufferSize(u8 maxClientNum, size_t blockBufferSize = MIN_NETWORK_BLOCK_BUFFER_SIZE * 2, size_t blockBufferNum = MIN_NETWORK_BLOCK_BUFFER_NUM); /*!--------------------------------------------------------------------------* @brief サーバを初期化します。 pBuffer に GetBufferSize() で指定されたサイズの 4096 Byte 境界 のバッファを指定してください。バッファにデバイスメモリを使用しないでください。
配信できるタイトルのサイズは 最大で 16MB です。
@param[in] eventHandle ダウンロードプレイからのシグナルを待つ nn::os::Event のハンドルを指定します。 Event はアプリケーションで初期化してください。また、イベントの情報は GetEventDesc で取得します。 @param[in] maxClientNum サーバに接続可能なクライアントの最大数(1 ~ MAX_CLIENT_NUM)を指定します。 @param[in] childIndex 配信する子機プログラムのインデックス(rsf の ChildIndex)を指定してください。 @param[in] pBuffer DLP の作業バッファへのポインタ。4096 バイト境界にしてください。 @param[in] bufferSize 作業バッファのサイズ。4096 バイト境界にしてください。 @param[in] blockBufferSize ファイルから読みだしたデータを送信前にためるブロックバッファのサイズです。MIN_NETWORK_BLOCK_BUFFER_SIZE 以上 MAX_NETWORK_BLOCK_BUFFER_SIZE 以下を指定してください。 @param[in] blockBufferNum ブロックバッファの数です。MIN_NETWORK_BLOCK_BUFFER_NUM 以上 MAX_NETWORK_BLOCK_BUFFER_NUM 以下を指定してください。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess 初期化が成功しました。 @retval ResultInvalidPointer pBuffer が NULL か 4096 バイト境界でないです。 @retval ResultOutOfRange maxClientNum、bufferSize、blockBufferSize、blockBufferNum が不正です。 @retval ResultInvalidHandle eventHandle が不正です。 @retval ResultAlreadyOccupiedWirelessDevice 無線デバイスが既に他の用途で占有されています。 他の無線処理を終了してください。 @retval ResultInternalError 内部に回復不可のエラーが発生しました。 @retval ResultWirelessOff 通信できない状態(スリープあるいは Wifi ボタンが OFF)です。 @retval ResultInvalidMediaType 親機のメディアタイプがサポートされていません。 @retval ResultFailedToAccessMedia メディアにアクセスできませんでした。子機プログラムが正しく親機に組み込まれていないか、カード抜けの可能性があります。 @retval ResultChildTooLarge 子機プログラムのインポートサイズが規定 ( MAX_CHILD_IMPORT_SIZE ) を超えています。 @retval ResultInvalidRegion 子機プログラムのリージョンが本体リージョンと異なります。 *--------------------------------------------------------------------------*/ static nn::Result Initialize( nn::Handle eventHandle, u8 maxClientNum, u8 childIndex, void* pBuffer, size_t bufferSize, size_t blockBufferSize = MIN_NETWORK_BLOCK_BUFFER_SIZE * 2, size_t blockBufferNum = MIN_NETWORK_BLOCK_BUFFER_NUM); /*!--------------------------------------------------------------------------* @brief サーバを終了します。 @return 処理の結果が返ってきます。 @retval ResultSuccess 終了が成功しました。 *--------------------------------------------------------------------------*/ static nn::Result Finalize(); /*!--------------------------------------------------------------------------* @brief サーバの状態を取得します。 @param[out] pState サーバの状態を返します。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess 状態の取得が成功しました。 *--------------------------------------------------------------------------*/ static nn::Result GetState(ServerState* pState); /*!--------------------------------------------------------------------------* @brief 到着しているイベントをキューから取得します。 現在のキューのサイズはイベント32個分です。キューがいっぱいになると、古いイベントから消去され新しいイベントが追加されます。
イベントがない場合、本API はブロックせず ResultNoData() の返すエラーコードを 返します。
なお、 イベントを取得しなくても各種状態取得 API を利用すれば処理を行えます。 @param[out] pEventDesc イベントを読み込み先を指定します。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess イベントの取得が成功しました。 @retval ResultNoData イベントがありません。 *--------------------------------------------------------------------------*/ static nn::Result GetEventDesc(EventDesc* pEventDesc); /*!--------------------------------------------------------------------------* @brief ダウンロードセッションを開始します。 @param[in] isManualAccept true : AcceptClient でクライアントの接続を許可します。 false : 無条件に接続を許可します。 @param[in] channel チャンネルを0(自動選択)、1、6、11 から指定してください。製品機 では 0 が強制的に選ばれます。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess セッションの開始が成功しました。 @retval ResultOutOfRange 不正なチャンネルを指定しています。 @retval ResultInvalidState 状態が不正です。 SERVER_STATE_INITIALIZED で使用してください。 @retval ResultWirelessOff 通信できない状態(スリープあるいは Wifi ボタンが OFF)です。 *--------------------------------------------------------------------------*/ static nn::Result OpenSessions(bool isManualAccept = false, u8 channel = 0); /*!--------------------------------------------------------------------------* @brief クライアントの接続を許可します。 isManualAccept 引数 を true で OpenSession() を呼ぶと、クライアントは接続後に CLIENT_STATE_WAITING_ACCEPT 状態になり
サーバからの許可を待ち続けます。このクライアントの接続を許可するには本 API を呼んでください。
呼び出し後、クライアントは CLIENT_STATE_WAITING_INVITE 状態へ遷移します。なお、接続を拒否する場合、DisconnectClient() でクライアントを切断してください。 @param[in] nodeId クライアントのノード ID を指定します。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess 接続許可が成功しました。 @retval ResultInvalidState 状態が不正です。 SERVER_STATE_OPENED_SESSIONS 状態(OpenSessions() が成功した後) で使用してください。 @retval ResultNoData 指定されたノード ID を持つノードは接続されていません。 *--------------------------------------------------------------------------*/ static nn::Result AcceptClient(u16 nodeId); /*!--------------------------------------------------------------------------* @brief クライアントのネットワーク接続を強制的に切断します。 接続しているクライアントをネットワークから切断します。 @param[in] nodeId クライアントのノード ID を指定します。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess 切断が成功しました。 @retval ResultInvalidState 状態が不正です。 SERVER_STATE_OPENED_SESSIONS 状態(OpenSessions() が成功した後) で使用してください。 @retval ResultWirelessOff 通信できない状態(スリープあるいは Wifi ボタンが OFF)です。 *--------------------------------------------------------------------------*/ static nn::Result DisconnectClient(u16 nodeId); /*!--------------------------------------------------------------------------* @brief ダウンロードデータセッションを開始します。 本 API の呼び出し以降、新たにクライアントの接続は行えません。また、本 API の呼び出し時に CLIENT_STATE_WAITING_ACCEPT 状態のクライアントは切断されます。
サーバは子機プログラムだけでなく子機プログラムのブートに必要なシステムを配信することがあります。サーバは、システムをダウンロードしたクライアントが切断の後にサーバへ再接続して来るまで
永遠に SERVER_STATE_WAITING_RECONNECT 状態で待ち続けます。しかし、クライアントは必ず再接続してくるとは限りませんので、SERVER_STATE_WAITING_RECONNECT 状態では
ユーザがいつでもダウンロードデータセッションを停止できるようにしてください。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess セッションの開始が成功しました。 @retval ResultInvalidState 状態が不正か、AcceptClient()されたクライアントがいません。SERVER_STATE_OPENED_SESSIONS 状態(OpenSessions() が成功した後) で使用してください。 @retval ResultWirelessOff 通信できない状態(スリープあるいは Wifi ボタンが OFF)です。 @retval ResultFailedToAccessMedia メディアにアクセスできませんでした。カード抜けの可能性があります。 *--------------------------------------------------------------------------*/ static nn::Result StartDistribute(); /*!--------------------------------------------------------------------------* @brief 全てのクライアントへリブート要求を出します。 全てのクライアントが切断されてから、CloseSessions() あるいは Finalize() を呼んでください。
クライアントの切断は、GetConnectingClients() のクライアント数から判断してください。
クライアントがリブート後に子機として再接続してくる保証はありません。親機として子機を待ち受ける場合は注意してください。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess リブート要求をクライアントへ出しました。 ResultInvalidState 状態が不正です。ダウンロードが完了した状態 (SERVER_STATE_COMPLETE_DISTRIBUTION) で使用してください。 *--------------------------------------------------------------------------*/ static nn::Result RebootAllClients(); /*!--------------------------------------------------------------------------* @brief ダウンロードセッションを停止します。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess 停止が成功しました。 *--------------------------------------------------------------------------*/ static nn::Result CloseSessions(); /*!--------------------------------------------------------------------------* @brief 接続しているクライアントの数を取得します。 @param[out] pNum pClients に格納されたクライアント ID の数を返します。 @param[out] pClients クライアントのノードIDを返します。 @param[in] size pClients の配列の個数を指定します。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess クライアント数の取得が成功しました。 @retval ResultInvalidState 状態が不正です。OpenSessions() が成功した( SERVER_STATE_OPENED_SESSIONS ) 以降、SERVER_STATE_ERROR 状態でない限り使用できます。 *--------------------------------------------------------------------------*/ static nn::Result GetConnectingClients(u16* pNum, u16 clients[], u16 size); /*!--------------------------------------------------------------------------* @brief クライアントの情報を取得します。 @param[out] pNodeInfo クライアントの情報を返します。 @param[in] nodeId クライアントのノードIDを指定します。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess クライアント情報の取得が成功しました。 @retval ResultInvalidState 状態が不正です。OpenSessions() が成功した( SERVER_STATE_OPENED_SESSIONS ) 以降、SERVER_STATE_ERROR 状態でない限り使用できます。 @retbal ResultNoData 指定されたノード ID を持つクライアントは接続されていません。 *--------------------------------------------------------------------------*/ static nn::Result GetClientInfo( NodeInfo* pClientInfo, u16 nodeId); /*!--------------------------------------------------------------------------* @brief クライアントの状態、ダウンロードの進捗などを取得します。 @param[out] pClientStatus クライアントの情報、状態、ダウンロードの進捗などを返します。 @param[in] nodeId クライアントのノードIDを指定します。 @return 処理の結果として以下の Result が返ってきます。 @retval ResultSuccess クライアントの状態取得が成功しました。 @retval ResultInvalidState 状態が不正です。OpenSessions() が成功した( SERVER_STATE_OPENED_SESSIONS ) 以降、SERVER_STATE_ERROR 状態でない限り使用できます。 @retbal ResultNoData 指定されたノード ID を持つクライアントは接続されていません。 *--------------------------------------------------------------------------*/ static nn::Result GetClientStatus( ClientStatus* pClientStatus, u16 nodeId); }; } // namespace CTR } // namespace dlp } // namespace nn #endif // __cplusplus #endif // ifndef NN_DLP_CTR_DLP_SERVER_H_