Assign a registered event ID to Android group avatar snapshots
This commit is contained in:
1 parent
e91987d241
commit
d969b277e1
3 files changed
+7
-4
No files matched your search
@@ -92,6 +92,7 @@ extern "C" {
|
||||
#define CHAT_EVT_RADIO_CALL 65 /* [id:8LE][group:8LE][peer:8LE][state:1][reason:1][incoming:1], radio_call.h */
|
||||
#define CHAT_EVT_CALL_PHONE_BUSY 66 /* [id:8LE][reserved:1]; вызывающий выбирает продолжить либо завершить */
|
||||
#define CHAT_EVT_MSG_UPDATED 67 /* [channel_len:1][channel][message_id:32] — правка после commit, без unread/звука */
|
||||
#define CHAT_EVT_GROUP_AVATAR_SNAPSHOT 68 /* Только Android JNI: id/group/version:8LE, hash:32, can_edit/failed:1, size:2LE, image:size. */
|
||||
|
||||
// ── Подключение получателя событий ──
|
||||
|
||||
|
||||
@@ -5,12 +5,14 @@ import java.nio.ByteOrder
|
||||
|
||||
/**
|
||||
* Декодирование локальных JNI-событий аватаров: 49 — файловый ответ, 50 — прогресс передачи,
|
||||
* 51/52 — результат публикации ссылки профиля/аватара группы, 53 — снимок аватара группы.
|
||||
* 51/52 — результат публикации ссылки профиля/аватара группы, 68 — снимок аватара группы.
|
||||
* Числа LE; UID и request ID хранят исходные 64 бита в Long, включая старший бит.
|
||||
* Файловые события разбирает общий MemberFilesProtocol; неверный формат бросает исключение.
|
||||
* Здесь проверяется framing: SHA256 байтов и геометрию изображения проверяют AvatarAssets/AvatarRepository.
|
||||
*/
|
||||
object AvatarProtocol {
|
||||
/** CHAT_EVT_GROUP_AVATAR_SNAPSHOT из chat_event.h; отдельный номер от FEEDBACK_CHANGED=53. */
|
||||
const val GROUP_SNAPSHOT_EVENT = 68
|
||||
/** Лимит пользовательского WebP-превью, не оригинала. */
|
||||
const val MAX_USER = 1024 * 1024
|
||||
const val MAX_GROUP = 16 * 1024
|
||||
@@ -30,7 +32,7 @@ object AvatarProtocol {
|
||||
fun hash(bytes: ByteArray): String = bytes.joinToString("") { "%02x".format(it.toInt() and 255) }
|
||||
private fun buffer(data: ByteArray) = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN)
|
||||
|
||||
/** Снимок 53: canEdit — наличие локального приватного ключа; failed — ошибка чтения core.
|
||||
/** Снимок GROUP_SNAPSHOT_EVENT: canEdit — наличие локального приватного ключа; failed — ошибка чтения core.
|
||||
* Пустое image допустимо при отсутствии/удалении аватара; окончательный допуск публикации проверяет core. */
|
||||
data class Group(val id: Long, val group: Long, val version: Long, val hash: String,
|
||||
val canEdit: Boolean, val failed: Boolean, val image: ByteArray)
|
||||
|
||||
@@ -3163,7 +3163,7 @@ JNIEXPORT void JNICALL Java_com_utun_chat_data_NativeLib_nativeRadioTalkEnd(
|
||||
utun_bridge_radio_talk_end((uint64_t)groupId);
|
||||
}
|
||||
|
||||
/* Снимок читается в потоке ядра; локальное JNI-событие 53 не меняет сетевой протокол.
|
||||
/* Снимок читается в потоке ядра; CHAT_EVT_GROUP_AVATAR_SNAPSHOT — локальное JNI-событие, не сетевой протокол.
|
||||
* id/group/version:8LE, hash:32, can_edit/failed:1, size:2LE, data:size. */
|
||||
static void android_avatar_snapshot(void* arg) {
|
||||
struct group_avatar_gui_request* req = arg;
|
||||
@@ -3188,7 +3188,7 @@ static void android_avatar_snapshot(void* arg) {
|
||||
if (size) memcpy(event + 60, record.data, size);
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_CHAT, "Android avatar: snapshot group=%s id=%llu version=%llu size=%zu edit=%d failed=%d",
|
||||
channel, (unsigned long long)req->id, (unsigned long long)record.version, size, can_edit, failed);
|
||||
jni_on_event(53, event, (int)(60 + size));
|
||||
jni_on_event(CHAT_EVT_GROUP_AVATAR_SNAPSHOT, event, (int)(60 + size));
|
||||
u_free(event); u_free(req);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user