Files
utun2/src/media_delivery/file_transfer.h
T

52 lines
4.5 KiB
C

/* file_transfer — передача неизменяемого файла между явно заданными узлами.
* Не знает о чатах, ключах содержимого, custody или БД. lookup авторизует запрос
* и возвращает путь; получатель проверяет содержимое в своём done.
* Каждая операция владеет CM handle до завершения/отмены, включая DOWN/TIMEOUT.
* Все API/callbacks в uasync; destroy вызывается вне callbacks, до удаления групп.
* До 16 входящих/исходящих операций суммарно. DATA до 8192 байт; router-пакеты подписаны,
* uint64 wire-поля имеют native byte order. Простой 30с завершает операцию ошибкой;
* при восстановлении пути/простое приём повторяет REQUEST с непрерывного полученного offset.
* Собственное временное назначение передаёт вызывающий: файл открывается с усечением,
* в том числе до возможного отказа запуска. При ошибке/cancel файл не удаляется и отбрасывается caller.
*/
#ifndef FILE_TRANSFER_H
#define FILE_TRANSFER_H
#include <stdint.h>
#include <stddef.h>
struct UTUN_INSTANCE;
struct file_transfer;
struct file_transfer_op;
/* Вызывается для каждого REQUEST, включая повторы: проверить права group/peer/object/size.
* 0 — записан NUL-терминированный путь (<cap байт) неизменяемого файла; иначе отказ.
* Файл сохранять доступным до завершения выдачи; перед отзывом отменить операции объекта. */
typedef int (*file_transfer_lookup_fn)(void* arg, uint64_t group, uint64_t peer,
const uint8_t object[16], uint64_t size, char* path, size_t cap);
typedef void (*file_transfer_done_fn)(void* arg, int error);
/* Один ft на instance; inst/его ua/router/группы живут дольше ft. lookup обязателен, arg заимствован.
* Создаёт router binding; возвращает owner либо NULL при ошибке. */
struct file_transfer* file_transfer_create(struct UTUN_INSTANCE* inst, file_transfer_lookup_fn lookup, void* arg);
/* Снимает binding и синхронно завершает активные pull как cancel; NULL допустим. */
void file_transfer_destroy(struct file_transfer* ft);
/* 0 в done означает точный приём size байт и закрытие файла, а не custody ACK.
* group/peer ненулевые, object указывает на 16 байт, size=1..INT64_MAX; done обязателен.
* destination — собственный временный путь; строка не сохраняется, файл открывается до возврата.
* Возвращает handle операции; done/arg заимствованы до завершения/отмены.
* Возврат NULL означает отказ запуска, done не вызывается.
* Ошибка приёма/таймаут даёт done(-1); успешный приём не включает fsync или проверку хеша.
* Handle перестаёт существовать перед вызовом done, его нужно обнулить в callback. */
struct file_transfer_op* file_transfer_pull(struct file_transfer* ft, uint64_t group, uint64_t peer,
const uint8_t object[16], uint64_t size, const char* destination,
file_transfer_done_fn done, void* arg);
/* Синхронный done(-2), ошибка fclose заменяет результат на -1. NULL допустим; прежний handle больше не использовать. */
void file_transfer_cancel(struct file_transfer_op* op);
/* Отозвать все операции объекта во всех группах (TTL/delete); ft=NULL допустим, object обязателен.
* callbacks приёма вызываются синхронно с -2, при ошибке fclose — с -1. */
void file_transfer_cancel_object(struct file_transfer* ft, const uint8_t object[16]);
#endif