From: luozheng <1732036298@qq.com> Date: Thu, 16 Oct 2025 08:23:30 +0000 (+0800) Subject: ln:屏保下载消息发送优化 X-Git-Tag: V1.0.9_20251128_194606_LN~227 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=75b4df3e687d6c485ed6af2654f3f94f92f65fb5;p=mirrors%2FFD230.git ln:屏保下载消息发送优化 --- diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index c0573ef32..1d0635316 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -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) { diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index 473ab460e..5c852abad 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -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); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c index aec082f9e..3cc5779bb 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c @@ -4,8 +4,29 @@ #include #include #include +#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); } /* 推送角色配置更改通知 */