From 31e461dca29e3c7b3bcb8507062de6f77abb2e5f Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 09:34:03 +0100 Subject: [PATCH] Carry voice PM receipts and document shared media completion semantics --- tools/chatgui-android/libutun_lite/photo_sender.h | 4 ++-- tools/chatgui-android/libutun_lite/video_sender.h | 2 +- tools/chatgui-android/libutun_lite/voice_recorder.c | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/chatgui-android/libutun_lite/photo_sender.h b/tools/chatgui-android/libutun_lite/photo_sender.h index 5d315575..f4a6fdde 100644 --- a/tools/chatgui-android/libutun_lite/photo_sender.h +++ b/tools/chatgui-android/libutun_lite/photo_sender.h @@ -1,6 +1,6 @@ /* Отправка подготовленного изображения: JPEG/PNG в канал/PM через attachment_send, другие форматы — только в канал. * MIME и размеры с учётом EXIF определяет Android по содержимому. JPEG/PNG забирает собственный cache-файл caller. - * 0 = запрос поставлен в uasync, -1 = отказ (cache остаётся caller); для канала результат — CHAT_EVT_MSG_SUBMITTED. + * 0 = запрос поставлен в uasync, -1 = отказ (cache остаётся caller); результат — CHAT_EVT_MSG_SUBMITTED. * Вызовы сериализовать со stop/restart; для дополнительных форматов источник живёт до результата и удаляется caller. */ #ifndef PHOTO_SENDER_H #define PHOTO_SENDER_H @@ -12,7 +12,7 @@ extern "C" { /* channel_id — ID канала либо dm:, generation — зафиксированное поколение PM (для канала 0). * db_path нужен только дополнительным форматам канала; content_type — проверенный MIME. - * reply_to — обязательные 32 байта (нули = без ответа), request_id — корреляция канального результата с UI. */ + * reply_to — обязательные 32 байта (нули = без ответа), request_id — корреляция результата локального commit с UI. */ int photo_send(const char* channel_id, const char* src_file_path, const char* db_path, int width, int height, const uint8_t reply_to[32], uint64_t request_id, const char* content_type, uint64_t generation); diff --git a/tools/chatgui-android/libutun_lite/video_sender.h b/tools/chatgui-android/libutun_lite/video_sender.h index fb09140e..715b5ffa 100644 --- a/tools/chatgui-android/libutun_lite/video_sender.h +++ b/tools/chatgui-android/libutun_lite/video_sender.h @@ -13,7 +13,7 @@ extern "C" { /* target — десятичный ID канала либо dm:conv_id; source — NUL-путь короче 1024 байтов. * duration_ms=1..86400000, width/height=1..16384. Для канала reply_to — обязательные 32 байта - * (нули = без ответа), request_id → CHAT_EVT_MSG_SUBMITTED. В DM эти поля игнорируются; + * (нули = без ответа), request_id → CHAT_EVT_MSG_SUBMITTED для канала и DM. В DM reply_to игнорируется; * generation фиксирует поколение беседы, 0 захватывает его в trampoline. */ int video_send(const char* channel_id, const char* src_file_path, const char* db_path, int duration_ms, int width, int height, const uint8_t reply_to[32], uint64_t request_id, uint64_t generation); diff --git a/tools/chatgui-android/libutun_lite/voice_recorder.c b/tools/chatgui-android/libutun_lite/voice_recorder.c index 6bba9e37..a2fc0432 100644 --- a/tools/chatgui-android/libutun_lite/voice_recorder.c +++ b/tools/chatgui-android/libutun_lite/voice_recorder.c @@ -219,7 +219,8 @@ int voice_recorder_stop(int* out_duration_ms) { req->inst = instance_lite_get_instance(); req->info.kind = ATTACHMENT_VOICE; req->preset = g_rec->preset; req->is_dm = !strncmp(g_rec->channel_id, "dm:", 3); req->dm_generation = g_rec->generation; - if (!req->is_dm) { memcpy(req->reply_to, g_rec->reply_to, sizeof(req->reply_to)); req->request_id = g_rec->request_id; } + req->request_id = g_rec->request_id; + if (!req->is_dm) memcpy(req->reply_to, g_rec->reply_to, sizeof(req->reply_to)); snprintf(req->target, sizeof(req->target), "%s", g_rec->channel_id + (req->is_dm ? 3 : 0)); if (g_rec->compressor && g_rec->compressor_enabled) { struct audio_compressor* replacement = audio_compressor_clone_config(g_rec->compressor);