// DataReceiver.cpp: implementation of the CDataReceiver class. // ////////////////////////////////////////////////////////////////////// //#include #include #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++; } } } }