네트워크 스트림 모델에 사용하려구 뚝딱뚝딱 만들었는데 아직 실제 사용하지는 않았구요 ^^
개념만 가지고 만들었는데 우선 기본적인 테스트로는 성공적으로 동작하니 안심(?)하셔도 될
것 같습니다.
스트림을 FIFO 방식으로 변경한 것입니다. ^^...
음... 여러모로 쓸모있는 클래스가 아닐까 생각됩니다만 헤헤 ^^... 그럼
즐빌하세요!
---- 헤더 입니다 -----
#ifndef unitZQueueStreamH
#define unitZQueueStreamH
#include <Classes.hpp>
#include "unitZSynchronize.h"
class TZQueueStream : public TZSynchronize
{
public:
TZQueueStream();
virtual ~TZQueueStream();
private:
TMemoryStream* FStream;
public:
int write(LPVOID pData, int iLen);
int read(LPVOID pData, int iLen);
int getbufSize();
};
#endif
----- 소스 입니다. -----
#include <SysUtils.hpp>
#include "unitZCommon.h"
#include "unitZGConout.h"
#pragma hdrstop
////
#include "unitZQueueStream.h"
#pragma package(smart_init)
/////////////////////////////////////////////////////////////////////
/* TODO 1 -onicekr -cImplementation : TZQueueStream Implementation */
/////////////////////////////////////////////////////////////////////
TZQueueStream::TZQueueStream()
: TZSynchronize()
{
FStream = new TMemoryStream();
FStream->SetSize(0);
}
TZQueueStream::~TZQueueStream()
{
SAFE_DELETE(FStream);
}
int TZQueueStream::write(LPVOID pData, int iLen)
{
try
{
this->TZSynchronize::Lock();
try
{
int iWriting = FStream->Write(pData, iLen);
#ifdef APP_NETWORK
AnsiString szTmp;
szTmp.sprintf("writing %d bytes, current buffer size %d bytes", iWriting, FStream->Size);
zout.trace("%s%s\n", APP_INFO, szTmp);
#endif
return iWriting;
}
__finally
{
this->TZSynchronize::Unlock();
}
}
catch( Exception &e )
{
#ifdef APP_EXCEPTION
if( e.Message.Length() )
zout.trace("%s%s\n", APP_EXCEPTION, e.Message);
else
zout.trace("%s%s\n", APP_EXCEPTION, DESC_UNKNOWN_EXCEPTION);
#endif
return -1;
}
return 0; //fake
}
int TZQueueStream::read(LPVOID pData, int iLen)
{
try
{
this->TZSynchronize::Lock();
try
{
FStream->Seek(0, soFromBeginning);
if( iLen > FStream->Size )
iLen = FStream->Size;
int iReading = FStream->Read(pData, iLen);
int iRemaining = FStream->Size - iReading;
memmove(FStream->Memory, &((LPBYTE)FStream->Memory)[iReading], iRemaining);
FStream->SetSize(iRemaining);
#ifdef APP_NETWORK
AnsiString szTmp;
szTmp.sprintf("reading %d bytes, remaining buffer size %d bytes", iReading, FStream->Size);
zout.trace("%s%s\n", APP_NETWORK, szTmp);
#endif
return iReading;
}
__finally
{
this->TZSynchronize::Unlock();
}
}
catch( Exception &e )
{
#ifdef APP_EXCEPTION
if( e.Message.Length() )
zout.trace("%s%s\n", APP_EXCEPTION, e.Message);
else
zout.trace("%s%s\n", APP_EXCEPTION, DESC_UNKNOWN_EXCEPTION);
#endif
return -1;
}
return 0; //fake
}
int TZQueueStream::getbufSize()
{
return FStream->Size;
}
|