62 lines
3.3 KiB
C
62 lines
3.3 KiB
C
/**
|
|
* @file topo_group_invite.h
|
|
* @brief Получение описания канала по прямому NCD-транспорту (INVITE_INFO).
|
|
*
|
|
* Запрашивает и проверяет подписанные сведения канала, готовит локальную группу.
|
|
* Успешный ответ не добавляет участника на других узлах и не означает READY группы.
|
|
* Вход по пользовательской ссылке и добавление участника описаны в chat_sync.h/chat_join.h.
|
|
* Все операции — в потоке uasync; временные запросы отменяются при остановке чата.
|
|
*/
|
|
#ifndef TOPO_GROUP_INVITE_H
|
|
#define TOPO_GROUP_INVITE_H
|
|
|
|
#include <stdint.h>
|
|
#include "topo_node.h"
|
|
#include "secure_channel.h"
|
|
|
|
struct UTUN_INSTANCE;
|
|
struct ETCP_CONN;
|
|
struct ll_entry;
|
|
struct NODE_CONN_DIRECT;
|
|
|
|
/* service id протокола invite: ETCP_RT_ID_GROUP_INVITE (etcp_bind, см. etcp_api.h) */
|
|
|
|
#define TGI_SUBCMD_INFO_REQ 0x01
|
|
#define TGI_SUBCMD_INFO_RESP 0x02
|
|
|
|
/* события коллбэка джойнера */
|
|
#define TGI_EVENT_JOIN 0 /* описание канала принято, локальная инфраструктура готова */
|
|
#define TGI_EVENT_TIMEOUT 1 /* попытка завершилась ошибкой или таймаутом */
|
|
|
|
typedef void (*tgi_cb_t)(uint64_t node_id, uint64_t group_id, int event, void* arg);
|
|
|
|
/** Идемпотентная инициализация: биндит обработчик ETCP_RT_ID_GROUP_INVITE. */
|
|
void topo_group_invite_init(struct UTUN_INSTANCE* inst);
|
|
|
|
/**
|
|
* Джойнер: прямое подключение (ncd) к приглашающему + проверка членства.
|
|
* ni — TOPO_NODE приглашающего (pubkey + адреса), не владеем.
|
|
* 0 — попытка начата, -1 — ошибка. До создания попытки ошибка не вызывает cb;
|
|
* после создания ошибки дают TGI_EVENT_TIMEOUT, иногда до возврата функции.
|
|
* Успешный обмен даёт TGI_EVENT_JOIN; cancel_all завершает ожидание без cb.
|
|
*/
|
|
int topo_group_invite_join(struct UTUN_INSTANCE* inst, uint64_t group_id,
|
|
struct TOPO_NODE* ni, uint64_t node_id,
|
|
tgi_cb_t cb, void* cb_arg);
|
|
|
|
/**
|
|
* Запустить групповую попытку к уже известному участнику, при необходимости
|
|
* передав адреса ni (заимствованы; NULL — взять известные). 0/-1.
|
|
* Применяется обычная проверка CHAT-членства. Сам CHANNEL_INVITE не отправляет.
|
|
*/
|
|
int topo_group_invite_to_channel(struct UTUN_INSTANCE* inst, uint64_t group_id,
|
|
struct TOPO_NODE* ni, uint64_t node_id);
|
|
|
|
/** Отменяет все pending-invite (teardown). */
|
|
void topo_group_invite_cancel_all(struct UTUN_INSTANCE* inst);
|
|
|
|
/** Обработчик приёма пакетов invite (etcp_bind). */
|
|
void topo_group_invite_recv_handler(struct ETCP_CONN* conn, struct ll_entry* entry);
|
|
|
|
#endif
|