Initial commit
This commit is contained in:
@@ -0,0 +1,236 @@
|
||||
// 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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user