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