Files
utun2/src/member_files/member_files.h
T

57 lines
3.8 KiB
C

/* Хранилище участников и асинхронный клиент поверх подписанного/зашифрованного router.
* Все API — uasync. callback получает заимствованный response ровно один раз; операция
* уже освобождена. NULL при отказе запуска, callback не вызывается. request копируется.
* quiesce запрещает новые команды и отменяет producers; destroy вне callbacks ждёт
* собственный дисковый поток до удаления CHAT-групп. Cancel не удаляет опубликованные файлы.
* GUI-команды используют trampolines; результат — CHAT_EVT_MEMBER_FILES_RESPONSE/TRANSFER. */
#ifndef MEMBER_FILES_H
#define MEMBER_FILES_H
#include "protocol.h"
#ifdef __cplusplus
extern "C" {
#endif
struct UTUN_INSTANCE;
struct mf_pending;
typedef void (*mf_response_fn)(void* arg, const struct mf_message* response);
int member_files_init(struct UTUN_INSTANCE* inst);
void member_files_quiesce(struct UTUN_INSTANCE* inst);
void member_files_destroy(struct UTUN_INSTANCE* inst);
void member_files_cancel_group(struct UTUN_INSTANCE* inst, uint64_t group);
struct mf_pending* member_files_request(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t server,
const struct mf_message* request, mf_response_fn callback, void* arg);
void member_files_cancel(struct mf_pending* pending);
void member_files_cancel_request_id(struct UTUN_INSTANCE* inst, uint64_t id);
/* 1 — действующий мембер; storage!=0 дополнительно требует подписанную роль хранителя. */
int member_files_member(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t node, int storage);
struct mf_gui_request { struct UTUN_INSTANCE* inst; uint64_t group, server; struct mf_message message; };
void member_files_gui_request(void* arg);
struct mf_transfer_request {
struct UTUN_INSTANCE* inst;
uint64_t id, group, server, owner;
uint64_t max_bytes; // 0 — без лимита; проверяется до открытия локального файла и передачи данных.
int upload;
uint8_t version[16];
char remote[MF_PATH_MAX + 1], local[MF_PATH_MAX + 1];
};
struct mf_transfer;
struct mf_transfer_progress { uint64_t id, done, total; uint16_t status; uint8_t finished; };
typedef void (*mf_transfer_fn)(void* arg, const struct mf_transfer_progress* progress);
// Один handle на файл; до 16 клиентских передач одновременно, включая upload/download к одному пиру.
// Все вызовы/callbacks — uasync. id=0 выбирает случайный ID. NULL: отказ запуска, callback не вызывается.
// finished приходит ровно один раз после закрытия/публикации; handle уже освобождён до callback.
// Прогресс заимствован на время callback. Cancel асинхронно ждёт свой I/O и не затрагивает другие handles.
struct mf_transfer* member_files_transfer_start(const struct mf_transfer_request* request, mf_transfer_fn callback, void* arg);
void member_files_transfer_cancel(struct mf_transfer* transfer);
/* id выбирает вызывающий. События: id/group/server/owner/done/total:8LE, status:2LE,state:1;
* state=1 progress, 2 finished. Загрузка/скачивание выполняет общий клиент, без Qt I/O. */
void member_files_gui_transfer(void* arg);
struct mf_cancel_request { struct UTUN_INSTANCE* inst; uint64_t id; };
void member_files_gui_cancel(void* arg);
#ifdef __cplusplus
}
#endif
#endif