Browse Source

Acknowledge Android PM file ownership only after native enqueue

master
evgeny 1 day ago
parent
commit
fe9441d63b
  1. 20
      tools/chatgui-android/jni_bridge/android_jni_bridge.c
  2. 2
      tools/chatgui-android/jni_bridge/android_jni_bridge.h

20
tools/chatgui-android/jni_bridge/android_jni_bridge.c

@ -659,13 +659,13 @@ void utun_bridge_dm_request_messages(const char* conv_id) {
uasync_post(ua, dm_messages_trampoline, req);
}
void utun_bridge_dm_send_file(const char* conv_id, const char* path, const char* name) {
int utun_bridge_dm_send_file(const char* conv_id, const char* path, const char* name) {
struct UASYNC* ua = instance_lite_get_uasync();
if (!conv_id || !path || !name || !uasync_is_running(ua)) { bridge_log(BLEV_WARN, "DM file: invalid request/core stopped"); return; }
if (!conv_id || !path || !name || !uasync_is_running(ua)) { bridge_log(BLEV_WARN, "DM file: invalid request/core stopped"); return -1; }
struct dm_file_req* req = u_calloc(1, sizeof(*req));
if (!req) { bridge_log(BLEV_ERROR, "DM file: OOM"); return; }
if (!req) { bridge_log(BLEV_ERROR, "DM file: OOM"); return -1; }
if (strlen(conv_id) >= sizeof(req->conv) || strlen(path) >= sizeof(req->path) || strlen(name) >= sizeof(req->info.name)) {
bridge_log(BLEV_ERROR, "DM file: path, conversation or name too long"); u_free(req); return;
bridge_log(BLEV_ERROR, "DM file: path, conversation or name too long"); u_free(req); return -1;
}
req->inst = instance_lite_get_instance();
snprintf(req->conv, sizeof(req->conv), "%s", conv_id);
@ -673,7 +673,12 @@ void utun_bridge_dm_send_file(const char* conv_id, const char* path, const char*
req->info.kind = ATTACHMENT_FILE;
req->remove_source = 1; /* PM picker передаёт собственный уникальный cache-файл. */
snprintf(req->info.name, sizeof(req->info.name), "%s", name);
uasync_post(ua, dm_send_file_trampoline, req);
if (attachment_validate(&req->info)) { bridge_log(BLEV_ERROR, "DM file: invalid name"); u_free(req); return -1; }
struct posted_task* post = u_calloc(1, sizeof(*post));
if (!post) { bridge_log(BLEV_ERROR, "DM file: completion allocation failed"); u_free(req); return -1; }
post->callback = dm_send_file_trampoline; post->arg = req;
uasync_post_reserved(ua, post);
return 0;
}
void utun_bridge_set_debug_level(const char* category, const char* level) {
@ -1914,16 +1919,17 @@ JNIEXPORT void JNICALL Java_com_utun_chat_data_NativeLib_nativeDmRequestMessages
if (c) (*env)->ReleaseStringUTFChars(env, convId, c);
}
JNIEXPORT void JNICALL Java_com_utun_chat_data_NativeLib_nativeDmSendFile(
JNIEXPORT jboolean JNICALL Java_com_utun_chat_data_NativeLib_nativeDmSendFile(
JNIEnv* env, jobject thiz, jstring convId, jstring path, jstring name) {
(void)thiz;
const char* c = (*env)->GetStringUTFChars(env, convId, NULL);
const char* p = (*env)->GetStringUTFChars(env, path, NULL);
const char* n = (*env)->GetStringUTFChars(env, name, NULL);
utun_bridge_dm_send_file(c, p, n);
int rc = utun_bridge_dm_send_file(c, p, n);
if (n) (*env)->ReleaseStringUTFChars(env, name, n);
if (p) (*env)->ReleaseStringUTFChars(env, path, p);
if (c) (*env)->ReleaseStringUTFChars(env, convId, c);
return rc == 0 ? JNI_TRUE : JNI_FALSE;
}
JNIEXPORT jlong JNICALL Java_com_utun_chat_data_NativeLib_nativeGetMyNodeId(

2
tools/chatgui-android/jni_bridge/android_jni_bridge.h

@ -210,7 +210,7 @@ void utun_bridge_dm_start(uint64_t node_id, const char* source_ch_id, const cha
void utun_bridge_dm_send(const char* conv_id, const char* text);
void utun_bridge_dm_request_conversations(void);
void utun_bridge_dm_request_messages(const char* conv_id);
void utun_bridge_dm_send_file(const char* conv_id, const char* path, const char* name);
int utun_bridge_dm_send_file(const char* conv_id, const char* path, const char* name);
#ifdef __cplusplus
}

Loading…
Cancel
Save