//******************************************************************** static TBASE_VALUE* _AllocValue(DWORD a_dwType, TBASE_VALUE_DATA *a_pData, DWORD a_cbSize, BOOL a_bValidate) { TBASE_VALUE* pValue = NULL; DWORD cbSize = 0; TTaskInfo* pTaskInfo = TASK_GetCurrent(); if (pTaskInfo==NULL) return NULL; //----------------------------------------------------------- if (a_bValidate) if (!_ValidateData(a_dwType, a_pData, a_cbSize)) { TASK_SetErrorInfo(TRERR_INVALID_DATA, NULL, NULL); return NULL; }; cbSize = _GetDataSize(a_dwType, a_pData, a_cbSize); //----------------------------------------------------------- if (cbSize==0) { TASK_SetErrorInfo(TRERR_INVALID_TYPE, NULL, NULL); return NULL; } //----------------------------------------------------------- pValue = (TBASE_VALUE*)malloc(cbSize); pValue->dwType = a_dwType; pValue->cbSize = cbSize; pValue->dwRefCount = 1; // wype³nij... memcpy(&pValue->data, a_pData, cbSize-offsetof(TBASE_VALUE, data)); pTaskInfo->m_setPointers.insert(pValue); return pValue; }
//******************************************************************** BOOL WINAPI TBASE_ReAllocValue(TBASE_VALUE** a_ppValue, DWORD a_dwType, TBASE_VALUE_DATA *a_pData, DWORD a_cbSize) { TBASE_VALUE* pValue = NULL; DWORD cbSize = 0; TTaskInfo* pTaskInfo = TASK_GetCurrent(); TPtrIter iter; if (pTaskInfo==NULL) return NULL; //----------------------------------------------------------- if (IsBadWritePtr(a_ppValue, sizeof(TBASE_VALUE*))) { TASK_SetErrorInfo(TRERR_INVALID_PARAMETER, NULL, NULL); return FALSE; } pValue = *a_ppValue; //---------------------------------------------------------- iter = pTaskInfo->m_setPointers.find(pValue); if (iter==pTaskInfo->m_setPointers.end()) { TASK_SetErrorInfo(TRERR_INVALID_PARAMETER, NULL, NULL); return FALSE; } //---------------------------------------------------------- if (!_ValidateData(a_dwType, a_pData, a_cbSize)) { TASK_SetErrorInfo(TRERR_INVALID_DATA, NULL, NULL); return NULL; }; //----------------------------------------------------------- cbSize = _GetDataSize(a_dwType, a_pData, a_cbSize); //----------------------------------------------------------- if (cbSize==0) { TASK_SetErrorInfo(TRERR_INVALID_TYPE, NULL, NULL); return FALSE; } //----------------------------------------------------------- pValue = (TBASE_VALUE*)realloc(pValue, cbSize); pValue->dwType = a_dwType; pValue->cbSize = cbSize; // wype³nij... memcpy(&pValue->data, a_pData, cbSize-offsetof(TBASE_VALUE, data)); *a_ppValue = pValue; *iter = pValue; return TRUE; }
CPktQue::QUEUE_RESULT CPktQue::Pop(CPacket* pPkt) { if(pPkt == NULL) { Logout(_T("#ERR(%d) QRES_IMPROPER_PARAM"), __LINE__); return QRES_IMPROPER_PARAM; } QUEUE_RESULT QueRes = QRES_OK; char* pOutBuf = pPkt->GetBuf(); cs.Lock(); // read packet header int iDataSize = _GetDataSize(); int iFrontDataSize = _GetFrontDataSize(); int r_old = r; if(iDataSize < TCP_PH_SIZE) { cs.Unlock(); return QRES_NOT_ENOUGH_DATA; } if(iFrontDataSize > TCP_PH_SIZE) { memcpy(pOutBuf, pBuf + r, TCP_PH_SIZE); r += TCP_PH_SIZE; } else if(iFrontDataSize < TCP_PH_SIZE) { memcpy(pOutBuf, pBuf + r, iFrontDataSize); memcpy(pOutBuf + iFrontDataSize, pBuf, TCP_PH_SIZE - iFrontDataSize); r = TCP_PH_SIZE - iFrontDataSize; } else /*if(iFrontDataSize == TCP_PH_SIZE)*/ { memcpy(pOutBuf, pBuf + r, TCP_PH_SIZE); r += TCP_PH_SIZE; if(r == QUEUE_BUF_SIZE) r = 0; } #if defined(_NEXON_NETWORK_) // 하나의 패킷 중 헤더를 제외한 데이터 크기 int iContentLen = (int)(ConvertByteOrder2(pPkt->GetHeader()->GetPktSize()) - 1); #else // 하나의 패킷 중 헤더를 제외한 데이터 크기 int iContentLen = pPkt->GetHeader()->GetPktSize() - TCP_PH_SIZE; #endif // read packet data pOutBuf = pPkt->GetContents(); iDataSize = _GetDataSize(); iFrontDataSize = _GetFrontDataSize(); if(iDataSize < iContentLen) { r = r_old; QueRes = QRES_NOT_ENOUGH_DATA; } else /*if(iDataSize >= iContentLen)*/ { if(iFrontDataSize == iContentLen) { memcpy(pOutBuf, pBuf + r, iContentLen); r += iContentLen; if(r == QUEUE_BUF_SIZE) r = 0; } else if(iFrontDataSize > iContentLen) { memcpy(pOutBuf, pBuf + r, iContentLen); r += iContentLen; } else /*if(iFrontDataSize < iContentLen)*/ { memcpy(pOutBuf, pBuf + r, iFrontDataSize); memcpy(pOutBuf + iFrontDataSize, pBuf, iContentLen - iFrontDataSize); r = iContentLen - iFrontDataSize; } } cs.Unlock(); return QueRes; }
CWebShopPktQueue::QUEUE_RESULT CWebShopPktQueue::Pop(OUT char* pOutBuf) { if(pBuf == NULL) { return QRES_NOT_INITIALIZED; } #define RESERVED_CHAR_SIZE 1 /*ReservedChar*/ #define CONTENT_LEN_SIZE 2 /*ContentLength(2)*/ #define PKT_HEADER_SIZE (RESERVED_CHAR_SIZE + CONTENT_LEN_SIZE) CS_LOCK(csThis); // read packet header int iDataSize = _GetDataSize(); int iFrontDataSize = _GetFrontDataSize(); int r_old = r; if(iDataSize < PKT_HEADER_SIZE) { CS_UNLOCK(csThis); return QRES_NOT_ENOUGH_DATA; } if(iFrontDataSize > PKT_HEADER_SIZE) { memcpy(pOutBuf, pBuf + r, PKT_HEADER_SIZE); r += PKT_HEADER_SIZE; } else if(iFrontDataSize < PKT_HEADER_SIZE) { memcpy(pOutBuf, pBuf + r, iFrontDataSize); memcpy(pOutBuf + iFrontDataSize, pBuf, PKT_HEADER_SIZE - iFrontDataSize); r = PKT_HEADER_SIZE - iFrontDataSize; } else if(iFrontDataSize == PKT_HEADER_SIZE) { memcpy(pOutBuf, pBuf + r, PKT_HEADER_SIZE); r = 0; } int iContentLen = *(LPWORD)(pOutBuf + RESERVED_CHAR_SIZE); // read packet data iDataSize = _GetDataSize(); iFrontDataSize = _GetFrontDataSize(); if(iDataSize < iContentLen) { r = r_old; CS_UNLOCK(csThis); return QRES_NOT_ENOUGH_DATA; } if(iFrontDataSize == iContentLen) { memcpy(pOutBuf, pBuf + r, iContentLen); r = f; } else if(iFrontDataSize > iContentLen) { memcpy(pOutBuf, pBuf + r, iContentLen); r += iContentLen; } else if(iFrontDataSize < iContentLen) { memcpy(pOutBuf, pBuf + r, iFrontDataSize); memcpy(pOutBuf + iFrontDataSize, pBuf, iContentLen - iFrontDataSize); r = iContentLen - iFrontDataSize; } CS_UNLOCK(csThis); return QRES_OK; #undef RESERVED_CHAR_SIZE #undef CONTENT_LEN_SIZE #undef PKT_HEADER_SIZE }