• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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