1
0
Fork 0

smart pointers for PDU header and data segments

This commit is contained in:
Kevin Matz 2021-08-31 11:13:36 -04:00
parent 858e8b4770
commit ae5732e2fd
16 changed files with 76 additions and 87 deletions

View File

@ -39,16 +39,6 @@ Pdu::Pdu(size_t vector_size)
}
/**
* @brief Pdu::~Pdu
*/
Pdu::~Pdu()
{
if (header_) delete header_;
if (data_) delete data_;
}
/**
* @brief Pdu::vector
* @return
@ -67,7 +57,7 @@ uint32_t Pdu::vector()
* @brief Pdu::header
* @return
*/
pdu_header * Pdu::header()
std::shared_ptr<pdu_header> Pdu::header()
{
if (flags_.hasHeader)
return header_;
@ -81,7 +71,7 @@ pdu_header * Pdu::header()
* @brief Pdu::data
* @return
*/
pdu_data * Pdu::data()
std::shared_ptr<pdu_data> Pdu::data()
{
if (flags_.hasData)
return data_;
@ -288,9 +278,10 @@ void Pdu::setVector (const uint32_t v)
* @brief Pdu::setHeader
* @param h
*/
void Pdu::setHeader (pdu_header * h)
void Pdu::setHeader (std::shared_ptr<pdu_header> h)
{
header_ = h; flags_.hasHeader = true;
header_ = h;
flags_.hasHeader = true;
}
@ -298,9 +289,10 @@ void Pdu::setHeader (pdu_header * h)
* @brief Pdu::setData
* @param d
*/
void Pdu::setData (pdu_data * d)
void Pdu::setData (std::shared_ptr<pdu_data> d)
{
data_ = d; flags_.hasData = true;
data_ = d;
flags_.hasData = true;
}

View File

@ -157,12 +157,11 @@ class Pdu
{
public:
Pdu(size_t vector_size);
~Pdu();
// getters
uint32_t vector(); // may inherit
pdu_header * header(); // may inherit
pdu_data * data(); // may inherit
std::shared_ptr<pdu_header> header(); // may inherit
std::shared_ptr<pdu_data> data(); // may inherit
Message<Pdu> parent();
Stream stream();
virtual size_t streamSize() const override;
@ -170,9 +169,9 @@ public:
virtual void oStream(Stream) const override;
// setters
void setVector (const uint32_t v);
void setHeader (pdu_header * h);
void setData (pdu_data * d);
void setVector (const uint32_t);
void setHeader (std::shared_ptr<pdu_header>);
void setData (std::shared_ptr<pdu_data>);
void setParent (Message<Pdu> pdu);
void setInherit(Message<Pdu> pdu);
@ -185,7 +184,7 @@ public:
{
if (flags_.hasHeader)
{
header_ = new T();
header_ = std::make_shared<T>();
if (stream_ && stream_->good())
header_->iStream(stream_);
}
@ -198,7 +197,7 @@ public:
{
if (flags_.hasData)
{
data_ = new T();
data_ = std::make_shared<T>();
if (stream_ && stream_->good())
data_->iStream(stream_);
}
@ -208,7 +207,7 @@ public:
*/
template<class T>
void createDataBlock() {
auto block = new Block<T>();
auto block = std::make_shared<Block<T>>();
if (stream_)
block->iStream(stream_);
block->setParent(shared_from_this());
@ -221,9 +220,9 @@ protected:
size_t vector_size_; //!< width (numbe of octets) of the vector
Message<Pdu> parent_; //!< parent PDU
Message<Pdu> inherit_; //!< PDU from which to inherit
pdu_header * header_ = nullptr; //!< header segment
pdu_data * data_ = nullptr; //!< data segment
Stream stream_; //!< buffer
std::shared_ptr<pdu_header> header_ = nullptr; //!< header segment
std::shared_ptr<pdu_data> data_ = nullptr; //!< data segment
};

View File

@ -86,8 +86,8 @@ void Device::dmpGet(PDU::Message<DMP::Pdu> dmp)
*/
void Device::dmpSet(PDU::Message<DMP::Pdu> dmp)
{
auto type = static_cast<address_type*>(dmp->header());
auto set_data = static_cast<address_pair_list*>(dmp->data());
auto type = std::static_pointer_cast<address_type>(dmp->header());
auto set_data = std::static_pointer_cast<address_pair_list>(dmp->data());
}

View File

@ -228,15 +228,15 @@ void Pdu::iStream(PDU::Stream stream)
if (!flags_.hasData)
return;
auto header = static_cast<address_type*>(this->header());
auto header = std::static_pointer_cast<address_type>(this->header());
auto dataIsAddressList = [this, header] () {
data_ = new address_list(*header);
data_ = std::make_shared<address_list>(*header);
*stream_ >> *data_;
};
auto dataIsAdddresPairList = [this, header] () {
data_ = new address_pair_list(*header);
data_ = std::make_shared<address_pair_list>(*header);
*stream_ >> *data_;
};

View File

@ -75,7 +75,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
// hase no header // header
createData<llrp_data>(); // data
auto payload = static_cast<llrp_data*>(data_);
auto payload = std::static_pointer_cast<llrp_data>(data_);
switch (vector_) {
case VECTOR_LLRP_PROBE_REQUEST:
{

View File

@ -40,7 +40,7 @@ Target::Target()
*/
void Target::receiveLLRP(ACN::PDU::Message<Pdu> frame)
{
auto data = static_cast<llrp_data*>(frame->data());
auto data = std::static_pointer_cast<llrp_data>(frame->data());
switch (frame->vector()) {
case VECTOR_LLRP_PROBE_REQUEST:
receiveProbeRequest(std::static_pointer_cast<ProbeRequest::Pdu>(data->child));

View File

@ -50,7 +50,7 @@ Broker::Broker(UUID::uuid cid, RDM::UID uid)
void Broker::rlpBrokerReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
{
root->createDataBlock<BrokerProtocol::Pdu>();
auto block = static_cast<ACN::PDU::Block<BrokerProtocol::Pdu>*>(root->data());
auto block = std::static_pointer_cast<ACN::PDU::Block<BrokerProtocol::Pdu>>(root->data());
for(auto const &frame : *block->pdu)
{
switch(frame->vector()) {

View File

@ -148,14 +148,14 @@ void Component::rlpSend(ACN::RLP::message_transport& transport,
const SDT::UDP::ipAddress& ip) const
{
// rlp header
RLP::rlp_header header;
header.cid = cid();
auto header = std::make_shared<RLP::rlp_header>();
header->cid = cid();
// rlp pdu
auto rlp = std::shared_ptr<RLP::Pdu>(new RLP::Pdu());
auto rlp = std::make_shared<RLP::Pdu>();
rlp->setVector(vector);
rlp->setHeader(&header);
rlp->setData(data.get());
rlp->setHeader(header);
rlp->setData(data);
// root block
PDU::Block<RLP::Pdu> block;
@ -178,8 +178,8 @@ void Component::rlpSend(ACN::RLP::message_transport& transport,
* @param stream
* @param ip
*
* \attention Override this method in your derived class that can write
* to the network.
* \attention Override this method in the derived platform class that can
* write to the network.
*/
void Component::rlpSend(const PDU::Stream stream,
const SDT::UDP::ipAddress& ip) const

View File

@ -49,8 +49,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
*stream_ >> *data_;
createData<COMMAND::Pdu>(); // data
}
} // namespace REQUEST
@ -245,7 +244,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
// the PDU. Do that now.
if (!flags_.hasData)
return;
auto data = static_cast<rpt_data*>(data_);
auto data = std::static_pointer_cast<rpt_data>(data_);
switch (vector())
{
case VECTOR_RPT_REQUEST:

View File

@ -181,9 +181,9 @@ void Pdu::iStream(ACN::PDU::Stream stream)
if (data_)
{
auto data = static_cast<discovery_list_data*>(data_);
auto root_header = static_cast<ACN::RLP::rlp_header*>(parent_->parent()->header());
auto frame_header = static_cast<EXTENDED::discovery_header*>(parent_->header());
auto data = std::static_pointer_cast<discovery_list_data>(data_);
auto root_header = std::static_pointer_cast<ACN::RLP::rlp_header>(parent_->parent()->header());
auto frame_header = std::static_pointer_cast<EXTENDED::discovery_header>(parent_->header());
for ( auto & f : data->found )
{
f.source = root_header->cid;

View File

@ -136,7 +136,7 @@ void Receiver::dataReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
// 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 = std::static_pointer_cast<ACN::PDU::Block<DATA::Pdu>>(root->data());
for(auto const &frame : *block->pdu)
{
/// > \cite sACN 6.2.1 E1.31 Data Packet: Vector
@ -167,7 +167,7 @@ void Receiver::extendedReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
// 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 = std::static_pointer_cast<ACN::PDU::Block<EXTENDED::Pdu>>(root->data());
for(auto const &frame : *block->pdu)
{
switch(frame->vector()) {
@ -197,8 +197,7 @@ void Receiver::extendedReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
*
*/
void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
auto header = static_cast<DATA::data_header*>(frame->header());
auto source = std::shared_ptr<DATA::data_header>(header);
auto source = std::static_pointer_cast<DATA::data_header>(frame->header());
if (!universes_.count(source->universe))
return;
@ -253,7 +252,7 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
}
// PDU data will be a block of DMP
auto block = static_cast<ACN::PDU::Block<ACN::DMP::Pdu>*>(frame->data());
auto block = std::static_pointer_cast<ACN::PDU::Block<ACN::DMP::Pdu>>(frame->data());
for (auto const &dmp : *block->pdu)
{
/// > \cite sACN 7.2 DMP Layer: Vector
@ -279,7 +278,7 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
*/
void Receiver::syncFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame)
{
auto header = static_cast<EXTENDED::sync_header*>(frame->header());
auto header = std::static_pointer_cast<EXTENDED::sync_header>(frame->header());
universes_.at(header->sync_address)->synchronize(header->sequence_number);
}
@ -289,7 +288,7 @@ void Receiver::syncFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame)
* @param frame
*/
void Receiver::discoveryFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame) {
auto block = static_cast<ACN::PDU::Block<EXTENDED::DISCOVERY::Pdu>*>(frame->data());
auto block = std::static_pointer_cast<ACN::PDU::Block<EXTENDED::DISCOVERY::Pdu>>(frame->data());
for(auto const &pdu : *block->pdu)
{
/// > \cite sACN 8 Universe Discovery Layer
@ -313,8 +312,8 @@ void Receiver::discoveryFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame) {
* @param pdu
*/
void Receiver::discoveryListHanlder(ACN::PDU::Message<EXTENDED::DISCOVERY::Pdu> pdu) {
auto header = static_cast<EXTENDED::DISCOVERY::discovery_list_header*>(pdu->header());
auto data = static_cast<EXTENDED::DISCOVERY::discovery_list_data*>(pdu->data());
auto header = std::static_pointer_cast<EXTENDED::DISCOVERY::discovery_list_header>(pdu->header());
auto data = std::static_pointer_cast<EXTENDED::DISCOVERY::discovery_list_data>(pdu->data());
for (auto& found : data->found)
discovered.insert(found);

View File

@ -118,11 +118,11 @@ void Source::discoveryAnnounce()
return;
// framing layer header
auto frmheader = new EXTENDED::discovery_header;
auto frmheader = std::make_shared<EXTENDED::discovery_header>();
frmheader->source_name = name();
// universe discovery layer
EXTENDED::DISCOVERY::discovery_list_header header;
auto header = std::make_shared<EXTENDED::DISCOVERY::discovery_list_header>();
// known universes
std::vector<EXTENDED::DISCOVERY::discoveredUniverse> list;
@ -150,28 +150,28 @@ void Source::discoveryAnnounce()
/// > The Universe Discovery Layer's Last Page field is an 8-bit field
/// > indicating the number of the final page being to be transmitted. ...
/// > Page numbers are indexed starting at 0.
header.last_page = list.size() / 512;
for (size_t i = 0; i <= header.last_page; i++)
header->last_page = list.size() / 512;
for (size_t i = 0; i <= header->last_page; i++)
{
/// > The Universe Discovery Layer's Page field is an 8-bit field
/// > indicating the page number of this E1.31 Universe Discovery Packet.
/// > Page numbers are indexed, starting at 0.
header.page = i;
header->page = i;
// universe discover layer data
EXTENDED::DISCOVERY::discovery_list_data data;
auto data = std::make_shared<EXTENDED::DISCOVERY::discovery_list_data>();
for (size_t n = i * 512; n < (i * 512) + 512; n++)
{
if (n > list.size())
break;
data.found.push_back(list.at(n));
data->found.push_back(list.at(n));
}
// framing layer data
auto dlistpdu = new EXTENDED::DISCOVERY::Pdu;
auto dlistpdu = std::make_shared<EXTENDED::DISCOVERY::Pdu>();
dlistpdu->setVector(VECTOR_UNIVERSE_DISCOVERY_UNIVERSE_LIST);
dlistpdu->setHeader(&header);
dlistpdu->setData(&data);
dlistpdu->setHeader(header);
dlistpdu->setData(data);
// framing layer
sendExtendedFrame(VECTOR_E131_EXTENDED_DISCOVERY, frmheader, dlistpdu,
@ -190,8 +190,8 @@ void Source::discoveryAnnounce()
* @param ip
*/
void Source::sendExtendedFrame(const uint16_t vector,
ACN::PDU::pdu_header* header,
ACN::PDU::pdu_data* data,
std::shared_ptr<ACN::PDU::pdu_header> header,
std::shared_ptr<ACN::PDU::pdu_data> data,
const ACN::SDT::UDP::ipAddress& ip) const
{
if (!(vector == VECTOR_E131_EXTENDED_DISCOVERY ||

View File

@ -60,8 +60,8 @@ protected:
virtual void discoveryAnnounce();
void sendExtendedFrame(const uint16_t vector,
ACN::PDU::pdu_header *header,
ACN::PDU::pdu_data *data,
std::shared_ptr<ACN::PDU::pdu_header> header,
std::shared_ptr<ACN::PDU::pdu_data> data,
const ACN::SDT::UDP::ipAddress&) const;
private:

View File

@ -64,7 +64,7 @@ void Universe::set(ACN::PDU::Message<ACN::DMP::Pdu> dmp,
/// > Receivers shall discard the packet if the received value is not 0xa1.
if (!dmp->header())
return;
auto type = static_cast<ACN::DMP::address_type*>(dmp->header());
auto type = std::static_pointer_cast<ACN::DMP::address_type>(dmp->header());
if (type->relative) return;
if (type->data_type != ACN::DMP::ARRAY) return;
if (type->address_length != ACN::DMP::TWO) return;
@ -72,7 +72,7 @@ void Universe::set(ACN::PDU::Message<ACN::DMP::Pdu> dmp,
// only act on the first property pair in the data
if (!dmp->data())
return;
auto set_data = static_cast<ACN::DMP::address_pair_list*>(dmp->data());
auto set_data = std::static_pointer_cast<ACN::DMP::address_pair_list>(dmp->data());
const auto& [range, data] = set_data->properties.front();
/// > \cite sACN 7.4 First Property Address
@ -202,14 +202,14 @@ void Universe::synchronize(uint8_t sequence_number)
void Universe::sACNsend() const
{
// header
ACN::DMP::address_type addrtyp;
addrtyp.byte = 0;
addrtyp.address_length = ACN::DMP::TWO;
addrtyp.data_type = ACN::DMP::ARRAY;
addrtyp.relative = false;
auto addrtyp = std::make_shared<ACN::DMP::address_type>();
addrtyp->byte = 0;
addrtyp->address_length = ACN::DMP::TWO;
addrtyp->data_type = ACN::DMP::ARRAY;
addrtyp->relative = false;
// property range
ACN::DMP::range pr(addrtyp);
ACN::DMP::range pr(*addrtyp);
pr.address = 0;
pr.incriment = 1;
pr.count = (active_data_slots <= 513 ? active_data_slots : 513);
@ -220,20 +220,20 @@ void Universe::sACNsend() const
std::back_inserter(pd));
// data segment
ACN::DMP::address_pair_list addrlst(addrtyp);
addrlst.properties.push_back(ACN::DMP::address_data_pair(pr, pd));
auto addrlst = std::make_shared<ACN::DMP::address_pair_list>(*addrtyp);
addrlst->properties.push_back(ACN::DMP::address_data_pair(pr, pd));
// DMP layer
auto dmp = std::make_shared<ACN::DMP::Pdu>();
dmp->setVector(ACN::DMP::SET_PROPERTY);
dmp->setHeader(&addrtyp);
dmp->setData(&addrlst);
dmp->setHeader(addrtyp);
dmp->setData(addrlst);
// sACN Framing Layer
auto frame = std::make_shared<DATA::Pdu>();
frame->setVector(VECTOR_E131_DATA_PACKET);
frame->setHeader(provenance_.get());
frame->setData(dmp.get());
frame->setHeader(provenance_);
frame->setData(dmp);
// send
switch (destination.type)

View File

@ -53,7 +53,7 @@ Leader::Leader(UUID::uuid cid)
void Leader::SdtReceiver(PDU::Message<RLP::Pdu> root)
{
root->createDataBlock<SDT::Pdu>();
auto block = static_cast<PDU::Block<SDT::Pdu>*>(root->data());
auto block = std::static_pointer_cast<PDU::Block<SDT::Pdu>>(root->data());
for(auto const &sdt : *block->pdu) {
switch(sdt->vector()) {

View File

@ -129,7 +129,7 @@ void Pdu::iStream(PDU::Stream stream)
{
if (!data_)
return;
auto data = static_cast<wrapper_data*>(data_);
auto data = std::static_pointer_cast<wrapper_data>(data_);
data->block.setParent(shared_from_this());
return;
}