/*----------------------------------------------------------------------------- * 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; }
/** * 解包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; }
/* *解消息包 */ 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; }