1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "fingerprint_policy_serializer.h"
17
18 #include "cJSON.h"
19 #include "cjson_check.h"
20
21 namespace OHOS {
22 namespace EDM {
23 const std::string TRUE_VALUE = "true";
Deserialize(const std::string & data,FingerprintPolicy & result)24 bool FingerprintPolicySerializer::Deserialize(const std::string &data, FingerprintPolicy &result)
25 {
26 cJSON* root = cJSON_Parse(data.c_str());
27 if (root == nullptr) {
28 return true;
29 }
30 if (cJSON_IsBool(root)) {
31 result.globalDisallow = cJSON_IsTrue(root);
32 cJSON_Delete(root);
33 return true;
34 }
35 cJSON* item;
36 cJSON_ArrayForEach(item, root) {
37 if (!cJSON_IsNumber(item)) {
38 continue;
39 }
40 result.accountIds.insert(item->valueint);
41 }
42 cJSON_Delete(root);
43 return true;
44 }
45
Serialize(const FingerprintPolicy & result,std::string & data)46 bool FingerprintPolicySerializer::Serialize(const FingerprintPolicy &result, std::string &data)
47 {
48 if (result.globalDisallow) {
49 data = TRUE_VALUE;
50 return true;
51 }
52 if (result.accountIds.empty()) {
53 return true;
54 }
55 cJSON* root = nullptr;
56 CJSON_CREATE_ARRAY_AND_CHECK(root, false);
57 for (auto& it : result.accountIds) {
58 cJSON* item = cJSON_CreateNumber(it);
59 cJSON_AddItemToArray(root, item);
60 }
61 char* jsonStr = cJSON_Print(root);
62 if (jsonStr == nullptr) {
63 cJSON_Delete(root);
64 return false;
65 }
66 data = std::string(jsonStr);
67 cJSON_free(jsonStr);
68 cJSON_Delete(root);
69 return true;
70 }
71
GetPolicy(MessageParcel & data,FingerprintPolicy & result)72 bool FingerprintPolicySerializer::GetPolicy(MessageParcel &data, FingerprintPolicy &result)
73 {
74 return true;
75 }
76
WritePolicy(MessageParcel & reply,FingerprintPolicy & result)77 bool FingerprintPolicySerializer::WritePolicy(MessageParcel &reply, FingerprintPolicy &result)
78 {
79 return true;
80 }
81
MergePolicy(std::vector<FingerprintPolicy> & data,FingerprintPolicy & result)82 bool FingerprintPolicySerializer::MergePolicy(std::vector<FingerprintPolicy> &data, FingerprintPolicy &result)
83 {
84 for (const auto &dataItem : data) {
85 result.globalDisallow = result.globalDisallow || dataItem.globalDisallow;
86 if (result.globalDisallow) {
87 result.accountIds.clear();
88 break;
89 }
90 for (auto accountId : dataItem.accountIds) {
91 result.accountIds.insert(accountId);
92 }
93 }
94 return true;
95 }
96 } // namespace EDM
97 } // namespace OHOS