1
0
Fork 0

rearrange header

This commit is contained in:
Kevin Matz 2023-05-16 10:09:14 -04:00
parent 7e679f3016
commit 79e9e2f360
2 changed files with 96 additions and 86 deletions

View File

@ -40,6 +40,75 @@ Receiver::~Receiver()
}
/**
* @brief Receiver::rxPacket
* @param buffer
*/
void Receiver::rxPacket(std::shared_ptr<bufferstream> buffer) const
{
auto packet = [&](std::shared_ptr<Message> msg)
{
msg->iStream(buffer);
if (!buffer->fail())
dispatch(msg);
};
while (buffer->available() && buffer->good())
{
/// > \cite Spec10 The contents of an OSC packet must be either an OSC Message or
/// > an OSC Bundle. The first byte of the packets contents unambiguously
/// > distinguishes between these two alternatives.
switch (buffer->peek()) {
case '/':
packet(std::make_shared<Message>());
break;
case '#':
packet(std::make_shared<Bundle>());
break;
default:
buffer->setstate(std::ios::failbit);
}
}
}
/**
* @brief Receiver::rxPacketStream
* @param buffer
*
* This method is presented in \cite Spec10 Spec 1.0, but has been delared as legacy
* in favor of SLIP framming. \see rxPacketSLIP
*/
void Receiver::rxPacketStream(std::shared_ptr<bufferstream> buffer) const
{
/// > \cite Spec10 In a stream-based protocol such as TCP, the stream should begin with
/// > an int32 giving the size of the first packet, followed by the contents of the
/// > first packet, followed by the size of the second packet, etc.
while (buffer->good()) {
size_t size = buffer->readType<int32_t>();
auto msg = std::make_shared<Message>();
msg->iStream(buffer);
if (size != msg->streamSize())
buffer->setstate(std::ios::failbit);
if (!buffer->fail())
dispatch(msg);
}
}
/**
* @brief Receiver::rxPacketSLIP
* @param buffer
*/
void Receiver::rxPacketSLIP(std::shared_ptr<bufferstream> buffer) const
{
(void)buffer;
/// \todo Receive an SLIP framed message.
}
/**
* @brief Receiver::dispatch
* @param msg
@ -48,18 +117,8 @@ void Receiver::dispatch(const std::shared_ptr<Message> msg) const
{
switch (msg->address_pattern.at(0)) {
case '/':
{
std::list<std::string> pattern;
std::istringstream strm(msg->address_pattern);
strm.seekg(1); // skip leading '/'
for (std::string name; std::getline(strm, name, '/');)
pattern.push_back(name);
std::vector<const Method *> hits;
address_space_->matchAddress(hits, pattern);
for (const auto hit: hits)
for (const auto &hit: findMethods(msg->address_pattern))
hit->trigger(msg);
}
break;
case '#':
scheduleBundle(std::static_pointer_cast<Bundle>(msg));
@ -70,6 +129,26 @@ void Receiver::dispatch(const std::shared_ptr<Message> msg) const
}
/**
* @brief Receiver::findMethods
* @param pattern
* @return
*/
std::vector<const Method *> Receiver::findMethods(std::string pattern) const
{
std::istringstream stream(pattern);
stream.seekg(1); // skip leading '/'
std::list<std::string> tokens;
for (std::string name; std::getline(stream, name, '/');)
tokens.push_back(name);
std::vector<const Method *> hits;
address_space_->matchAddress(hits, tokens);
return hits;
}
/**
* @brief Receiver::scheduleBundle
* @param msg
@ -110,75 +189,5 @@ void Receiver::scheduleBundle(const std::shared_ptr<Bundle> msg) const
}
}
/**
* @brief Receiver::rxPacket
* @param buffer
*/
void Receiver::rxPacket(std::shared_ptr<bufferstream> buffer) const
{
auto packet = [&](std::shared_ptr<Message> msg)
{
msg->iStream(buffer);
if (!buffer->fail())
dispatch(msg);
};
while (buffer->available() && buffer->good())
{
/// > \cite Spec10 The contents of an OSC packet must be either an OSC Message or
/// > an OSC Bundle. The first byte of the packets contents unambiguously
/// > distinguishes between these two alternatives.
switch (buffer->peek()) {
case '/':
packet(std::make_shared<Message>());
break;
case '#':
packet(std::make_shared<Bundle>());
break;
default:
buffer->setstate(std::ios::failbit);
}
}
}
/**
* @brief Receiver::rxPacketStream
* @param buffer
*
* This method is presented in \cite Spec10 Spec 1.0, but has been delared as legacy
* in favor of SLIP framming. \see rxPacketSLIP
*/
void Receiver::rxPacketStream(std::shared_ptr<bufferstream> buffer) const
{
/// > \cite Spec10 In a stream-based protocol such as TCP, the stream should begin with
/// > an int32 giving the size of the first packet, followed by the contents of the
/// > first packet, followed by the size of the second packet, etc.
while (buffer->good()) {
size_t size = buffer->readType<int32_t>();
auto msg = std::make_shared<Message>();
msg->iStream(buffer);
if (size != msg->streamSize())
buffer->setstate(std::ios::failbit);
if (!buffer->fail())
dispatch(msg);
}
}
/**
* @brief Receiver::rxPacketSLIP
* @param buffer
*/
void Receiver::rxPacketSLIP(std::shared_ptr<bufferstream> buffer) const
{
(void)buffer;
/// \todo Receive an SLIP framed message.
}
} // namespace OSC

View File

@ -42,17 +42,18 @@ public:
explicit Receiver();
virtual ~Receiver();
void rxPacket(std::shared_ptr<bufferstream> buffer) const;
void rxPacketStream(std::shared_ptr<bufferstream> buffer) const;
void rxPacketSLIP(std::shared_ptr<bufferstream> buffer) const;
void dispatch(const std::shared_ptr<Message> msg) const;
/**
* @brief rootMethod
* @return
*/
Method* rootMethod() { return address_space_; }
void rxPacket(std::shared_ptr<bufferstream> buffer) const;
void rxPacketStream(std::shared_ptr<bufferstream> buffer) const;
void rxPacketSLIP(std::shared_ptr<bufferstream> buffer) const;
Method *rootMethod() const { return address_space_; }
std::vector<const Method *> findMethods(std::string pattern) const;
protected:
void scheduleBundle(const std::shared_ptr<Bundle> bundle) const;