1 /*
2 * Copyright (c) 2022 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 "discovery_filter.h"
17 #include "json_object.h"
18
19 namespace OHOS {
20 namespace DistributedHardware {
21 const std::string FILTERS_KEY = "filters";
22 const std::string FILTER_OP_KEY = "filter_op";
23 const std::string FILTERS_TYPE_OR = "OR";
24 const std::string FILTERS_TYPE_AND = "AND";
25 const int32_t DM_OK = 0;
26 const int32_t ERR_DM_INPUT_PARA_INVALID = 96929749;
27 enum class DmDiscoveryDeviceFilter : int32_t {
28 DM_INVALID_DEVICE = 0,
29 DM_VALID_DEVICE = 1,
30 DM_ALL_DEVICE = 2
31 };
32
ParseFilterJson(const std::string & str)33 int32_t DeviceFilterOption::ParseFilterJson(const std::string &str)
34 {
35 JsonObject jsonObject(str);
36 if (jsonObject.IsDiscarded()) {
37 LOGE("FilterOptions parse error.");
38 return ERR_DM_INPUT_PARA_INVALID;
39 }
40 if (!jsonObject.Contains(FILTERS_KEY) || !jsonObject[FILTERS_KEY].IsArray()) {
41 LOGE("Filters invalid.");
42 return ERR_DM_INPUT_PARA_INVALID;
43 }
44 std::vector<JsonItemObject> children = jsonObject[FILTERS_KEY].Items();
45 if (children.empty()) {
46 LOGE("Filters invalid.");
47 return ERR_DM_INPUT_PARA_INVALID;
48 }
49 if (jsonObject.Contains(FILTER_OP_KEY) && !jsonObject[FILTER_OP_KEY].IsString()) {
50 LOGE("Filters_op invalid.");
51 return ERR_DM_INPUT_PARA_INVALID;
52 }
53 if (!jsonObject.Contains(FILTER_OP_KEY)) {
54 filterOp_ = FILTERS_TYPE_OR; // filterOp optional, "OR" default
55 } else {
56 jsonObject[FILTER_OP_KEY].GetTo(filterOp_);
57 }
58
59 for (const auto &object : children) {
60 if (!object.Contains("type") || !object["type"].IsString()) {
61 LOGE("Filters type invalid");
62 return ERR_DM_INPUT_PARA_INVALID;
63 }
64 if (!object.Contains("value") || !object["value"].IsNumberInteger()) {
65 LOGE("Filters value invalid");
66 return ERR_DM_INPUT_PARA_INVALID;
67 }
68 DeviceFilters deviceFilters;
69 deviceFilters.type = object["type"].Get<std::string>();
70 deviceFilters.value = object["value"].Get<int32_t>();
71 filters_.push_back(deviceFilters);
72 }
73 return DM_OK;
74 }
75
ParseFilterOptionJson(const std::string & str)76 int32_t DeviceFilterOption::ParseFilterOptionJson(const std::string &str)
77 {
78 JsonObject object(str);
79 if (object.IsDiscarded()) {
80 LOGE("ParseFilterOptionJson parse error.");
81 return ERR_DM_INPUT_PARA_INVALID;
82 }
83 filterOp_ = FILTERS_TYPE_AND;
84 DeviceFilters deviceFilters;
85 if (object.Contains("credible") && object["credible"].IsNumberInteger()) {
86 deviceFilters.type = "credible";
87 deviceFilters.value = object["credible"].Get<int32_t>();
88 filters_.push_back(deviceFilters);
89 }
90 if (object.Contains("range") && object["range"].IsNumberInteger()) {
91 deviceFilters.type = "range";
92 deviceFilters.value = object["range"].Get<int32_t>();
93 filters_.push_back(deviceFilters);
94 }
95 if (object.Contains("isTrusted") && object["isTrusted"].IsNumberInteger()) {
96 deviceFilters.type = "isTrusted";
97 deviceFilters.value = object["isTrusted"].Get<int32_t>();
98 filters_.push_back(deviceFilters);
99 }
100 if (object.Contains("authForm") && object["authForm"].IsNumberInteger()) {
101 deviceFilters.type = "authForm";
102 deviceFilters.value = object["authForm"].Get<int32_t>();
103 filters_.push_back(deviceFilters);
104 }
105 if (object.Contains("deviceType") && object["deviceType"].IsNumberInteger()) {
106 deviceFilters.type = "deviceType";
107 deviceFilters.value = object["deviceType"].Get<int32_t>();
108 filters_.push_back(deviceFilters);
109 }
110 return DM_OK;
111 }
112
TransformToFilter(const std::string & filterOptions)113 int32_t DeviceFilterOption::TransformToFilter(const std::string &filterOptions)
114 {
115 if (filterOptions.empty()) {
116 LOGI("DeviceFilterOption::filterOptions empty");
117 filterOp_ = FILTERS_TYPE_OR;
118 DeviceFilters deviceFilters;
119 deviceFilters.type = "credible";
120 deviceFilters.value = static_cast<int32_t>(DmDiscoveryDeviceFilter::DM_INVALID_DEVICE);
121 filters_.push_back(deviceFilters);
122 return DM_OK;
123 }
124 return ParseFilterJson(filterOptions);
125 }
126
TransformFilterOption(const std::string & filterOptions)127 int32_t DeviceFilterOption::TransformFilterOption(const std::string &filterOptions)
128 {
129 if (filterOptions.empty()) {
130 LOGI("DeviceFilterOption::filterOptions empty");
131 filterOp_ = FILTERS_TYPE_OR;
132 DeviceFilters deviceFilters;
133 deviceFilters.type = "credible";
134 deviceFilters.value = static_cast<int32_t>(DmDiscoveryDeviceFilter::DM_INVALID_DEVICE);
135 filters_.push_back(deviceFilters);
136 return DM_OK;
137 }
138 return ParseFilterOptionJson(filterOptions);
139 }
140
FilterByDeviceState(int32_t value,bool isActive)141 bool DiscoveryFilter::FilterByDeviceState(int32_t value, bool isActive)
142 {
143 if (value == static_cast<int32_t>(DmDiscoveryDeviceFilter::DM_INVALID_DEVICE)) {
144 return !isActive;
145 }
146 if (value == static_cast<int32_t>(DmDiscoveryDeviceFilter::DM_VALID_DEVICE)) {
147 return isActive;
148 }
149 return (value == static_cast<int32_t>(DmDiscoveryDeviceFilter::DM_ALL_DEVICE));
150 }
151
FilterByRange(int32_t value,int32_t range)152 bool DiscoveryFilter::FilterByRange(int32_t value, int32_t range)
153 {
154 return ((range >= 0) && (range <= value));
155 }
156
FilterByDeviceType(int32_t value,int32_t deviceType)157 bool DiscoveryFilter::FilterByDeviceType(int32_t value, int32_t deviceType)
158 {
159 return (value == deviceType);
160 }
161
FilterByType(const DeviceFilters & filters,const DeviceFilterPara & filterPara)162 bool DiscoveryFilter::FilterByType(const DeviceFilters &filters, const DeviceFilterPara &filterPara)
163 {
164 if (filters.type == "credible") {
165 return FilterByDeviceState(filters.value, filterPara.isOnline);
166 }
167 if (filters.type == "range") {
168 return FilterByRange(filters.value, filterPara.range);
169 }
170 if (filters.type == "isTrusted") {
171 return FilterByDeviceState(filters.value, filterPara.isTrusted);
172 }
173 if (filters.type == "deviceType") {
174 return FilterByDeviceType(filters.value, filterPara.deviceType);
175 }
176 return false;
177 }
178
FilterOr(const std::vector<DeviceFilters> & filters,const DeviceFilterPara & filterPara)179 bool DiscoveryFilter::FilterOr(const std::vector<DeviceFilters> &filters, const DeviceFilterPara &filterPara)
180 {
181 for (auto &iter : filters) {
182 if (FilterByType(iter, filterPara) == true) {
183 return true;
184 }
185 }
186 return false;
187 }
188
FilterAnd(const std::vector<DeviceFilters> & filters,const DeviceFilterPara & filterPara)189 bool DiscoveryFilter::FilterAnd(const std::vector<DeviceFilters> &filters, const DeviceFilterPara &filterPara)
190 {
191 for (auto &iter : filters) {
192 if (FilterByType(iter, filterPara) == false) {
193 return false;
194 }
195 }
196 return true;
197 }
198
IsValidDevice(const std::string & filterOp,const std::vector<DeviceFilters> & filters,const DeviceFilterPara & filterPara)199 bool DiscoveryFilter::IsValidDevice(const std::string &filterOp, const std::vector<DeviceFilters> &filters,
200 const DeviceFilterPara &filterPara)
201 {
202 if (filterOp == FILTERS_TYPE_OR) {
203 return FilterOr(filters, filterPara);
204 }
205 if (filterOp == FILTERS_TYPE_AND) {
206 return FilterAnd(filters, filterPara);
207 }
208 return false;
209 }
210 } // namespace DistributedHardware
211 } // namespace OHOS