#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"
#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"
// #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" {
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");
}
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() {
// 加载Message文件
bool MessageModel::LoadMessagesFromStorage() {
// 加载消息过滤文件
- // filtration_file_read();
+ filtration_file_read();
std::ifstream file(MESSAGE_JSON_FILE);
if (!file.is_open()) {
// 保存Message文件
bool MessageModel::SaveMessagesToStorage() {
// 消息过滤文件保存
- // filtration_file_save();
+ filtration_file_save();
if (MessageVector.empty()) {
// 清空文件
std::ofstream file(MESSAGE_JSON_FILE,
// 获取当前项[数组下标]
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() {
} // 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<std::string> &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<MessageData> &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<int, std::string> &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<DIR, DirCloser> 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<std::string> GetFileNamesInDirectory(const std::string &directory)
- {
- std::vector<std::string> 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<std::string> &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<MessageData> MessageModel::LoadMessageData()
- {
- std::vector<MessageData> MessageVector; // 返回的数据列表
- std::vector<std::string> 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<char>(file)), std::istreambuf_iterator<char>());
- 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<std::string> &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<MessageData> &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<int, std::string> &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<DIR, DirCloser> 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<std::string> GetFileNamesInDirectory(const std::string &directory)
+ {
+ std::vector<std::string> 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<std::string> &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<MessageData> MessageModel::LoadMessageData()
+ {
+ std::vector<MessageData> MessageVector; // 返回的数据列表
+ std::vector<std::string> 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<char>(file)), std::istreambuf_iterator<char>());
+ 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<MessageData> 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<char>(file)), std::istreambuf_iterator<char>());
- 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<char>(file)), std::istreambuf_iterator<char>());
- 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<MessageData> 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<char>(file)), std::istreambuf_iterator<char>());
+ 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<char>(file)), std::istreambuf_iterator<char>());
+ 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