Files
utun2/tools/chatgui/transport/gui_bridge.h
T

254 lines
17 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Мост desktop GUI ↔ ядро: post копирует бинарное событие в Qt-очередь, callbacks работают в GUI.
* post_uasync_fn передаёт функцию и arg без копирования в сетевой поток; arg освобождает обработчик.
* Регистрация callbacks и UI-состояние принадлежат GUI. Полученный inst заимствован;
* чтение указателя не гарантирует время жизни объекта при stop/finalize. */
#ifndef GUI_BRIDGE_H
#define GUI_BRIDGE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stddef.h>
struct UASYNC;
struct TOPO_GROUP;
struct TOPO_GROUP_NODE;
struct UTUN_INSTANCE;
/* ── Типы уведомлений uasync→GUI (fire-and-forget) ── */
#define GUI_EVT_MSG_RECEIVED 1 /* data: [ch_id_len:1][ch_id:var][author_node_id:8] */
#define GUI_EVT_CONNECT_RESULT 2 /* data: [node_id:8][result:4][channel_id:8] */
#define GUI_EVT_NEW_PEER 3 /* data: [node_id:8] */
#define GUI_EVT_CHANNEL_UPDATED 4 /* data: [ch_id_len:1][ch_id:var] */
#define GUI_EVT_MEMBERS_CHANGED 5 /* data: [ch_id_len:1][ch_id:var] */
#define GUI_EVT_MY_NODE_ID 6 /* data: [node_id:8] */
#define GUI_EVT_AUTO_CONNECT_STATUS 7 /* data: [status:1][total_tried:2][node_count:2][success:2] */
#define GUI_EVT_CHANNEL_PEERS_ONLINE 8 /* data: [ch_id_len:1][ch_id:var][online_count:2] */
#define GUI_EVT_DB_READY 9 /* data: none — DB is open, tables created */
#define GUI_EVT_STATUS_REFRESH 10 /* data: status text (null-terminated string) */
#define GUI_EVT_NODE_CHANGED 11 /* data: [node_id:8] */
#define GUI_EVT_ATTACHMENT_DOWNLOADED 14 /* data: [ch_id_len:1][ch_id:var][msg_id:8] */
#define GUI_EVT_DOWNLOAD_PROGRESS 15 /* data: [ch_id_len:1][ch_id:var][msg_id:8][blocks_done:4][num_blocks:4] */
#define GUI_EVT_NODEINFO_UPDATE 16 /* data: node_id:8 conn_presence:1 conn_up:1 best_rtt:2(0.1ms,0xFFFF=nodata) */
#define GUI_EVT_CONN_LIST 20 /* data: [count:2][entry:46B]* — binary conn list */
#define GUI_EVT_CONN_METRICS 21 /* data: text dump of selected connection metrics */
#define GUI_EVT_MEMBER_DETAIL 22 /* data: [node_id:8][flags:1][own_tcp_active:2][links...][socks...] — live snapshot for member detail panel */
#define GUI_EVT_MEMBER_LIST 23 /* data: [ch_id_len:1][ch_id:var][count:2][member:79B]* — полный список мемберов канала */
#define GUI_EVT_MEMBER_UPDATED 24 /* data: [ch_id_len:1][ch_id:var][count:1][member:79B] — обновление одного мембера */
#define GUI_EVT_MEMBER_REMOVED 25 /* data: [ch_id_len:1][ch_id:var][node_id:8] — мембер удалён из канала */
#define GUI_EVT_BGP_INFO 26 /* data: text — BGP hop summary for member detail */
#define GUI_EVT_ADMIN_KEY_RECEIVED 28 /* data: [ch_id_len:1][ch_id:var][from_node_id:8] — получен канальный ключ */
#define GUI_EVT_INVITE_LINK_READY 29 /* data: [ch_id_len:1][ch_id:var][request_id:8][link_len:2][link:var] — пустой link = ошибка */
#define GUI_EVT_INVITE_CANDIDATES 30 /* data: [ch_id_len:1][ch_id:var][auto_node_id:8][count:2][node_id:8]* — достижимые узлы для invite */
#define GUI_EVT_DM_MSG_RECEIVED 32 /* data: [conv_id_len:1][conv_id:var][author_node_id:8] */
#define GUI_EVT_DM_CONV_UPDATED 33 /* data: [conv_id_len:1][conv_id:var] — беседа создана/изменена */
#define GUI_EVT_CALL_INCOMING 34 /* data: [ch_id_len:1][ch_id:var][caller_node_id:8][call_id:8] */
#define GUI_EVT_CALL_RINGING 35 /* data: [call_id:8] */
#define GUI_EVT_CALL_ACCEPTED 36 /* data: [call_id:8] */
#define GUI_EVT_CALL_ENDED 37 /* data: [call_id:8][reason:1] */
#define GUI_EVT_CALL_DECLINED 38 /* data: [call_id:8][reason:1] */
#define GUI_EVT_CALL_STATS 39 /* data: [call_id:8][rtt:2][buffer:2][tempo:2][dropped:2][underruns:2][min:2][max:2][reserve:2] */
#define GUI_EVT_CALL_ERROR 40 /* data: [call_id:8][err:1][text:var] */
#define GUI_EVT_DM_MESSAGES 41 /* data: [conv_id_len:1][conv_id:var][count:2]([dir:1][seq:8][ts:8][author:8][ct_len:1][ct:var][data_len:2][data:var])* */
#define GUI_EVT_CALL_PATH 42 /* data: [call_id:8][text:var] — BGP-маршрут до пира звонка */
#define GUI_EVT_RADIO_TALK 43 /* data: [group_id:8][src_node_id:8][stream_id:2][on:1] — кто-то начал/закончил говорить */
#define GUI_EVT_CALL_CONNECTION 44 /* data: [call_id:8][CONN_TYPE:1][next_hop_node_id:8] */
/* Размеры элементов пакета GUI_EVT_MEMBER_DETAIL (должны совпадать с chat_status.c) */
#define MEMBER_DETAIL_LINK_SIZE 64
#define MEMBER_DETAIL_MAX_LINKS 16
#define MEMBER_DETAIL_MAX_SOCKS 16
#define MEMBER_DETAIL_SOCK_SIZE 48
/* ── API ── */
/* Инициализация моста (вызывается из GUI при старте) */
void gui_bridge_init(void);
/* Установить uasync (вызывается из UtunNode после создания ua) */
void gui_bridge_set_uasync(struct UASYNC* ua);
/* Установить UTUN_INSTANCE (вызывается из UtunNode после создания instance).
Читается GUI-потоком через gui_bridge_get_inst() для сборки trampoline-аргументов. */
void gui_bridge_set_inst(struct UTUN_INSTANCE* inst);
/* Текущий заимствованный UTUN_INSTANCE (NULL пока не создан/после сброса моста). */
struct UTUN_INSTANCE* gui_bridge_get_inst(void);
/* uasync → GUI: уведомление (fire-and-forget, через Qt::QueuedConnection) */
void gui_bridge_post(int event_type, const uint8_t* data, int data_len);
/* GUI → uasync: передать fn(arg). Проверить готовность заранее: без ua запрос отбрасывается,
* функция не вызывается и arg не освобождается мостом. */
void gui_bridge_post_uasync_fn(void (*fn)(void*), void* arg);
/* Проверить готовность uasync (g_ua != NULL) */
int gui_bridge_is_uasync_ready(void);
/* Callback для результатов подключения (вызывается из GUI-потока) */
typedef void (*gui_connect_result_fn)(uint64_t node_id, uint64_t channel_id, int result);
void gui_bridge_set_connect_result_cb(gui_connect_result_fn cb);
/* Callback для входящих сообщений (вызывается из GUI-потока) */
typedef void (*gui_msg_received_fn)(const char* ch_id, int ch_id_len, uint64_t author);
void gui_bridge_set_msg_received_cb(gui_msg_received_fn cb);
/* Callback для обновления канала (вызывается из GUI-потока) */
typedef void (*gui_channel_updated_fn)(const char* ch_id, int ch_id_len);
void gui_bridge_set_channel_updated_cb(gui_channel_updated_fn cb);
/* Callback для получения своего node_id после инициализации uTun */
typedef void (*gui_my_node_id_fn)(uint64_t node_id);
void gui_bridge_set_my_node_id_cb(gui_my_node_id_fn cb);
/* Callback для статуса авто-подключения (вызывается из GUI-потока)
* status: 0=in_progress, 1=done(3+), 2=stopped */
typedef void (*gui_auto_connect_status_fn)(uint8_t status, uint16_t total_tried, uint16_t node_count, uint16_t connected);
void gui_bridge_set_auto_connect_status_cb(gui_auto_connect_status_fn cb);
/* Callback для обновления числа онлайн-пиров канала (вызывается из GUI-потока) */
typedef void (*gui_channel_peers_online_fn)(const char* ch_id, int ch_id_len, uint16_t online_count);
void gui_bridge_set_channel_peers_online_cb(gui_channel_peers_online_fn cb);
/* Callback: DB открыта, таблицы созданы, можно загружать данные (вызывается из GUI-потока) */
typedef void (*gui_db_ready_fn)(void);
void gui_bridge_set_db_ready_cb(gui_db_ready_fn cb);
/* Callback для обновления статуса (NTP + connections) — text без \0, вызывается из GUI-потока */
typedef void (*gui_status_refresh_fn)(const char* text, int len);
void gui_bridge_set_status_refresh_cb(gui_status_refresh_fn cb);
/* Callback для завершения загрузки медиа-аттача */
typedef void (*gui_attachment_downloaded_fn)(const char* ch_id, int ch_id_len, int64_t msg_id);
void gui_bridge_set_attachment_downloaded_cb(gui_attachment_downloaded_fn cb);
/* Callback для прогресса загрузки медиа */
typedef void (*gui_download_progress_fn)(const char* ch_id, int ch_id_len, int64_t msg_id, int blocks_done, int num_blocks);
void gui_bridge_set_download_progress_cb(gui_download_progress_fn cb);
/* Callback для обновления статуса узла (nodeinfo) — data: 12B packed */
typedef void (*gui_nodeinfo_update_fn)(const uint8_t* data, int len);
void gui_bridge_set_nodeinfo_update_cb(gui_nodeinfo_update_fn cb);
/* Callback для входящих приглашений (вызывается из GUI-потока)
data: [ch_id_len:1][ch_id][name_len:1][name][inviter_node_id:8][inviter_name_len:1][inviter_name] */
typedef void (*gui_invite_received_fn)(const uint8_t* data, int len);
void gui_bridge_set_invite_received_cb(gui_invite_received_fn cb);
/* Callback для списка ETCP-соединений (вызывается из GUI-потока) */
typedef void (*gui_conn_list_fn)(const uint8_t* data, int len);
void gui_bridge_set_conn_list_cb(gui_conn_list_fn cb);
/* Callback для метрик выбранного соединения (вызывается из GUI-потока) */
typedef void (*gui_conn_metrics_fn)(const uint8_t* data, int len);
void gui_bridge_set_conn_metrics_cb(gui_conn_metrics_fn cb);
/* Callback для live-снапшота панели деталей участника (вызывается из GUI-потока)
data: [node_id:8][flags:1][own_tcp_active:2][links...][socks...] — см. chat_status.c collect_member_detail */
typedef void (*gui_member_detail_fn)(const uint8_t* data, int len);
void gui_bridge_set_member_detail_cb(gui_member_detail_fn cb);
/* Callback для получения полного списка мемберов канала (вызывается из GUI-потока)
data: [ch_id_len:1][ch_id:var][count:2][member:79B]* */
typedef void (*gui_member_list_fn)(const uint8_t* data, int len);
void gui_bridge_set_member_list_cb(gui_member_list_fn cb);
/* Callback для обновления одного мембера (вызывается из GUI-потока)
data: [ch_id_len:1][ch_id:var][count:1][member:79B] */
typedef void (*gui_member_updated_fn)(const uint8_t* data, int len);
void gui_bridge_set_member_updated_cb(gui_member_updated_fn cb);
/* Callback для удаления мембера из канала (вызывается из GUI-потока)
data: [ch_id_len:1][ch_id:var][node_id:8] */
typedef void (*gui_member_removed_fn)(const uint8_t* data, int len);
void gui_bridge_set_member_removed_cb(gui_member_removed_fn cb);
/* Callback для BGP hop info текста (вызывается из GUI-потока)
data: текстовая строка формата "rtt:12ms hop:3 via bgp: [ABCD] name1 [EF12] name2" */
typedef void (*gui_bgp_info_fn)(const uint8_t* data, int len);
void gui_bridge_set_bgp_info_cb(gui_bgp_info_fn cb);
/* Callback: получен канальный приватный ключ (стал совладельцем) — data: [ch_id_len:1][ch_id][from_node_id:8] */
typedef void (*gui_admin_key_received_fn)(const uint8_t* data, int len);
void gui_bridge_set_admin_key_received_cb(gui_admin_key_received_fn cb);
/* Callback: готова invite-ссылка (link = пустая строка при ошибке, детали в логе) */
typedef void (*gui_invite_link_ready_fn)(const char* ch_id, int ch_id_len, uint64_t request_id, const char* link);
void gui_bridge_set_invite_link_ready_cb(gui_invite_link_ready_fn cb);
/* Callback: список достижимых узлов-кандидатов для invite — data: [auto_node_id:8][count:2][node_id:8]* */
typedef void (*gui_invite_candidates_fn)(const char* ch_id, int ch_id_len, const uint8_t* data, int len);
void gui_bridge_set_invite_candidates_cb(gui_invite_candidates_fn cb);
/* Callback для входящего звонка (вызывается из GUI-потока) */
typedef void (*gui_call_incoming_fn)(const char* ch_id, int ch_id_len, uint64_t caller_node_id, uint64_t call_id);
void gui_bridge_set_call_incoming_cb(gui_call_incoming_fn cb);
/* Callback для звонкового события с call_id (ringing/accepted) */
typedef void (*gui_call_id_fn)(uint64_t call_id);
void gui_bridge_set_call_ringing_cb(gui_call_id_fn cb);
void gui_bridge_set_call_accepted_cb(gui_call_id_fn cb);
/* Callback для завершения/отклонения звонка (вызывается из GUI-потока) */
typedef void (*gui_call_ended_fn)(uint64_t call_id, uint8_t reason);
void gui_bridge_set_call_ended_cb(gui_call_ended_fn cb);
void gui_bridge_set_call_declined_cb(gui_call_ended_fn cb);
/* Callback для ошибки звонка (пир офлайн/нет маршрута). text может быть пустым. */
typedef void (*gui_call_error_fn)(uint64_t call_id, uint8_t err, const char* text, int len);
void gui_bridge_set_call_error_cb(gui_call_error_fn cb);
/* CALL_STATS: все длительности в мс; extrema относятся к последним 10 секундным интервалам. */
typedef void (*gui_call_stats_fn)(uint64_t call_id, int rtt, int buffer, int tempo,
int dropped, int underruns, int minimum, int maximum, int reserve);
void gui_bridge_set_call_stats_cb(gui_call_stats_fn cb);
/* Callback для BGP-маршрута звонка (вызывается из GUI-потока) */
typedef void (*gui_call_path_fn)(uint64_t call_id, const char* text, int len);
void gui_bridge_set_call_path_cb(gui_call_path_fn cb);
typedef void (*gui_call_connection_fn)(uint64_t call_id, uint8_t type, uint64_t next_hop_node_id);
void gui_bridge_set_call_connection_cb(gui_call_connection_fn cb);
/* Callback индикации говорящего в рации (вызывается из GUI-потока)
* group_id — канал, src_node_id — кто говорит, on — 1=начал / 0=закончил. */
typedef void (*gui_radio_talk_fn)(uint64_t group_id, uint64_t src_node_id, uint8_t on);
void gui_bridge_set_radio_talk_cb(gui_radio_talk_fn cb);
/* Callback для входящего DM-сообщения (вызывается из GUI-потока)
* conv_id_len/conv_id — идентификатор беседы (десятичная строка). */
typedef void (*gui_dm_msg_received_fn)(const char* conv_id, int conv_id_len, uint64_t author);
void gui_bridge_set_dm_msg_received_cb(gui_dm_msg_received_fn cb);
/* Callback: DM-беседа создана/изменена (вызывается из GUI-потока). */
/* Снимок BGP-доступности PM и уведомление об изменениях сети (GUI-поток). */
typedef void (*gui_network_changed_fn)(int event_type);
void gui_bridge_set_network_changed_cb(gui_network_changed_fn cb);
void gui_bridge_set_dm_call_route_cb(void (*cb)(const uint8_t* data, int len));
typedef void (*gui_dm_conv_updated_fn)(const char* conv_id, int conv_id_len);
void gui_bridge_set_dm_conv_updated_cb(gui_dm_conv_updated_fn cb);
/* Callback: расшифрованные сообщения DM-беседы (вызывается из GUI-потока)
* data: [conv_id_len:1][conv_id:var][count:2]([dir:1][seq:8][ts:8][author:8][ct_len:1][ct:var][data_len:2][data:var])* */
typedef void (*gui_dm_messages_fn)(const uint8_t* data, int len);
void gui_bridge_set_dm_messages_cb(gui_dm_messages_fn cb);
/* CHAT_EVT_DM_INVITE_RESULT: коррелированный результат отправки приглашения. */
void gui_bridge_set_dm_invite_result_cb(gui_dm_messages_fn cb);
/* Файловый браузер: wire-ответы и прогресс общих передач, в GUI-потоке. */
void gui_bridge_set_member_files_response_cb(gui_dm_messages_fn cb);
void gui_bridge_set_member_files_transfer_cb(gui_dm_messages_fn cb);
/* CHAT_EVT_ATTACHMENT_PREPARATION: target + job UUID + state. */
void gui_bridge_set_attachment_preparation_cb(gui_dm_messages_fn cb);
/* uTun nodeinfo callback — registered via utun_add_nodeinfo_cbk, called from uasync thread */
void gui_nodeinfo_cb_impl(struct TOPO_GROUP* group, struct TOPO_GROUP_NODE* nq, void* arg);
#ifdef __cplusplus
}
#endif
#endif /* GUI_BRIDGE_H */