-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoscmessagedecoder.cpp
More file actions
87 lines (73 loc) · 2.38 KB
/
Copy pathoscmessagedecoder.cpp
File metadata and controls
87 lines (73 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "oscmessagedecoder.h"
#include "messagehandler.h"
#include <boost/bind.hpp>
#include <sstream>
#include <iostream>
OSCMessageDecoder::OSCMessageDecoder(const oscpkt::Message& Message,
boost::asio::io_service& IOService,
MessageHandler& MessageHandler) :
m_Message(Message),
m_MessageHandlerSharedLock(MessageHandler.GetMutex()),
m_IOService(IOService),
m_MessageHandler(MessageHandler)
{
}
void OSCMessageDecoder::AsyncDecode(const oscpkt::Message &Message,
boost::asio::io_service &IOService,
MessageHandler &MessageHandler)
{
auto Decoder = std::make_shared<OSCMessageDecoder>(Message, IOService, MessageHandler);
Decoder->BeginDecode();
}
void OSCMessageDecoder::BeginDecode()
{
m_IOService.post(boost::bind(&OSCMessageDecoder::DoDecode, shared_from_this()));
}
void OSCMessageDecoder::DoDecode()
{
const std::string AddressPattern = m_Message.addressPattern();
std::istringstream AddressPatternStream(AddressPattern);
std::string Part;
std::getline(AddressPatternStream, Part, '/'); // skip first
if (std::getline(AddressPatternStream, Part, '/') && Part == "device")
{
DecodeDeviceMessage(AddressPatternStream);
}
else
{
std::cout << "Message Type Error" << std::endl;
// error - non device message
}
}
void OSCMessageDecoder::DecodeDeviceMessage(std::istringstream& AddressPatternStream)
{
// Require Target and Function
std::string Target;
std::string Function;
if (!std::getline(AddressPatternStream, Target, '/'))
{
std::cout << "Message Target Error" << std::endl;
// error - no Target
return;
}
if (!std::getline(AddressPatternStream, Function, '/'))
{
std::cout << "Message Function Error" << std::endl;
// error - No Type
return;
}
if (Function != "message")
{
std::cout << "Message Unknown Function Error" << std::endl;
// error - bad type
return;
}
std::string Message; // extract message
if (!m_Message.arg().popStr(Message).isOkNoMoreArgs())
{
std::cout << "Message Content Error" << std::endl;
// error - Can't extract string message
return;
}
m_MessageHandler.OnDeviceMessage(Target, Message);
}