-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathparser.cpp
More file actions
77 lines (62 loc) · 2.33 KB
/
Copy pathparser.cpp
File metadata and controls
77 lines (62 loc) · 2.33 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
#include "sapparser.h"
#include <algorithm>
#include "log.h"
#include "asio.hpp"
#include "saphandler.h"
using namespace pml::sap;
void Parser::ParseMessage(const std::string& sSenderIp, std::vector<unsigned char> vMessage)
{
if(vMessage.size() < 8)
{
pml::log::log(pml::log::Level::kError, "pml::sapserver") << "Parser SAP message to short";
return;
}
sap aMessage;
aMessage.sSenderIp = sSenderIp;
aMessage.nVersion = (vMessage[0] & 0xE0);
aMessage.bIpv6 = (vMessage[0] & 0x10);
aMessage.bDeletionMessage = (vMessage[0] & 0x4);
aMessage.bEncrypted = (vMessage[0] & 0x2);
aMessage.bCompressed = (vMessage[0] & 0x1);
aMessage.nAuthenticationLength = vMessage[1];
aMessage.nAuthenticationLength*=4; //convert from number of 32 bit words to number of bytes
aMessage.nMessageId = (static_cast<uint16_t>(vMessage[3]) << 8) + vMessage[2];
size_t nStartOfPayload(8);
if(aMessage.bIpv6 == false)
{
asio::ip::address_v4::bytes_type bytes;
std::copy_n(vMessage.begin()+4, 4, bytes.begin());
asio::ip::address_v4 addr(asio::ip::make_address_v4(bytes));
aMessage.sOriginatingSource = addr.to_string();
}
else
{
nStartOfPayload = 20;
asio::ip::address_v6::bytes_type bytes;
std::copy_n(vMessage.begin()+4, 16, bytes.begin());
asio::ip::address_v6 addr(asio::ip::make_address_v6(bytes));
aMessage.sOriginatingSource = addr.to_string();
}
//next is authentication data if any
if(aMessage.nAuthenticationLength != 0)
{
std::copy(vMessage.begin()+nStartOfPayload, vMessage.begin()+nStartOfPayload+aMessage.nAuthenticationLength, std::back_inserter(aMessage.vAuthentication));
nStartOfPayload += aMessage.nAuthenticationLength;
}
//extract the mime type -all chars up to \0
auto itNull = std::find(vMessage.begin()+nStartOfPayload, vMessage.end(), 0x00);
aMessage.sMimeType = std::string(vMessage.begin()+nStartOfPayload, itNull);
if(itNull != vMessage.end())
{
++itNull;
}
aMessage.sData = std::string(itNull, vMessage.end());
if(aMessage.sMimeType.empty() == false)
{
m_pHandler->SapMessage(aMessage);
}
else
{
pml::log::log(pml::log::Level::kError, "pml::sapserver") << "Parser SAP message no mime type";
}
}