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