You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
2.8 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}
}
}
};