Esempio n. 1
0
File: tlv.c Progetto: softirq/common
/*-----------------------------------------------------------------------------
 *  get number tlv value
 *-----------------------------------------------------------------------------*/
int GetNumTlvValue(char **ppCur, int *piLeftLen,uint16_t wLen, NumTlvValue *pstNumTlvValue)
{
    if(ppCur == NULL || piLeftLen == NULL || pstNumTlvValue == NULL || wLen == 0 || wLen > MAX_NUMBER_TLV_LEN)
    {
        return -1;
    }
    if(wLen == CHAR_LEN)
    {
        if((GetChar(ppCur, piLeftLen, &(pstNumTlvValue->cValue))) != 0)
            return -2;
    }
    else if(wLen == WORD_LEN)
    {
        if((GetWord(ppCur, piLeftLen, &(pstNumTlvValue->wValue))) != 0)
            return -3;
    }
    else if(wLen == DWORD_LEN)
    {
        if((GetDWord(ppCur, piLeftLen, &(pstNumTlvValue->dwValue))) != 0)
            return -4;
    }
    else if(wLen == DDWORD_LEN)
    {
        if((GetDDWord(ppCur, piLeftLen, &(pstNumTlvValue->ddwValue))) != 0)
            return -5;
    }
    else
    {
        printf("GetNumTlvValue error. wLen = %d\n", wLen);
        return -6;
    }

    return 0;
}
Esempio n. 2
0
/**
 * 解包push消息的响应
 */
int ParsePkg(const uint8_t *pPkg, int iPkgLen, tASecMsgHead &stHead, tASecPushMsgRsp &stRsp)
{
	if (iPkgLen <= (int)sizeof(tASecMsgHead)+2)
	{
		return -1;
	}

	if (pPkg[0] != 0x02 ||
		pPkg[iPkgLen-1] != 0x03)
	{
		return -2;
	}

	memcpy(&stHead, pPkg+1, sizeof(stHead));
	Ntoh(&stHead);

	if (stHead.usLength != iPkgLen ||
			MSG_TYPE_PUSH_MSG_RSP != stHead.usMsgType)
	{
		return -3;
	}

	char *pCur = (char*)pPkg+1/*STX*/+sizeof(tASecMsgHead);
	int iLeftLen = iPkgLen-1-sizeof(tASecMsgHead);

	CK_RET(GetDWord(&pCur, &iLeftLen, (uint32_t*)&stRsp.ulRet), -4);
	CK_RET(GetString(&pCur, &iLeftLen, stRsp.aszErrMsg, sizeof(stRsp.aszErrMsg)), -5);

	if (iLeftLen != 1)
	{
		return -7;
	}

	return 0;
}
Esempio n. 3
0
/*
 *解消息包
 */
int ParsePkg(const uint8_t *pPkg, int iPkgLen, tASecMsgBody &stBody)
{
	char *pCur = (char*)pPkg;
	int iLeftLen = iPkgLen;

	CK_RET(GetDlWord(&pCur, &iLeftLen, &stBody.ullTknSeq), -1);
	CK_RET(GetString(&pCur, &iLeftLen, stBody.aszUin, sizeof(stBody.aszUin)), -2);
	CK_RET(GetDWord(&pCur, &iLeftLen, &stBody.ulMsgId), -3);

	stBody.ucType = *pCur;
	pCur++;

	stBody.ucSubType = *pCur;
	pCur++;

	CK_RET(GetDWord(&pCur, &iLeftLen,  &stBody.ulTime), -4);
	CK_RET(GetString(&pCur, &iLeftLen, stBody.aszTitle, sizeof(stBody.aszTitle)), -5);
	CK_RET(GetString(&pCur, &iLeftLen, stBody.aszMsg, sizeof(stBody.aszMsg)), -6);

	return 0;
}