Skip to content

Commit 2d7fdbb

Browse files
committed
expose WebSocket makeBuffer() method to be piblically available
1 parent 1dde9cf commit 2d7fdbb

File tree

2 files changed

+84
-88
lines changed

2 files changed

+84
-88
lines changed

src/AsyncWebSocket.cpp

Lines changed: 23 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ class AsyncWebSocketControl {
181181
*/
182182

183183

184-
AsyncWebSocketMessage::AsyncWebSocketMessage(std::shared_ptr<std::vector<uint8_t>> buffer, uint8_t opcode, bool mask) :
184+
AsyncWebSocketMessage::AsyncWebSocketMessage(AsyncWebSocketMessageBuffer buffer, uint8_t opcode, bool mask) :
185185
_WSbuffer{buffer},
186186
_opcode(opcode & 0x07),
187187
_mask{mask},
@@ -643,39 +643,12 @@ size_t AsyncWebSocketClient::printf_P(PGM_P formatP, ...)
643643
}
644644
#endif
645645

646-
namespace {
647-
std::shared_ptr<std::vector<uint8_t>> makeBuffer(const uint8_t *message, size_t len)
646+
AsyncWebSocketMessageBuffer AsyncWebSocketClient::makeBuffer(const uint8_t *message, size_t len)
648647
{
649648
auto buffer = std::make_shared<std::vector<uint8_t>>(len);
650649
std::memcpy(buffer->data(), message, len);
651650
return buffer;
652651
}
653-
}
654-
655-
void AsyncWebSocketClient::text(std::shared_ptr<std::vector<uint8_t>> buffer)
656-
{
657-
_queueMessage(buffer);
658-
}
659-
660-
void AsyncWebSocketClient::text(const uint8_t *message, size_t len)
661-
{
662-
text(makeBuffer(message, len));
663-
}
664-
665-
void AsyncWebSocketClient::text(const char *message, size_t len)
666-
{
667-
text((const uint8_t *)message, len);
668-
}
669-
670-
void AsyncWebSocketClient::text(const char *message)
671-
{
672-
text(message, strlen(message));
673-
}
674-
675-
void AsyncWebSocketClient::text(const String &message)
676-
{
677-
text(message.c_str(), message.length());
678-
}
679652

680653
void AsyncWebSocketClient::text(const __FlashStringHelper *data)
681654
{
@@ -698,31 +671,6 @@ void AsyncWebSocketClient::text(const __FlashStringHelper *data)
698671
}
699672
}
700673

701-
void AsyncWebSocketClient::binary(std::shared_ptr<std::vector<uint8_t>> buffer)
702-
{
703-
_queueMessage(buffer, WS_BINARY);
704-
}
705-
706-
void AsyncWebSocketClient::binary(const uint8_t *message, size_t len)
707-
{
708-
binary(makeBuffer(message, len));
709-
}
710-
711-
void AsyncWebSocketClient::binary(const char *message, size_t len)
712-
{
713-
binary((const uint8_t *)message, len);
714-
}
715-
716-
void AsyncWebSocketClient::binary(const char *message)
717-
{
718-
binary(message, strlen(message));
719-
}
720-
721-
void AsyncWebSocketClient::binary(const String &message)
722-
{
723-
binary(message.c_str(), message.length());
724-
}
725-
726674
void AsyncWebSocketClient::binary(const __FlashStringHelper *data, size_t len)
727675
{
728676
PGM_P p = reinterpret_cast<PGM_P>(data);
@@ -737,7 +685,7 @@ void AsyncWebSocketClient::binary(const __FlashStringHelper *data, size_t len)
737685
IPAddress AsyncWebSocketClient::remoteIP() const
738686
{
739687
if (!_client)
740-
return IPAddress(0U);
688+
return IPAddress((uint32_t)0);
741689

742690
return _client->remoteIP();
743691
}
@@ -850,23 +798,15 @@ void AsyncWebSocket::pingAll(const uint8_t *data, size_t len)
850798
c.ping(data, len);
851799
}
852800

