Files
utun2/src/media_delivery/file_transfer.h
T

36 lines
2.4 KiB
C

/* file_transfer — передача неизменяемого файла между явно заданными узлами.
* Не знает о чатах, ключах содержимого, custody или БД. lookup авторизует запрос
* и возвращает путь; получатель проверяет содержимое в своём done.
* Каждая операция владеет CM handle до завершения/отмены, включая DOWN/TIMEOUT.
* Все API/callbacks в uasync; destroy вызывается вне callbacks, до удаления групп.
* Файл назначения принадлежит вызывающему; при ошибке его нужно отбросить.
*/
#ifndef FILE_TRANSFER_H
#define FILE_TRANSFER_H
#include <stdint.h>
#include <stddef.h>
struct UTUN_INSTANCE;
struct file_transfer;
struct file_transfer_op;
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);
/* 0 в done означает точный приём size байт и закрытие файла, а не custody ACK.
* Возврат NULL означает отказ запуска, done не вызывается.
* cancel синхронно вызывает done(-2); ошибка fclose заменяет результат на -1, в том числе при отмене.
* Handle перестаёт существовать перед вызовом done, его нужно обнулить в callback. */
struct file_transfer* file_transfer_create(struct UTUN_INSTANCE* inst, file_transfer_lookup_fn lookup, void* arg);
void file_transfer_destroy(struct file_transfer* ft);
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);
void file_transfer_cancel(struct file_transfer_op* op);
/* Отозвать все операции объекта (TTL/delete); callbacks приёма вызываются синхронно с -2, при ошибке fclose — с -1. */
void file_transfer_cancel_object(struct file_transfer* ft, const uint8_t object[16]);
#endif