From 16996e1f9ad824f2e4a08ce42afc856131d81c8e Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Tue, 9 Jun 2020 22:41:38 +0200 Subject: [PATCH] added first impression of adapter client API --- include/webfuse/adapter/client.h | 80 ++++++++++++++++ include/webfuse/adapter/client_credentials.h | 28 ++++++ include/webfuse_adapter.h | 4 + lib/webfuse/adapter/api.c | 98 ++++++++++++++++++++ meson.build | 1 + test/webfuse/tests/adapter/test_client.cc | 85 +++++++++++++++++ 6 files changed, 296 insertions(+) create mode 100644 include/webfuse/adapter/client.h create mode 100644 include/webfuse/adapter/client_credentials.h create mode 100644 test/webfuse/tests/adapter/test_client.cc diff --git a/include/webfuse/adapter/client.h b/include/webfuse/adapter/client.h new file mode 100644 index 0000000..2e8273f --- /dev/null +++ b/include/webfuse/adapter/client.h @@ -0,0 +1,80 @@ +//////////////////////////////////////////////////////////////////////////////// +/// \file adapter/client.h +/// \brief Adapter client. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef WF_ADAPTER_CLIENT_H +#define WF_ADAPTER_CLIENT_H + +#include "webfuse/adapter/api.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define WF_CLIENT_CREATED 0x0001 +#define WF_CLIENT_DISPOSING 0x0002 + +#define WF_CLIENT_CONNECTED 0x0011 +#define WF_CLIENT_DISCONNECTED 0x0012 + +#define WF_CLIENT_AUTHENTICATED 0x0021 +#define WF_CLIENT_AUTHENTICATION_FAILED 0x0022 +#define WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS 0x0023 + +#define WF_CLIENT_FILESYSTEM_ADDED 0x0031 +#define WF_CLIENT_FILESYSTEM_ADD_FAILED 0x0032 + +struct wf_client; + +typedef void wf_client_callback_fn( + struct wf_client * client, + int reason, + void * args); + +extern WF_API struct wf_client * +wf_client_create( + wf_client_callback_fn * callback, + void * user_data); + +extern WF_API void +wf_client_dispose( + struct wf_client * client); + +extern WF_API void * +wf_client_get_userdata( + struct wf_client * client); + +extern WF_API void +wf_client_service( + struct wf_client * client); + +extern WF_API void +wf_client_interrupt( + struct wf_client * client); + +extern WF_API void +wf_client_connect( + struct wf_client * client, + char const * url); + +extern WF_API void +wf_client_disconnect( + struct wf_client * client); + +extern WF_API void +wf_client_authenticate( + struct wf_client * client); + +extern WF_API void +wf_client_add_filesystem( + struct wf_client * client, + char const * local_path, + char const * name); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/include/webfuse/adapter/client_credentials.h b/include/webfuse/adapter/client_credentials.h new file mode 100644 index 0000000..f673317 --- /dev/null +++ b/include/webfuse/adapter/client_credentials.h @@ -0,0 +1,28 @@ +#ifndef WF_ADAPTER_CLIENT_CREDENTIALS_H +#define WF_ADAPTER_CLIENT_CREDENTIALS_H + +#include "webfuse/adapter/api.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +struct wf_client_credentials; + +extern WF_API void +wf_client_credentials_set_type( + struct wf_client_credentials * credentials, + char const * type); + +extern WF_API void +wf_client_credentials_add( + struct wf_client_credentials * credentials, + char const * key, + char const * value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/webfuse_adapter.h b/include/webfuse_adapter.h index 1ff048f..da9533c 100644 --- a/include/webfuse_adapter.h +++ b/include/webfuse_adapter.h @@ -17,4 +17,8 @@ #include #include +#include +#include + + #endif diff --git a/lib/webfuse/adapter/api.c b/lib/webfuse/adapter/api.c index 5049e16..66288e6 100644 --- a/lib/webfuse/adapter/api.c +++ b/lib/webfuse/adapter/api.c @@ -178,3 +178,101 @@ wf_mountpoint_set_userdata( { wf_impl_mountpoint_set_userdata(mountpoint, user_data, dispose); } + +// client + +struct wf_client * +wf_client_create( + wf_client_callback_fn * callback, + void * user_data) +{ + (void) callback; + (void) user_data; + + return NULL; +} + +void +wf_client_dispose( + struct wf_client * client) +{ + (void) client; +} + +void * +wf_client_get_userdata( + struct wf_client * client) +{ + (void) client; + return NULL; +} + +void +wf_client_service( + struct wf_client * client) +{ + (void) client; +} + +void +wf_client_interrupt( + struct wf_client * client) +{ + (void) client; +} + +void +wf_client_connect( + struct wf_client * client, + char const * url) +{ + (void) client; + (void) url; +} + +void +wf_client_disconnect( + struct wf_client * client) +{ + (void) client; +} + +void +wf_client_authenticate( + struct wf_client * client) +{ + (void) client; +} + +void +wf_client_add_filesystem( + struct wf_client * client, + char const * local_path, + char const * name) +{ + (void) client; + (void) local_path; + (void) name; +} + +// client credentials + +void +wf_client_credentials_set_type( + struct wf_client_credentials * credentials, + char const * type) +{ + (void) credentials; + (void) type; +} + +void +wf_client_credentials_add( + struct wf_client_credentials * credentials, + char const * key, + char const * value) +{ + (void) credentials; + (void) key; + (void) value; +} \ No newline at end of file diff --git a/meson.build b/meson.build index e08f828..42edd6f 100644 --- a/meson.build +++ b/meson.build @@ -250,6 +250,7 @@ alltests = executable('alltests', 'test/webfuse/tests/integration/file.cc', 'test/webfuse/tests/integration/server.cc', 'test/webfuse/tests/integration/provider.cc', + 'test/webfuse/tests/adapter/test_client.cc', link_args: [ '-Wl,--wrap=wf_timer_manager_create', '-Wl,--wrap=wf_timer_manager_dispose', diff --git a/test/webfuse/tests/adapter/test_client.cc b/test/webfuse/tests/adapter/test_client.cc new file mode 100644 index 0000000..d972447 --- /dev/null +++ b/test/webfuse/tests/adapter/test_client.cc @@ -0,0 +1,85 @@ +#include + +#include "webfuse/adapter/client.h" +#include "webfuse/adapter/client_credentials.h" + +namespace +{ + +enum class connection_state +{ + disconnected, + connected, + connecting +}; + +struct context +{ + connection_state state; +}; + +void callback( + wf_client * client, + int reason, + void * args) +{ + auto * ctx = reinterpret_cast(wf_client_get_userdata(client)); + + switch (reason) + { + case WF_CLIENT_CREATED: + ctx->state = connection_state::connecting; + wf_client_connect(client, "ws://dummy-server/"); + break; + case WF_CLIENT_CONNECTED: + ctx->state = connection_state::connected; + wf_client_authenticate(client); + break; + case WF_CLIENT_AUTHENTICATED: + wf_client_add_filesystem(client, ".", "test"); + break; + case WF_CLIENT_AUTHENTICATION_FAILED: + wf_client_disconnect(client); + break; + case WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS: + { + auto * credentials = reinterpret_cast(args); + wf_client_credentials_set_type(credentials, "username"); + wf_client_credentials_add(credentials, "user", "bob"); + wf_client_credentials_add(credentials, "password", "secret"); + } + break; + case WF_CLIENT_FILESYSTEM_ADDED: + // operational + break; + case WF_CLIENT_FILESYSTEM_ADD_FAILED: + wf_client_disconnect(client); + break; + case WF_CLIENT_DISCONNECTED: + ctx->state = connection_state::disconnected; + break; + default: + break; + } +} + +} + +TEST(client, general_usage) +{ + context ctx; + ctx.state = connection_state::connecting; + + wf_client * client = wf_client_create( + &callback, reinterpret_cast(&ctx)); + + if (nullptr != client) + { + while (ctx.state != connection_state::disconnected) + { + wf_client_service(client); + } + + wf_client_dispose(client); + } +} \ No newline at end of file