801+
void AsyncWebSocket::text(uint32_t id, AsyncWebSocketMessageBuffer message){
802+
if (AsyncWebSocketClient * c = client(id))
803+
c->message(message);
804+
};
853805
void AsyncWebSocket::text(uint32_t id, const uint8_t *message, size_t len)
854806
{
855807
if (AsyncWebSocketClient * c = client(id))
856808
c->text(makeBuffer(message, len));
857809
}
858-
void AsyncWebSocket::text(uint32_t id, const char *message, size_t len)
859-
{
860-
text(id, (const uint8_t *)message, len);
861-
}
862-
void AsyncWebSocket::text(uint32_t id, const char * message)
863-
{
864-
text(id, message, strlen(message));
865-
}
866-
void AsyncWebSocket::text(uint32_t id, const String &message)
867-
{
868-
text(id, message.c_str(), message.length());
869-
}
870810
void AsyncWebSocket::text(uint32_t id, const __FlashStringHelper *data)
871811
{
872812
PGM_P p = reinterpret_cast<PGM_P>(data);
@@ -889,7 +829,7 @@ void AsyncWebSocket::text(uint32_t id, const __FlashStringHelper *data)
889829
}
890830
}
891831

892-
void AsyncWebSocket::textAll(std::shared_ptr<std::vector<uint8_t>> buffer)
832+
void AsyncWebSocket::textAll(AsyncWebSocketMessageBuffer buffer)
893833
{
894834
for (auto &c : _clients)
895835
if (c.status() == WS_CONNECTED)
@@ -932,6 +872,10 @@ void AsyncWebSocket::textAll(const __FlashStringHelper *data)
932872
}
933873
}
934874

875+
void AsyncWebSocket::binary(uint32_t id, AsyncWebSocketMessageBuffer message){
876+
if (AsyncWebSocketClient * c = client(id))
877+
c->binary(message);
878+
};
935879
void AsyncWebSocket::binary(uint32_t id, const uint8_t *message, size_t len)
936880
{
937881
if (AsyncWebSocketClient *c = client(id))
@@ -961,7 +905,7 @@ void AsyncWebSocket::binary(uint32_t id, const __FlashStringHelper *data, size_t
961905
}
962906
}
963907

964-
void AsyncWebSocket::binaryAll(std::shared_ptr<std::vector<uint8_t>> buffer)
908+
void AsyncWebSocket::binaryAll(AsyncWebSocketMessageBuffer buffer)
965909
{
966910
for (auto &c : _clients)
967911
if (c.status() == WS_CONNECTED)
@@ -1022,7 +966,7 @@ size_t AsyncWebSocket::printfAll(const char *format, ...)
1022966
va_end(arg);
1023967
delete[] temp;
1024968

1025-
std::shared_ptr<std::vector<uint8_t>> buffer = std::make_shared<std::vector<uint8_t>>(len);
969+
AsyncWebSocketMessageBuffer buffer = std::make_shared<std::vector<uint8_t>>(len);
1026970

1027971
va_start(arg, format);
1028972
vsnprintf( (char *)buffer->data(), len + 1, format, arg);
@@ -1058,7 +1002,7 @@ size_t AsyncWebSocket::printfAll_P(PGM_P formatP, ...)
10581002
va_end(arg);
10591003
delete[] temp;
10601004

1061-
std::shared_ptr<std::vector<uint8_t>> buffer = std::make_shared<std::vector<uint8_t>>(len + 1);
1005+
AsyncWebSocketMessageBuffer buffer = std::make_shared<std::vector<uint8_t>>(len + 1);
10621006

10631007
va_start(arg, formatP);
10641008
vsnprintf_P((char *)buffer->data(), len + 1, formatP, arg);
@@ -1141,6 +1085,13 @@ void AsyncWebSocket::handleRequest(AsyncWebServerRequest *request)
11411085
request->send(response);
11421086
}
11431087

