DDLNode *ExprElements(DDLNode *expr) { //debug << "push expr only" <<"\n"; ArrayData *ad = new ArrayData(); ad->Push(expr); return ad; }
MsgStatus CMessage2Parser::_ParserParam( CMessage* pMsg, const CBufferMessage& pBuf ) { uint8* pData = pBuf.GetBuffer(); int nParserIndex = MSG_HEAD_LEN; std::string strParam; int ArrSize = 0; std::vector<std::string> vecStrParam; std::vector<uint8> vecUint8Param; std::vector<uint16> vecUint16Param; std::vector<uint32> vecUint32Param; ArrayData* pArrData = NULL; uint8 NumByte[4] = {0}; for (auto It = pMsg->PortBegin(); It != pMsg->PortEnd(); It++) { pArrData = new ArrayData; switch (It->second.first) { case MsgDataMType_Data: switch (It->second.second) { case MsgDataType_String: for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } for (int index = 0; index < _ByteToInt(NumByte); index++) { if ((_ByteToInt(NumByte) == 1) && (pData[nParserIndex] == 0)) { nParserIndex++; break; } strParam.push_back(pData[nParserIndex]); nParserIndex++; } pMsg->Write(It->first, new StringData(strParam)); strParam.clear(); memset(NumByte, 0, 4); break; case MsgDataType_Uint8: pMsg->Write(It->first, new NumData<uint8>(pData[nParserIndex])); nParserIndex++; break; case MsgDataType_Uint16: for (int index = 0; index < sizeof(uint16); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } pMsg->Write(It->first, new NumData<uint16>(_ByteToInt(NumByte))); memset(NumByte, 0, 4); break; case MsgDataType_Uint32: for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } pMsg->Write(It->first, new NumData<uint32>(_ByteToInt(NumByte))); memset(NumByte, 0, 4); break; } break; case MsgDataMType_List: for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } ArrSize = _ByteToInt(NumByte); memset(NumByte, 0, 4); for (int index = 0; index < ArrSize; index++) { if (It->second.second == MsgDataType_String) { for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } for (int index = 0; index < _ByteToInt(NumByte); index++) { if ((_ByteToInt(NumByte) == 1) && (pData[nParserIndex] == 0)) { nParserIndex++; break; } strParam.push_back(pData[nParserIndex]); nParserIndex++; } vecStrParam.push_back(strParam); strParam.clear(); memset(NumByte, 0, 4); } else if (It->second.second == MsgDataType_Uint8) { vecUint8Param.push_back(pData[nParserIndex]); nParserIndex++; } else if (It->second.second == MsgDataType_Uint16) { for (int index = 0; index < sizeof(uint16); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } vecUint16Param.push_back(_ByteToInt(NumByte)); memset(NumByte, 0, 4); } else if (It->second.second == MsgDataType_Uint32) { for (int index = 0; index < sizeof(uint32); index++) { NumByte[index] = pData[nParserIndex]; nParserIndex++; } vecUint32Param.push_back(_ByteToInt(NumByte)); memset(NumByte, 0, 4); } } if (!vecStrParam.empty()) { pArrData->Push(vecStrParam); vecStrParam.clear(); } if (!vecUint8Param.empty()) { pArrData->Push(vecUint8Param); vecUint8Param.clear(); } if (!vecUint16Param.empty()) { pArrData->Push(vecUint16Param); vecUint16Param.clear(); } if (!vecUint32Param.empty()) { pArrData->Push(vecUint32Param); vecUint32Param.clear(); } pMsg->WriteArr(It->first, pArrData); break; default: return MsgStatus_Err; } } return MsgStatus_Ok; }