From 54e16bfd3dc14e60e55b1da7ddb91597bab6f66f Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 23 Mar 2019 11:33:42 +0100 Subject: [PATCH] moves some logic from server_protocol to session --- lib/wsfs/adapter/server_protocol.c | 48 ++++++++------------ lib/wsfs/adapter/session.c | 72 ++++++++++++++++++++++++++++-- lib/wsfs/adapter/session.h | 29 +++++++++++- lib/wsfs/adapter/session_manager.c | 16 ++++--- lib/wsfs/adapter/session_manager.h | 5 ++- 5 files changed, 127 insertions(+), 43 deletions(-) diff --git a/lib/wsfs/adapter/server_protocol.c b/lib/wsfs/adapter/server_protocol.c index 9f8c503..2d037c4 100644 --- a/lib/wsfs/adapter/server_protocol.c +++ b/lib/wsfs/adapter/server_protocol.c @@ -34,31 +34,31 @@ static int wsfs_server_protocol_callback( } break; case LWS_CALLBACK_ESTABLISHED: - { - bool is_authenticated = wsfs_authenticators_authenticate(&protocol->authenticators, NULL); - wsfs_session_manager_add(&protocol->session_manager, wsi, is_authenticated); - } + session = wsfs_session_manager_add( + &protocol->session_manager, + wsi, + &protocol->authenticators, + &protocol->rpc); + + if (NULL != session) + { + wsfs_session_authenticate(session, NULL); + } break; case LWS_CALLBACK_CLOSED: - { - wsfs_session_manager_remove(&protocol->session_manager, wsi); - } + wsfs_session_manager_remove(&protocol->session_manager, wsi); break; case LWS_CALLBACK_SERVER_WRITEABLE: - if ((NULL != session) && (!wsfs_message_queue_empty(&session->queue))) + if (NULL != session) { - struct wsfs_message * message = wsfs_message_queue_pop(&session->queue); - lws_write(wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT); - wsfs_message_dispose(message); - - if (!wsfs_message_queue_empty(&session->queue)) - { - lws_callback_on_writable(wsi); - } + wsfs_session_onwritable(session); } break; case LWS_CALLBACK_RECEIVE: - wsfs_jsonrpc_server_onresult(&protocol->rpc, in, len); + if (NULL != session) + { + wsfs_session_receive(session, in, len); + } break; case LWS_CALLBACK_RAW_RX_FILE: wsfs_filesystem_process_request(&protocol->filesystem); @@ -74,21 +74,11 @@ static bool wsfs_server_protocol_invoke( void * user_data, json_t const * request) { - bool result = false; struct wsfs_server_protocol * protocol = user_data; struct wsfs_session * session = &protocol->session_manager.session; + struct wsfs_message * message = wsfs_message_create(request); - if ((session->is_authenticated) && (NULL != session->wsi)) - { - struct wsfs_message * message = wsfs_message_create(request); - if (NULL != message) - { - wsfs_message_queue_push(&session->queue, message); - lws_callback_on_writable(session->wsi); - - result = true; - } - } + bool const result = wsfs_session_send(session, message); return result; } diff --git a/lib/wsfs/adapter/session.c b/lib/wsfs/adapter/session.c index 4ad8606..1112e64 100644 --- a/lib/wsfs/adapter/session.c +++ b/lib/wsfs/adapter/session.c @@ -1,14 +1,23 @@ #include "wsfs/adapter/session.h" +#include "wsfs/adapter/authenticators.h" +#include "wsfs/message_queue.h" +#include "wsfs/message.h" +#include "wsfs/adapter/jsonrpc/server.h" + +#include #include void wsfs_session_init( struct wsfs_session * session, struct lws * wsi, - bool is_authenticated) + struct wsfs_authenticators * authenticators, + struct wsfs_jsonrpc_server * rpc) { - session->wsi = wsi; - session->is_authenticated = is_authenticated; - wsfs_message_queue_init(&session->queue); + session->wsi = wsi; + session->is_authenticated = false; + session->authenticators = authenticators; + session->rpc = rpc; + wsfs_message_queue_init(&session->queue); } void wsfs_session_cleanup( @@ -17,4 +26,59 @@ void wsfs_session_cleanup( wsfs_message_queue_cleanup(&session->queue); session->is_authenticated = false; session->wsi = NULL; + session->authenticators = NULL; + session->rpc = NULL; +} + +void wsfs_session_authenticate( + struct wsfs_session * session, + struct wsfs_credentials * creds) +{ + session->is_authenticated = wsfs_authenticators_authenticate(session->authenticators, creds); +} + +bool wsfs_session_send( + struct wsfs_session * session, + struct wsfs_message * message) +{ + bool result = (session->is_authenticated) && (NULL != session->wsi); + + if (result) + { + wsfs_message_queue_push(&session->queue, message); + lws_callback_on_writable(session->wsi); + + result = true; + } + else + { + wsfs_message_dispose(message); + } + + return result; +} + +void wsfs_session_onwritable( + struct wsfs_session * session) +{ + if (!wsfs_message_queue_empty(&session->queue)) + { + struct wsfs_message * message = wsfs_message_queue_pop(&session->queue); + lws_write(session->wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT); + wsfs_message_dispose(message); + + if (!wsfs_message_queue_empty(&session->queue)) + { + lws_callback_on_writable(session->wsi); + } + } +} + + +void wsfs_session_receive( + struct wsfs_session * session, + char const * data, + size_t length) +{ + wsfs_jsonrpc_server_onresult(session->rpc, data, length); } \ No newline at end of file diff --git a/lib/wsfs/adapter/session.h b/lib/wsfs/adapter/session.h index 3c45341..86d41d8 100644 --- a/lib/wsfs/adapter/session.h +++ b/lib/wsfs/adapter/session.h @@ -3,6 +3,10 @@ #ifndef __cplusplus #include +#include +#else +#include +using std::size_t; #endif #include "wsfs/message_queue.h" @@ -13,18 +17,41 @@ extern "C" #endif struct lws; +struct wsfs_message; +struct wsfs_credentials; +struct wsfs_authenticators; +struct wsfs_jsonrpc_server; struct wsfs_session { struct lws * wsi; bool is_authenticated; struct wsfs_message_queue queue; + struct wsfs_authenticators * authenticators; + struct wsfs_jsonrpc_server * rpc; }; extern void wsfs_session_init( struct wsfs_session * session, struct lws * wsi, - bool is_authenticated); + struct wsfs_authenticators * authenticators, + struct wsfs_jsonrpc_server * rpc); + +extern void wsfs_session_authenticate( + struct wsfs_session * session, + struct wsfs_credentials * creds); + +extern bool wsfs_session_send( + struct wsfs_session * session, + struct wsfs_message * message); + +extern void wsfs_session_receive( + struct wsfs_session * session, + char const * data, + size_t length); + +extern void wsfs_session_onwritable( + struct wsfs_session * session); extern void wsfs_session_cleanup( struct wsfs_session * session); diff --git a/lib/wsfs/adapter/session_manager.c b/lib/wsfs/adapter/session_manager.c index 73e332e..290398e 100644 --- a/lib/wsfs/adapter/session_manager.c +++ b/lib/wsfs/adapter/session_manager.c @@ -4,7 +4,7 @@ void wsfs_session_manager_init( struct wsfs_session_manager * manager) { - wsfs_session_init(&manager->session, NULL, false); + wsfs_session_init(&manager->session, NULL, NULL, NULL); } void wsfs_session_manager_cleanup( @@ -13,18 +13,20 @@ void wsfs_session_manager_cleanup( wsfs_session_cleanup(&manager->session); } -bool wsfs_session_manager_add( +struct wsfs_session * wsfs_session_manager_add( struct wsfs_session_manager * manager, struct lws * wsi, - bool is_authenticated) + struct wsfs_authenticators * authenticators, + struct wsfs_jsonrpc_server * rpc) { - bool const result = (NULL == manager->session.wsi); - if (result) + struct wsfs_session * session = NULL; + if (NULL == manager->session.wsi) { - wsfs_session_init(&manager->session, wsi, is_authenticated); + session = &manager->session; + wsfs_session_init(&manager->session, wsi, authenticators, rpc); } - return result; + return session; } struct wsfs_session * wsfs_session_manager_get( diff --git a/lib/wsfs/adapter/session_manager.h b/lib/wsfs/adapter/session_manager.h index b21eeab..d047aef 100644 --- a/lib/wsfs/adapter/session_manager.h +++ b/lib/wsfs/adapter/session_manager.h @@ -25,10 +25,11 @@ extern void wsfs_session_manager_init( extern void wsfs_session_manager_cleanup( struct wsfs_session_manager * manager); -extern bool wsfs_session_manager_add( +extern struct wsfs_session * wsfs_session_manager_add( struct wsfs_session_manager * manager, struct lws * wsi, - bool is_authenticated); + struct wsfs_authenticators * authenticators, + struct wsfs_jsonrpc_server * rpc); extern struct wsfs_session * wsfs_session_manager_get( struct wsfs_session_manager * manager,