Files
DBService/ComposeService/DataBuffers.cpp
T
2026-07-09 11:27:59 +08:00

237 lines
5.6 KiB
C++

// DataReceiver.cpp: implementation of the CDataReceiver class.
//
//////////////////////////////////////////////////////////////////////
//#include <windows.h>
#include <stdlib.h>
#include "debug.h"
#include "DataBuffers.h"
#include "MessageDef.h"
#define MAX_BUFFER_NUM 500
//////////////////////////////////////////////////////////////////////
// CDataReceiver
//////////////////////////////////////////////////////////////////////
CDataBufferManager::CDataBufferManager()
:m_smProcess("mDBMProcess",1)
{
m_seqFileNo = 1;
}
CDataBufferManager::~CDataBufferManager()
{
CMutexLock lockProcess( &m_smProcess );
if( m_lstBuffers.size()>0 ){
DATABUFFERLIST::iterator iter = m_lstBuffers.begin();
while( iter!=m_lstBuffers.end() ){
delete *iter;
iter++;
}
m_lstBuffers.clear();
}
}
int CDataBufferManager::NewDataBuffer( int idUser, int iType, int nDataSize, char* pData, int iClientType )
{
CMutexLock lockProcess( &m_smProcess );
if( m_lstBuffers.size()>0 ){
DATABUFFERLIST::iterator iter = m_lstBuffers.begin();
while( iter!=m_lstBuffers.end() ){
DATABUFFER *pBuffer = (*iter);
if( pBuffer->iDataType==iType && pBuffer->idUser==idUser && pBuffer->iClientType==iClientType && pBuffer->nDataSize==nDataSize){
pBuffer->idPack = pBuffer->nRecvSize = pBuffer->tSeconds = 0;
// DebugPrint("repeat buffer %d (type: %d)", pBuffer->idBuffer, iType);
return -pBuffer->idBuffer;
}
iter++;
}
}
if( m_lstBuffers.size()>MAX_BUFFER_NUM ){
DebugPrint("buffer full!!!");
return ERR_BUFFER_NUM;
}
//分配文件号
int idFile = m_seqFileNo++;
if( m_seqFileNo>MAX_BUFFER_ID ) m_seqFileNo = 1;
//创建DataBuffer
DATABUFFER * pBuffer = new DATABUFFER;
pBuffer->idUser = idUser;
pBuffer->idBuffer = idFile;
pBuffer->iDataType = iType;
pBuffer->nDataSize = nDataSize;
pBuffer->iClientType = iClientType;
pBuffer->idPack = pBuffer->nRecvSize = pBuffer->tSeconds = 0;
if( pData ){
pBuffer->pData = pData;
}
else{
pBuffer->pData = new char[nDataSize];
}
m_lstBuffers.push_back( pBuffer );
return idFile;
}
int CDataBufferManager::ReceiveData( int idBuffer, int idPack, int nSize, char* pNewData )
{
CMutexLock lockProcess( &m_smProcess );
if( m_lstBuffers.size()>0 ){
DATABUFFERLIST::iterator iter = m_lstBuffers.begin();
while( iter!=m_lstBuffers.end() ){
if( (*iter)->idBuffer==idBuffer ){
int ret = 0;
PDATABUFFER pBuffer = *iter;
pBuffer->tSeconds = 0;
if( idPack > pBuffer->idPack ){
ret = ERR_PACK_ID;
}
else if( idPack==pBuffer->idPack ){
if( nSize > pBuffer->nDataSize - pBuffer->nRecvSize ){
ret = ERR_DATA_SIZE;
}
else{
memcpy( pBuffer->pData + pBuffer->nRecvSize, pNewData, nSize );
pBuffer->nRecvSize += nSize;
pBuffer->idPack++;
if( pBuffer->nRecvSize==pBuffer->nDataSize ){
ret = ERR_DATA_END;
/* ret = SaveFile( pBuffer );
delete[] pBuffer->pData;
delete pBuffer;
m_lstBuffers.erase( iter );
*/
}
}
}
return ret;
}
iter++;
}
}
return ERR_DATA_ID;
}
int CDataBufferManager::GetData( int idBuffer, int idPack, int& nSize, char*& pData )
{
CMutexLock lockProcess( &m_smProcess );
if( m_lstBuffers.size()>0 ){
DATABUFFERLIST::iterator iter = m_lstBuffers.begin();
while( iter!=m_lstBuffers.end() ){
if( (*iter)->idBuffer==idBuffer ){
int ret = 0;
PDATABUFFER pBuffer = *iter;
pBuffer->tSeconds = 0;
if( idPack > pBuffer->idPack || idPack*MAX_PACK_SIZE > pBuffer->nDataSize ){
ret = ERR_PACK_ID;
}
else if( idPack==pBuffer->idPack || idPack==pBuffer->idPack-1 ){
if( (idPack+1)*MAX_PACK_SIZE<=pBuffer->nDataSize ){
nSize = MAX_PACK_SIZE;
}
else{
nSize = pBuffer->nDataSize % MAX_PACK_SIZE;
}
pData = pBuffer->pData + idPack*MAX_PACK_SIZE;
if( idPack==pBuffer->idPack )
pBuffer->idPack++;
}
else if( idPack==-1 ){ //客户端接收完成,删除数据
// DebugPrint( "delete buffer %d due to complete", (*iter)->idBuffer );
delete pBuffer;
m_lstBuffers.erase( iter );
}
return ret;
}
iter++;
}
}
return ERR_DATA_ID;
}
DATABUFFER * CDataBufferManager::GetBuffer( int idBuffer )
{
CMutexLock lockProcess( &m_smProcess );
if( m_lstBuffers.size()>0 ){
DATABUFFERLIST::iterator iter = m_lstBuffers.begin();
while( iter!=m_lstBuffers.end() ){
if( (*iter)->idBuffer==idBuffer ){
return *iter;
}
iter++;
}
}
return NULL;
}
void CDataBufferManager::DeleteBuffer( int idBuffer )
{
CMutexLock lockProcess( &m_smProcess );
if( m_lstBuffers.size()>0 ){
DATABUFFERLIST::iterator iter = m_lstBuffers.begin();
while( iter!=m_lstBuffers.end() ){
if( (*iter)->idBuffer==idBuffer ){
//DebugPrint( "delete buffer %d due to complete", (*iter)->idBuffer );
delete *iter;
iter = m_lstBuffers.erase( iter );
break;
}
else{
iter++;
}
}
}
}
void CDataBufferManager::OnTimer()
{
CMutexLock lockProcess( &m_smProcess );
if( m_lstBuffers.size()>0 ){
DATABUFFERLIST::iterator iter = m_lstBuffers.begin();
while( iter!=m_lstBuffers.end() ){
if( (*iter)->tSeconds>=30 ){ //超过半分钟无数据操作
// DebugPrint( "delete buffer %d due to timeout (type: %d)", (*iter)->idBuffer, (*iter)->iDataType );
delete *iter;
iter = m_lstBuffers.erase( iter );
}
else{
(*iter)->tSeconds++;
iter++;
}
}
}
}