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.

134 lines
2.9 KiB
C

2 years ago
#pragma once
//<2F>ؼ<EFBFBD><D8BC><EFBFBD>
class CSimpleCriticalSection {
private:
CRITICAL_SECTION FSection;
public:
CSimpleCriticalSection(){InitializeCriticalSection(&FSection);}
virtual ~CSimpleCriticalSection(){DeleteCriticalSection(&FSection);}
void Enter(){EnterCriticalSection(&FSection);}
void Leave(){LeaveCriticalSection(&FSection);}
};
//ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class CBufferLoop {
private:
int FSize; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
int FStart; //<2F><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ͷ
int FEnd; //<2F><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>β
int FLength; //<2F><>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
BYTE* FBuffer; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
protected:
CSimpleCriticalSection* cs;
protected:
INT16 Append(const unsigned char* Src, const UINT32 alen)
{
INT16 len = (alen > (UINT32) FSize) ? FSize : (INT16) alen;
//assert(len > 0);
//<2F><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ռ<D5BC><E4B2BB>Length
if ((len + FLength) >= FSize)
len = FSize - FLength;
if ((len + FEnd) >= FSize) {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>󲿿ռ<D5BC><E4B2BB>Length<74><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
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(){
2 years ago
delete[] FBuffer;
FBuffer = 0;
//by CYH <20><>ע<EFBFBD>ͻᱨ<CDBB><E1B1A8><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>δ֪
//delete cs;
2 years ago
}
CBufferLoop& operator=(const CBufferLoop& abl)
{
if (this == &abl)
return *this; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>
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;
}
}
}
};