#pragma once //关键段 class CSimpleCriticalSection { private: CRITICAL_SECTION FSection; public: CSimpleCriticalSection(){InitializeCriticalSection(&FSection);} virtual ~CSimpleCriticalSection(){DeleteCriticalSection(&FSection);} void Enter(){EnterCriticalSection(&FSection);} void Leave(){LeaveCriticalSection(&FSection);} }; //循环缓冲区类 class CBufferLoop { private: int FSize; //缓冲区大小 int FStart; //有效数据头 int FEnd; //有效数据尾 int FLength; //有效数据长度 BYTE* FBuffer; //缓冲区地址 protected: CSimpleCriticalSection* cs; protected: INT16 Append(const unsigned char* Src, const UINT32 alen) { INT16 len = (alen > (UINT32) FSize) ? FSize : (INT16) alen; //assert(len > 0); //缓存剩余空间不够Length if ((len + FLength) >= FSize) len = FSize - FLength; if ((len + FEnd) >= FSize) { //缓存内数据块后部空间不够Length,将数据块移到缓存首地址 memcpy(FBuffer, FBuffer + FStart, FLength); FStart = 0; FEnd = FLength; } memcpy(FBuffer + FEnd, Src, len); FEnd += len; FLength += len; return len; } void Drop(const int len) { //assert(len > 0); if (len > FLength) { FStart = 0; FEnd = 0; FLength = 0; } else { FStart += len; FLength -= len; } } int Size(){return FSize;} int Length(){return FLength;} public: CBufferLoop() : FSize(512), FStart(0), FEnd(0), FLength(0), FBuffer(0),cs(new CSimpleCriticalSection()) { FBuffer = new unsigned char[FSize]; memset(FBuffer, 0, FSize); }; CBufferLoop(const CBufferLoop& abl) : FSize(abl.FSize), FStart(abl.FStart), FEnd(abl.FEnd), FLength(abl.FLength), FBuffer(0) { FBuffer = new unsigned char[FSize]; memcpy(FBuffer, abl.FBuffer, FSize); } virtual ~CBufferLoop(){ delete[] FBuffer; FBuffer = 0; delete cs; } CBufferLoop& operator=(const CBufferLoop& abl) { if (this == &abl) return *this; // 见条款17 if (FBuffer) delete[] FBuffer; FSize = abl.FSize; FStart = abl.FStart; FEnd = abl.FEnd; FLength = abl.FLength; FBuffer = new unsigned char[FSize]; memcpy(FBuffer, abl.FBuffer, FSize); return *this; } BYTE* const Addr() {return FBuffer + FStart;} void Reset() { memset(FBuffer, 0, FSize); FStart = 0; FEnd = 0; FLength = 0; } //重新申请缓冲区 void CBufferLoop::AllocMemory(int len) { if ( (len > FSize) && (FSize >= 0) && (len < 64 * 1024 * 1024) ) { unsigned char *temp = new unsigned char[len]; if(temp != NULL) { if (FBuffer != 0) { if (FLength > 0) { #ifndef __MSDOS__ cs->Enter(); #endif memcpy((void*)temp, (void*)(FBuffer + FStart), (unsigned int)FLength); FSize = len; FStart = 0; FEnd = FLength; #ifndef __MSDOS__ cs->Leave(); #endif } else { FSize = len; FStart = 0; FEnd = 0; FLength = 0; } delete[] FBuffer; } FBuffer = temp; } } } };