Initial commit

This commit is contained in:
2026-07-09 11:27:59 +08:00
commit 3f1edda843
126 changed files with 34446 additions and 0 deletions
+184
View File
@@ -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++;
}
}
}
}