From 14cf9c6b32fead557af4a853f6ef1c6003b23978 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=A2=81=E6=B8=85=E6=A2=A6?= <3449750381@qq.com> Date: Fri, 29 Aug 2025 06:59:18 +0000 Subject: [PATCH] Merge #2173 into sdk650pathc0423 from refs/changes/2173/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 袁清梦 * refs/changes/2173/head: (2 commits squashed) - 增加消息提醒 - Merge branch 'sdk650pathc0423' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk650pathc0423 Signed-off-by: Caisking <3449750381@qq.com> Merged-by: Caisking <3449750381@qq.com> CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/2173 --- .../nativeui/message/include/MessageModel.h | 5 +- .../nativeui/message/src/MessageModel.cpp | 1339 ++++++++--------- 2 files changed, 672 insertions(+), 672 deletions(-) diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h index ce8f886f7..08bc09ea7 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h @@ -7,6 +7,7 @@ #include #include "bleService.h" #include "bleInstruct.h" +#include "bleANCS.h" #endif #include "message/include/MessagePresenter.h" @@ -35,7 +36,9 @@ public: void InitMessageListItems(); // 初始化消息列表项 const MessageListItem *GetMessageListItems() const; // 获取消息列表项 uint8_t GetMessageCount() const; // 获取消息数量 - // void AddMessageData(ancs_data_info_t *messageInfo); // 增加消息项 + #ifdef SUPPORT_BLE_SERVICE + void AddMessageData(ancs_data_info_t *messageInfo); // 增加消息项 + #endif bool LoadMessagesFromStorage(); // 初始化信息数组 {开机调用一次} bool SaveMessagesToStorage(); // 保存信息数组 {关机时候调用} bool SetMessageAsRead(); // 设置当前项已读 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp index d63038205..42d346230 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp @@ -13,9 +13,9 @@ #include "main/include/MainViewSample.h" #include "NativeAbility.h" #include "UiConfig.h" - -// #include "bleANCS.h" - +#ifdef SUPPORT_BLE_SERVICE +#include "bleANCS.h" +#endif #include "broadcast_feature.h" #include "broadcast_service.h" #include "cJSON.h" @@ -46,13 +46,13 @@ #include "message/include/MessageControlView.h" #include "message/include/MessageView.h" -// #include "traing/include/TraingModel.h" +#include "traing/include/TraingModel.h" #define MESSAGE_JSON_FILE "user/userdata/ancs.json" #define MESSAGE_JSON_DIR "user/userdata/message/" #define PRINTFDATA 0 -// #include "message_notification.h" +#include "message_notification.h" #include "msg_center.h" #include "notification_manager.h" @@ -62,12 +62,12 @@ extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, // #include "msg_center_customerC.h" -// void show_notify_messgae() { -// // printf("show_notify_messgae\n"); -// OHOS::NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_THREE); -// OHOS::NotificationManager::GetInstance()->ShowNotify( -// OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true); -// } +void show_notify_messgae() { + // printf("show_notify_messgae\n"); + OHOS::NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_THREE); + OHOS::NotificationManager::GetInstance()->ShowNotify( + OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true); +} #ifdef __cplusplus extern "C" { @@ -140,102 +140,102 @@ static void Notify(void *args, const Topic topic, Request *request) { return; } - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d", request->msgId); - - // if (request->msgId == TOPIC_EVENT_MESSAGE_UPDATA) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - // "Processing TOPIC_EVENT_MESSAGE_UPDATA"); - - // if (request->data == NULL) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Received NULL data"); - // return; - // } - - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d", - // request->msgId); - // ancs_data_info_t *messageInfo = (ancs_data_info_t *)request->data; - // ancs_data_info_t messageInfo_; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo"); - - // messageInfo_.title = (char *)malloc(messageInfo->titlelen + 1); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo.title"); - // if (messageInfo_.title == NULL) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - // "Failed to allocate memory for title"); - // return; - // } - - // memcpy(messageInfo_.title, messageInfo->title, messageInfo->titlelen); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "memcpy"); - // messageInfo_.title[messageInfo->titlelen] = '\0'; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, - // "messageInfo.title[messageInfo->titlelen]"); - // messageInfo_.msg = (char *)malloc(messageInfo->msglen + 1); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo_.msg"); - // if (messageInfo_.msg == NULL) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - // "Failed to allocate memory for message"); - // free(messageInfo_.title); // Free previously allocated title - // return; - // } - - // memcpy(messageInfo_.msg, messageInfo->msg, messageInfo->msglen); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, - // "messageInfo.msg[messageInfo->msglen]"); - // messageInfo_.msg[messageInfo->msglen] = '\0'; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, - // "messageInfo_.msg[messageInfo->msglen end"); - - // messageInfo_.appid = messageInfo->appid; - // messageInfo_.uid = messageInfo->uid; - // messageInfo_.time = messageInfo->time; - // messageInfo_.read = 0; - - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "message_data %p %p\r\n", - // messageInfo_.title, messageInfo_.msg); - - // MessageModel::GetInstance().AddMessageData(&messageInfo_); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddMessageData"); - - // // uint32_t currentTimestamp = OHOS::TraingModel::GetInstance()->get_current_time(); - // uint32_t currentTimestamp = 0; - // if (currentTimestamp - messageTimestamp <= 1) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageTimestamp too short"); - // free(messageInfo_.title); - // free(messageInfo_.msg); - // return; - // } - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get_current_time end"); - - // messageTimestamp = currentTimestamp; - - // /* - // 以下状态不进行消息弹窗 - // -训练中 - // -省电模式 - // -呼吸训练中 - // -使用语音助手 - // */ - // if (uapi_dev_runtime_get_train_status() || - // uapi_dev_runtime_get_saveele_status() || - // uapi_dev_runtime_get_respiratory_training_status() || - // uapi_dev_runtime_get_voice_status()) { - - // free(messageInfo_.title); - // free(messageInfo_.msg); - // return; - // } - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "status end"); - - // CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0); - - // // show_notify_messgae(); - - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Message popup sent"); - - // free(messageInfo_.title); - // free(messageInfo_.msg); - // } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d", request->msgId); + + if (request->msgId == TOPIC_EVENT_MESSAGE_UPDATA) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Processing TOPIC_EVENT_MESSAGE_UPDATA"); + + if (request->data == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Received NULL data"); + return; + } +#ifdef SUPPORT_BLE_SERVICE + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d", + request->msgId); + ancs_data_info_t *messageInfo = (ancs_data_info_t *)request->data; + ancs_data_info_t messageInfo_; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo"); + + messageInfo_.title = (char *)malloc(messageInfo->titlelen + 1); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo.title"); + if (messageInfo_.title == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to allocate memory for title"); + return; + } + + memcpy(messageInfo_.title, messageInfo->title, messageInfo->titlelen); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "memcpy"); + messageInfo_.title[messageInfo->titlelen] = '\0'; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "messageInfo.title[messageInfo->titlelen]"); + messageInfo_.msg = (char *)malloc(messageInfo->msglen + 1); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo_.msg"); + if (messageInfo_.msg == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to allocate memory for message"); + free(messageInfo_.title); // Free previously allocated title + return; + } + + memcpy(messageInfo_.msg, messageInfo->msg, messageInfo->msglen); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "messageInfo.msg[messageInfo->msglen]"); + messageInfo_.msg[messageInfo->msglen] = '\0'; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "messageInfo_.msg[messageInfo->msglen end"); + + messageInfo_.appid = messageInfo->appid; + messageInfo_.uid = messageInfo->uid; + messageInfo_.time = messageInfo->time; + messageInfo_.read = 0; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "message_data %p %p\r\n", + messageInfo_.title, messageInfo_.msg); + + MessageModel::GetInstance().AddMessageData(&messageInfo_); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddMessageData"); + + uint32_t currentTimestamp =OHOS::TraingModel::GetInstance()->get_current_time(); + if (currentTimestamp - messageTimestamp <= 1) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageTimestamp too short"); + free(messageInfo_.title); + free(messageInfo_.msg); + return; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get_current_time end"); + + messageTimestamp = currentTimestamp; + + /* + 以下状态不进行消息弹窗 + -训练中 + -省电模式 + -呼吸训练中 + -使用语音助手 + */ + if (uapi_dev_runtime_get_train_status() || + uapi_dev_runtime_get_saveele_status() || + uapi_dev_runtime_get_respiratory_training_status() || + uapi_dev_runtime_get_voice_status()) { + + free(messageInfo_.title); + free(messageInfo_.msg); + return; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "status end"); + + CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0); + + // show_notify_messgae(); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Message popup sent"); + + free(messageInfo_.title); + free(messageInfo_.msg); +#endif + } } void saveancsdata() { // printf("saveancs\r\n"); @@ -262,51 +262,47 @@ MessageModel &MessageModel::GetInstance() { } void MessageModel::at_message_test() { - // // Initialize timestamp - // uint32_t timestamp = 0; - // if (uapi_get_timestampe_ss(×tamp) != ERRCODE_SUCC) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp"); - // return; - // } - - // ancs_data_info_t data; - // const char *title = "title"; // Assuming title and msg are defined elsewhere - // const char *msg = "message"; - - // data.title = (char *)malloc(strlen(title) + 1); - // data.msg = (char *)malloc(strlen(msg) + 1); - - // if (data.title == NULL || data.msg == NULL) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failed"); - // free(data.title); // Free previously allocated memory - // free(data.msg); - // return; - // } - - // strcpy(data.title, title); - // strcpy(data.msg, msg); - - // data.appid = 0; - // data.uid = 0; - // data.time = timestamp; - // data.read = 0; - // data.hasCode = 1; - - // data.msglen = strlen(msg); - // data.titlelen = strlen(title); - - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "message_data %s %s\r\n", data.title, - // data.msg); - - // CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA, (uint8_t *)&data, - // sizeof(ancs_data_info_t)); - - // free(data.title); - // free(data.msg); - - // Simulate message push notification (if needed) - // OHOS::NotificationManager::GetInstance()->ShowNotify( - // OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true); +#ifdef SUPPORT_BLE_SERVICE + // Initialize timestamp + uint32_t timestamp = 0; + if (uapi_get_timestampe_ss(×tamp) != ERRCODE_SUCC) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp"); + return; + } + + ancs_data_info_t data; + const char *title = "title"; // Assuming title and msg are defined elsewhere + const char *msg = "message"; + + data.title = (char *)malloc(strlen(title) + 1); + data.msg = (char *)malloc(strlen(msg) + 1); + + if (data.title == NULL || data.msg == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failed"); + free(data.title); // Free previously allocated memory + free(data.msg); + return; + } + + strcpy(data.title, title); + strcpy(data.msg, msg); + + data.appid = 0; + data.uid = 0; + data.time = timestamp; + data.read = 0; + data.hasCode = 1; + + data.msglen = strlen(msg); + data.titlelen = strlen(title); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "message_data %s %s\r\n", data.title, + data.msg); + + CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA, (uint8_t *)&data, + sizeof(ancs_data_info_t)); + +#endif } void MessageModel ::Init() { @@ -323,7 +319,7 @@ uint8_t MessageModel::GetMessageCount() const { return numberOfItems; } // 加载Message文件 bool MessageModel::LoadMessagesFromStorage() { // 加载消息过滤文件 - // filtration_file_read(); + filtration_file_read(); std::ifstream file(MESSAGE_JSON_FILE); if (!file.is_open()) { @@ -412,7 +408,7 @@ bool MessageModel::LoadMessagesFromStorage() { // 保存Message文件 bool MessageModel::SaveMessagesToStorage() { // 消息过滤文件保存 - // filtration_file_save(); + filtration_file_save(); if (MessageVector.empty()) { // 清空文件 std::ofstream file(MESSAGE_JSON_FILE, @@ -500,48 +496,49 @@ void MessageModel::SetCurrentIndex(uint8_t index) { // 获取当前项[数组下标] uint8_t MessageModel::GetCurrentIndex() { return currentIndex_; } - +#ifdef SUPPORT_BLE_SERVICE // 增加消息项[添加数组项] -// void MessageModel::AddMessageData(ancs_data_info_t *messageInfo) { -// if (messageInfo == nullptr) { -// WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo is null"); -// return; -// } - -// // 创建并填充 MessageData -// MessageData data; -// data.isRead = messageInfo->read; -// data.labelDetails = messageInfo->msg ? messageInfo->msg : ""; -// data.labelTitle = messageInfo->title ? messageInfo->title : ""; -// data.timestamp = messageInfo->time; - -// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, -// "AddMessageData data.isRead is %d, data.labelDetails is %s, " -// "data.labelTitle is %s, data.timestamp is %u", -// data.isRead, data.labelDetails.c_str(), data.labelTitle.c_str(), -// data.timestamp); - -// // 处理时间字符串 -// char labelTime[20]; -// if (uapi_get_TIME_STR(data.timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != -// ERRCODE_SUCC) { -// data.labelTime = "--"; // 默认值 -// } else { -// data.labelTime = labelTime; // 直接使用 labelTime -// } - -// // 添加数据到消息向量 -// MessageVector.push_back(data); - -// // 删除多余的数据 -// if (MessageVector.size() > MaxMessageListCount) { -// MessageVector.erase(MessageVector.begin(), -// MessageVector.begin() + -// (MessageVector.size() - MaxMessageListCount)); -// } - -// WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo add is ok"); -// } +void MessageModel::AddMessageData(ancs_data_info_t *messageInfo) { + if (messageInfo == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo is null"); + return; + } + + // 创建并填充 MessageData + MessageData data; + data.isRead = messageInfo->read; + data.labelDetails = messageInfo->msg ? messageInfo->msg : ""; + data.labelTitle = messageInfo->title ? messageInfo->title : ""; + data.timestamp = messageInfo->time; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "AddMessageData data.isRead is %d, data.labelDetails is %s, " + "data.labelTitle is %s, data.timestamp is %u", + data.isRead, data.labelDetails.c_str(), data.labelTitle.c_str(), + data.timestamp); + + // 处理时间字符串 + char labelTime[20]; + if (uapi_get_TIME_STR(data.timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != + ERRCODE_SUCC) { + data.labelTime = "--"; // 默认值 + } else { + data.labelTime = labelTime; // 直接使用 labelTime + } + + // 添加数据到消息向量 + MessageVector.push_back(data); + + // 删除多余的数据 + if (MessageVector.size() > MaxMessageListCount) { + MessageVector.erase(MessageVector.begin(), + MessageVector.begin() + + (MessageVector.size() - MaxMessageListCount)); + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo add is ok"); +} +#endif // 获取目前的项 MessageData *MessageModel::GetCurrentMessageData() { @@ -627,483 +624,483 @@ void MessageModel::UpdateMessageView() { } // namespace OHOS #if 0 - uint8_t MessageModel::GetMessageCount() const - { - return (numberOfItems != 0 ? numberOfItems : MaxMessageListCount); - } - /* -------------------------------------------------------------------------- */ - void MessageModel::PrintData(MessageData messagedata) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "--------------------------------------"); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Title: %s", (messagedata.labelTitle).c_str()); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Details: %s", (messagedata.labelDetails).c_str()); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Time: %s", (messagedata.labelTime).c_str()); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Read: %d", messagedata.isRead); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "--------------------------------------"); - } - /*打印文件名数组*/ - void PrintFileName(const std::vector &filenames) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Filenames:"); - for (const auto &filename : filenames) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s", filename.c_str()); - } - } - - /*打印message数组*/ - void PrintMessageData(const std::vector &MessageVector) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageVector:"); - for (const auto &message : MessageVector) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title: %s", message.labelTitle.c_str()); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Details: %s", message.labelDetails.c_str()); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timestamp: %d", message.timestamp); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "IsRead: %d", message.isRead); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, ""); - } - } - /*打印map*/ - void PrintMessageMap(const std::map &messageMap) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMap:"); - for (const auto &pair : messageMap) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Key: %d, Value: %s", pair.first, pair.second.c_str()); - } - } - /* -------------------------------------------------------------------------- */ - /*检查是否存在数据*/ - bool MessageModel::HasDataJson() - { - // 打开消息数据目录 - DIR *dir = opendir(MESSAGE_JSON_DIR); - if (dir == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open MESSAGE_JSON_DIR"); - jsonDataExists = false; - return false; - } - - // 在作用域结束时自动关闭目录 - struct DirCloser - { - void operator()(DIR *d) const - { - if (d) - closedir(d); - } - }; - std::unique_ptr dirPtr(dir); - - // 检查目录是否为空 - struct dirent *ent; - // 是否存在文件标志位 - bool isEmpty = true; - while ((ent = readdir(dir)) != nullptr) - { - // 过滤掉当前目录和上级目录 - if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) - { - continue; - } - // 普通文件 - if (ent->d_type == DT_REG || ent->d_type == DT_UNKNOWN) - { - isEmpty = false; - break; - } - } - - if (isEmpty) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No data files found in MESSAGE_JSON_DIR"); - jsonDataExists = false; - return false; - } - - jsonDataExists = true; - return true; - } - - /*加载json函数*/ - /* - 加载messagejson文件夹 MESSAGE_JSON_DIR - 文件夹里面的文件[一条数据]一个文件 按序号命名,0.json 1.json 2.json... - 需要建立一个文件名和数组下标对应的map ->方便进行对文件操作? - 最多加载10条数据(先按序号排序??) - 如果还有多余的遍历删除序号最小的文件(消息最早的) - 获取到一个 MessageData 数组返回 - - 1.遍历文件夹的每一个文件 排序 - 2.先加载? - 3.每次加载一个文件 更新一下map - 4.超过10条。后面的文件直接删除 - 5.返回数组 - */ - - /*遍历文件夹*/ - std::vector GetFileNamesInDirectory(const std::string &directory) - { - std::vector filenames; - DIR *dir; - struct dirent *ent; - if ((dir = opendir(directory.c_str())) != nullptr) - { - while ((ent = readdir(dir)) != nullptr) - { - std::string fileName = ent->d_name; - if (fileName != "." && fileName != "..") - { - // 2.遍历文件夹里面的文件名生成文件名数组 - if (ent->d_type == DT_REG || ent->d_type == DT_UNKNOWN) // 普通文件 - { - fileName = directory + fileName; - filenames.push_back(fileName); - // printf("GetFileNamesInDirectory:%s\r\n", fileName.c_str()); - } - else if (ent->d_type == DT_DIR) // 目录 - { - continue; - } - } - } - closedir(dir); - return filenames; - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s is null!", directory.c_str()); - return filenames; - } - - /*文件名数组 删除多余项*/ - void MessageModel::DeleteExcessFiles(std::vector &filenames) - { - if (filenames.size() > MaxMessageListCount) - { - int numFilesToDelete = filenames.size() - MaxMessageListCount; - for (int i = 0; i < numFilesToDelete; i++) - { - std::remove(filenames[i].c_str()); // 删除文件 - filenames.erase(filenames.begin() + i); // 从数组中删除相应的文件名 - } - } - } - - /*message json 加载*/ - std::vector MessageModel::LoadMessageData() - { - std::vector MessageVector; // 返回的数据列表 - std::vector filenames; // 文件名数组 - - // 1.检查消息目录是否存在 - filenames = GetFileNamesInDirectory(MESSAGE_JSON_DIR); - // 3.检查文件夹是否为空 - if (filenames.empty()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message directory is empty"); - return MessageVector; - } - - // 4.文件名排序 - // std::sort(filenames.begin(), filenames.end()); - - // 5.文件数量超出限制删除多余文件 - DeleteExcessFiles(filenames); // 删除多余文件 - - // 6.解析json - for (int i = 0; i < filenames.size(); i++) - { - std::ifstream file((filenames[i])); - if (!file.is_open()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open file %s ", filenames[i].c_str()); - continue; // 跳过当前文件 - } - - std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); - file.close(); - - cJSON *root = cJSON_Parse(jsonData.c_str()); - if (root == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file %s ", filenames[i].c_str()); - continue; // 跳过当前文件 - } - - MessageData messagedata; - - messagedata.labelTitle = cJSON_GetObjectItem(root, "title")->valuestring; - messagedata.labelDetails = cJSON_GetObjectItem(root, "msg")->valuestring; - messagedata.isRead = cJSON_GetObjectItem(root, "read")->valueint; - - // 获取时间 - uint32 timestamp = cJSON_GetObjectItem(root, "time")->valueint; - messagedata.timestamp = timestamp; - char labelTime[20]; - if (uapi_get_TIME_STR(timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC) - { - messagedata.labelTime = std::string("2024.1.1 00:00"); - } - else - { - messagedata.labelTime = std::string(labelTime); - } - - // 生成json数组数组 - MessageVector.push_back(messagedata); - // 维护map 映射文件名和数组下标 - fileIndexMap[i] = filenames[i]; - cJSON_Delete(root); - } + uint8_t MessageModel::GetMessageCount() const + { + return (numberOfItems != 0 ? numberOfItems : MaxMessageListCount); + } + /* -------------------------------------------------------------------------- */ + void MessageModel::PrintData(MessageData messagedata) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "--------------------------------------"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Title: %s", (messagedata.labelTitle).c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Details: %s", (messagedata.labelDetails).c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Time: %s", (messagedata.labelTime).c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Read: %d", messagedata.isRead); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "--------------------------------------"); + } + /*打印文件名数组*/ + void PrintFileName(const std::vector &filenames) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Filenames:"); + for (const auto &filename : filenames) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s", filename.c_str()); + } + } + + /*打印message数组*/ + void PrintMessageData(const std::vector &MessageVector) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageVector:"); + for (const auto &message : MessageVector) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title: %s", message.labelTitle.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Details: %s", message.labelDetails.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timestamp: %d", message.timestamp); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "IsRead: %d", message.isRead); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, ""); + } + } + /*打印map*/ + void PrintMessageMap(const std::map &messageMap) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMap:"); + for (const auto &pair : messageMap) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Key: %d, Value: %s", pair.first, pair.second.c_str()); + } + } + /* -------------------------------------------------------------------------- */ + /*检查是否存在数据*/ + bool MessageModel::HasDataJson() + { + // 打开消息数据目录 + DIR *dir = opendir(MESSAGE_JSON_DIR); + if (dir == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open MESSAGE_JSON_DIR"); + jsonDataExists = false; + return false; + } + + // 在作用域结束时自动关闭目录 + struct DirCloser + { + void operator()(DIR *d) const + { + if (d) + closedir(d); + } + }; + std::unique_ptr dirPtr(dir); + + // 检查目录是否为空 + struct dirent *ent; + // 是否存在文件标志位 + bool isEmpty = true; + while ((ent = readdir(dir)) != nullptr) + { + // 过滤掉当前目录和上级目录 + if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) + { + continue; + } + // 普通文件 + if (ent->d_type == DT_REG || ent->d_type == DT_UNKNOWN) + { + isEmpty = false; + break; + } + } + + if (isEmpty) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No data files found in MESSAGE_JSON_DIR"); + jsonDataExists = false; + return false; + } + + jsonDataExists = true; + return true; + } + + /*加载json函数*/ + /* + 加载messagejson文件夹 MESSAGE_JSON_DIR + 文件夹里面的文件[一条数据]一个文件 按序号命名,0.json 1.json 2.json... + 需要建立一个文件名和数组下标对应的map ->方便进行对文件操作? + 最多加载10条数据(先按序号排序??) + 如果还有多余的遍历删除序号最小的文件(消息最早的) + 获取到一个 MessageData 数组返回 + + 1.遍历文件夹的每一个文件 排序 + 2.先加载? + 3.每次加载一个文件 更新一下map + 4.超过10条。后面的文件直接删除 + 5.返回数组 + */ + + /*遍历文件夹*/ + std::vector GetFileNamesInDirectory(const std::string &directory) + { + std::vector filenames; + DIR *dir; + struct dirent *ent; + if ((dir = opendir(directory.c_str())) != nullptr) + { + while ((ent = readdir(dir)) != nullptr) + { + std::string fileName = ent->d_name; + if (fileName != "." && fileName != "..") + { + // 2.遍历文件夹里面的文件名生成文件名数组 + if (ent->d_type == DT_REG || ent->d_type == DT_UNKNOWN) // 普通文件 + { + fileName = directory + fileName; + filenames.push_back(fileName); + // printf("GetFileNamesInDirectory:%s\r\n", fileName.c_str()); + } + else if (ent->d_type == DT_DIR) // 目录 + { + continue; + } + } + } + closedir(dir); + return filenames; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s is null!", directory.c_str()); + return filenames; + } + + /*文件名数组 删除多余项*/ + void MessageModel::DeleteExcessFiles(std::vector &filenames) + { + if (filenames.size() > MaxMessageListCount) + { + int numFilesToDelete = filenames.size() - MaxMessageListCount; + for (int i = 0; i < numFilesToDelete; i++) + { + std::remove(filenames[i].c_str()); // 删除文件 + filenames.erase(filenames.begin() + i); // 从数组中删除相应的文件名 + } + } + } + + /*message json 加载*/ + std::vector MessageModel::LoadMessageData() + { + std::vector MessageVector; // 返回的数据列表 + std::vector filenames; // 文件名数组 + + // 1.检查消息目录是否存在 + filenames = GetFileNamesInDirectory(MESSAGE_JSON_DIR); + // 3.检查文件夹是否为空 + if (filenames.empty()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message directory is empty"); + return MessageVector; + } + + // 4.文件名排序 + // std::sort(filenames.begin(), filenames.end()); + + // 5.文件数量超出限制删除多余文件 + DeleteExcessFiles(filenames); // 删除多余文件 + + // 6.解析json + for (int i = 0; i < filenames.size(); i++) + { + std::ifstream file((filenames[i])); + if (!file.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open file %s ", filenames[i].c_str()); + continue; // 跳过当前文件 + } + + std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + cJSON *root = cJSON_Parse(jsonData.c_str()); + if (root == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file %s ", filenames[i].c_str()); + continue; // 跳过当前文件 + } + + MessageData messagedata; + + messagedata.labelTitle = cJSON_GetObjectItem(root, "title")->valuestring; + messagedata.labelDetails = cJSON_GetObjectItem(root, "msg")->valuestring; + messagedata.isRead = cJSON_GetObjectItem(root, "read")->valueint; + + // 获取时间 + uint32 timestamp = cJSON_GetObjectItem(root, "time")->valueint; + messagedata.timestamp = timestamp; + char labelTime[20]; + if (uapi_get_TIME_STR(timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC) + { + messagedata.labelTime = std::string("2024.1.1 00:00"); + } + else + { + messagedata.labelTime = std::string(labelTime); + } + + // 生成json数组数组 + MessageVector.push_back(messagedata); + // 维护map 映射文件名和数组下标 + fileIndexMap[i] = filenames[i]; + cJSON_Delete(root); + } #if PRINTFDATA - PrintFileName(filenames); - PrintMessageData(MessageVector); - PrintMessageMap(fileIndexMap); + PrintFileName(filenames); + PrintMessageData(MessageVector); + PrintMessageMap(fileIndexMap); #endif - return MessageVector; - } - - void MessageModel::InitMessageListItems() - { - // 读取json数据 - std::vector messageVector = LoadMessageData(); - if (!messageVector.empty()) - { - numberOfItems = messageVector.size(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "the numberOfItems is %d", numberOfItems); - for (int i = numberOfItems - 1, count = 0; i >= 0 && count < MaxMessageListCount; i--, count++) - { - MessageData messageData; - messageData.isRead = messageVector[i].isRead; - messageData.labelTitle = messageVector[i].labelTitle; - messageData.labelDetails = messageVector[i].labelDetails; - messageData.labelTime = messageVector[i].labelTime; - // PrintData(messageData); - // 获取是否读取 来信 信息内容 时间 - Messages[count] = {count, messageData.isRead, messageData.labelTitle, messageData.labelDetails, messageData.labelTime}; - } - } - } - - const MessageListItem *MessageModel::GetMessageListItems() const - { - return Messages; - } - - bool MessageModel::GetJsonLoadStatus() - { - return jsonDataExists; - } - - // 设置当前界面 - void MessageModel::SetPopupViewState(bool state) - { - popupViewState = state; - } - - // 获取当前界面 0:没有记录 | 1:有记录 - bool MessageModel::GetPopupViewState() - { - return popupViewState; - } - - /*保存json数据*/ - void MessageModel::SaveMessageData(const MessageData data, const int index) - { - cJSON *root = cJSON_CreateObject(); - - cJSON *item = cJSON_CreateObject(); - cJSON_AddStringToObject(item, "title", data.labelTitle.c_str()); - cJSON_AddStringToObject(item, "msg", data.labelDetails.c_str()); - cJSON_AddNumberToObject(item, "time", data.timestamp); - cJSON_AddNumberToObject(item, "read", data.isRead); - - std::string jsonString = cJSON_Print(root); - cJSON_Delete(root); - - std::ofstream file(fileIndexMap[index]); - if (file.is_open()) - { - file << jsonString; - file.close(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveMessageData is ok"); - } - else - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for writing"); - } - } - - // 获取目前的message - MessageData *MessageModel::GetCurrentMessageData() - { - PrintData(message_); - return &message_; - } - - // 设置目前的message - void MessageModel::SetCurrentMessageData(MessageData *data) - { - if (data != nullptr) - { - message_.labelDetails = data->labelDetails; - message_.labelTime = data->labelTime; - message_.labelTitle = data->labelTitle; - message_.isRead = data->isRead; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetMessageData is ok"); - } - } - - // 清除所有数据[删除文件夹内所有文件] - bool MessageModel::ClearAllData() - { - // 遍历fileIndexMap并删除对应文件 - for (auto it = fileIndexMap.begin(); it != fileIndexMap.end(); ++it) - { - std::string filePath = it->second; - uapi_delete_files(filePath.c_str()); - } - - // 清空fileIndexMap - fileIndexMap.clear(); - - return true; // 表示清除操作成功 - } - - // 删除单个项 [通过 map 删除] - bool MessageModel::DeleteSingleItem(int currentIndex) - { - if (currentIndex < 0) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid index for deletion: Index is less than 0"); - return false; - } - - auto it = std::next(fileIndexMap.begin(), currentIndex); - if (it == fileIndexMap.end()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Item at index not found"); - return false; - } - - // 删除文件 - uapi_delete_files(it->second.c_str()); - - // 删除对应项 - fileIndexMap.erase(it); - - return true; - } - // 设置当前项已读 - bool MessageModel::SetMessageIsread() - { - // 1.找到对应的项文件 - if (fileIndexMap.find(indexCurrent) == fileIndexMap.end()) - { - // 检查索引是否存在于map中 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Index not found in fileIndexMap"); - return false; - } - std::ofstream file(fileIndexMap[indexCurrent]); - if (!file.is_open()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "filename is error"); - return false; - } - - // 2.获取文件内容 - std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); - file.close(); - if (jsonData.empty()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData is null"); - return false; - } - - // 3.设置属性已读 - cJSON *root = cJSON_Parse(jsonData.c_str()); - if (root == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file"); - return false; - } - - // 4.更新数据并保存文件 - cJSON_ReplaceItemInObject(root, "isRead", cJSON_CreateNumber(1)); // 将"isRead"属性值设为1,表示已读 - - // 5.重新生成 JSON 字符串 - char *updatedJsonData = cJSON_Print(root); - - // 6.打开文件以写入更新后的数据 - outFile.open(fileIndexMap[indexCurrent]); - if (outFile.is_open()) - { - outFile << updatedJsonData; // 将更新后的 JSON 数据写入文件 - outFile.close(); - cJSON_free(updatedJsonData); - } - else - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file for writing"); - cJSON_free(updatedJsonData); - cJSON_Delete(root); - return false; - } - // 释放 JSON 对象内存 - cJSON_Delete(root); - return true; - } - // 获取最新消息项 - MessageData *MessageModel::GetNewestData(int index) - { - // 打开文件 - std::string filename = MESSAGE_JSON_DIR + std::to_string(index) + ".json"; - std::ifstream file(filename); - if (!file.is_open()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file"); - return nullptr; - } - - // 获取文件内容 - std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); - file.close(); - - if (jsonData.empty()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: File is empty"); - return nullptr; - } - - // 解析JSON数据 - cJSON *root = cJSON_Parse(jsonData.c_str()); - if (root == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file"); - return nullptr; - } - - // 创建MessageData对象并设置属性 - MessageData *data = new MessageData(); - data->labelTitle = cJSON_GetObjectItem(root, "title")->valuestring; - data->labelDetails = cJSON_GetObjectItem(root, "msg")->valuestring; - data->isRead = cJSON_GetObjectItem(root, "read")->valueint; - data->timestamp = cJSON_GetObjectItem(root, "time")->valueint; - - // 释放资源并返回数据 - cJSON_Delete(root); - return data; - } - // 设置当前项 - void MessageModel::SetCurrentIndex(uint8_t index) - { - indexCurrent = index; - } - // 获取当前项 - uint8_t MessageModel::GetCurrentIndex() - { - return indexCurrent; - } + return MessageVector; + } + + void MessageModel::InitMessageListItems() + { + // 读取json数据 + std::vector messageVector = LoadMessageData(); + if (!messageVector.empty()) + { + numberOfItems = messageVector.size(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "the numberOfItems is %d", numberOfItems); + for (int i = numberOfItems - 1, count = 0; i >= 0 && count < MaxMessageListCount; i--, count++) + { + MessageData messageData; + messageData.isRead = messageVector[i].isRead; + messageData.labelTitle = messageVector[i].labelTitle; + messageData.labelDetails = messageVector[i].labelDetails; + messageData.labelTime = messageVector[i].labelTime; + // PrintData(messageData); + // 获取是否读取 来信 信息内容 时间 + Messages[count] = {count, messageData.isRead, messageData.labelTitle, messageData.labelDetails, messageData.labelTime}; + } + } + } + + const MessageListItem *MessageModel::GetMessageListItems() const + { + return Messages; + } + + bool MessageModel::GetJsonLoadStatus() + { + return jsonDataExists; + } + + // 设置当前界面 + void MessageModel::SetPopupViewState(bool state) + { + popupViewState = state; + } + + // 获取当前界面 0:没有记录 | 1:有记录 + bool MessageModel::GetPopupViewState() + { + return popupViewState; + } + + /*保存json数据*/ + void MessageModel::SaveMessageData(const MessageData data, const int index) + { + cJSON *root = cJSON_CreateObject(); + + cJSON *item = cJSON_CreateObject(); + cJSON_AddStringToObject(item, "title", data.labelTitle.c_str()); + cJSON_AddStringToObject(item, "msg", data.labelDetails.c_str()); + cJSON_AddNumberToObject(item, "time", data.timestamp); + cJSON_AddNumberToObject(item, "read", data.isRead); + + std::string jsonString = cJSON_Print(root); + cJSON_Delete(root); + + std::ofstream file(fileIndexMap[index]); + if (file.is_open()) + { + file << jsonString; + file.close(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveMessageData is ok"); + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for writing"); + } + } + + // 获取目前的message + MessageData *MessageModel::GetCurrentMessageData() + { + PrintData(message_); + return &message_; + } + + // 设置目前的message + void MessageModel::SetCurrentMessageData(MessageData *data) + { + if (data != nullptr) + { + message_.labelDetails = data->labelDetails; + message_.labelTime = data->labelTime; + message_.labelTitle = data->labelTitle; + message_.isRead = data->isRead; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetMessageData is ok"); + } + } + + // 清除所有数据[删除文件夹内所有文件] + bool MessageModel::ClearAllData() + { + // 遍历fileIndexMap并删除对应文件 + for (auto it = fileIndexMap.begin(); it != fileIndexMap.end(); ++it) + { + std::string filePath = it->second; + uapi_delete_files(filePath.c_str()); + } + + // 清空fileIndexMap + fileIndexMap.clear(); + + return true; // 表示清除操作成功 + } + + // 删除单个项 [通过 map 删除] + bool MessageModel::DeleteSingleItem(int currentIndex) + { + if (currentIndex < 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid index for deletion: Index is less than 0"); + return false; + } + + auto it = std::next(fileIndexMap.begin(), currentIndex); + if (it == fileIndexMap.end()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Item at index not found"); + return false; + } + + // 删除文件 + uapi_delete_files(it->second.c_str()); + + // 删除对应项 + fileIndexMap.erase(it); + + return true; + } + // 设置当前项已读 + bool MessageModel::SetMessageIsread() + { + // 1.找到对应的项文件 + if (fileIndexMap.find(indexCurrent) == fileIndexMap.end()) + { + // 检查索引是否存在于map中 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Index not found in fileIndexMap"); + return false; + } + std::ofstream file(fileIndexMap[indexCurrent]); + if (!file.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "filename is error"); + return false; + } + + // 2.获取文件内容 + std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + if (jsonData.empty()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData is null"); + return false; + } + + // 3.设置属性已读 + cJSON *root = cJSON_Parse(jsonData.c_str()); + if (root == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file"); + return false; + } + + // 4.更新数据并保存文件 + cJSON_ReplaceItemInObject(root, "isRead", cJSON_CreateNumber(1)); // 将"isRead"属性值设为1,表示已读 + + // 5.重新生成 JSON 字符串 + char *updatedJsonData = cJSON_Print(root); + + // 6.打开文件以写入更新后的数据 + outFile.open(fileIndexMap[indexCurrent]); + if (outFile.is_open()) + { + outFile << updatedJsonData; // 将更新后的 JSON 数据写入文件 + outFile.close(); + cJSON_free(updatedJsonData); + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file for writing"); + cJSON_free(updatedJsonData); + cJSON_Delete(root); + return false; + } + // 释放 JSON 对象内存 + cJSON_Delete(root); + return true; + } + // 获取最新消息项 + MessageData *MessageModel::GetNewestData(int index) + { + // 打开文件 + std::string filename = MESSAGE_JSON_DIR + std::to_string(index) + ".json"; + std::ifstream file(filename); + if (!file.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file"); + return nullptr; + } + + // 获取文件内容 + std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + if (jsonData.empty()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: File is empty"); + return nullptr; + } + + // 解析JSON数据 + cJSON *root = cJSON_Parse(jsonData.c_str()); + if (root == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file"); + return nullptr; + } + + // 创建MessageData对象并设置属性 + MessageData *data = new MessageData(); + data->labelTitle = cJSON_GetObjectItem(root, "title")->valuestring; + data->labelDetails = cJSON_GetObjectItem(root, "msg")->valuestring; + data->isRead = cJSON_GetObjectItem(root, "read")->valueint; + data->timestamp = cJSON_GetObjectItem(root, "time")->valueint; + + // 释放资源并返回数据 + cJSON_Delete(root); + return data; + } + // 设置当前项 + void MessageModel::SetCurrentIndex(uint8_t index) + { + indexCurrent = index; + } + // 获取当前项 + uint8_t MessageModel::GetCurrentIndex() + { + return indexCurrent; + } #endif \ No newline at end of file -- 2.17.1