237 lines
5.6 KiB
C++
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++;
|
|
}
|
|
}
|
|
}
|
|
}
|