1 /*
2 * Copyright (c) 2023 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 #define LOG_TAG "UdmfClient"
16 #include "udmf_client.h"
17
18 #include "dds_trace.h"
19 #include "udmf_conversion.h"
20 #include "udmf_radar_reporter.h"
21
22 #include "logger.h"
23 #include "udmf_service_client.h"
24 #include "udmf_utils.h"
25 #include "accesstoken_kit.h"
26 #include "ipc_skeleton.h"
27 #include "udmf_notifier_stub.h"
28 #include "unified_data_helper.h"
29 #include "unified_html_record_process.h"
30 #include "utd_client.h"
31
32 namespace OHOS {
33 namespace UDMF {
34 constexpr const char *TAG = "UdmfClient::";
35 constexpr const char *BUNDLE_IN_APP = "udmf.inapp.data";
36 static constexpr int KEY_LEN = 32;
37 static constexpr int FILE_TYPES_MAX_SIZE = 1024;
38 static constexpr std::initializer_list<std::string_view> FILE_TOP_TYPES = { "general.file-uri", "general.file" };
39 static constexpr int WITH_SUMMARY_FORMAT_VER = 1;
40 using namespace OHOS::DistributedDataDfx;
41 using namespace RadarReporter;
GetInstance()42 UdmfClient &UdmfClient::GetInstance()
43 {
44 static UdmfClient instance;
45 return instance;
46 }
47
ProcessDragIfInApp(UnifiedData & unifiedData,std::string & intentionDrag,std::string & key)48 void UdmfClient::ProcessDragIfInApp(UnifiedData &unifiedData, std::string &intentionDrag, std::string &key)
49 {
50 std::string bundleName = BUNDLE_IN_APP;
51 UnifiedKey udKey = UnifiedKey(intentionDrag, bundleName, UTILS::GenerateId());
52 key = udKey.GetUnifiedKey();
53 dataCache_.Clear();
54 dataCache_.Insert(key, unifiedData);
55 LOG_INFO(UDMF_CLIENT, "SetData in app success, bundleName:%{public}s.", bundleName.c_str());
56 RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
57 BizScene::SET_DATA, SetDataStage::SET_DATA_END, StageRes::SUCCESS, BizState::DFX_END);
58 }
59
SetData(CustomOption & option,UnifiedData & unifiedData,std::string & key)60 Status UdmfClient::SetData(CustomOption &option, UnifiedData &unifiedData, std::string &key)
61 {
62 DdsTrace trace(
63 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
64 RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
65 BizScene::SET_DATA, SetDataStage::SET_DATA_BEGIN, StageRes::IDLE, BizState::DFX_BEGIN);
66 if (!UnifiedDataUtils::IsValidIntention(option.intention)) {
67 LOG_ERROR(UDMF_SERVICE, "Invalid intention");
68 return E_INVALID_PARAMETERS;
69 }
70 auto service = UdmfServiceClient::GetInstance();
71 if (service == nullptr) {
72 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
73 RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
74 BizScene::SET_DATA, SetDataStage::SET_DATA_BEGIN, StageRes::FAILED, E_IPC, BizState::DFX_END);
75 return E_IPC;
76 }
77 RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
78 BizScene::SET_DATA, SetDataStage::SET_DATA_BEGIN, StageRes::SUCCESS);
79 if (option.intention == UD_INTENTION_DRAG) {
80 ShareOptions shareOption = SHARE_OPTIONS_BUTT;
81 auto intentionDrag = UD_INTENTION_MAP.at(option.intention);
82 auto status = GetAppShareOption(intentionDrag, shareOption);
83 if (status != E_NOT_FOUND && status != E_OK) {
84 RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
85 BizScene::SET_DATA, SetDataStage::SET_DATA_END, StageRes::FAILED, status, BizState::DFX_END);
86 LOG_ERROR(UDMF_CLIENT, "get appShareOption fail, intention:%{public}s", intentionDrag.c_str());
87 return static_cast<Status>(status);
88 }
89 if (shareOption == ShareOptions::IN_APP) {
90 ProcessDragIfInApp(unifiedData, intentionDrag, key);
91 return E_OK;
92 }
93 if (unifiedData.HasType(UtdUtils::GetUtdIdFromUtdEnum(UDType::HTML))) {
94 UnifiedHtmlRecordProcess::GetUriFromHtmlRecord(unifiedData);
95 }
96 }
97 int32_t ret = service->SetData(option, unifiedData, key);
98 if (ret != E_OK) {
99 RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
100 BizScene::SET_DATA, SetDataStage::SET_DATA_END, StageRes::FAILED, ret, BizState::DFX_END);
101 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
102 return static_cast<Status>(ret);
103 }
104 RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
105 BizScene::SET_DATA, SetDataStage::SET_DATA_END, StageRes::SUCCESS, BizState::DFX_END);
106 return E_OK;
107 }
108
GetData(const QueryOption & query,UnifiedData & unifiedData)109 Status UdmfClient::GetData(const QueryOption &query, UnifiedData &unifiedData)
110 {
111 DdsTrace trace(
112 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
113 RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
114 BizScene::GET_DATA, GetDataStage::GET_DATA_BEGIN, StageRes::IDLE, BizState::DFX_BEGIN);
115 auto service = UdmfServiceClient::GetInstance();
116 if (service == nullptr) {
117 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
118 RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
119 BizScene::GET_DATA, GetDataStage::GET_DATA_BEGIN, StageRes::FAILED, E_IPC, BizState::DFX_END);
120 return E_IPC;
121 }
122 RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
123 BizScene::GET_DATA, GetDataStage::GET_DATA_BEGIN, StageRes::SUCCESS);
124 if (GetDataFromCache(query, unifiedData) == E_OK) {
125 RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
126 BizScene::GET_DATA, GetDataStage::GET_DATA_END, StageRes::SUCCESS, BizState::DFX_END);
127 return E_OK;
128 }
129 LOG_INFO(UDMF_CLIENT, "Data not found in cache. key = %{public}s", query.key.c_str());
130 int32_t ret = service->GetData(query, unifiedData);
131 if (ret != E_OK) {
132 RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
133 BizScene::GET_DATA, GetDataStage::GET_DATA_END, StageRes::FAILED, ret, BizState::DFX_END);
134 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
135 return static_cast<Status>(ret);
136 }
137 if (unifiedData.HasType(UtdUtils::GetUtdIdFromUtdEnum(UDType::HTML))) {
138 UnifiedHtmlRecordProcess::RebuildHtmlRecord(unifiedData);
139 }
140 RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
141 BizScene::GET_DATA, GetDataStage::GET_DATA_END, StageRes::SUCCESS, BizState::DFX_END);
142 return E_OK;
143 }
144
GetBatchData(const QueryOption & query,std::vector<UnifiedData> & unifiedDataSet)145 Status UdmfClient::GetBatchData(const QueryOption &query, std::vector<UnifiedData> &unifiedDataSet)
146 {
147 DdsTrace trace(
148 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
149 auto service = UdmfServiceClient::GetInstance();
150 if (service == nullptr) {
151 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
152 return E_IPC;
153 }
154 int32_t ret = service->GetBatchData(query, unifiedDataSet);
155 if (ret != E_OK) {
156 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
157 }
158 for (auto &data : unifiedDataSet) {
159 data.ClearUriInfo();
160 }
161 return static_cast<Status>(ret);
162 }
163
UpdateData(const QueryOption & query,UnifiedData & unifiedData)164 Status UdmfClient::UpdateData(const QueryOption &query, UnifiedData &unifiedData)
165 {
166 DdsTrace trace(
167 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
168 auto service = UdmfServiceClient::GetInstance();
169 if (service == nullptr) {
170 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
171 return E_IPC;
172 }
173 int32_t ret = service->UpdateData(query, unifiedData);
174 if (ret != E_OK) {
175 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
176 }
177 return static_cast<Status>(ret);
178 }
179
DeleteData(const QueryOption & query,std::vector<UnifiedData> & unifiedDataSet)180 Status UdmfClient::DeleteData(const QueryOption &query, std::vector<UnifiedData> &unifiedDataSet)
181 {
182 DdsTrace trace(
183 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
184 auto service = UdmfServiceClient::GetInstance();
185 if (service == nullptr) {
186 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
187 return E_IPC;
188 }
189 int32_t ret = service->DeleteData(query, unifiedDataSet);
190 if (ret != E_OK) {
191 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
192 }
193 return static_cast<Status>(ret);
194 }
195
GetSummary(const QueryOption & query,Summary & summary)196 Status UdmfClient::GetSummary(const QueryOption &query, Summary &summary)
197 {
198 DdsTrace trace(
199 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
200 auto service = UdmfServiceClient::GetInstance();
201 if (service == nullptr) {
202 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
203 return E_IPC;
204 }
205 auto it = dataCache_.Find(query.key);
206 if (it.first) {
207 UdmfConversion::InitValueObject(it.second);
208 UnifiedDataHelper::GetSummary(it.second, summary);
209 LOG_INFO(UDMF_CLIENT, "GetSummary in cache! key = %{public}s", query.key.c_str());
210 return E_OK;
211 }
212
213 int32_t ret = service->GetSummary(query, summary);
214 if (ret != E_OK) {
215 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
216 }
217 return static_cast<Status>(ret);
218 }
219
AddPrivilege(const QueryOption & query,Privilege & privilege)220 Status UdmfClient::AddPrivilege(const QueryOption &query, Privilege &privilege)
221 {
222 DdsTrace trace(
223 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
224 auto service = UdmfServiceClient::GetInstance();
225 if (service == nullptr) {
226 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
227 return E_IPC;
228 }
229 int32_t ret = service->AddPrivilege(query, privilege);
230 if (ret != E_OK) {
231 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
232 }
233 return static_cast<Status>(ret);
234 }
235
Sync(const QueryOption & query,const std::vector<std::string> & devices)236 Status UdmfClient::Sync(const QueryOption &query, const std::vector<std::string> &devices)
237 {
238 DdsTrace trace(
239 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
240 auto service = UdmfServiceClient::GetInstance();
241 if (service == nullptr) {
242 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
243 return E_IPC;
244 }
245 int32_t ret = service->Sync(query, devices);
246 if (ret != E_OK) {
247 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
248 }
249 return static_cast<Status>(ret);
250 }
251
IsRemoteData(const QueryOption & query,bool & result)252 Status UdmfClient::IsRemoteData(const QueryOption &query, bool &result)
253 {
254 DdsTrace trace(
255 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
256 auto service = UdmfServiceClient::GetInstance();
257 if (service == nullptr) {
258 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
259 return E_IPC;
260 }
261 int32_t ret = service->IsRemoteData(query, result);
262 if (ret != E_OK) {
263 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
264 }
265 return static_cast<Status>(ret);
266 }
267
SetAppShareOption(const std::string & intention,enum ShareOptions shareOption)268 Status UdmfClient::SetAppShareOption(const std::string &intention, enum ShareOptions shareOption)
269 {
270 DdsTrace trace(
271 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
272 auto service = UdmfServiceClient::GetInstance();
273 if (service == nullptr) {
274 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
275 return E_IPC;
276 }
277 int32_t ret = service->SetAppShareOption(intention, shareOption);
278 if (ret != E_OK) {
279 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
280 }
281 return static_cast<Status>(ret);
282 }
283
GetAppShareOption(const std::string & intention,enum ShareOptions & shareOption)284 Status UdmfClient::GetAppShareOption(const std::string &intention, enum ShareOptions &shareOption)
285 {
286 DdsTrace trace(
287 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
288 auto service = UdmfServiceClient::GetInstance();
289 if (service == nullptr) {
290 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
291 return E_IPC;
292 }
293 int32_t shareOptionRet = SHARE_OPTIONS_BUTT;
294 int32_t ret = service->GetAppShareOption(intention, shareOptionRet);
295 if (ShareOptionsUtil::IsValid(shareOptionRet)) {
296 shareOption = static_cast<ShareOptions>(shareOptionRet);
297 }
298 if (ret != E_OK) {
299 LOG_INFO(UDMF_CLIENT, "No share option was obtained, ret = %{public}d", ret);
300 }
301 return static_cast<Status>(ret);
302 }
303
304
RemoveAppShareOption(const std::string & intention)305 Status UdmfClient::RemoveAppShareOption(const std::string &intention)
306 {
307 DdsTrace trace(
308 std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
309 auto service = UdmfServiceClient::GetInstance();
310 if (service == nullptr) {
311 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
312 return E_IPC;
313 }
314 int32_t ret = service->RemoveAppShareOption(intention);
315 if (ret != E_OK) {
316 LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
317 }
318 return static_cast<Status>(ret);
319 }
320
GetSelfBundleName()321 std::string UdmfClient::GetSelfBundleName()
322 {
323 uint32_t tokenId = IPCSkeleton::GetSelfTokenID();
324 Security::AccessToken::HapTokenInfo hapInfo;
325 if (Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, hapInfo)
326 != Security::AccessToken::AccessTokenKitRet::RET_SUCCESS) {
327 return "";
328 }
329 return hapInfo.bundleName;
330 }
331
GetDataFromCache(const QueryOption & query,UnifiedData & unifiedData)332 Status UdmfClient::GetDataFromCache(const QueryOption &query, UnifiedData &unifiedData)
333 {
334 auto it = dataCache_.Find(query.key);
335 if (it.first) {
336 unifiedData = it.second;
337 dataCache_.Erase(query.key);
338 return E_OK;
339 }
340 return E_NOT_FOUND;
341 }
342
GetParentType(Summary & oldSummary,Summary & newSummary)343 Status UdmfClient::GetParentType(Summary &oldSummary, Summary &newSummary)
344 {
345 std::map<std::string, int64_t> tmpSummary;
346 for (const auto &[type, size] : oldSummary.summary) {
347 std::string fileType = UnifiedDataUtils::GetBelongsToFileType(type);
348 if (fileType.empty()) {
349 tmpSummary[type] = size;
350 continue;
351 }
352 if (tmpSummary.find(fileType) != tmpSummary.end()) {
353 tmpSummary[fileType] += size;
354 } else {
355 tmpSummary[fileType] = size;
356 }
357 }
358 newSummary.summary = std::move(tmpSummary);
359 newSummary.totalSize = oldSummary.totalSize;
360 return E_OK;
361 }
362
SetDelayInfo(const DataLoadParams & dataLoadParams,std::string & key)363 Status UdmfClient::SetDelayInfo(const DataLoadParams &dataLoadParams, std::string &key)
364 {
365 if (dataLoadParams.dataLoadInfo.sequenceKey.length() != KEY_LEN) {
366 LOG_ERROR(UDMF_CLIENT, "Invalid key=%{public}s", dataLoadParams.dataLoadInfo.sequenceKey.c_str());
367 return E_INVALID_PARAMETERS;
368 }
369 auto service = UdmfServiceClient::GetInstance();
370 if (service == nullptr) {
371 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
372 return E_IPC;
373 }
374 sptr<IRemoteObject> iUdmfNotifier = new (std::nothrow) UdmfNotifierClient(dataLoadParams.loadHandler);
375 if (iUdmfNotifier == nullptr) {
376 LOG_ERROR(UDMF_CLIENT, "IUdmfNotifier unavailable");
377 return E_IPC;
378 }
379 auto ret = service->SetDelayInfo(dataLoadParams.dataLoadInfo, iUdmfNotifier, key);
380 if (ret != E_OK) {
381 LOG_ERROR(UDMF_CLIENT, "Failed, ret = %{public}d, udkey = %{public}s.", ret, key.c_str());
382 }
383 return static_cast<Status>(ret);
384 }
385
PushDelayData(const std::string & key,UnifiedData & unifiedData)386 Status UdmfClient::PushDelayData(const std::string &key, UnifiedData &unifiedData)
387 {
388 if (key.empty()) {
389 LOG_ERROR(UDMF_CLIENT, "Empty key");
390 return E_INVALID_PARAMETERS;
391 }
392 auto service = UdmfServiceClient::GetInstance();
393 if (service == nullptr) {
394 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
395 return E_IPC;
396 }
397 auto status = service->PushDelayData(key, unifiedData);
398 if (status != E_OK) {
399 LOG_ERROR(UDMF_CLIENT, "Failed, ret = %{public}d", status);
400 }
401 return static_cast<Status>(status);
402 }
403
GetDataIfAvailable(const std::string & key,const DataLoadInfo & dataLoadInfo,sptr<IRemoteObject> iUdmfNotifier,std::shared_ptr<UnifiedData> unifiedData)404 Status UdmfClient::GetDataIfAvailable(const std::string &key, const DataLoadInfo &dataLoadInfo,
405 sptr<IRemoteObject> iUdmfNotifier, std::shared_ptr<UnifiedData> unifiedData)
406 {
407 if (key.empty() || iUdmfNotifier == nullptr) {
408 LOG_ERROR(UDMF_CLIENT, "Empty key or notifier");
409 return E_INVALID_PARAMETERS;
410 }
411 auto service = UdmfServiceClient::GetInstance();
412 if (service == nullptr) {
413 LOG_ERROR(UDMF_CLIENT, "Service unavailable");
414 return E_IPC;
415 }
416 int32_t ret = service->GetDataIfAvailable(key, dataLoadInfo, iUdmfNotifier, unifiedData);
417 if (ret != E_OK) {
418 LOG_ERROR(UDMF_CLIENT, "Failed! ret = %{public}d", ret);
419 return static_cast<Status>(ret);
420 }
421 return E_OK;
422 }
423
GetBundleNameByUdKey(const std::string & key)424 std::string UdmfClient::GetBundleNameByUdKey(const std::string &key)
425 {
426 UnifiedKey udkey(key);
427 if (!udkey.IsValid()) {
428 LOG_ERROR(UDMF_CLIENT, "IsValid udkey:%{public}s", key.c_str());
429 return "";
430 }
431 return udkey.bundleName;
432 }
433
IsAppropriateType(const Summary & summary,const std::vector<std::string> & allowTypes)434 bool UdmfClient::IsAppropriateType(const Summary &summary, const std::vector<std::string> &allowTypes)
435 {
436 for (const auto &allowType : allowTypes) {
437 if (summary.summary.find(allowType) != summary.summary.end()
438 || summary.specificSummary.find(allowType) != summary.specificSummary.end()) {
439 return true;
440 }
441 }
442 if (summary.version < WITH_SUMMARY_FORMAT_VER) {
443 return false;
444 }
445 // when the summary format version is greater than 0, we need to check the file type
446 return CheckFileUtdType(summary, allowTypes);
447 }
448
CheckFileUtdType(const Summary & summary,const std::vector<std::string> & allowTypes)449 bool UdmfClient::CheckFileUtdType(const Summary &summary, const std::vector<std::string> &allowTypes)
450 {
451 std::set<std::string> fileUtdTypes;
452 for (const auto &[type, formats] : summary.summaryFormat) {
453 if (!type.empty() && std::find(formats.begin(), formats.end(), Uds_Type::UDS_FILE_URI) != formats.end()) {
454 fileUtdTypes.emplace(type);
455 }
456 if (fileUtdTypes.size() > FILE_TYPES_MAX_SIZE) {
457 LOG_WARN(UDMF_CLIENT, "Exceeding the maximum size");
458 break;
459 }
460 }
461 for (const auto &type : allowTypes) {
462 if (std::find(FILE_TOP_TYPES.begin(), FILE_TOP_TYPES.end(), type) != FILE_TOP_TYPES.end()) {
463 // If the supported file type falls into, return true when the file is included
464 if (!fileUtdTypes.empty()) {
465 return true;
466 }
467 continue;
468 }
469 if (!UnifiedDataUtils::IsFilterFileType(type)) {
470 continue;
471 }
472 for (const auto &fileUtdType : fileUtdTypes) {
473 std::shared_ptr<TypeDescriptor> descriptor;
474 UtdClient::GetInstance().GetTypeDescriptor(fileUtdType, descriptor);
475 if (descriptor == nullptr) {
476 continue;
477 }
478 bool isSpecificType = false;
479 descriptor->BelongsTo(type, isSpecificType);
480 if (isSpecificType) {
481 return true;
482 }
483 }
484 }
485 LOG_INFO(UDMF_CLIENT, "Not appropriate type");
486 return false;
487 }
488 } // namespace UDMF
489 } // namespace OHOS