ln:屏保下载消息发送优化 2538/1 2538/head 2539/target/1
authorluozheng <1732036298@qq.com>
Thu, 16 Oct 2025 08:23:30 +0000 (16:23 +0800)
committerluozheng <1732036298@qq.com>
Thu, 16 Oct 2025 08:23:30 +0000 (16:23 +0800)
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.h
code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c

index c0573ef..1d06353 100644 (file)
@@ -1510,34 +1510,7 @@ static void ln_http_server_send_task(void const *arg)
         else if (mail.cmd == LN_HTTP_SERVICE_CMD_DOWNLOAD_SCREEN_IMAGE)
         {
             printf("LN_HTTP_SERVICE_CMD_DOWNLOAD_SCREEN_IMAGE:下载屏保文件\n");
-            if (mail.data)
-            {
-                ln_download_file_req_t req;
-                memcpy(&req, mail.data, sizeof(req));
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载URL: %s, 保存路径: %s", req.url, req.save_path);
-                errcode_t ret = uapi_ln_download_with_retry(req.url, req.save_path, 3);
-                if (ret == ERRCODE_SUCC)
-                {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载成功,通知去切换屏保");
-                    push_download_success_notification(DOWNLOAD_FILE_TYPE_SCREEN_IMAGE);
-                }
-                else
-                {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载失败");
-                    push_download_fail_notification(DOWNLOAD_FILE_TYPE_SCREEN_IMAGE);
-                }
-                /* 释放由发送方分配的指针 */
-                if (req.url)
-                {
-                    free(req.url);
-                    req.url = NULL;
-                }
-                if (req.save_path)
-                {
-                    free(req.save_path);
-                    req.save_path = NULL;
-                }
-            }
+            ln_download_screen_image();
         }
         else if (mail.cmd == LN_HTTP_SERVICE_CMD_SCHEDULE_REMINDER)
         {
index 473ab46..5c852ab 100644 (file)
@@ -266,6 +266,7 @@ uint32_t ln_token_is_expired(int *expired_out);
 uint32_t uapi_ln_refresh_device_token(void);
 void ln_start_emoji_download(void);
 void ln_voice_chat_interrupt(const char *reason);//打断当前ai回答
+void ln_download_screen_image(void);
 
 // 解析设备角色配置
 void ln_parse_character_config(const char *json_buf, int json_len);
index aec082f..3cc5779 100644 (file)
@@ -4,8 +4,29 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <cJSON.h>
+#include "wearable_log.h"
 
 LnCharacterConfig g_ln_character_config = {0};
+
+/* 解析阶段保存一次性屏保URL,避免随后清理全局结构后丢失 */
+static char *g_ln_pending_screen_image_url = NULL;
+static void ln_set_pending_screen_image(const char *url)
+{
+    if (g_ln_pending_screen_image_url)
+    {
+        free(g_ln_pending_screen_image_url);
+        g_ln_pending_screen_image_url = NULL;
+    }
+    if (url && url[0])
+    {
+        size_t ulen = strlen(url);
+        g_ln_pending_screen_image_url = (char *)malloc(ulen + 1);
+        if (g_ln_pending_screen_image_url)
+        {
+            memcpy(g_ln_pending_screen_image_url, url, ulen + 1);
+        }
+    }
+}
 /* 动态字符串工具 */
 static inline char *ln_strdup_s(const char *src)
 {
@@ -94,6 +115,31 @@ static void ln_clear_character_config(void)
     g_ln_character_config = (LnCharacterConfig){0};
 }
 
+void ln_download_screen_image(void)
+{
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 开始下载屏保文件");
+    if (g_ln_pending_screen_image_url && g_ln_pending_screen_image_url[0])
+    {
+        const char *url = g_ln_pending_screen_image_url;
+        const char *save_path = LN_DEVICE_SCREEN_IMAGE_FILE;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载URL: %s, 保存路径: %s", url, save_path);
+        errcode_t ret = uapi_ln_download_with_retry(url, save_path, 3);
+        if (ret == ERRCODE_SUCC)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载成功,通知去切换屏保");
+            push_download_success_notification(DOWNLOAD_FILE_TYPE_SCREEN_IMAGE);
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载失败");
+            push_download_fail_notification(DOWNLOAD_FILE_TYPE_SCREEN_IMAGE);
+        }
+        /* 一次性使用后释放 */
+        free(g_ln_pending_screen_image_url);
+        g_ln_pending_screen_image_url = NULL;
+    }
+}
+
 /* 解析设备角色配置 JSON 并保存到全局结构体 */
 void ln_parse_character_config(const char *json_buf, int json_len)
 {
@@ -220,28 +266,11 @@ void ln_parse_character_config(const char *json_buf, int json_len)
     if (g_ln_character_config.avatar_screen_image && strlen(g_ln_character_config.avatar_screen_image) > 0 && g_ln_character_config.avatar_screen_image_as_emoji == 1)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保图片不为空,下载屏保图片");
-        // 下载屏保图片,eg:"https://example.com/new_avatar.bin"
-        ln_download_file_req_t req;
-        memset(&req, 0, sizeof(req));
-        /* 分配与拷贝,发送方分配,接收方负责释放 */
-        if (g_ln_character_config.avatar_screen_image)
-        {
-            size_t ulen = strlen(g_ln_character_config.avatar_screen_image);
-            req.url = (char *)malloc(ulen + 1);
-            if (req.url)
-            {
-                memcpy(req.url, g_ln_character_config.avatar_screen_image, ulen + 1);
-            }
-        }
-        const char *save = LN_DEVICE_SCREEN_IMAGE_FILE;
-        size_t slen = strlen(save);
-        req.save_path = (char *)malloc(slen + 1);
-        if (req.save_path)
-        {
-            memcpy(req.save_path, save, slen + 1);
-        }
+        /* 解析阶段先拷贝URL,避免稍后清理结构体后URL丢失 */
+        ln_set_pending_screen_image(g_ln_character_config.avatar_screen_image);
         push_download_file_notification(DOWNLOAD_FILE_TYPE_SCREEN_IMAGE);
-        do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_DOWNLOAD_SCREEN_IMAGE, (char *)&req, sizeof(req));
+        // 改为无参发送:由接收线程读取全局配置并下载
+        do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_DOWNLOAD_SCREEN_IMAGE, NULL, 0);
     }
 
     /* 推送角色配置更改通知 */