diff --git a/src/Packet.cpp b/src/Packet.cpp index 11e823ce..a342c37f 100644 --- a/src/Packet.cpp +++ b/src/Packet.cpp @@ -19,5 +19,25 @@ void Packet::calculatePacketHash(uint8_t* hash) const { sha.finalize(hash, MAX_HASH_SIZE); } +uint8_t Packet::writeTo(uint8_t dest[]) const { + uint8_t i = 0; + dest[i++] = header; + dest[i++] = path_len; + memcpy(&dest[i], path, path_len); i += path_len; + memcpy(&dest[i], payload, payload_len); i += payload_len; + return i; +} + +bool Packet::readFrom(const uint8_t src[], uint8_t len) { + uint8_t i = 0; + header = src[i++]; + path_len = src[i++]; + if (path_len > sizeof(path)) return false; // bad encoding + memcpy(path, &src[i], path_len); i += path_len; + if (i >= len) return false; // bad encoding + payload_len = len - i; + memcpy(payload, &src[i], payload_len); //i += payload_len; + return true; // success +} } \ No newline at end of file diff --git a/src/Packet.h b/src/Packet.h index 99daf0c4..c8769d8c 100644 --- a/src/Packet.h +++ b/src/Packet.h @@ -71,6 +71,20 @@ public: void markDoNotRetransmit() { header = 0xFF; } bool isMarkedDoNotRetransmit() const { return header == 0xFF; } + + /** + * \brief save entire packet as a blob + * \param dest (OUT) destination buffer (assumed to be MAX_MTU_SIZE) + * \returns the packet length + */ + uint8_t writeTo(uint8_t dest[]) const; + + /** + * \brief restore this packet from a blob (as created using writeTo()) + * \param src (IN) buffer containing blob + * \param len the packet length (as returned by writeTo()) + */ + bool readFrom(const uint8_t src[], uint8_t len); }; }