// ResponseManger.cpp: implementation of the CResponseManger class. // ////////////////////////////////////////////////////////////////////// #ifdef _WIN32 #include #endif #include #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++; } } } }