Websocket now supports html5 as well

This commit is contained in:
JCash
2020-09-02 10:44:02 +02:00
parent 1e6c534609
commit 5de32250c3
7 changed files with 371 additions and 147 deletions

View File

@@ -1,8 +1,81 @@
#include "websocket.h"
#if defined(HAVE_WSLAY)
namespace dmWebsocket
{
const struct wslay_event_callbacks g_WslCallbacks = {
WSL_RecvCallback,
WSL_SendCallback,
WSL_GenmaskCallback,
NULL,
NULL,
NULL,
WSL_OnMsgRecvCallback
};
#define WSLAY_CASE(_X) case _X: return #_X;
const char* WSL_ResultToString(int err)
{
switch(err) {
WSLAY_CASE(WSLAY_ERR_WANT_READ);
WSLAY_CASE(WSLAY_ERR_WANT_WRITE);
WSLAY_CASE(WSLAY_ERR_PROTO);
WSLAY_CASE(WSLAY_ERR_INVALID_ARGUMENT);
WSLAY_CASE(WSLAY_ERR_INVALID_CALLBACK);
WSLAY_CASE(WSLAY_ERR_NO_MORE_MSG);
WSLAY_CASE(WSLAY_ERR_CALLBACK_FAILURE);
WSLAY_CASE(WSLAY_ERR_WOULDBLOCK);
WSLAY_CASE(WSLAY_ERR_NOMEM);
default: return "Unknown error";
};
}
#undef WSLAY_CASE
int WSL_Init(wslay_event_context_ptr* ctx, ssize_t buffer_size, void* userctx)
{
// Currently only supports client implementation
int ret = -1;
ret = wslay_event_context_client_init(ctx, &g_WslCallbacks, userctx);
if (ret == 0)
wslay_event_config_set_max_recv_msg_length(*ctx, buffer_size);
return ret;
}
void WSL_Exit(wslay_event_context_ptr ctx)
{
wslay_event_context_free(ctx);
}
int WSL_Close(wslay_event_context_ptr ctx)
{
const char* reason = "Client wants to close";
wslay_event_queue_close(ctx, 0, (const uint8_t*)reason, strlen(reason));
return 0;
}
int WSL_Poll(wslay_event_context_ptr ctx)
{
int r = 0;
if ((r = wslay_event_recv(ctx)) != 0 || (r = wslay_event_send(ctx)) != 0) {
dmLogError("Websocket poll error: %s", WSL_ResultToString(r));
}
return r;
}
int WSL_WantsExit(wslay_event_context_ptr ctx)
{
if ((wslay_event_get_close_sent(ctx) && wslay_event_get_close_received(ctx))) {
return 1;
}
return 0;
}
ssize_t WSL_RecvCallback(wslay_event_context_ptr ctx, uint8_t *buf, size_t len, int flags, void *user_data)
{
WebsocketConnection* conn = (WebsocketConnection*)user_data;
@@ -135,3 +208,5 @@ int WSL_GenmaskCallback(wslay_event_context_ptr ctx, uint8_t *buf, size_t len, v
}
} // namespace
#endif // HAVE_WSLAY