1088+
AsyncWebSocketMessageBuffer AsyncWebSocket::makeBuffer(const uint8_t *message, size_t len)
1089+
{
1090+
auto buffer = std::make_shared<std::vector<uint8_t>>(len);
1091+
std::memcpy(buffer->data(), message, len);
1092+
return buffer;
1093+
}
1094+
11441095
/*
11451096
* Response to Web Socket request - sends the authorization and detaches the TCP Client from the web server
11461097
* Authentication code from https://github.com/Links2004/arduinoWebSockets/blob/master/src/WebSockets.cpp#L480
@@ -1208,3 +1159,4 @@ size_t AsyncWebSocketResponse::_ack(AsyncWebServerRequest *request, size_t len,
12081159

12091160
return 0;
12101161
}
1162+

src/AsyncWebSocket.h

Lines changed: 61 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
#define DEFAULT_MAX_WS_CLIENTS 4
5151
#endif
5252

53+
using AsyncWebSocketMessageBuffer = std::shared_ptr<std::vector<uint8_t>>;
54+
5355
class AsyncWebSocket;
5456
class AsyncWebSocketResponse;
5557
class AsyncWebSocketClient;
@@ -84,6 +86,7 @@ typedef enum { WS_CONTINUATION, WS_TEXT, WS_BINARY, WS_DISCONNECT = 0x08, WS_PIN
8486
typedef enum { WS_MSG_SENDING, WS_MSG_SENT, WS_MSG_ERROR } AwsMessageStatus;
8587
typedef enum { WS_EVT_CONNECT, WS_EVT_DISCONNECT, WS_EVT_PONG, WS_EVT_ERROR, WS_EVT_DATA } AwsEventType;
8688

89+
8790
class AsyncWebSocketMessage
8891
{
8992
private:
@@ -161,7 +164,26 @@ class AsyncWebSocketClient {
161164
}
162165

163166
//data packets
164-
void message(std::shared_ptr<std::vector<uint8_t>> buffer, uint8_t opcode=WS_TEXT, bool mask=false) { _queueMessage(buffer, opcode, mask); }
167+
/**
168+
* @brief allocate memory buffer owned by shared-pointer and copy provided data
169+
* used to keep the data untill websocket send is complete for single/multiple clients
170+
*
171+
* @param message
172+
* @param len
173+
* @return AsyncWebSocketMessageBuffer
174+
*/
175+
AsyncWebSocketMessageBuffer makeBuffer(const uint8_t *message, size_t len);
176+
177+
/**
178+
* @brief allocate empty memory buffer owned by shared-pointer
179+
* used to keep the data untill websocket send is complete for single/multiple clients
180+
*
181+
* @param len
182+
* @return AsyncWebSocketMessageBuffer
183+
*/
184+
inline AsyncWebSocketMessageBuffer makeBuffer(size_t len){ return std::make_shared<std::vector<uint8_t>>(len); };
185+
186+
void message(AsyncWebSocketMessageBuffer buffer, uint8_t opcode=WS_TEXT, bool mask=false) { _queueMessage(buffer, opcode, mask); }
165187
bool queueIsFull() const;
166188
size_t queueLen() const;
167189

