1
0
mirror of https://github.com/falk-werner/webfuse-provider synced 2026-03-02 04:09:18 +00:00

added implementation of wf_client_connect and wf_client_disconnect

This commit is contained in:
Falk Werner
2020-06-11 22:57:56 +02:00
parent f2bbebd670
commit eb48dbecc5
8 changed files with 371 additions and 16 deletions

View File

@@ -100,15 +100,14 @@ wf_impl_client_connect(
struct wf_client * client,
char const * url)
{
(void) url;
wf_impl_client_protocol_callback(&client->protocol, WF_CLIENT_DISCONNECTED, NULL);
wf_impl_client_protocol_connect(&client->protocol, client->context, url);
}
void
wf_impl_client_disconnect(
struct wf_client * client)
{
(void) client;
wf_impl_client_protocol_disconnect(&client->protocol);
}
void

View File

@@ -1,19 +1,56 @@
#include "webfuse/adapter/impl/client_protocol.h"
#include "webfuse/adapter/client_callback.h"
#include "webfuse/core/protocol_names.h"
#include "webfuse/core/url.h"
#include "webfuse/core/util.h"
#include <stddef.h>
#include <libwebsockets.h>
static int wf_impl_client_protocol_lws_callback(
struct lws * WF_UNUSED_PARAM(wsi),
enum lws_callback_reasons WF_UNUSED_PARAM(reason),
struct lws * wsi,
enum lws_callback_reasons reason,
void * WF_UNUSED_PARAM(user),
void * WF_UNUSED_PARAM(in),
void * in,
size_t WF_UNUSED_PARAM(len))
{
return 0;
int result = 0;
struct lws_protocols const * ws_protocol = lws_get_protocol(wsi);
struct wf_client_protocol * protocol = (NULL != ws_protocol) ? ws_protocol->user : NULL;
if (NULL != protocol)
{
switch (reason)
{
case LWS_CALLBACK_CLIENT_ESTABLISHED:
protocol->is_connected = true;
protocol->callback(protocol->user_data, WF_CLIENT_CONNECTED, NULL);
break;
case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
protocol->is_connected = false;
protocol->callback(protocol->user_data, WF_CLIENT_DISCONNECTED, NULL);
break;
case LWS_CALLBACK_CLIENT_CLOSED:
protocol->is_connected = false;
protocol->callback(protocol->user_data, WF_CLIENT_DISCONNECTED, NULL);
protocol->wsi = NULL;
break;
case LWS_CALLBACK_SERVER_WRITEABLE:
// fall-through
case LWS_CALLBACK_CLIENT_WRITEABLE:
if (wsi == protocol->wsi)
{
if (protocol->is_shutdown_requested)
{
result = 1;
}
}
default:
break;
}
}
return result;
}
void
@@ -22,6 +59,9 @@ wf_impl_client_protocol_init(
wf_client_callback_fn * callback,
void * user_data)
{
protocol->is_connected = false,
protocol->is_shutdown_requested = false;
protocol->wsi = NULL;
protocol->callback = callback;
protocol->user_data = user_data;
protocol->callback(protocol->user_data, WF_CLIENT_INIT, NULL);
@@ -57,14 +97,47 @@ wf_impl_client_protocol_init_lws(
void
wf_impl_client_protocol_connect(
struct wf_client_protocol * protocol,
struct lws_context * context,
char const * url)
{
struct wf_url url_data;
bool const success = wf_url_init(&url_data, url);
if (success)
{
struct lws_client_connect_info info;
memset(&info, 0 ,sizeof(struct lws_client_connect_info));
info.context = context;
info.port = url_data.port;
info.address = url_data.host;
info.path = url_data.path;
info.host = info.address;
info.origin = info.address;
info.ssl_connection = (url_data.use_tls) ? LCCSCF_USE_SSL : 0;
info.protocol = WF_PROTOCOL_NAME_PROVIDER_SERVER;
info.local_protocol_name = WF_PROTOCOL_NAME_ADAPTER_CLIENT;
info.pwsi = &protocol->wsi;
lws_client_connect_via_info(&info);
wf_url_cleanup(&url_data);
}
else
{
protocol->callback(protocol->user_data, WF_CLIENT_DISCONNECTED, NULL);
}
}
void
wf_impl_client_protocol_disconnect(
struct wf_client_protocol * protocol)
{
if (protocol->is_connected)
{
protocol->is_shutdown_requested = true;
lws_callback_on_writable(protocol->wsi);
}
else
{
protocol->callback(protocol->user_data, WF_CLIENT_DISCONNECTED, NULL);
}
}

View File

@@ -3,12 +3,17 @@
#include "webfuse/adapter/client_callback.h"
#ifndef __cplusplus
#include <stdbool.h>
#endif
#ifdef __cplusplus
extern "C"
{
#endif
struct lws_protocols;
struct lws_context;
typedef void
wf_client_protocol_callback_fn(
@@ -18,6 +23,9 @@ wf_client_protocol_callback_fn(
struct wf_client_protocol
{
bool is_connected;
bool is_shutdown_requested;
struct lws * wsi;
wf_client_callback_fn * callback;
void * user_data;
};
@@ -46,6 +54,7 @@ wf_impl_client_protocol_init_lws(
extern void
wf_impl_client_protocol_connect(
struct wf_client_protocol * protocol,
struct lws_context * conext,
char const * url);
extern void

View File

@@ -1,5 +1,4 @@
#include "webfuse/adapter/impl/client_tlsconfig.h"
#include "webfuse/core/url.h"
#include <stdlib.h>
#include <string.h>