修复表盘下载路径问题
authorCaisking <Casiking@zhihuishixun.com>
Mon, 8 Sep 2025 12:04:23 +0000 (20:04 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Mon, 8 Sep 2025 12:04:23 +0000 (20:04 +0800)
code/sdk/application/wearable/fd230/nativeapp/nativeui/set_dial/src/SetDialModel.cpp
code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c

index ec89ed7..ddc3280 100644 (file)
@@ -1007,9 +1007,9 @@ bool check_dial_freespace_(uint16_t id, uint32_t dial_size) {
 }
 
 void ble_get_dial_path_(char *buf, uint16_t id) {
-  char *path =
-      (char *)OHOS::SetDialModel::GetInstance().GetSaveDir(id, 0).c_str();
+  char *path =(char *)OHOS::SetDialModel::GetInstance().GetSaveDir(id, 0).c_str();
   memcpy(buf, path, strlen(path) + 1);
+  printf("ble_get_dial_path_ %s\n", path);
   return;
 }
 
index a3e9a09..5bf13bf 100644 (file)
@@ -72,7 +72,7 @@ extern "C" {
 // #ifdef FD230
 
 
-#define DIAL_DATA_DIR NULL
+#define DIAL_DATA_DIR "/user/dial/offline_dial"
 
 #define TAR_PATH EXC_TAR_PATH
 
index 8451562..4378e2d 100644 (file)
@@ -7679,99 +7679,125 @@ errcode_t decode_single_dial_info(ble_read_data *buffer_handle)
 }\r
 static errcode_t install_dial(void)\r
 {\r
-    char *lzmapkgname =uapi_dev_runtime_get_dialname();\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"install %s\n",lzmapkgname);\r
-    char *lzmaindex = strstr(lzmapkgname,".lzma");\r
-    if (lzmaindex != NULL)\r
-    {\r
-        struct stat info;\r
-        if (stat(get_dial_path(), &info) != 0)\r
-        {\r
-            if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)\r
-            {\r
-                return ERRCODE_FAIL; // \r
-            }\r
-        }\r
+    char *lzmapkgname = uapi_dev_runtime_get_dialname();\r
+    // 增加初始参数校验打印\r
+    if (lzmapkgname == NULL) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取到的表盘包名为空\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 开始安装表盘,包名:%s\n", lzmapkgname);\r
 \r
-        char dial_basename[64]={0};\r
-        int dial_basenamelen =  (lzmaindex - lzmapkgname);\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dial_basenamelen %d\n",dial_basenamelen);\r
-        if (dial_basenamelen>0 )\r
-        {\r
-            memcpy_s(dial_basename,sizeof(dial_basename),lzmapkgname,dial_basenamelen);\r
-        }\r
-        else{\r
+    // 检查是否为lzma格式包\r
+    char *lzmaindex = strstr(lzmapkgname, ".lzma");\r
+    if (lzmaindex == NULL) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:包名中未找到.lzma后缀,不是有效压缩包\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    // 创建表盘目录(若不存在)\r
+    struct stat info;\r
+    if (stat(get_dial_path(), &info) != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录不存在,尝试创建...\n");\r
+        if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:创建表盘目录失败\n");\r
             return ERRCODE_FAIL;\r
         }\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dial_basename %s\n",dial_basename);\r
-        char dialbin_filepath[128]={0};\r
-        if(ble_dial_uid>5)\r
-        {\r
-            if (get_dial_file_path(dial_basename,strlen(dial_basename),dialbin_filepath,sizeof(dialbin_filepath)) != ERRCODE_SUCC)\r
-            {\r
-                return ERRCODE_FAIL;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            if (get_custom_dial_file_path(ble_dial_uid,dial_basename,strlen(dial_basename),dialbin_filepath,sizeof(dialbin_filepath)) != ERRCODE_SUCC)\r
-            {\r
-                return ERRCODE_FAIL;\r
-            }\r
-        }\r
-       \r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录创建成功\n");\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录已存在,无需创建\n");\r
+    }\r
 \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dialbin_filepath %s\n",dialbin_filepath);\r
-        char lzma_filepath[128]={0};\r
-        if (get_file_recv_file_path(lzmapkgname,strlen(lzmapkgname),lzma_filepath,sizeof(lzma_filepath)) != ERRCODE_SUCC)\r
-        {\r
+    // 解析表盘基础名称(去除.lzma后缀)\r
+    char dial_basename[64] = {0};\r
+    int dial_basenamelen = lzmaindex - lzmapkgname;\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析基础名称长度:%d\n", dial_basenamelen);\r
+    if (dial_basenamelen <= 0 || dial_basenamelen >= sizeof(dial_basename)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:基础名称长度无效(%d),超出缓冲区大小\n", dial_basenamelen);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    memcpy_s(dial_basename, sizeof(dial_basename), lzmapkgname, dial_basenamelen);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析到表盘基础名称:%s\n", dial_basename);\r
+\r
+    // 确定解压后bin文件路径\r
+    char dialbin_filepath[128] = {0};\r
+    if (ble_dial_uid > 5) {\r
+        if (get_dial_file_path(dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取常规表盘文件路径失败\n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+    } else {\r
+        if (get_custom_dial_file_path(ble_dial_uid, dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取自定义表盘文件路径失败\n");\r
             return ERRCODE_FAIL;\r
         }\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"lzma_filepath %s\n",lzma_filepath);\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压目标bin文件路径:%s\n", dialbin_filepath);\r
 \r
-        errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath,dialbin_filepath);\r
+    // 确定源lzma文件路径\r
+    char lzma_filepath[128] = {0};\r
+    if (get_file_recv_file_path(lzmapkgname, strlen(lzmapkgname), lzma_filepath, sizeof(lzma_filepath)) != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取源lzma文件路径失败\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件路径:%s\n", lzma_filepath);\r
 \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode %s to %s , ret %X \n",lzma_filepath,dialbin_filepath, ret);\r
+    // 执行解压操作\r
+    errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath, dialbin_filepath);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压操作完成,返回码:0x%X(%s)\n", ret, \r
+                 (ret == ERRCODE_SUCC) ? "成功" : "失败");\r
 \r
-        char *namebuf= strtok(lzmapkgname,".");\r
+    // 关键:检查解压后bin文件是否存在及大小\r
+    struct stat bin_info;\r
+    if (stat(dialbin_filepath, &bin_info) != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件不存在或无法访问(路径:%s)\n", dialbin_filepath);\r
+        ret = ERRCODE_FAIL; // 即使解压返回成功,文件不存在也视为失败\r
+    } else {\r
+        if (bin_info.st_size <= 0) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件大小为空(%ld字节),无效文件\n", bin_info.st_size);\r
+            ret = ERRCODE_FAIL; // 大小为空视为失败\r
+        } else {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压后bin文件大小正常:%ld字节\n", bin_info.st_size);\r
+        }\r
+    }\r
 \r
-        if(ble_dial_uid>5)\r
-        {\r
-            install_Register_dial(namebuf,ble_dial_uid);\r
+    // 若解压失败,直接返回\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压失败,终止安装流程\n");\r
+        return ret;\r
+    }\r
 \r
+    // 注册并设置表盘\r
+    char *namebuf = strtok(lzmapkgname, ".");\r
+    if (ble_dial_uid > 5) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 注册常规表盘:%s(ID:%d)\n", namebuf, ble_dial_uid);\r
+        install_Register_dial(namebuf, ble_dial_uid);\r
+        ble_set_dial_by_id(ble_dial_uid);\r
+    } else {\r
+        if (ble_dial_file_index == ble_dial_file_count) {\r
+            char name_str[32] = {0};\r
+            ble_get_custom_dial(ble_dial_uid, name_str);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘安装完毕,注册:%s(ID:%d)\n", name_str, ble_dial_uid);\r
+            install_Register_dial(name_str, ble_dial_uid);\r
             ble_set_dial_by_id(ble_dial_uid);\r
-\r
-        }\r
-        else\r
-        {\r
-            if(ble_dial_file_index==ble_dial_file_count)\r
-            {\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"自定义表盘安装完毕\r\n");\r
-                char name_str[32]={0};\r
-                ble_get_custom_dial(ble_dial_uid,name_str);\r
-                install_Register_dial(name_str,ble_dial_uid);\r
-                ble_set_dial_by_id(ble_dial_uid);\r
-            }\r
-     \r
+        } else {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘未达安装条件(当前索引:%d,总数:%d)\n", \r
+                         ble_dial_file_index, ble_dial_file_count);\r
         }\r
-        \r
-       \r
-        //安装完后删除表盘\r
-         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"remove  %s\r\n",lzma_filepath);\r
-\r
-        if(0!=remove(lzma_filepath))\r
-        return ERRCODE_FAIL;\r
+    }\r
 \r
-        if ( ret == ERRCODE_SUCC)\r
-            return ERRCODE_SUCC;\r
-        else\r
-            return ERRCODE_FAIL;\r
-    }else{\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,".lzma not found\n");\r
-        return ERRCODE_FAIL;\r
+    // 删除源lzma文件\r
+    #if 1\r
+    if (remove(lzma_filepath) != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 警告:删除源lzma文件失败(路径:%s),可能残留冗余文件\n", lzma_filepath);\r
+        // 此处不返回失败,仅警告,因为核心安装已完成\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件已成功删除\n");\r
     }\r
-}\r
+    #endif\r
 \r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘安装流程全部完成,返回成功\n");\r
+    return ERRCODE_SUCC;\r
+}\r
 static char file_name[128]={0};\r
 static uint32_t file_size=0;\r
 \r