Initial commit
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
// ResponseManger.cpp: implementation of the CResponseManger class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "ResponseManager.h"
|
||||
#include "ServerInner.h"
|
||||
|
||||
#define MAX_RESPONSE_NUM 2000
|
||||
|
||||
int g_nMaxListSize = 0;
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// CDataReceiver
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
CResponseManager::CResponseManager()
|
||||
:m_smProcess("mRMProcess",1)
|
||||
{
|
||||
}
|
||||
|
||||
CResponseManager::~CResponseManager()
|
||||
{
|
||||
CMutexLock lockProcess( &m_smProcess );
|
||||
|
||||
int nSize = m_lstResponses.size();
|
||||
DebugPrint( "Response remain size = %d", nSize );
|
||||
|
||||
if( nSize>0 ){
|
||||
TRESPONSELIST::iterator iter = m_lstResponses.begin();
|
||||
while( iter!=m_lstResponses.end() ){
|
||||
delete *iter;
|
||||
iter++;
|
||||
}
|
||||
|
||||
m_lstResponses.clear();
|
||||
}
|
||||
}
|
||||
|
||||
bool CResponseManager::NewResponse( int iExtra, TNETMESSAGE* pResponse )
|
||||
{
|
||||
CMutexLock lockProcess( &m_smProcess );
|
||||
|
||||
if( m_lstResponses.size()>MAX_RESPONSE_NUM || !pResponse ){
|
||||
return false;
|
||||
}
|
||||
|
||||
TRESPONSENODE * pNode = new TRESPONSENODE;
|
||||
pNode->iExtra = iExtra;
|
||||
pNode->iTimeCount = 0;
|
||||
memcpy( &(pNode->response), pResponse, pResponse->nLength+14 );
|
||||
// DebugPrint("Insert response for msg: 0x%X - %d", pResponse->eMessageType, iExtra);
|
||||
m_lstResponses.push_back( pNode );
|
||||
|
||||
if( m_lstResponses.size()>g_nMaxListSize ){
|
||||
g_nMaxListSize = m_lstResponses.size();
|
||||
|
||||
if( g_nMaxListSize%10==0 ){
|
||||
DebugPrint( "response list max size = %d.", g_nMaxListSize );
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TNETMESSAGE* CResponseManager::GetResponse( TNETMESSAGE* pRequest )
|
||||
{
|
||||
CMutexLock lockProcess( &m_smProcess );
|
||||
|
||||
if( m_lstResponses.size()>0 ){
|
||||
TRESPONSELIST::iterator iter = m_lstResponses.begin();
|
||||
while( iter!=m_lstResponses.end() ){
|
||||
if( (*iter)->response.eMessageType==pRequest->eMessageType+1 ){
|
||||
if( !memcmp(pRequest->idDevice, (*iter)->response.idDevice, 6) ){
|
||||
if( (*iter)->response.nSequenceNum==pRequest->nSequenceNum ){ //同一请求多次发送
|
||||
(*iter)->iTimeCount = 0;
|
||||
return &((*iter)->response);
|
||||
}
|
||||
else if(pRequest->eMessageType>=e_iconRequest //非时效性请求
|
||||
|| (*iter)->iTimeCount<5){ //或5秒内相同的请求
|
||||
int iExtra = 0;
|
||||
if(pRequest->eMessageType==e_webURLRequest){
|
||||
TIntRequest * pUrlReq = (TIntRequest*)pRequest->byMessageBody;
|
||||
iExtra = pUrlReq->iReq;
|
||||
}
|
||||
else if(pRequest->eMessageType==e_styleScoreRequest){
|
||||
UINT idStyle;
|
||||
int scrUser, iType = e_ST_Origin;
|
||||
|
||||
if( pRequest->nLength==sizeof(TStyleScoreRequest) ){
|
||||
TStyleScoreRequest * pSSReq = (TStyleScoreRequest*)pRequest->byMessageBody;
|
||||
idStyle = pSSReq->idStyle;
|
||||
iType = pSSReq->iType;
|
||||
scrUser = pSSReq->scrUser;
|
||||
}
|
||||
else{
|
||||
TStyleScoreRequest0 * pSSReq = (TStyleScoreRequest0*)pRequest->byMessageBody;
|
||||
idStyle = pSSReq->idStyle;
|
||||
scrUser = pSSReq->scrUser;
|
||||
}
|
||||
|
||||
iExtra = (idStyle<<16) + (iType<<8) + scrUser;
|
||||
|
||||
if(scrUser>0 && (iExtra&0xFFF0)==((*iter)->iExtra&0xFFF0) && iExtra!=(*iter)->iExtra ){
|
||||
delete *iter;
|
||||
iter = m_lstResponses.erase(iter);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if(pRequest->eMessageType==e_styleInfoRequest){
|
||||
TStyleInfoRequest * pSIReq = (TStyleInfoRequest*)pRequest->byMessageBody;
|
||||
int iType = HIWORD( pSIReq->iType );
|
||||
if( iType==0 ){
|
||||
if( LOWORD( pSIReq->iType )==e_SM_Checker )
|
||||
iType = e_ST_Temp;
|
||||
else
|
||||
iType = e_ST_Origin;
|
||||
}
|
||||
iExtra = (iType<<16) + pSIReq->idStyle;
|
||||
}
|
||||
else if(pRequest->eMessageType==e_styleDataRequest){
|
||||
TStyleDataRequest * pSDReq = (TStyleDataRequest*)pRequest->byMessageBody;
|
||||
int iType = HIWORD( pSDReq->iType );
|
||||
if( iType==0 ){
|
||||
if( LOWORD( pSDReq->iType )==e_SM_Checker )
|
||||
iType = e_ST_Temp;
|
||||
else
|
||||
iType = e_ST_Origin;
|
||||
}
|
||||
iExtra = (iType<<16) + pSDReq->idStyle;
|
||||
}
|
||||
else if(pRequest->eMessageType==e_noticeUpdateRequest){
|
||||
TNoticeUpdateRequest * pNUReq = (TNoticeUpdateRequest*)pRequest->byMessageBody;
|
||||
iExtra = pNUReq->idUser;
|
||||
}
|
||||
else if(pRequest->eMessageType==e_qnaUpdateRequest){
|
||||
TQnAUpdateRequest * pQUReq = (TQnAUpdateRequest*)pRequest->byMessageBody;
|
||||
iExtra = (pQUReq->iClientType<<20) + pQUReq->idUser;
|
||||
}
|
||||
|
||||
if((*iter)->iExtra==iExtra){
|
||||
// DebugPrint("Got response for msg: 0x%X", pRequest->eMessageType);
|
||||
(*iter)->response.nSequenceNum = pRequest->nSequenceNum;
|
||||
(*iter)->iTimeCount = 0;
|
||||
return &((*iter)->response);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( pRequest->iExtra < 0x0D00 && (*iter)->response.nSequenceNum==pRequest->nSequenceNum
|
||||
&& ( pRequest->eMessageType==e_registerRequest || pRequest->eMessageType==e_qnaSubmitRequest )){
|
||||
(*iter)->iTimeCount = 0;
|
||||
return &((*iter)->response);
|
||||
}
|
||||
}
|
||||
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void CResponseManager::OnTimer()
|
||||
{
|
||||
CMutexLock lockProcess( &m_smProcess );
|
||||
|
||||
if( m_lstResponses.size()>0 ){
|
||||
TRESPONSELIST::iterator iter = m_lstResponses.begin();
|
||||
while( iter!=m_lstResponses.end() ){
|
||||
if( ++((*iter)->iTimeCount)>=30 ){ //超过30秒无数据操作
|
||||
// DebugPrint("Delete response for msg: 0x%X", (*iter)->response.eMessageType);
|
||||
delete *iter;
|
||||
iter = m_lstResponses.erase( iter );
|
||||
}
|
||||
else{
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user