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