review of stream condition checking throughout iStream path
This commit is contained in:
parent
abb5bf1466
commit
a6620f1def
@ -90,6 +90,11 @@ void Appliance::TcpPacketReceiver(PDU::Stream stream)
|
|||||||
*/
|
*/
|
||||||
void Appliance::RlpReceiver(std::shared_ptr<RLP::Pdu> root)
|
void Appliance::RlpReceiver(std::shared_ptr<RLP::Pdu> root)
|
||||||
{
|
{
|
||||||
|
/// To this point, the data segment of the RLP PDU will not have been read.
|
||||||
|
/// The root PDU must have not failed, and still have bytes available to read.
|
||||||
|
if (!root->stream()->good())
|
||||||
|
return;
|
||||||
|
|
||||||
if (rlp_vectors_.count(root->vector()))
|
if (rlp_vectors_.count(root->vector()))
|
||||||
for(auto const &handler : rlp_vectors_[root->vector()])
|
for(auto const &handler : rlp_vectors_[root->vector()])
|
||||||
handler(root);
|
handler(root);
|
||||||
|
108
acn/dmp.cpp
108
acn/dmp.cpp
@ -88,10 +88,12 @@ size_t range::streamSize() const
|
|||||||
*/
|
*/
|
||||||
void range::iStream(PDU::Stream stream)
|
void range::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
address = read_(stream);
|
if (!stream->good())
|
||||||
if (type_ == SINGLE) return;
|
return;
|
||||||
incriment = read_(stream);
|
address = read_(stream);
|
||||||
count = read_(stream);
|
if (type_ == SINGLE) return;
|
||||||
|
incriment = read_(stream);
|
||||||
|
count = read_(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -229,61 +231,59 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(PDU::Stream stream)
|
void Pdu::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
PDU::Pdu::iStream(stream);
|
PDU::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
createHeader<address_type>(); // header
|
||||||
|
|
||||||
createHeader<address_type>();
|
if (!flags_.hasData)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!flags_.hasData)
|
auto header = static_cast<address_type*>(this->header());
|
||||||
return;
|
|
||||||
|
|
||||||
auto header = static_cast<address_type*>(this->header());
|
auto dataIsAddressList = [this, header] () {
|
||||||
|
data_ = new address_list(header);
|
||||||
|
data_->iStream(stream_);
|
||||||
|
};
|
||||||
|
|
||||||
auto dataIsAddressList = [this, header] () {
|
auto dataIsAdddresPairList = [this, header] () {
|
||||||
data_ = new address_list(header);
|
data_ = new address_pair_list(header);
|
||||||
data_->iStream(stream_);
|
data_->iStream(stream_);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto dataIsAdddresPairList = [this, header] () {
|
switch(vector()) {
|
||||||
data_ = new address_pair_list(header);
|
case GET_PROPERTY:
|
||||||
data_->iStream(stream_);
|
dataIsAddressList();
|
||||||
};
|
break;
|
||||||
|
case SET_PROPERTY:
|
||||||
switch(vector()) {
|
dataIsAdddresPairList();
|
||||||
case GET_PROPERTY:
|
break;
|
||||||
dataIsAddressList();
|
case GET_PROPERTY_REPLY:
|
||||||
break;
|
dataIsAdddresPairList();
|
||||||
case SET_PROPERTY:
|
break;
|
||||||
dataIsAdddresPairList();
|
case EVENT:
|
||||||
break;
|
dataIsAdddresPairList();
|
||||||
case GET_PROPERTY_REPLY:
|
break;
|
||||||
dataIsAdddresPairList();
|
case SUBSCRIBE:
|
||||||
break;
|
dataIsAddressList();
|
||||||
case EVENT:
|
break;
|
||||||
dataIsAdddresPairList();
|
case UNSUBSCRIBE:
|
||||||
break;
|
dataIsAddressList();
|
||||||
case SUBSCRIBE:
|
break;
|
||||||
dataIsAddressList();
|
case GET_PROPERTY_FAIL:
|
||||||
break;
|
dataIsAdddresPairList();
|
||||||
case UNSUBSCRIBE:
|
break;
|
||||||
dataIsAddressList();
|
case SET_PROPERTY_FAIL:
|
||||||
break;
|
dataIsAdddresPairList();
|
||||||
case GET_PROPERTY_FAIL:
|
break;
|
||||||
dataIsAdddresPairList();
|
case SUBSCRIBE_ACCEPT:
|
||||||
break;
|
dataIsAddressList();
|
||||||
case SET_PROPERTY_FAIL:
|
break;
|
||||||
dataIsAdddresPairList();
|
case SUBSCRIBE_REJECT:
|
||||||
break;
|
dataIsAdddresPairList();
|
||||||
case SUBSCRIBE_ACCEPT:
|
break;
|
||||||
dataIsAddressList();
|
case SYNC_EVENT:
|
||||||
break;
|
dataIsAdddresPairList();
|
||||||
case SUBSCRIBE_REJECT:
|
break;
|
||||||
dataIsAdddresPairList();
|
}
|
||||||
break;
|
|
||||||
case SYNC_EVENT:
|
|
||||||
dataIsAdddresPairList();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // DMP
|
} // DMP
|
||||||
|
@ -51,7 +51,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (in_avail() < sizeof(T))
|
if (in_avail() < sizeof(T))
|
||||||
setstate(std::ios_base::failbit);
|
setstate(std::ios_base::failbit);
|
||||||
if (fail())
|
if (!good())
|
||||||
return 0;
|
return 0;
|
||||||
T ret = 0;
|
T ret = 0;
|
||||||
auto data = reinterpret_cast<uint8_t*>(&ret);
|
auto data = reinterpret_cast<uint8_t*>(&ret);
|
||||||
|
@ -49,6 +49,8 @@ transport::transport(bool filled)
|
|||||||
*/
|
*/
|
||||||
void transport::iStream(PDU::Stream stream)
|
void transport::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
/**
|
/**
|
||||||
* 2. Preamble Format:
|
* 2. Preamble Format:
|
||||||
* The ACN Packet Identifier shall be the text string “ASC-E1.17\0\0\0”
|
* The ACN Packet Identifier shall be the text string “ASC-E1.17\0\0\0”
|
||||||
|
@ -52,6 +52,8 @@ transport::transport(bool filled)
|
|||||||
*/
|
*/
|
||||||
void transport::iStream(PDU::Stream stream)
|
void transport::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
/**
|
/**
|
||||||
* 2. Preamble Format:
|
* 2. Preamble Format:
|
||||||
* The preamble size includes both size fields so the
|
* The preamble size includes both size fields so the
|
||||||
|
22
acn/rlp.cpp
22
acn/rlp.cpp
@ -43,11 +43,14 @@ size_t rlp_header::streamSize() const
|
|||||||
*/
|
*/
|
||||||
void rlp_header::iStream(PDU::Stream stream)
|
void rlp_header::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
uint8_t buffer[UUID_LENGTH];
|
if (!stream->good())
|
||||||
stream->read(buffer, UUID_LENGTH);
|
return;
|
||||||
if (stream->gcount() != UUID_LENGTH)
|
|
||||||
return stream->setstate(std::ios_base::failbit);
|
uint8_t buffer[UUID_LENGTH];
|
||||||
cid = UUID::uuid(buffer);
|
stream->read(buffer, UUID_LENGTH);
|
||||||
|
if (stream->gcount() != UUID_LENGTH)
|
||||||
|
return stream->setstate(std::ios_base::failbit);
|
||||||
|
cid = UUID::uuid(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -57,7 +60,7 @@ void rlp_header::iStream(PDU::Stream stream)
|
|||||||
*/
|
*/
|
||||||
void rlp_header::oStream(PDU::Stream stream) const
|
void rlp_header::oStream(PDU::Stream stream) const
|
||||||
{
|
{
|
||||||
stream->write(cid.bytes(), UUID_LENGTH);
|
stream->write(cid.bytes(), UUID_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -77,10 +80,9 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(PDU::Stream stream)
|
void Pdu::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
PDU::Pdu::iStream(stream); //! do base class first
|
PDU::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
createHeader<rlp_header>(); // header
|
||||||
|
// protocol dependent data segment // data
|
||||||
createHeader<rlp_header>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // RLP
|
} // RLP
|
||||||
|
@ -32,9 +32,12 @@ namespace UDP {
|
|||||||
* @brief address_t::iStream
|
* @brief address_t::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void address_t::iStream(PDU::Stream stream) {
|
void address_t::iStream(PDU::Stream stream)
|
||||||
*stream >> type;
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
|
|
||||||
|
*stream >> type;
|
||||||
if (type != SDT_ADDR_NULL)
|
if (type != SDT_ADDR_NULL)
|
||||||
*stream >> port;
|
*stream >> port;
|
||||||
|
|
||||||
|
25
acn/sdt.cpp
25
acn/sdt.cpp
@ -33,6 +33,8 @@ namespace SDT {
|
|||||||
*/
|
*/
|
||||||
void params_t::iStream(PDU::Stream stream)
|
void params_t::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
*stream >> Expiry;
|
*stream >> Expiry;
|
||||||
uint8_t packed;
|
uint8_t packed;
|
||||||
*stream >> packed;
|
*stream >> packed;
|
||||||
@ -50,6 +52,8 @@ void params_t::iStream(PDU::Stream stream)
|
|||||||
*/
|
*/
|
||||||
void join_data_t::iStream(PDU::Stream stream)
|
void join_data_t::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
*stream >> mid;
|
*stream >> mid;
|
||||||
*stream >> number;
|
*stream >> number;
|
||||||
*stream >> reciprocal;
|
*stream >> reciprocal;
|
||||||
@ -67,6 +71,8 @@ void join_data_t::iStream(PDU::Stream stream)
|
|||||||
*/
|
*/
|
||||||
void join_accept_data_t::iStream(PDU::Stream stream)
|
void join_accept_data_t::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
uint8_t buf[16];
|
uint8_t buf[16];
|
||||||
stream->read(buf, sizeof(buf));
|
stream->read(buf, sizeof(buf));
|
||||||
leader = UUID::uuid(buf);
|
leader = UUID::uuid(buf);
|
||||||
@ -83,6 +89,8 @@ void join_accept_data_t::iStream(PDU::Stream stream)
|
|||||||
*/
|
*/
|
||||||
void join_refuse_data_t::iStream(PDU::Stream stream)
|
void join_refuse_data_t::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
uint8_t buf[16];
|
uint8_t buf[16];
|
||||||
stream->read(buf, sizeof(buf));
|
stream->read(buf, sizeof(buf));
|
||||||
leader = UUID::uuid(buf);
|
leader = UUID::uuid(buf);
|
||||||
@ -99,6 +107,8 @@ void join_refuse_data_t::iStream(PDU::Stream stream)
|
|||||||
*/
|
*/
|
||||||
void nak_data_t::iStream(PDU::Stream stream)
|
void nak_data_t::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
uint8_t buf[16];
|
uint8_t buf[16];
|
||||||
stream->read(buf, sizeof(buf));
|
stream->read(buf, sizeof(buf));
|
||||||
leader = UUID::uuid(buf);
|
leader = UUID::uuid(buf);
|
||||||
@ -116,6 +126,8 @@ void nak_data_t::iStream(PDU::Stream stream)
|
|||||||
*/
|
*/
|
||||||
void wrapper_data_t::iStream(PDU::Stream stream)
|
void wrapper_data_t::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
*stream >> number;
|
*stream >> number;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,9 +206,9 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(PDU::Stream stream)
|
void Pdu::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
PDU::Pdu::iStream(stream); //! do base class first
|
PDU::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
// TODO: header segment // header
|
||||||
if (!stream_->good()) return;
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -226,10 +238,9 @@ ClientPdu::ClientPdu()
|
|||||||
*/
|
*/
|
||||||
void ClientPdu::iStream(PDU::Stream stream)
|
void ClientPdu::iStream(PDU::Stream stream)
|
||||||
{
|
{
|
||||||
PDU::Pdu::iStream(stream);
|
PDU::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
createHeader<client_pdu_header>(); // header
|
||||||
|
// TODO: data segment // data
|
||||||
createHeader<client_pdu_header>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}; // SDT
|
}; // SDT
|
||||||
|
@ -40,8 +40,11 @@ Pdu::Pdu()
|
|||||||
* @brief BrokerProtocol::Pdu::iStream
|
* @brief BrokerProtocol::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// TODO: header segment // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,8 +40,11 @@ Pdu::Pdu()
|
|||||||
* @brief EPT::Pdu::iStream
|
* @brief EPT::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// TODO: header segment // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -60,8 +63,11 @@ Pdu::Pdu()
|
|||||||
* @brief EPT::DATA::Pdu::iStream
|
* @brief EPT::DATA::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// TODO: header segment // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DATA
|
} // namespace DATA
|
||||||
@ -82,8 +88,11 @@ Pdu::Pdu()
|
|||||||
* @brief EPT::STATUS::Pdu::iStream
|
* @brief EPT::STATUS::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// TODO: header segment // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace STATUS
|
} // namespace STATUS
|
||||||
|
@ -33,6 +33,8 @@ namespace LLRP {
|
|||||||
*/
|
*/
|
||||||
void llrp_data::iStream(ACN::PDU::Stream stream)
|
void llrp_data::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
/// Destination CID - The Destination CID indicates the CID of the intended
|
/// Destination CID - The Destination CID indicates the CID of the intended
|
||||||
/// recipient of this PDU.
|
/// recipient of this PDU.
|
||||||
uint8_t * buffer = new uint8_t[UUID_LENGTH];
|
uint8_t * buffer = new uint8_t[UUID_LENGTH];
|
||||||
@ -76,16 +78,11 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
RDMnet::Pdu::iStream(stream); // do base class first
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
// hase no header // header
|
||||||
if (!stream_->good()) return;
|
createData<llrp_data>(); // data
|
||||||
|
|
||||||
/// has no header
|
|
||||||
|
|
||||||
auto payload = new llrp_data();
|
|
||||||
payload->iStream(stream_);
|
|
||||||
data_ = payload;
|
|
||||||
|
|
||||||
|
auto payload = static_cast<llrp_data*>(data_);
|
||||||
switch (vector_) {
|
switch (vector_) {
|
||||||
case VECTOR_LLRP_PROBE_REQUEST:
|
case VECTOR_LLRP_PROBE_REQUEST:
|
||||||
{
|
{
|
||||||
@ -129,6 +126,9 @@ namespace ProbeRequest {
|
|||||||
*/
|
*/
|
||||||
void request_data::iStream(ACN::PDU::Stream stream)
|
void request_data::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
|
|
||||||
auto readUID = [stream] (RDM::UID& uid) {
|
auto readUID = [stream] (RDM::UID& uid) {
|
||||||
*stream >> uid.device;
|
*stream >> uid.device;
|
||||||
*stream >> uid.manufacturer;
|
*stream >> uid.manufacturer;
|
||||||
@ -178,14 +178,9 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
RDMnet::Pdu::iStream(stream); // do base class first
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
// hase no header // header
|
||||||
if (!stream_->good()) return;
|
createData<request_data>(); // data
|
||||||
|
|
||||||
/// LLRP::PDU has no header
|
|
||||||
|
|
||||||
data_ = new request_data();
|
|
||||||
data_->iStream(stream_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ProbeRequest
|
} // namespace ProbeRequest
|
||||||
@ -198,6 +193,9 @@ namespace ProbeReply {
|
|||||||
*/
|
*/
|
||||||
void reply_data::iStream(ACN::PDU::Stream stream)
|
void reply_data::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
|
|
||||||
*stream >> id.device;
|
*stream >> id.device;
|
||||||
*stream >> id.manufacturer;
|
*stream >> id.manufacturer;
|
||||||
stream->read(address, sizeof(address));
|
stream->read(address, sizeof(address));
|
||||||
@ -233,14 +231,9 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
RDMnet::Pdu::iStream(stream); // do base class first
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
// hase no header // header
|
||||||
if (!stream_->good()) return;
|
createData<reply_data>(); // data
|
||||||
|
|
||||||
/// has no header
|
|
||||||
|
|
||||||
data_ = new reply_data();
|
|
||||||
data_->iStream(stream_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ProbeReply
|
} // namespace ProbeReply
|
||||||
@ -253,6 +246,9 @@ namespace RdmCmd {
|
|||||||
*/
|
*/
|
||||||
void rdm_data::iStream(ACN::PDU::Stream stream)
|
void rdm_data::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
|
|
||||||
auto buffer = std::vector<uint8_t>();
|
auto buffer = std::vector<uint8_t>();
|
||||||
buffer.push_back(RDM::SC_RDM);
|
buffer.push_back(RDM::SC_RDM);
|
||||||
while (stream->good())
|
while (stream->good())
|
||||||
@ -288,14 +284,9 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
RDMnet::Pdu::iStream(stream); // do base class first
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
// hase no header // header
|
||||||
if (!stream_->good()) return;
|
createData<rdm_data>(); // data
|
||||||
|
|
||||||
/// has no header
|
|
||||||
|
|
||||||
data_ = new rdm_data();
|
|
||||||
data_->iStream(stream_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace RdmCmd
|
} // namespace RdmCmd
|
||||||
|
@ -40,8 +40,11 @@ Pdu::Pdu()
|
|||||||
* @brief RPT::Pdu::iStream
|
* @brief RPT::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// hase no header // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -60,8 +63,11 @@ Pdu::Pdu()
|
|||||||
* @brief RPT::REQUEST::Pdu::iStream
|
* @brief RPT::REQUEST::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// hase no header // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DATA
|
} // namespace DATA
|
||||||
@ -82,8 +88,11 @@ Pdu::Pdu()
|
|||||||
* @brief RPT::STATUS::Pdu::iStream
|
* @brief RPT::STATUS::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// hase no header // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace STATUS
|
} // namespace STATUS
|
||||||
@ -104,8 +113,11 @@ Pdu::Pdu()
|
|||||||
* @brief RPT::NOTIFICATION::Pdu::iStream
|
* @brief RPT::NOTIFICATION::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// hase no header // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace NOTIFICATION
|
} // namespace NOTIFICATION
|
||||||
@ -127,8 +139,11 @@ Pdu::Pdu()
|
|||||||
* @brief RPT::COMMAND::Pdu::iStream
|
* @brief RPT::COMMAND::Pdu::iStream
|
||||||
* @param stream
|
* @param stream
|
||||||
*/
|
*/
|
||||||
void Pdu::iStream([[maybe_unused]] ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||||
|
// hase no header // header
|
||||||
|
// TODO: data segment // data
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace COMMAND
|
} // namespace COMMAND
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "pdu.h"
|
#include "pdu.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "rdm/uid.h"
|
||||||
|
|
||||||
namespace RDMnet {
|
namespace RDMnet {
|
||||||
namespace RPT {
|
namespace RPT {
|
||||||
@ -40,6 +42,13 @@ namespace RPT {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 3.3.2 Dynamic UID Request
|
||||||
|
* RPT Components wishing to obtain Dynamic UIDs from the Broker use a special
|
||||||
|
* Dynamic UID value known as a Dynamic UID Request.
|
||||||
|
*/
|
||||||
|
static const RDM::UID DynamicUidRequest = RDM::UID(0, MY_ESTA_MANUFACTURER_ID,
|
||||||
|
true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The RPT::Pdu class
|
* @brief The RPT::Pdu class
|
||||||
|
@ -49,6 +49,9 @@ size_t data_header::streamSize() const
|
|||||||
*/
|
*/
|
||||||
void data_header::iStream(ACN::PDU::Stream stream)
|
void data_header::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
|
|
||||||
stream->read(source_name, sizeof(source_name));
|
stream->read(source_name, sizeof(source_name));
|
||||||
if (stream->gcount() != sizeof(source_name))
|
if (stream->gcount() != sizeof(source_name))
|
||||||
return stream->setstate(std::ios_base::failbit);
|
return stream->setstate(std::ios_base::failbit);
|
||||||
@ -91,11 +94,9 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
ACN::PDU::Pdu::iStream(stream);
|
ACN::PDU::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
createHeader<data_header>(); // header
|
||||||
|
createDataBlock<ACN::DMP::Pdu>(); // data
|
||||||
createHeader<data_header>();
|
|
||||||
createDataBlock<ACN::DMP::Pdu>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // DATA
|
} // DATA
|
||||||
|
@ -47,6 +47,9 @@ size_t sync_header::streamSize() const
|
|||||||
*/
|
*/
|
||||||
void sync_header::iStream(ACN::PDU::Stream stream)
|
void sync_header::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
|
|
||||||
*stream >> sequence_number;
|
*stream >> sequence_number;
|
||||||
*stream >> sync_address;
|
*stream >> sync_address;
|
||||||
stream->read(reserved, sizeof(reserved));
|
stream->read(reserved, sizeof(reserved));
|
||||||
@ -82,6 +85,9 @@ size_t discovery_header::streamSize() const
|
|||||||
*/
|
*/
|
||||||
void discovery_header::iStream(ACN::PDU::Stream stream)
|
void discovery_header::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
|
|
||||||
stream->read(source_name, sizeof(source_name));
|
stream->read(source_name, sizeof(source_name));
|
||||||
if (stream->gcount() != sizeof(source_name))
|
if (stream->gcount() != sizeof(source_name))
|
||||||
return stream->setstate(std::ios_base::failbit);
|
return stream->setstate(std::ios_base::failbit);
|
||||||
@ -112,17 +118,15 @@ Pdu::Pdu()
|
|||||||
|
|
||||||
void Pdu::iStream(ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
ACN::PDU::Pdu::iStream(stream);
|
ACN::PDU::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
|
||||||
|
|
||||||
switch(vector_)
|
switch(vector_)
|
||||||
{
|
{
|
||||||
case VECTOR_E131_EXTENDED_SYNCHRONIZATION:
|
case VECTOR_E131_EXTENDED_SYNCHRONIZATION:
|
||||||
createHeader<sync_header>();
|
createHeader<sync_header>(); // header
|
||||||
break;
|
break; // has no data // data
|
||||||
case VECTOR_E131_EXTENDED_DISCOVERY:
|
case VECTOR_E131_EXTENDED_DISCOVERY:
|
||||||
createHeader<discovery_header>();
|
createHeader<discovery_header>(); // header
|
||||||
createDataBlock<DISCOVERY::Pdu>();
|
createDataBlock<DISCOVERY::Pdu>(); // data
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -148,6 +152,9 @@ size_t discovery_list_header::streamSize() const
|
|||||||
*/
|
*/
|
||||||
void discovery_list_header::iStream(ACN::PDU::Stream stream)
|
void discovery_list_header::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
|
if (!stream->good())
|
||||||
|
return;
|
||||||
|
|
||||||
*stream >> page;
|
*stream >> page;
|
||||||
*stream >> last_page;
|
*stream >> last_page;
|
||||||
}
|
}
|
||||||
@ -205,11 +212,9 @@ Pdu::Pdu()
|
|||||||
*/
|
*/
|
||||||
void Pdu::iStream(ACN::PDU::Stream stream)
|
void Pdu::iStream(ACN::PDU::Stream stream)
|
||||||
{
|
{
|
||||||
ACN::PDU::Pdu::iStream(stream);
|
ACN::PDU::Pdu::iStream(stream); // flags, length, and vector
|
||||||
if (stream->fail()) return;
|
createHeader<discovery_list_header>(); // header
|
||||||
|
createData<discovery_list_data>(); // data
|
||||||
createHeader<discovery_list_header>();
|
|
||||||
createData<discovery_list_data>();
|
|
||||||
|
|
||||||
if (data_)
|
if (data_)
|
||||||
{
|
{
|
||||||
|
@ -126,8 +126,10 @@ void Receiver::onDiscovered(const EXTENDED::DISCOVERY::Watcher cb) {
|
|||||||
void Receiver::dataReceiver(std::shared_ptr<ACN::RLP::Pdu> root)
|
void Receiver::dataReceiver(std::shared_ptr<ACN::RLP::Pdu> root)
|
||||||
{
|
{
|
||||||
root->createDataBlock<DATA::Pdu>();
|
root->createDataBlock<DATA::Pdu>();
|
||||||
|
// a PDU::Block is guaranteed to have been instantiated, but if the input
|
||||||
|
// stream failed, it will not list any PDU. OK to loop without checking
|
||||||
|
// the state of the stream.
|
||||||
auto block = static_cast<ACN::PDU::Block<DATA::Pdu>*>(root->data());
|
auto block = static_cast<ACN::PDU::Block<DATA::Pdu>*>(root->data());
|
||||||
|
|
||||||
for(auto const &frame : *block->pdu)
|
for(auto const &frame : *block->pdu)
|
||||||
{
|
{
|
||||||
/// 6.2.1 E1.31 Data Packet: Vector
|
/// 6.2.1 E1.31 Data Packet: Vector
|
||||||
@ -154,8 +156,10 @@ void Receiver::dataReceiver(std::shared_ptr<ACN::RLP::Pdu> root)
|
|||||||
void Receiver::extendedReceiver(std::shared_ptr<ACN::RLP::Pdu> root)
|
void Receiver::extendedReceiver(std::shared_ptr<ACN::RLP::Pdu> root)
|
||||||
{
|
{
|
||||||
root->createDataBlock<EXTENDED::Pdu>();
|
root->createDataBlock<EXTENDED::Pdu>();
|
||||||
|
// a PDU::Block is guaranteed to have been instantiated, but if the input
|
||||||
|
// stream failed, it will not list any PDU. OK to loop without checking
|
||||||
|
// the state of the stream.
|
||||||
auto block = static_cast<ACN::PDU::Block<EXTENDED::Pdu>*>(root->data());
|
auto block = static_cast<ACN::PDU::Block<EXTENDED::Pdu>*>(root->data());
|
||||||
|
|
||||||
for(auto const &frame : *block->pdu)
|
for(auto const &frame : *block->pdu)
|
||||||
{
|
{
|
||||||
switch(frame->vector()) {
|
switch(frame->vector()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user