Message* Packet::deserialize(std::istream& ifs) { std::vector<char> data; // Get the message header. data.resize(DUNE_IMC_CONST_HEADER_SIZE); ifs.read(&data[0], DUNE_IMC_CONST_HEADER_SIZE); // If we're at the EOF there's nothing more to do. if (ifs.eof()) return 0; if (ifs.gcount() < DUNE_IMC_CONST_HEADER_SIZE) throw BufferTooShort(); Header hdr; deserializeHeader(hdr, (uint8_t*)&data[0], DUNE_IMC_CONST_HEADER_SIZE); // Get remaining data. uint16_t remaining = hdr.size + DUNE_IMC_CONST_FOOTER_SIZE; data.resize(DUNE_IMC_CONST_HEADER_SIZE + remaining); ifs.read(&data[DUNE_IMC_CONST_HEADER_SIZE], remaining); if (ifs.gcount() < remaining) throw BufferTooShort(); return deserializePayload(hdr, (uint8_t*)&data[0], DUNE_IMC_CONST_HEADER_SIZE + remaining, 0); }
Message* Packet::deserialize(std::istream& ifs, Utils::ByteBuffer& bfr) { // Get the message header. bfr.setSize(DUNE_IMC_CONST_HEADER_SIZE); ifs.read(bfr.getBufferSigned(), DUNE_IMC_CONST_HEADER_SIZE); // If we're at the EOF there's nothing more to do. if (ifs.eof()) return 0; if (ifs.gcount() < DUNE_IMC_CONST_HEADER_SIZE) throw BufferTooShort(); Header hdr; deserializeHeader(hdr, bfr.getBuffer(), DUNE_IMC_CONST_HEADER_SIZE); // Get remaining data. uint16_t remaining = hdr.size + DUNE_IMC_CONST_FOOTER_SIZE; bfr.setSize(DUNE_IMC_CONST_HEADER_SIZE + remaining); ifs.read(bfr.getBufferSigned() + DUNE_IMC_CONST_HEADER_SIZE, remaining); if (ifs.gcount() < remaining) throw BufferTooShort(); return deserializePayload(hdr, bfr.getBuffer(), DUNE_IMC_CONST_HEADER_SIZE + remaining, 0); }
/******************************************************************************* * @author : Rohan Jyoti * @name : deserializeMembershipList * @param : Membership List to add to if necessary, Serialzed recv ML * @return : void * @purpose : Deserialized recv ML and add to specified ML if necessary ******************************************************************************/ void deserializeMembershipList(queue_t *incomingML, char *serializedML) { //remove /r/n/r/n delimiter and payloadAction serializedML[strlen(serializedML) - (ME_DELIM_SIZE + PA_SIZE)] = '\0'; int reached_end = NOT_SET; int pos, lastBrkpt=0; while(reached_end == NOT_SET) { for(pos=lastBrkpt; pos < (int)strlen(serializedML); pos++) { if(pos == (int)strlen(serializedML) - 1) { reached_end = IS_SET; //this is the case for last payload in series, or //if there is only one payload in ML char *tPayload; asprintf(&tPayload, "%s\r\n\r\n", serializedML+lastBrkpt); mPayload_t *aPayload = (mPayload_t *)deserializePayload(tPayload); //payload to add addToML(incomingML, aPayload); free(tPayload); break; } else { if(serializedML[pos] == '$') { char *tPayload = (char *)malloc(pos-lastBrkpt +1); strncpy(tPayload, serializedML + lastBrkpt, pos-lastBrkpt); tPayload[pos - lastBrkpt] = '\0'; char *tPayload_delimited; asprintf(&tPayload_delimited, "%s\r\n\r\n", tPayload); mPayload_t *aPayload = (mPayload_t *)deserializePayload(tPayload_delimited); //payload to add addToML(incomingML, aPayload); lastBrkpt = pos + 1; free(tPayload); free(tPayload_delimited); break; } } } } }
Message* Packet::deserialize(const uint8_t* bfr, uint16_t bfr_len, Message* msg) { Header hdr; // Get the message header. deserializeHeader(hdr, bfr, bfr_len); // Check if we can unpack the message. if (hdr.size > bfr_len - (DUNE_IMC_CONST_HEADER_SIZE + DUNE_IMC_CONST_FOOTER_SIZE)) throw BufferTooShort(); return deserializePayload(hdr, bfr, bfr_len, msg); }