36 lines
2.4 KiB
C
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
|