1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "input_parse.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include <sstream> 19c29fa5a6Sopenharmony_ci 20c29fa5a6Sopenharmony_ci#include "cJSON.h" 21c29fa5a6Sopenharmony_ci#include "define_multimodal.h" 22c29fa5a6Sopenharmony_ci 23c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG 24c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "GetDeviceNode" 25c29fa5a6Sopenharmony_ci 26c29fa5a6Sopenharmony_cinamespace OHOS { 27c29fa5a6Sopenharmony_cinamespace MMI { 28c29fa5a6Sopenharmony_cinamespace { 29c29fa5a6Sopenharmony_cistruct JsonParser { 30c29fa5a6Sopenharmony_ci JsonParser() = default; 31c29fa5a6Sopenharmony_ci ~JsonParser() 32c29fa5a6Sopenharmony_ci { 33c29fa5a6Sopenharmony_ci if (json_ != nullptr) { 34c29fa5a6Sopenharmony_ci cJSON_Delete(json_); 35c29fa5a6Sopenharmony_ci } 36c29fa5a6Sopenharmony_ci } 37c29fa5a6Sopenharmony_ci operator cJSON *() 38c29fa5a6Sopenharmony_ci { 39c29fa5a6Sopenharmony_ci return json_; 40c29fa5a6Sopenharmony_ci } 41c29fa5a6Sopenharmony_ci cJSON *json_ { nullptr }; 42c29fa5a6Sopenharmony_ci}; 43c29fa5a6Sopenharmony_ci 44c29fa5a6Sopenharmony_civoid GetJsonData(cJSON *json, const std::string &key, std::string &val) 45c29fa5a6Sopenharmony_ci{ 46c29fa5a6Sopenharmony_ci if (!cJSON_IsObject(json)) { 47c29fa5a6Sopenharmony_ci MMI_HILOGE("The json is not object"); 48c29fa5a6Sopenharmony_ci return; 49c29fa5a6Sopenharmony_ci } 50c29fa5a6Sopenharmony_ci if (cJSON_HasObjectItem(json, key.c_str())) { 51c29fa5a6Sopenharmony_ci cJSON* rawValue = cJSON_GetObjectItem(json, key.c_str()); 52c29fa5a6Sopenharmony_ci if (cJSON_IsString(rawValue)) { 53c29fa5a6Sopenharmony_ci val = rawValue->valuestring; 54c29fa5a6Sopenharmony_ci } 55c29fa5a6Sopenharmony_ci } 56c29fa5a6Sopenharmony_ci return; 57c29fa5a6Sopenharmony_ci} 58c29fa5a6Sopenharmony_ci 59c29fa5a6Sopenharmony_citemplate <class T> 60c29fa5a6Sopenharmony_civoid GetJsonData(cJSON *json, const std::string &key, T &val) 61c29fa5a6Sopenharmony_ci{ 62c29fa5a6Sopenharmony_ci if (!cJSON_IsObject(json)) { 63c29fa5a6Sopenharmony_ci MMI_HILOGE("The json is not object"); 64c29fa5a6Sopenharmony_ci return; 65c29fa5a6Sopenharmony_ci } 66c29fa5a6Sopenharmony_ci if (cJSON_HasObjectItem(json, key.c_str())) { 67c29fa5a6Sopenharmony_ci cJSON* rawNum = cJSON_GetObjectItem(json, key.c_str()); 68c29fa5a6Sopenharmony_ci if (cJSON_IsNumber(rawNum)) { 69c29fa5a6Sopenharmony_ci val = rawNum->valueint; 70c29fa5a6Sopenharmony_ci } 71c29fa5a6Sopenharmony_ci } 72c29fa5a6Sopenharmony_ci return; 73c29fa5a6Sopenharmony_ci} 74c29fa5a6Sopenharmony_ci 75c29fa5a6Sopenharmony_civoid GetJsonData(cJSON *json, const std::string& key, std::vector<int32_t>& vals) 76c29fa5a6Sopenharmony_ci{ 77c29fa5a6Sopenharmony_ci if (!cJSON_IsObject(json)) { 78c29fa5a6Sopenharmony_ci MMI_HILOGE("The json is not object"); 79c29fa5a6Sopenharmony_ci return; 80c29fa5a6Sopenharmony_ci } 81c29fa5a6Sopenharmony_ci if (!cJSON_HasObjectItem(json, key.c_str())) { 82c29fa5a6Sopenharmony_ci MMI_HILOGE("The json is not data:%{public}s", key.c_str()); 83c29fa5a6Sopenharmony_ci return; 84c29fa5a6Sopenharmony_ci } 85c29fa5a6Sopenharmony_ci cJSON* rawVal = cJSON_GetObjectItem(json, key.c_str()); 86c29fa5a6Sopenharmony_ci if (!cJSON_IsArray(rawVal)) { 87c29fa5a6Sopenharmony_ci MMI_HILOGE("The rawVal is not Array"); 88c29fa5a6Sopenharmony_ci return; 89c29fa5a6Sopenharmony_ci } 90c29fa5a6Sopenharmony_ci int32_t rawValSize = cJSON_GetArraySize(rawVal); 91c29fa5a6Sopenharmony_ci for (int32_t i = 0; i < rawValSize; ++i) { 92c29fa5a6Sopenharmony_ci cJSON* val = cJSON_GetArrayItem(rawVal, i); 93c29fa5a6Sopenharmony_ci if (cJSON_IsNumber(val)) { 94c29fa5a6Sopenharmony_ci vals.push_back(val->valueint); 95c29fa5a6Sopenharmony_ci } 96c29fa5a6Sopenharmony_ci } 97c29fa5a6Sopenharmony_ci return; 98c29fa5a6Sopenharmony_ci} 99c29fa5a6Sopenharmony_ci 100c29fa5a6Sopenharmony_cibool ParseEvents(cJSON* eventInfo, DeviceEvent& event) 101c29fa5a6Sopenharmony_ci{ 102c29fa5a6Sopenharmony_ci if (!cJSON_IsArray(eventInfo)) { 103c29fa5a6Sopenharmony_ci MMI_HILOGE("The eventInfo is not array"); 104c29fa5a6Sopenharmony_ci return false; 105c29fa5a6Sopenharmony_ci } 106c29fa5a6Sopenharmony_ci int32_t eventSize = cJSON_GetArraySize(eventInfo); 107c29fa5a6Sopenharmony_ci for (int32_t i = 0; i < eventSize; ++i) { 108c29fa5a6Sopenharmony_ci cJSON* eventArray = cJSON_GetArrayItem(eventInfo, i); 109c29fa5a6Sopenharmony_ci if (cJSON_IsArray(eventArray)) { 110c29fa5a6Sopenharmony_ci cJSON* xPos = cJSON_GetArrayItem(eventArray, 0); 111c29fa5a6Sopenharmony_ci if (!cJSON_IsNumber(xPos)) { 112c29fa5a6Sopenharmony_ci MMI_HILOGE("The xPos is not number"); 113c29fa5a6Sopenharmony_ci return false; 114c29fa5a6Sopenharmony_ci } 115c29fa5a6Sopenharmony_ci Pos pos; 116c29fa5a6Sopenharmony_ci pos.xPos = xPos->valueint; 117c29fa5a6Sopenharmony_ci cJSON* yPos = cJSON_GetArrayItem(eventArray, 1); 118c29fa5a6Sopenharmony_ci if (!cJSON_IsNumber(yPos)) { 119c29fa5a6Sopenharmony_ci MMI_HILOGE("The yPos is not number"); 120c29fa5a6Sopenharmony_ci return false; 121c29fa5a6Sopenharmony_ci } 122c29fa5a6Sopenharmony_ci pos.yPos = yPos->valueint; 123c29fa5a6Sopenharmony_ci event.posXY.push_back(pos); 124c29fa5a6Sopenharmony_ci } 125c29fa5a6Sopenharmony_ci } 126c29fa5a6Sopenharmony_ci return true; 127c29fa5a6Sopenharmony_ci} 128c29fa5a6Sopenharmony_ci 129c29fa5a6Sopenharmony_civoid ParseEventsObj(cJSON* eventInfo, DeviceEvent& event) 130c29fa5a6Sopenharmony_ci{ 131c29fa5a6Sopenharmony_ci if (!cJSON_IsObject(eventInfo)) { 132c29fa5a6Sopenharmony_ci MMI_HILOGE("The eventInfo is not object"); 133c29fa5a6Sopenharmony_ci return; 134c29fa5a6Sopenharmony_ci } 135c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "eventType", event.eventType); 136c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "event", event.event); 137c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "keyValue", event.keyValue); 138c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "blockTime", event.blockTime); 139c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "ringEvents", event.ringEvents); 140c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "direction", event.direction); 141c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "distance", event.distance); 142c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "xPos", event.xPos); 143c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "yPos", event.yPos); 144c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "tiltX", event.tiltX); 145c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "tiltY", event.tiltY); 146c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "pressure", event.pressure); 147c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "trackingId", event.trackingId); 148c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "reportType", event.reportType); 149c29fa5a6Sopenharmony_ci GetJsonData(eventInfo, "keyStatus", event.keyStatus); 150c29fa5a6Sopenharmony_ci return; 151c29fa5a6Sopenharmony_ci} 152c29fa5a6Sopenharmony_ci 153c29fa5a6Sopenharmony_cibool ParseData(cJSON* events, std::vector<DeviceEvent>& eventData) 154c29fa5a6Sopenharmony_ci{ 155c29fa5a6Sopenharmony_ci if (!cJSON_IsArray(events)) { 156c29fa5a6Sopenharmony_ci MMI_HILOGE("The events is not array"); 157c29fa5a6Sopenharmony_ci return false; 158c29fa5a6Sopenharmony_ci } 159c29fa5a6Sopenharmony_ci int32_t eventsSize = cJSON_GetArraySize(events); 160c29fa5a6Sopenharmony_ci for (int32_t i = 0; i < eventsSize; ++i) { 161c29fa5a6Sopenharmony_ci cJSON* eventInfo = cJSON_GetArrayItem(events, i); 162c29fa5a6Sopenharmony_ci DeviceEvent event; 163c29fa5a6Sopenharmony_ci if (cJSON_IsArray(eventInfo)) { 164c29fa5a6Sopenharmony_ci if (!ParseEvents(eventInfo, event)) { 165c29fa5a6Sopenharmony_ci MMI_HILOGE("Failed to parse events"); 166c29fa5a6Sopenharmony_ci return false; 167c29fa5a6Sopenharmony_ci } 168c29fa5a6Sopenharmony_ci } else if (cJSON_IsObject(eventInfo)) { 169c29fa5a6Sopenharmony_ci ParseEventsObj(eventInfo, event); 170c29fa5a6Sopenharmony_ci } else { 171c29fa5a6Sopenharmony_ci MMI_HILOGE("Events is error"); 172c29fa5a6Sopenharmony_ci return false; 173c29fa5a6Sopenharmony_ci } 174c29fa5a6Sopenharmony_ci eventData.push_back(event); 175c29fa5a6Sopenharmony_ci } 176c29fa5a6Sopenharmony_ci return true; 177c29fa5a6Sopenharmony_ci} 178c29fa5a6Sopenharmony_ci} // namespace 179c29fa5a6Sopenharmony_ci 180c29fa5a6Sopenharmony_cistd::string Pos::ToString() const 181c29fa5a6Sopenharmony_ci{ 182c29fa5a6Sopenharmony_ci std::ostringstream ss; 183c29fa5a6Sopenharmony_ci ss << "pos(" << xPos << "," << yPos << ")"; 184c29fa5a6Sopenharmony_ci return ss.str(); 185c29fa5a6Sopenharmony_ci} 186c29fa5a6Sopenharmony_ci 187c29fa5a6Sopenharmony_cistd::string DeviceEvent::ToString() const 188c29fa5a6Sopenharmony_ci{ 189c29fa5a6Sopenharmony_ci std::ostringstream ss; 190c29fa5a6Sopenharmony_ci ss << "{eventType:" << eventType 191c29fa5a6Sopenharmony_ci << ",event:["; 192c29fa5a6Sopenharmony_ci for (const auto &item : event) { 193c29fa5a6Sopenharmony_ci ss << item << ","; 194c29fa5a6Sopenharmony_ci } 195c29fa5a6Sopenharmony_ci ss << "],keyValue:" << keyValue 196c29fa5a6Sopenharmony_ci << ",blockTime:" << blockTime 197c29fa5a6Sopenharmony_ci << ",ringEvents:["; 198c29fa5a6Sopenharmony_ci for (const auto &item : ringEvents) { 199c29fa5a6Sopenharmony_ci ss << item << ","; 200c29fa5a6Sopenharmony_ci } 201c29fa5a6Sopenharmony_ci ss << "],direction:" << direction 202c29fa5a6Sopenharmony_ci << ",distance:" << distance 203c29fa5a6Sopenharmony_ci << ",xPos:" << xPos 204c29fa5a6Sopenharmony_ci << ",yPos:" << yPos 205c29fa5a6Sopenharmony_ci << ",tiltX:" << tiltX 206c29fa5a6Sopenharmony_ci << ",tiltY:" << tiltY 207c29fa5a6Sopenharmony_ci << ",pressure:" << pressure 208c29fa5a6Sopenharmony_ci << ",trackingId:" << trackingId 209c29fa5a6Sopenharmony_ci << ",reportType:" << reportType 210c29fa5a6Sopenharmony_ci << ",keyStatus:" << keyStatus 211c29fa5a6Sopenharmony_ci << ",posXY:"; 212c29fa5a6Sopenharmony_ci for (const auto &item : posXY) { 213c29fa5a6Sopenharmony_ci ss << item.ToString() << ","; 214c29fa5a6Sopenharmony_ci } 215c29fa5a6Sopenharmony_ci ss << "}" << std::endl; 216c29fa5a6Sopenharmony_ci return ss.str(); 217c29fa5a6Sopenharmony_ci} 218c29fa5a6Sopenharmony_ci 219c29fa5a6Sopenharmony_cistd::string DeviceItem::ToString() const 220c29fa5a6Sopenharmony_ci{ 221c29fa5a6Sopenharmony_ci std::ostringstream ss; 222c29fa5a6Sopenharmony_ci ss << "{deviceName:" << deviceName 223c29fa5a6Sopenharmony_ci << ",deviceIndex:" << deviceIndex 224c29fa5a6Sopenharmony_ci << ",events:["; 225c29fa5a6Sopenharmony_ci for (const auto &item : events) { 226c29fa5a6Sopenharmony_ci ss << item.ToString() << ","; 227c29fa5a6Sopenharmony_ci } 228c29fa5a6Sopenharmony_ci ss << "]" << std::endl; 229c29fa5a6Sopenharmony_ci return ss.str(); 230c29fa5a6Sopenharmony_ci} 231c29fa5a6Sopenharmony_ci 232c29fa5a6Sopenharmony_ciDeviceItems DataInit(const std::string& fileData, bool logStatus) 233c29fa5a6Sopenharmony_ci{ 234c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 235c29fa5a6Sopenharmony_ci JsonParser parser; 236c29fa5a6Sopenharmony_ci parser.json_ = cJSON_Parse(fileData.c_str()); 237c29fa5a6Sopenharmony_ci if (!cJSON_IsArray(parser.json_)) { 238c29fa5a6Sopenharmony_ci MMI_HILOGE("The parser is not array"); 239c29fa5a6Sopenharmony_ci return {}; 240c29fa5a6Sopenharmony_ci } 241c29fa5a6Sopenharmony_ci int32_t arraysSize = cJSON_GetArraySize(parser.json_); 242c29fa5a6Sopenharmony_ci DeviceItems deviceItems; 243c29fa5a6Sopenharmony_ci for (int32_t i = 0; i < arraysSize; ++i) { 244c29fa5a6Sopenharmony_ci cJSON* deviceInfo = cJSON_GetArrayItem(parser.json_, i); 245c29fa5a6Sopenharmony_ci if (!cJSON_IsObject(deviceInfo)) { 246c29fa5a6Sopenharmony_ci MMI_HILOGE("The deviceInfo is not Object"); 247c29fa5a6Sopenharmony_ci return {}; 248c29fa5a6Sopenharmony_ci } 249c29fa5a6Sopenharmony_ci cJSON* deviceName = cJSON_GetObjectItem(deviceInfo, "deviceName"); 250c29fa5a6Sopenharmony_ci if (!cJSON_IsString(deviceName)) { 251c29fa5a6Sopenharmony_ci MMI_HILOGE("The deviceName is not string"); 252c29fa5a6Sopenharmony_ci return {}; 253c29fa5a6Sopenharmony_ci } 254c29fa5a6Sopenharmony_ci DeviceItem deviceItem; 255c29fa5a6Sopenharmony_ci deviceItem.deviceName = deviceName->valuestring; 256c29fa5a6Sopenharmony_ci GetJsonData(deviceInfo, "deviceIndex", deviceItem.deviceIndex); 257c29fa5a6Sopenharmony_ci cJSON *events = nullptr; 258c29fa5a6Sopenharmony_ci if (cJSON_HasObjectItem(deviceInfo, "events")) { 259c29fa5a6Sopenharmony_ci events = cJSON_GetObjectItem(deviceInfo, "events"); 260c29fa5a6Sopenharmony_ci } else if (cJSON_HasObjectItem(deviceInfo, "singleEvent")) { 261c29fa5a6Sopenharmony_ci events = cJSON_GetObjectItem(deviceInfo, "singleEvent"); 262c29fa5a6Sopenharmony_ci } 263c29fa5a6Sopenharmony_ci if (!cJSON_IsArray(events)) { 264c29fa5a6Sopenharmony_ci MMI_HILOGE("The events is not array"); 265c29fa5a6Sopenharmony_ci return {}; 266c29fa5a6Sopenharmony_ci } 267c29fa5a6Sopenharmony_ci if (!ParseData(events, deviceItem.events)) { 268c29fa5a6Sopenharmony_ci MMI_HILOGE("Failed to parse data"); 269c29fa5a6Sopenharmony_ci return {}; 270c29fa5a6Sopenharmony_ci } 271c29fa5a6Sopenharmony_ci deviceItems.push_back(deviceItem); 272c29fa5a6Sopenharmony_ci if (logStatus) { 273c29fa5a6Sopenharmony_ci MMI_HILOGW("deviceItem[%{public}d]:%{public}s", i, deviceItem.ToString().c_str()); 274c29fa5a6Sopenharmony_ci } 275c29fa5a6Sopenharmony_ci } 276c29fa5a6Sopenharmony_ci return deviceItems; 277c29fa5a6Sopenharmony_ci} 278c29fa5a6Sopenharmony_ci} // namespace MMI 279c29fa5a6Sopenharmony_ci} // namespace OHOS