diff --git a/acn/dmp.cpp b/acn/dmp.cpp index 939b1af..d3d9c6f 100644 --- a/acn/dmp.cpp +++ b/acn/dmp.cpp @@ -163,7 +163,7 @@ void address_pair_list::oStream(PDU::Stream stream) const { for (const auto & [range, vect] : properties) { - range.oStream(stream); + *stream << range; for (uint8_t d : vect) *stream << d; } @@ -191,9 +191,8 @@ void address_list::iStream(PDU::Stream stream) while(stream->good()) { // Property Address - range pr(type_->type, type_->width); - pr.iStream(stream); - addresses.push_back(pr); + addresses.emplace_back(range(type_->type, type_->width)); + *stream >> addresses.back(); //set EOF if buffer insufficient for another property range if (stream->available() < address_width(type_->width) * @@ -209,7 +208,7 @@ void address_list::iStream(PDU::Stream stream) void address_list::oStream(PDU::Stream stream) const { for (const auto & addr : addresses) - addr.oStream(stream); + *stream << addr; } @@ -239,12 +238,12 @@ void Pdu::iStream(PDU::Stream stream) auto dataIsAddressList = [this, header] () { data_ = new address_list(header); - data_->iStream(stream_); + *stream_ >> *data_; }; auto dataIsAdddresPairList = [this, header] () { data_ = new address_pair_list(header); - data_->iStream(stream_); + *stream_ >> *data_; }; switch(vector()) { diff --git a/acn/pdu-stream.cpp b/acn/pdu-stream.cpp index d5ff620..0f15e55 100644 --- a/acn/pdu-stream.cpp +++ b/acn/pdu-stream.cpp @@ -76,6 +76,18 @@ void pdu_stream::writeString(const std::string &str, const int fixed_length) } +/** + * @brief pdu_stream::operator >> + * @param obj + * @return + */ +pdu_stream& pdu_stream::operator>> (pdu_stream_object& obj) +{ + obj.iStream(shared_from_this()); + return *this; +} + + /** * @brief pdu_stream::operator >> * @param val @@ -143,6 +155,18 @@ pdu_stream& pdu_stream::operator>> (UUID::uuid& uuid) }; +/** + * @brief pdu_stream::operator << + * @param obj + * @return + */ +pdu_stream& pdu_stream::operator<< (const pdu_stream_object& obj) +{ + obj.oStream(shared_from_this()); + return *this; +} + + /** * @brief pdu_stream::operator << * @param val diff --git a/acn/pdu-stream.h b/acn/pdu-stream.h index 8f142b4..2d05bb3 100644 --- a/acn/pdu-stream.h +++ b/acn/pdu-stream.h @@ -31,11 +31,14 @@ namespace ACN { namespace PDU { +struct pdu_stream_object; + /** * @brief Input/Output stream of nested PDU */ class pdu_stream - : private std::basic_streambuf + : public std::enable_shared_from_this + , private std::basic_streambuf , public std::basic_iostream { public: @@ -44,6 +47,7 @@ public: // input sequence uint32_t available() { return in_avail(); } uint8_t * data() { return gptr(); } + pdu_stream& operator>> (pdu_stream_object& obj); pdu_stream& operator>> (uint8_t& val); pdu_stream& operator>> (uint16_t& val); pdu_stream& operator>> (uint32_t& val); @@ -70,6 +74,7 @@ public: // output sequence uint32_t size() { return pptr() - pbase(); } uint8_t * base() { return pbase(); } + pdu_stream& operator<< (const pdu_stream_object& obj); pdu_stream& operator<< (const uint8_t& val); pdu_stream& operator<< (const uint16_t& val); pdu_stream& operator<< (const uint32_t& val); diff --git a/acn/rlp-tcp.cpp b/acn/rlp-tcp.cpp index 0b10753..39f5ff9 100644 --- a/acn/rlp-tcp.cpp +++ b/acn/rlp-tcp.cpp @@ -63,8 +63,7 @@ void transport::iStream(PDU::Stream stream) return stream->setstate(std::ios_base::failbit); *stream >> length; - - root.iStream(stream); + *stream >> root; } diff --git a/acn/rlp-udp.cpp b/acn/rlp-udp.cpp index b0270d6..e25b52c 100644 --- a/acn/rlp-udp.cpp +++ b/acn/rlp-udp.cpp @@ -85,7 +85,7 @@ void transport::iStream(PDU::Stream stream) if (length > PREAMBLE_MINIMUM_SIZE) stream->ignore((length - PREAMBLE_MINIMUM_SIZE)); - root.iStream(stream); + *stream >> root; } @@ -99,7 +99,7 @@ void transport::oStream(PDU::Stream stream) const *stream << postamble_size; stream->write(acn_id, sizeof(acn_id)); for ( auto& pdu : *root.pdu ) - pdu->oStream(stream); + *stream << pdu; } } // UDP diff --git a/otp/advertisement.cpp b/otp/advertisement.cpp index 2389b5f..458e18b 100644 --- a/otp/advertisement.cpp +++ b/otp/advertisement.cpp @@ -142,7 +142,7 @@ void name_data::iStream(PDU::Stream stream) while (stream->good()) { points.push_back(point_description()); - points.back().iStream(stream); + *stream >> points.back(); } } @@ -156,7 +156,7 @@ void name_data::oStream(PDU::Stream stream) const *stream << flags; *stream << reserved; for (const auto & p : points) - p.oStream(stream); + *stream << p; } } // namespace Name @@ -248,7 +248,7 @@ void advertisement_data::iStream(PDU::Stream stream) void advertisement_data::oStream(PDU::Stream stream) const { *stream << reserved; - payload->oStream(stream); + *stream << payload; } } // namespace OTP::Advertisement diff --git a/otp/base.cpp b/otp/base.cpp index 98ccc35..60ca2f5 100644 --- a/otp/base.cpp +++ b/otp/base.cpp @@ -74,7 +74,7 @@ void base_data::oStream(PDU::Stream stream) const *stream << options; *stream << reserved; stream->writeString(name, 32); - payload->oStream(stream); + *stream << payload; } diff --git a/rdmnet/broker-protocol.cpp b/rdmnet/broker-protocol.cpp index 7f116c3..b5faed6 100644 --- a/rdmnet/broker-protocol.cpp +++ b/rdmnet/broker-protocol.cpp @@ -105,7 +105,7 @@ void client_connect_data::iStream(ACN::PDU::Stream stream) *stream >> version; stream->readString(searchDomain, 231); *stream >> flags.byte; - pdu->iStream(stream); + *stream >> *pdu; } @@ -119,7 +119,7 @@ void client_connect_data::oStream(ACN::PDU::Stream stream) const *stream << version; stream->writeString(searchDomain, 231); *stream << flags.byte; - pdu->oStream(stream); + *stream << pdu; } @@ -156,7 +156,7 @@ void connect_reply_data::oStream(ACN::PDU::Stream stream) const void client_entry_update_data::iStream(ACN::PDU::Stream stream) { *stream >> flags.byte; - pdu->iStream(stream); + *stream >> *pdu; } @@ -167,7 +167,7 @@ void client_entry_update_data::iStream(ACN::PDU::Stream stream) void client_entry_update_data::oStream(ACN::PDU::Stream stream) const { *stream << flags.byte; - pdu->oStream(stream); + *stream << pdu; } @@ -248,7 +248,7 @@ void request_dynamic_uid_data::iStream(ACN::PDU::Stream stream) while (stream->good()) { list.emplace_back(dynamic_uid_request()); - list.back().iStream(stream); + *stream >> list.back(); } } @@ -260,7 +260,7 @@ void request_dynamic_uid_data::iStream(ACN::PDU::Stream stream) void request_dynamic_uid_data::oStream(ACN::PDU::Stream stream) const { for (const auto & r : list) - r.oStream(stream); + *stream << r; } @@ -297,7 +297,7 @@ void dynamic_uid_assignment_data::iStream(ACN::PDU::Stream stream) while (stream->good()) { list.emplace_back(dynamic_uid_mapping()); - list.back().iStream(stream); + *stream >> list.back(); } } @@ -309,7 +309,7 @@ void dynamic_uid_assignment_data::iStream(ACN::PDU::Stream stream) void dynamic_uid_assignment_data::oStream(ACN::PDU::Stream stream) const { for (const auto & r : list) - r.oStream(stream); + *stream << r; } diff --git a/rdmnet/llrp.cpp b/rdmnet/llrp.cpp index f36d0a5..455ae9a 100644 --- a/rdmnet/llrp.cpp +++ b/rdmnet/llrp.cpp @@ -53,7 +53,7 @@ void llrp_data::oStream(ACN::PDU::Stream stream) const *stream << destination; *stream << transaction; if (child) - child->oStream(stream); + *stream << child; } @@ -81,7 +81,7 @@ void Pdu::iStream(ACN::PDU::Stream stream) case VECTOR_LLRP_PROBE_REQUEST: { auto block = ACN::PDU::Block(); - block.iStream(stream_); + *stream_ >> block; if (!block.pdu->empty()) payload->child = block.pdu->front(); } @@ -89,7 +89,7 @@ void Pdu::iStream(ACN::PDU::Stream stream) case VECTOR_LLRP_PROBE_REPLY: { auto block = ACN::PDU::Block(); - block.iStream(stream_); + *stream_ >> block; if (!block.pdu->empty()) payload->child = block.pdu->front(); } @@ -97,7 +97,7 @@ void Pdu::iStream(ACN::PDU::Stream stream) case VECTOR_LLRP_RDM_CMD: { auto block = ACN::PDU::Block(); - block.iStream(stream_); + *stream_ >> block; if (!block.pdu->empty()) payload->child = block.pdu->front(); } diff --git a/rdmnet/rpt.cpp b/rdmnet/rpt.cpp index 96af86c..6d11e11 100644 --- a/rdmnet/rpt.cpp +++ b/rdmnet/rpt.cpp @@ -51,7 +51,7 @@ void Pdu::iStream(ACN::PDU::Stream stream) RDMnet::Pdu::iStream(stream); // flags, length, and vector // hase no header // header data_ = new COMMAND::Pdu(); // data - data_->iStream(stream_); + *stream_ >> *data_; } } // namespace REQUEST @@ -261,7 +261,7 @@ void Pdu::iStream(ACN::PDU::Stream stream) default: return; } - data->pdu->iStream(stream_); + *stream >> *data->pdu; } @@ -311,11 +311,8 @@ void rpt_data::oStream(ACN::PDU::Stream stream) const { *stream << sequence; stream->writeType(0); - pdu->oStream(stream); + *stream << pdu; } - - - } // namespace RPT } // namespace RDMnet