rearrange header
This commit is contained in:
parent
7e679f3016
commit
79e9e2f360
|
@ -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 packet’s 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 packet’s 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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue