/*-------------------------------------------------------------------------- Project: HorizonSDK File: rdt_ReceiveBuffer.h Copyright 2009 Nintendo. 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. $Date:: 2010-04-30#$ $Rev: 15289 $ $Author: hiratsu_daisuke $ *-------------------------------------------------------------------------*/ #include "stdafx.h" #ifndef NN_RDT_RECEIVEBUFFER_H_ #define NN_RDT_RECEIVEBUFFER_H_ #include "rdt_RingBuffer.h" namespace nn { namespace rdt { namespace CTR { /*! @brief これは受信バッファを表現するためのクラスです。 ネットワーク経由で到着したセグメントは解釈された後、 実データがこのバッファに追加されていきます。 */ class ReceiveBuffer{ public: /*! @brief 初期化します。 */ ReceiveBuffer(void); /*! @brief 解放します。 */ ~ReceiveBuffer(void); /*! @brief 初期化します。初期シーケンス番号はゼロにセットされます。 必要であれば、SetInitialSequenceNumber()を後で呼び出して下さい。 */ void Initialize(void *pBuf, u16 bufSize); /*! @brief 解放処理を行います。 */ void Finalize(void); /*! @brief numには、初期シーケンス番号をセットします。 実際に到着するデータの先頭のシーケンス番号は、ここで設定した値に +1されたものであるとします。 この関数は、データをこのウィンドウに詰める前に呼び出しておかねばなりません。 */ void SetInitialSequenceNumber(u32 num); /*! @brief データ列の先頭からnバイトを除去します。 データ列の長さよりも大きな数値が指定された場合は、データの全てが除去されます。 */ void Pop(size_t n); /*! @brief ウィンドウにデータを追加します。 バッファが不足しており、データを追加するのに充分な空きが無い場合には falseが返ります。 */ bool Push(const void *pBuf, size_t len); /*! @brief ウィンドウからデータを読み出します。 この関数呼び出しのみでは、このオブジェクトに保持されている データは除去されません。 読み出すことのできたバイト数が返ります。 */ size_t Read(void *pBuf, size_t len); /*! @brief 到着しているデータのうち、最新データ(最新オクテット)の シーケンス番号を得ます。 */ u32 GetLatestSequenceNumber(void) const; /*! @brief バッファの空きがどれだけあるかを得ます。単位はバイト(オクテット)です。 */ size_t GetRestSize(void) const; /*! @brief 保持されているデータを破棄し、まっさらな状態に戻します。 Initialize()直後の状態に戻るイメージです。 */ void Clear(void); /*! @brief バッファがカラッポかどうかを判定します。 */ bool IsEmpty(void) const; /*! @brief このオブジェクトの状態をプリントします。(デバッグ用) */ void PrintDebugInfo(void) const; /*! @brief CUnitによる単体テストです。 */ static void Test(void); private: /*! @brief コピーコンストラクタは封印します。 */ ReceiveBuffer (const ReceiveBuffer&); /*! @brief 代入演算子は封印します。 */ ReceiveBuffer& operator=(const ReceiveBuffer&); // メンバ変数群 RingBuffer m_ringBuf; u32 m_initSeqNum; // 初期シーケンス番号 u32 m_latestSeqNum; bool m_initialized; // 初期化済みならtrue // パディング u8 m_padding[3]; }; }}} // namespace nn::rdt::CTR #endif // end of NN_RDT_RECEIVEBUFFER_H_