2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
20#include "core/socket/stream/SocketConnection.h"
21#include "iot/mqtt/SubProtocol.h"
22#include "log/Logger.h"
23#include "utils/system/signal.h"
24#include "web/websocket/SubProtocolContext.h"
26#ifndef DOXYGEN_SHOULD_SKIP_THIS
28#include "utils/hexdump.h"
36 template <
typename WSSubProtocolRole>
37 SubProtocol<WSSubProtocolRole>::SubProtocol(web::websocket::SubProtocolContext* subProtocolContext,
38 const std::string& name,
39 iot::mqtt::Mqtt* mqtt)
40 : WSSubProtocolRole(subProtocolContext, name, 0)
41 , iot::mqtt::MqttContext(mqtt)
42 , onReceivedFromPeerEvent([
this]([[maybe_unused]]
const utils::Timeval& currentTime) {
43 iot::mqtt::MqttContext::onReceivedFromPeer();
46 onReceivedFromPeerEvent.span();
54 template <
typename WSSubProtocolRole>
55 std::size_t SubProtocol<WSSubProtocolRole>::recv(
char* chunk, std::size_t chunklen) {
56 std::size_t maxReturn = std::min(chunklen, size);
58 std::copy(buffer.data() + cursor, buffer.data() + cursor + maxReturn, chunk);
66 template <
typename WSSubProtocolRole>
67 void SubProtocol<WSSubProtocolRole>::send(
const char* chunk, std::size_t chunklen) {
68 WSSubProtocolRole::sendMessage(chunk, chunklen);
71 template <
typename WSSubProtocolRole>
72 void SubProtocol<WSSubProtocolRole>::end([[maybe_unused]]
bool fatal) {
73 WSSubProtocolRole::sendClose();
76 template <
typename WSSubProtocolRole>
77 void SubProtocol<WSSubProtocolRole>::close() {
78 WSSubProtocolRole::sendClose();
81 template <
typename WSSubProtocolRole>
82 void SubProtocol<WSSubProtocolRole>::onConnected() {
83 LOG(INFO) << getSocketConnection()->getConnectionName() <<
" WSMQTT: connected:";
84 iot::mqtt::MqttContext::onConnected();
87 template <
typename WSSubProtocolRole>
88 void SubProtocol<WSSubProtocolRole>::onMessageStart(
int opCode) {
89 if (opCode == web::websocket::SubProtocolContext::OpCode::TEXT) {
90 LOG(ERROR) << getSocketConnection()->getConnectionName() <<
" WSMQTT: Wrong Opcode: " << opCode;
93 LOG(DEBUG) << getSocketConnection()->getConnectionName() <<
" WSMQTT: Message START: " << opCode;
97 template <
typename WSSubProtocolRole>
98 void SubProtocol<WSSubProtocolRole>::onMessageData(
const char* chunk, std::size_t chunkLen) {
99 data.append(std::string(chunk, chunkLen));
101 LOG(DEBUG) << getSocketConnection()->getConnectionName() <<
" WebSocket: Frame Data:\n"
102 << std::string(32,
' ').append(utils::hexDump(std::vector<
char>(chunk, chunk + chunkLen), 32));
105 template <
typename WSSubProtocolRole>
106 void SubProtocol<WSSubProtocolRole>::onMessageEnd() {
107 LOG(DEBUG) << getSocketConnection()->getConnectionName() <<
" WSMQTT: Message END";
109 buffer.insert(buffer.end(), data.begin(), data.end());
113 iot::mqtt::MqttContext::onReceivedFromPeer();
116 onReceivedFromPeerEvent.span();
123 template <
typename WSSubProtocolRole>
124 void SubProtocol<WSSubProtocolRole>::onMessageError(uint16_t errnum) {
125 LOG(ERROR) << getSocketConnection()->getConnectionName() <<
" WSMQTT: Message error: " << errnum;
128 template <
typename WSSubProtocolRole>
129 void SubProtocol<WSSubProtocolRole>::onDisconnected() {
130 iot::mqtt::MqttContext::onDisconnected();
131 LOG(DEBUG) << getSocketConnection()->getConnectionName() <<
" WSMQTT: disconnected:";
134 template <
typename WSSubProtocolRole>
135 bool SubProtocol<WSSubProtocolRole>::onSignal(
int sig) {
136 bool ret = iot::mqtt::MqttContext::onSignal(sig);
137 LOG(INFO) << getSocketConnection()->getConnectionName() <<
" WSMQTT: exit due to '" << strsignal(sig) <<
"' (SIG"
138 << utils::system::sigabbrev_np(sig) <<
" = " << sig <<
")";
145 template <
typename WSSubProtocolRole>
146 core::socket::stream::SocketConnection* SubProtocol<WSSubProtocolRole>::getSocketConnection()
const {
147 return WSSubProtocolRole::subProtocolContext->getSocketConnection();
void onEvent(const utils::Timeval ¤tTime) override
OnReceivedFromPeerEvent(const std::function< void(const utils::Timeval &)> &onReceivedFromPeer)
std::function< void(const utils::Timeval &)> onReceivedFromPeer
void onMessageError(uint16_t errnum) override
bool onSignal(int sig) override
void send(const char *chunk, std::size_t chunklen) override
void onDisconnected() override
void onConnected() override
void end(bool fatal=false) override
core::socket::stream::SocketConnection * getSocketConnection() const override
std::size_t recv(char *chunk, std::size_t chunklen) override
std::vector< char > buffer
OnReceivedFromPeerEvent onReceivedFromPeerEvent
void onMessageData(const char *chunk, std::size_t chunkLen) override
SubProtocol(web::websocket::SubProtocolContext *subProtocolContext, const std::string &name, iot::mqtt::Mqtt *mqtt)
void onMessageEnd() override
void onMessageStart(int opCode) override
~SubProtocol() override=default