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:
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)