/*
This file is part of GNUnet.
Copyright (C) 2021--2024 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
SPDX-License-Identifier: AGPL3.0-or-later
*/
/*
* @author Tobias Frisch
* @file gnunet_chat_file.h
*/
#ifndef GNUNET_CHAT_FILE_H_
#define GNUNET_CHAT_FILE_H_
#include
#include
#include
#include "gnunet_chat_lib.h"
struct GNUNET_CHAT_FileUpload
{
struct GNUNET_CHAT_FileUpload *prev;
struct GNUNET_CHAT_FileUpload *next;
struct GNUNET_CHAT_Context *context;
GNUNET_CHAT_FileUploadCallback callback;
void *cls;
};
struct GNUNET_CHAT_FileDownload
{
struct GNUNET_CHAT_FileDownload *prev;
struct GNUNET_CHAT_FileDownload *next;
GNUNET_CHAT_FileDownloadCallback callback;
void *cls;
};
struct GNUNET_CHAT_FileUnindex
{
struct GNUNET_CHAT_FileUnindex *prev;
struct GNUNET_CHAT_FileUnindex *next;
GNUNET_CHAT_FileUnindexCallback callback;
void *cls;
};
struct GNUNET_CHAT_Handle;
#define GNUNET_CHAT_FILE_STATUS_DOWNLOAD 0x1
#define GNUNET_CHAT_FILE_STATUS_PUBLISH 0x2
#define GNUNET_CHAT_FILE_STATUS_UNINDEX 0x4
#define GNUNET_CHAT_FILE_STATUS_MASK 0x7
struct GNUNET_CHAT_File
{
struct GNUNET_CHAT_Handle *handle;
char *name;
struct GNUNET_HashCode hash;
struct GNUNET_CRYPTO_SymmetricSessionKey *key;
struct GNUNET_FS_MetaData *meta;
struct GNUNET_FS_Uri *uri;
struct GNUNET_FS_DownloadContext *download;
struct GNUNET_FS_PublishContext *publish;
struct GNUNET_FS_UnindexContext *unindex;
struct GNUNET_CHAT_FileUpload *upload_head;
struct GNUNET_CHAT_FileUpload *upload_tail;
struct GNUNET_CHAT_FileDownload *download_head;
struct GNUNET_CHAT_FileDownload *download_tail;
struct GNUNET_CHAT_FileUnindex *unindex_head;
struct GNUNET_CHAT_FileUnindex *unindex_tail;
int status;
char *preview;
void *user_pointer;
};
/**
* Creates a chat file handle from a file body in a
* message with a selected chat handle.
*
* @param[in,out] handle Chat handle
* @param[in] message File message body
* @return New chat file handle
*/
struct GNUNET_CHAT_File*
file_create_from_message (struct GNUNET_CHAT_Handle *handle,
const struct GNUNET_MESSENGER_MessageFile *message);
/**
* Creates a chat file handle from a FS CHK URI and
* with a selected chat handle.
*
* @param[in,out] handle Chat handle
* @param[in] uri FS CHK URI
* @return New chat file handle
*/
struct GNUNET_CHAT_File*
file_create_from_chk_uri (struct GNUNET_CHAT_Handle *handle,
const struct GNUNET_FS_Uri *uri);
/**
* Creates a chat file handle from a local file on disk
* under a given name using a hash and a
* selected symmetric key with a selected chat
* handle.
*
* @param[in,out] handle Chat handle
* @param[in] name File name
* @param[in] hash File hash
* @param[in] key Symmetric key
* @return New chat file handle
*/
struct GNUNET_CHAT_File*
file_create_from_disk (struct GNUNET_CHAT_Handle *handle,
const char *name,
const struct GNUNET_HashCode *hash,
const struct GNUNET_CRYPTO_SymmetricSessionKey *key);
/**
* Destroys a chat file handle and frees its memory.
*
* @param[in,out] file Chat file handle
*/
void
file_destroy (struct GNUNET_CHAT_File *file);
/**
* Binds a chat context, a callback and a closure
* to a given chat file handle to be called on any
* progress uploading the regarding file.
*
* @param[in,out] file Chat file handle
* @param[in,out] context Chat context
* @param[in] cb Callback for upload progress
* @param[in,out] cls Closure
*/
void
file_bind_upload (struct GNUNET_CHAT_File *file,
struct GNUNET_CHAT_Context *context,
GNUNET_CHAT_FileUploadCallback cb,
void *cls);
/**
* Binds a callback and a closure to a given chat file
* handle to be called on any progress downloading the
* regarding file.
*
* @param[in,out] file Chat file handle
* @param[in] cb Callback for download progress
* @param[in,out] cls Closure
*/
void
file_bind_downlaod (struct GNUNET_CHAT_File *file,
GNUNET_CHAT_FileDownloadCallback cb,
void *cls);
/**
* Binds a callback and a closure to a given chat file
* handle to be called on any progress unindexing the
* regarding file.
*
* @param[in,out] file Chat file handle
* @param[in] cb Callback for unindex progress
* @param[in,out] cls Closure
*/
void
file_bind_unindex (struct GNUNET_CHAT_File *file,
GNUNET_CHAT_FileUnindexCallback cb,
void *cls);
/**
* Calls the regarding events and bound callback of a given
* chat file handle to a file upload progress using
* the provided state of completed bytes and its file
* size.
*
* @param[in,out] file Chat file handle
* @param[in] completed Amount of uploaded bytes
* @param[in] size Full file size
*/
void
file_update_upload (struct GNUNET_CHAT_File *file,
uint64_t completed,
uint64_t size);
/**
* Calls the regarding events and bound callback of a given
* chat file handle to a file download progress using
* the provided state of completed bytes and its file
* size.
*
* @param[in,out] file Chat file handle
* @param[in] completed Amount of downloaded bytes
* @param[in] size Full file size
*/
void
file_update_download (struct GNUNET_CHAT_File *file,
uint64_t completed,
uint64_t size);
/**
* Calls the regarding events and bound callback of a given
* chat file handle to a file unindex progress using
* the provided state of completed bytes and its file
* size.
*
* @param[in,out] file Chat file handle
* @param[in] completed Amount of unindexed bytes
* @param[in] size Full file size
*/
void
file_update_unindex (struct GNUNET_CHAT_File *file,
uint64_t completed,
uint64_t size);
#endif /* GNUNET_CHAT_FILE_H_ */