From 8b7f377702bd0f7ff8ac422f67c668309d515975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Wed, 23 Jun 2021 16:45:35 +0200 Subject: [PATCH] feat: add extern device access --- file-browser/include/device_mount.h | 12 ++ file-browser/include/extern_file_access.h | 31 +++++ file-browser/src/extern_file_access.c | 148 ++++++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 file-browser/include/device_mount.h create mode 100644 file-browser/include/extern_file_access.h create mode 100644 file-browser/src/extern_file_access.c diff --git a/file-browser/include/device_mount.h b/file-browser/include/device_mount.h new file mode 100644 index 0000000000000000000000000000000000000000..86b64e3251ef8487d4e1b458dcb550ae1f28a7a0 --- /dev/null +++ b/file-browser/include/device_mount.h @@ -0,0 +1,12 @@ +#ifndef __MOUNT_UTILS_H__ +#define __MOUNT_UTILS_H__ + +#include +#include "file_access.h" + +file_operation_error_t device_mount(char *device, char *target); +file_operation_error_t device_umount(char *device, char *target); + +char *device_mount_get_filesystem(char *device); + +#endif // __MOUNT_UTILS_H__ diff --git a/file-browser/include/extern_file_access.h b/file-browser/include/extern_file_access.h new file mode 100644 index 0000000000000000000000000000000000000000..003da399288b9db99586a49d6685c1d07dbb689e --- /dev/null +++ b/file-browser/include/extern_file_access.h @@ -0,0 +1,31 @@ +#ifndef __EXTERN_FILE_ACCESS_H__ +#define __EXTERN_FILE_ACCESS_H__ + +#include "file_access.h" + +fileaccess_state_t extern_fileaccess_init_state(void *data); +bool extern_fileaccess_deinit_state(fileaccess_state_t state); + +directory_or_error_t extern_fileaccess_directory_list(fileaccess_state_t state, + char *path); +directory_or_error_t extern_fileaccess_root_list(fileaccess_state_t state); + +directory_or_error_t extern_fileaccess_directory_create(fileaccess_state_t state, + char *path); +file_operation_error_t +extern_fileaccess_directory_delete(fileaccess_state_t state, char *path); + +file_operation_error_t +extern_fileaccess_directory_close(fileaccess_state_t state, + directory_t *directory); + +file_operation_error_t +extern_fileaccess_file_get_mime_type(fileaccess_state_t state, file_t *file, + char *mime); +executing_file_or_error_t +extern_fileaccess_file_execute(fileaccess_state_t state, file_t *file, + char *args); +file_operation_error_t extern_fileaccess_file_delete(fileaccess_state_t state, + char *path); + +#endif __EXTERN_FILE_ACCESS_H__ diff --git a/file-browser/src/extern_file_access.c b/file-browser/src/extern_file_access.c new file mode 100644 index 0000000000000000000000000000000000000000..9815248b0b889a77e5451cc74efb90d6e0a4468f --- /dev/null +++ b/file-browser/src/extern_file_access.c @@ -0,0 +1,148 @@ +#include "extern_file_access.h" +#include "device_mount.h" +#include "local_file_access.h" +#include +#include + +static bool extern_fileaccess_check_mount(fileaccess_state_t state) { + return true; +} + +fileaccess_state_t extern_fileaccess_init_state(void *data) { + size_t device_length = strlen(data); + + extern_fileaccess_state_t externstate = {.path = "/mnt/file_browser_device", + .mount_device = NULL, + .mounted = false, + .error = FILOPER_SUCCESS}; + + char *malloced = malloc(sizeof(char) * (device_length + 1)); + if (malloced == NULL) { + externstate.error = FILOPER_UNKNOWN; + } else { + strcpy(malloced, data); + externstate.mount_device = malloced; + } + + externstate.error = device_mount(externstate.mount_device, externstate.path); + + fileaccess_state_t state = { + .fileaccess = &extern_file_access, + .payload.exter = externstate, + }; + + return state; +} + +bool extern_fileaccess_deinit_state(fileaccess_state_t state) { + // unmount + state.payload.exter.error = + device_umount(state.payload.exter.mount_device, state.payload.exter.path); + free(state.payload.exter.mount_device); + + return true; +} + +directory_or_error_t extern_fileaccess_directory_list(fileaccess_state_t state, + char *path) { + if (!extern_fileaccess_check_mount(state)) { + directory_or_error_t error = {.error = true, + .payload.error = FILOPER_UNKNOWN}; + + return error; + } + + return local_fileaccess_directory_list(state, path); +} + +directory_or_error_t extern_fileaccess_root_list(fileaccess_state_t state) { + if (!extern_fileaccess_check_mount(state)) { + directory_or_error_t error = {.error = true, + .payload.error = FILOPER_UNKNOWN}; + + return error; + } + + return local_fileaccess_root_list(state); +} + +directory_or_error_t +extern_fileaccess_directory_create(fileaccess_state_t state, char *path) { + if (!extern_fileaccess_check_mount(state)) { + directory_or_error_t error = {.error = true, + .payload.error = FILOPER_UNKNOWN}; + + return error; + } + + return local_fileaccess_directory_create(state, path); +} + +file_operation_error_t +extern_fileaccess_directory_delete(fileaccess_state_t state, char *path) { + if (!extern_fileaccess_check_mount(state)) { + return FILOPER_UNKNOWN; + } + + return local_fileaccess_directory_delete(state, path); +} + +file_operation_error_t +extern_fileaccess_directory_close(fileaccess_state_t state, + directory_t *directory) { + if (!extern_fileaccess_check_mount(state)) { + return FILOPER_UNKNOWN; + } + + return local_fileaccess_directory_close(state, directory); +} + +file_operation_error_t +extern_fileaccess_file_get_mime_type(fileaccess_state_t state, file_t *file, + char *mime) { + if (!extern_fileaccess_check_mount(state)) { + return FILOPER_UNKNOWN; + } + + return local_fileaccess_file_get_mime_type(state, file, mime); +} + +executing_file_or_error_t +extern_fileaccess_file_execute(fileaccess_state_t state, file_t *file, + char *args) { + if (!extern_fileaccess_check_mount(state)) { + executing_file_or_error_t error = {.error = true, + .payload.error = FILOPER_UNKNOWN}; + + return error; + } + + return local_fileaccess_file_execute(state, file, args); +} + +file_operation_error_t extern_fileaccess_file_delete(fileaccess_state_t state, + char *path) { + if (!extern_fileaccess_check_mount(state)) { + return FILOPER_UNKNOWN; + } + + return local_fileaccess_file_delete(state, path); +} + +const fileaccess_t temp_file_access = { + .type = FA_EXTERN, + .init = extern_fileaccess_init_state, + .deinit = extern_fileaccess_deinit_state, + + .delete_file = extern_fileaccess_file_delete, + .execute_file = extern_fileaccess_file_execute, + .get_mime_type = extern_fileaccess_file_get_mime_type, + + .list_directory = extern_fileaccess_directory_list, + .close_directory = extern_fileaccess_directory_close, + .create_directory = extern_fileaccess_directory_create, + .delete_directory = extern_fileaccess_directory_delete, + + .list_root = extern_fileaccess_root_list, + +};