Example #1
0
//********************************************************************
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;
}
Example #2
0
//********************************************************************
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;
}
Example #3
0
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;
}
Example #4
0
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
}