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)
{
#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)
{
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)
{
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);
}
/* 推送角色配置更改通知 */