@@ -170,18 +192,18 @@ class AsyncWebSocketClient {
170192
size_t printf_P(PGM_P formatP, ...) __attribute__ ((format (printf, 2, 3)));
171193
#endif
172194

173-
void text(std::shared_ptr<std::vector<uint8_t>> buffer);
174-
void text(const uint8_t *message, size_t len);
175-
void text(const char *message, size_t len);
176-
void text(const char *message);
177-
void text(const String &message);
195+
inline void text(AsyncWebSocketMessageBuffer buffer){ _queueMessage(buffer); };
196+
inline void text(const uint8_t *message, size_t len){ text(makeBuffer(message, len)); };
197+
inline void text(const char *message, size_t len){ text((const uint8_t *)message, len); };
198+
inline void text(const char *message){ text(message, strlen(message)); };
199+
inline void text(const String &message){ text(message.c_str(), message.length()); };
178200
void text(const __FlashStringHelper *message);
179201

180-
void binary(std::shared_ptr<std::vector<uint8_t>> buffer);
181-
void binary(const uint8_t *message, size_t len);
182-
void binary(const char * message, size_t len);
183-
void binary(const char * message);
184-
void binary(const String &message);
202+
inline void binary(AsyncWebSocketMessageBuffer buffer){ _queueMessage(buffer, WS_BINARY); };
203+
inline void binary(const uint8_t *message, size_t len){ binary(makeBuffer(message, len)); };
204+
inline void binary(const char * message, size_t len){ binary((const uint8_t *)message, len); };
205+
inline void binary(const char * message){ binary(message, strlen(message)); };
206+
inline void binary(const String &message){ binary(message.c_str(), message.length()); };
185207
void binary(const __FlashStringHelper *message, size_t len);
186208

187209
bool canSend() const;
@@ -205,7 +227,7 @@ class AsyncWebSocket: public AsyncWebHandler {
205227
std::list<AsyncWebSocketClient> _clients;
206228
uint32_t _cNextId;
207229
AwsEventHandler _eventHandler;
208-
AwsHandshakeHandler _handshakeHandler;
230+
AwsHandshakeHandler _handshakeHandler;
209231
bool _enabled;
210232
AsyncWebLock _lock;
211233

@@ -229,26 +251,48 @@ class AsyncWebSocket: public AsyncWebHandler {
229251
void ping(uint32_t id, const uint8_t *data=NULL, size_t len=0);
230252
void pingAll(const uint8_t *data=NULL, size_t len=0); // done
231253

254+
//data packets
255+
/**
256+
* @brief allocate memory buffer owned by shared-pointer and copy provided data
257+
* used to keep the data untill websocket send is complete for single/multiple clients
258+
*
259+
* @param message
260+
* @param len
261+
* @return AsyncWebSocketMessageBuffer
262+
*/
263+
AsyncWebSocketMessageBuffer makeBuffer(const uint8_t *message, size_t len);
264+
265+
/**
266+
* @brief allocate empty memory buffer owned by shared-pointer
267+
* used to keep the data untill websocket send is complete for single/multiple clients
268+
*
269+
* @param len
270+
* @return AsyncWebSocketMessageBuffer
271+
*/
272+
inline AsyncWebSocketMessageBuffer makeBuffer(size_t len){ return std::make_shared<std::vector<uint8_t>>(len); };
273+
274+
void text(uint32_t id, AsyncWebSocketMessageBuffer message);
232275
void text(uint32_t id, const uint8_t * message, size_t len);
233-
void text(uint32_t id, const char *message, size_t len);
234-
void text(uint32_t id, const char *message);
235-
void text(uint32_t id, const String &message);
276+
inline void text(uint32_t id, const char *message, size_t len){ text(id, (const uint8_t *)message, len); };
277+
inline void text(uint32_t id, const char *message){ text(id, message, strlen(message)); };
278+
inline void text(uint32_t id, const String &message){ text(id, message.c_str(), message.length()); };
236279
void text(uint32_t id, const __FlashStringHelper *message);
237280

238-
void textAll(std::shared_ptr<std::vector<uint8_t>> buffer);
281+
void textAll(AsyncWebSocketMessageBuffer buffer);
239282
void textAll(const uint8_t *message, size_t len);
240283
void textAll(const char * message, size_t len);
241284
void textAll(const char * message);
242285
void textAll(const String &message);
243286
void textAll(const __FlashStringHelper *message); // need to convert
244287

288+
void binary(uint32_t id, AsyncWebSocketMessageBuffer message);
245289
void binary(uint32_t id, const uint8_t *message, size_t len);
246290
void binary(uint32_t id, const char *message, size_t len);
247291
void binary(uint32_t id, const char *message);
248292
void binary(uint32_t id, const String &message);
249293
void binary(uint32_t id, const __FlashStringHelper *message, size_t len);
250294

251-
void binaryAll(std::shared_ptr<std::vector<uint8_t>> buffer);
295+
void binaryAll(AsyncWebSocketMessageBuffer buffer);
252296
void binaryAll(const uint8_t *message, size_t len);
253297
void binaryAll(const char *message, size_t len);
254298
void binaryAll(const char *message);

0 commit comments

Comments
 (0)