libgnunetchat

library for GNUnet Messenger
Log | Files | Refs | README | LICENSE

commit 4db9842adc64fe254a2e61ce214b2fabb2fc67f8
parent ba8fe8ba1afa40046b209b1ae8ba290a09c90050
Author: TheJackiMonster <thejackimonster@gmail.com>
Date:   Mon, 10 Jan 2022 21:50:43 +0100

Implemented using temporary file previews

Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>

Diffstat:
Minclude/gnunet_chat_lib.h | 19+++++++++++++++++++
Msrc/gnunet_chat_file.c | 23++++++++++++-----------
Msrc/gnunet_chat_file.h | 2++
Msrc/gnunet_chat_lib.c | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++----
4 files changed, 87 insertions(+), 15 deletions(-)

diff --git a/include/gnunet_chat_lib.h b/include/gnunet_chat_lib.h @@ -816,6 +816,25 @@ int GNUNET_CHAT_file_is_local (const struct GNUNET_CHAT_File *file); /** + * Returns the temporary file name of the decrypted file preview + * of a given <i>file</i> handle. + * + * @param[in,out] file File handle + * @return The temporary file name or NULL on error + */ +const char* +GNUNET_CHAT_file_open_preview (struct GNUNET_CHAT_File *file); + +/** + * Deletes the temporary decrypted file preview of a given <i>file</i> + * handle. + * + * @param[out] file File handle + */ +void +GNUNET_CHAT_file_close_preview (struct GNUNET_CHAT_File *file); + +/** * Sets a custom <i>user pointer</i> to a given <i>file</i> handle so it can * be accessed in file related callbacks. * diff --git a/src/gnunet_chat_file.c b/src/gnunet_chat_file.c @@ -61,6 +61,8 @@ file_create_from_message (struct GNUNET_CHAT_Handle *handle, file->unindex_head = NULL; file->unindex_tail = NULL; + file->preview = NULL; + file->user_pointer = NULL; return file; @@ -102,6 +104,8 @@ file_create_from_disk (struct GNUNET_CHAT_Handle *handle, file->unindex_head = NULL; file->unindex_tail = NULL; + file->preview = NULL; + file->user_pointer = NULL; return file; @@ -251,21 +255,18 @@ file_update_upload (struct GNUNET_CHAT_File *file, if (!(file->uri)) return; - struct GNUNET_MESSENGER_Message message; - message.header.kind = GNUNET_MESSENGER_KIND_FILE; - - memcpy(&(message.body.file.key), &(file->key), sizeof(file->key)); - memcpy(&(message.body.file.hash), &(file->hash), sizeof(file->hash)); - - strncpy(message.body.file.name, file->name, NAME_MAX); - - message.body.file.uri = GNUNET_FS_uri_to_string(file->uri); + struct GNUNET_MESSENGER_Message msg; + msg.header.kind = GNUNET_MESSENGER_KIND_FILE; + GNUNET_memcpy(&(msg.body.file.key), &(file->key), sizeof(file->key)); + GNUNET_memcpy(&(msg.body.file.hash), &(file->hash), sizeof(file->hash)); + GNUNET_strlcpy(msg.body.file.name, file->name, NAME_MAX); + msg.body.file.uri = GNUNET_FS_uri_to_string(file->uri); while (file->upload_head) { upload = file->upload_head; - GNUNET_MESSENGER_send_message(upload->context->room, &message, NULL); + GNUNET_MESSENGER_send_message(upload->context->room, &msg, NULL); GNUNET_CONTAINER_DLL_remove( file->upload_head, @@ -276,7 +277,7 @@ file_update_upload (struct GNUNET_CHAT_File *file, GNUNET_free(upload); } - GNUNET_free(message.body.file.uri); + GNUNET_free(msg.body.file.uri); } void diff --git a/src/gnunet_chat_file.h b/src/gnunet_chat_file.h @@ -92,6 +92,8 @@ struct GNUNET_CHAT_File struct GNUNET_CHAT_FileUnindex *unindex_head; struct GNUNET_CHAT_FileUnindex *unindex_tail; + char *preview; + void *user_pointer; }; diff --git a/src/gnunet_chat_lib.c b/src/gnunet_chat_lib.c @@ -638,7 +638,7 @@ GNUNET_CHAT_context_send_file (struct GNUNET_CHAT_Context *context, ); if (file) - goto file_upload; + goto file_binding; if ((GNUNET_YES == GNUNET_DISK_file_test(filename)) || (GNUNET_OK != GNUNET_DISK_directory_create_for_file(filename)) || @@ -677,9 +677,6 @@ GNUNET_CHAT_context_send_file (struct GNUNET_CHAT_Context *context, return NULL; } -file_upload: - file_bind_upload(file, context, callback, cls); - struct GNUNET_FS_BlockOptions bo; bo.anonymity_level = 1; @@ -707,6 +704,9 @@ file_upload: ); GNUNET_free(filename); + +file_binding: + file_bind_upload(file, context, callback, cls); return file; } @@ -1016,6 +1016,56 @@ GNUNET_CHAT_file_is_local (const struct GNUNET_CHAT_File *file) } +const char* +GNUNET_CHAT_file_open_preview (struct GNUNET_CHAT_File *file) +{ + if (!file) + return NULL; + + if (file->preview) + return file->preview; + + char *filename; + util_get_filename ( + file->handle->directory, "files", &(file->hash), &filename + ); + + if (GNUNET_YES != GNUNET_DISK_file_test(filename)) + goto free_filename; + + file->preview = GNUNET_DISK_mktemp(file->name); + + if (!(file->preview)) + goto free_filename; + + remove(file->preview); + + if ((GNUNET_OK != GNUNET_DISK_file_copy(filename, file->preview)) || + (GNUNET_OK != util_decrypt_file(file->preview, &(file->key)))) + { + GNUNET_free(file->preview); + file->preview = NULL; + } + +free_filename: + GNUNET_free(filename); + return file->preview; +} + + +void +GNUNET_CHAT_file_close_preview (struct GNUNET_CHAT_File *file) +{ + if ((!file) || (!(file->preview))) + return; + + remove(file->preview); + + GNUNET_free(file->preview); + file->preview = NULL; +} + + void GNUNET_CHAT_file_set_user_pointer (struct GNUNET_CHAT_File *file, void *user_pointer)