57 lines
3.8 KiB
C
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
|