From e4d95f5dc937bf549e7436a3c33ca3db9dcff185 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sun, 3 Mar 2019 18:02:30 +0100 Subject: [PATCH] implements operation read --- example/provider/main.c | 30 +++++++++++--- lib/wsfs/provider/operation/read.c | 63 ++++++++++++++++++++++++++---- 2 files changed, 80 insertions(+), 13 deletions(-) diff --git a/example/provider/main.c b/example/provider/main.c index 15f7b94..4cc21e1 100644 --- a/example/provider/main.c +++ b/example/provider/main.c @@ -203,6 +203,11 @@ static void fs_open( } } +static size_t min(size_t const a, size_t const b) +{ + return (a < b) ? a : b; +} + static void fs_read( struct wsfsp_request * request, ino_t inode, @@ -211,13 +216,28 @@ static void fs_read( size_t length, void * user_data) { - (void) inode; (void) handle; - (void) offset; - (void) length; - (void) user_data; - wsfsp_respond_error(request, -1); + struct fs * fs = (struct fs*) user_data; + struct fs_entry const * entry = fs_getentry(fs, inode); + if ((NULL != entry) && (FS_FILE == entry->type)) + { + if (entry->content_length > offset) + { + size_t const remaining = entry->content_length - offset; + size_t const count = min(remaining, length); + + wsfsp_respond_read(request, &entry->content[offset], count); + } + else + { + wsfsp_respond_error(request, -1); + } + } + else + { + wsfsp_respond_error(request, -1); + } } static struct wsfsp_provider fs_provider = diff --git a/lib/wsfs/provider/operation/read.c b/lib/wsfs/provider/operation/read.c index ac802d8..c7e4fec 100644 --- a/lib/wsfs/provider/operation/read.c +++ b/lib/wsfs/provider/operation/read.c @@ -1,5 +1,8 @@ #include "wsfs/provider/operation/read_intern.h" -#include + +#include +#include + #include "wsfs/provider/operation/error.h" #include "wsfs/util.h" @@ -8,11 +11,28 @@ void wsfsp_read( json_t * params, int id) { - (void) context; - (void) params; - (void) id; + size_t const count = json_array_size(params); + if (4 == count) + { + json_t * inode_holder = json_array_get(params, 0); + json_t * handle_holder = json_array_get(params, 1); + json_t * offset_holder = json_array_get(params, 2); + json_t * length_holder = json_array_get(params, 3); + + if (json_is_integer(inode_holder) && + json_is_integer(handle_holder) && + json_is_integer(offset_holder) && + json_is_integer(length_holder)) + { + ino_t inode = (ino_t) json_integer_value(inode_holder); + int handle = json_integer_value(handle_holder); + size_t offset = json_integer_value(offset_holder); + size_t length = json_integer_value(length_holder); + struct wsfsp_request * request = wsfsp_request_create(context->request, id); - puts("read"); + context->provider->read(request, inode, handle, offset, length, context->user_data); + } + } } void wsfsp_read_default( @@ -31,7 +51,34 @@ void wsfsp_respond_read( char const * data, size_t length) { - (void) request; - (void) data; - (void) length; + if (0 < length) + { + size_t const size = 4 * ((length / 3) + 2); + char * buffer = malloc(size); + if (NULL != buffer) + { + lws_b64_encode_string(data, length, buffer, size); + + json_t * result = json_object(); + json_object_set_new(result, "data", json_string(buffer)); + json_object_set_new(result, "format", json_string("base64")); + json_object_set_new(result, "count", json_integer((int) length)); + + wsfsp_respond(request, result); + free(buffer); + } + else + { + wsfsp_respond_error(request, -1); + } + } + else + { + json_t * result = json_object(); + json_object_set_new(result, "data", json_string("")); + json_object_set_new(result, "format", json_string("identitiy")); + json_object_set_new(result, "count", json_integer(0)); + + wsfsp_respond(request, result); + } } \ No newline at end of file