• 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 "unified_data_helper.h"
28 #include "unified_html_record_process.h"
29 
30 namespace OHOS {
31 namespace UDMF {
32 constexpr const char *TAG = "UdmfClient::";
33 using namespace OHOS::DistributedDataDfx;
34 using namespace RadarReporter;
GetInstance()35 UdmfClient &UdmfClient::GetInstance()
36 {
37     static UdmfClient instance;
38     return instance;
39 }
40 
SetData(CustomOption & option,UnifiedData & unifiedData,std::string & key)41 Status UdmfClient::SetData(CustomOption &option, UnifiedData &unifiedData, std::string &key)
42 {
43     DdsTrace trace(
44         std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
45     RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
46         BizScene::SET_DATA, SetDataStage::SET_DATA_BEGIN, StageRes::IDLE, BizState::DFX_BEGIN);
47     auto service = UdmfServiceClient::GetInstance();
48     if (service == nullptr) {
49         LOG_ERROR(UDMF_CLIENT, "Service unavailable");
50         RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
51             BizScene::SET_DATA, SetDataStage::SET_DATA_BEGIN, StageRes::FAILED, E_IPC, BizState::DFX_END);
52         return E_IPC;
53     }
54     RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
55         BizScene::SET_DATA, SetDataStage::SET_DATA_BEGIN, StageRes::SUCCESS);
56     if (option.intention == UD_INTENTION_DRAG) {
57         ShareOptions shareOption = SHARE_OPTIONS_BUTT;
58         auto status = GetAppShareOption(UD_INTENTION_MAP.at(option.intention), shareOption);
59         if (status != E_NOT_FOUND && status != E_OK) {
60             RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
61                 BizScene::SET_DATA, SetDataStage::SET_DATA_END, StageRes::FAILED, status, BizState::DFX_END);
62             LOG_ERROR(UDMF_CLIENT, "get appShareOption fail, intention:%{public}s",
63                       UD_INTENTION_MAP.at(option.intention).c_str());
64             return static_cast<Status>(status);
65         }
66         if (shareOption == ShareOptions::IN_APP) {
67             std::string bundleName = "udmf.inapp.data";
68             UnifiedKey udKey = UnifiedKey(UD_INTENTION_MAP.at(option.intention), bundleName, UTILS::GenerateId());
69             key = udKey.GetUnifiedKey();
70             dataCache_.Clear();
71             dataCache_.Insert(key, unifiedData);
72             LOG_INFO(UDMF_CLIENT, "SetData in app success, bundleName:%{public}s.", bundleName.c_str());
73             RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
74                 BizScene::SET_DATA, SetDataStage::SET_DATA_END, StageRes::SUCCESS, BizState::DFX_END);
75             return E_OK;
76         }
77         if (unifiedData.HasType(UtdUtils::GetUtdIdFromUtdEnum(UDType::HTML))) {
78             UnifiedHtmlRecordProcess::GetUriFromHtmlRecord(unifiedData);
79         }
80     }
81     int32_t ret = service->SetData(option, unifiedData, key);
82     if (ret != E_OK) {
83         RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
84             BizScene::SET_DATA, SetDataStage::SET_DATA_END, StageRes::FAILED, ret, BizState::DFX_END);
85         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
86         return static_cast<Status>(ret);
87     }
88     RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
89         BizScene::SET_DATA, SetDataStage::SET_DATA_END, StageRes::SUCCESS, BizState::DFX_END);
90     return E_OK;
91 }
92 
GetData(const QueryOption & query,UnifiedData & unifiedData)93 Status UdmfClient::GetData(const QueryOption &query, UnifiedData &unifiedData)
94 {
95     DdsTrace trace(
96         std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
97     RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
98         BizScene::GET_DATA, GetDataStage::GET_DATA_BEGIN, StageRes::IDLE, BizState::DFX_BEGIN);
99     auto service = UdmfServiceClient::GetInstance();
100     if (service == nullptr) {
101         LOG_ERROR(UDMF_CLIENT, "Service unavailable");
102         RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
103             BizScene::GET_DATA, GetDataStage::GET_DATA_BEGIN, StageRes::FAILED, E_IPC, BizState::DFX_END);
104         return E_IPC;
105     }
106     RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
107         BizScene::GET_DATA, GetDataStage::GET_DATA_BEGIN, StageRes::SUCCESS);
108     if (GetDataFromCache(query, unifiedData) == E_OK) {
109         RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
110             BizScene::GET_DATA, GetDataStage::GET_DATA_END, StageRes::SUCCESS, BizState::DFX_END);
111         return E_OK;
112     }
113     LOG_INFO(UDMF_CLIENT, "Data not found in cache. key = %{public}s", query.key.c_str());
114     int32_t ret = service->GetData(query, unifiedData);
115     if (ret != E_OK) {
116         RadarReporterAdapter::ReportFail(std::string(__FUNCTION__),
117             BizScene::GET_DATA, GetDataStage::GET_DATA_END, StageRes::FAILED, ret, BizState::DFX_END);
118         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
119         return static_cast<Status>(ret);
120     }
121     if (unifiedData.HasType(UtdUtils::GetUtdIdFromUtdEnum(UDType::HTML))) {
122         UnifiedHtmlRecordProcess::RebuildHtmlRecord(unifiedData);
123     }
124     RadarReporterAdapter::ReportNormal(std::string(__FUNCTION__),
125         BizScene::GET_DATA, GetDataStage::GET_DATA_END, StageRes::SUCCESS, BizState::DFX_END);
126     return E_OK;
127 }
128 
GetBatchData(const QueryOption & query,std::vector<UnifiedData> & unifiedDataSet)129 Status UdmfClient::GetBatchData(const QueryOption &query, std::vector<UnifiedData> &unifiedDataSet)
130 {
131     DdsTrace trace(
132         std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
133     auto service = UdmfServiceClient::GetInstance();
134     if (service == nullptr) {
135         LOG_ERROR(UDMF_CLIENT, "Service unavailable");
136         return E_IPC;
137     }
138     int32_t ret = service->GetBatchData(query, unifiedDataSet);
139     if (ret != E_OK) {
140         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
141     }
142     for (auto &data : unifiedDataSet) {
143         data.ClearUriInfo();
144     }
145     return static_cast<Status>(ret);
146 }
147 
UpdateData(const QueryOption & query,UnifiedData & unifiedData)148 Status UdmfClient::UpdateData(const QueryOption &query, UnifiedData &unifiedData)
149 {
150     DdsTrace trace(
151         std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
152     auto service = UdmfServiceClient::GetInstance();
153     if (service == nullptr) {
154         LOG_ERROR(UDMF_CLIENT, "Service unavailable");
155         return E_IPC;
156     }
157     int32_t ret = service->UpdateData(query, unifiedData);
158     if (ret != E_OK) {
159         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
160     }
161     return static_cast<Status>(ret);
162 }
163 
DeleteData(const QueryOption & query,std::vector<UnifiedData> & unifiedDataSet)164 Status UdmfClient::DeleteData(const QueryOption &query, std::vector<UnifiedData> &unifiedDataSet)
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->DeleteData(query, unifiedDataSet);
174     if (ret != E_OK) {
175         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
176     }
177     return static_cast<Status>(ret);
178 }
179 
GetSummary(const QueryOption & query,Summary & summary)180 Status UdmfClient::GetSummary(const QueryOption &query, Summary &summary)
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     auto it = dataCache_.Find(query.key);
190     if (it.first) {
191         UdmfConversion::InitValueObject(it.second);
192         UnifiedDataHelper::GetSummary(it.second, summary);
193         LOG_INFO(UDMF_CLIENT, "GetSummary in cache! key = %{public}s", query.key.c_str());
194         return E_OK;
195     }
196 
197     int32_t ret = service->GetSummary(query, summary);
198     if (ret != E_OK) {
199         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
200     }
201     return static_cast<Status>(ret);
202 }
203 
AddPrivilege(const QueryOption & query,Privilege & privilege)204 Status UdmfClient::AddPrivilege(const QueryOption &query, Privilege &privilege)
205 {
206     DdsTrace trace(
207         std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
208     auto service = UdmfServiceClient::GetInstance();
209     if (service == nullptr) {
210         LOG_ERROR(UDMF_CLIENT, "Service unavailable");
211         return E_IPC;
212     }
213     int32_t ret = service->AddPrivilege(query, privilege);
214     if (ret != E_OK) {
215         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
216     }
217     return static_cast<Status>(ret);
218 }
219 
Sync(const QueryOption & query,const std::vector<std::string> & devices)220 Status UdmfClient::Sync(const QueryOption &query, const std::vector<std::string> &devices)
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->Sync(query, devices);
230     if (ret != E_OK) {
231         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
232     }
233     return static_cast<Status>(ret);
234 }
235 
IsRemoteData(const QueryOption & query,bool & result)236 Status UdmfClient::IsRemoteData(const QueryOption &query, bool &result)
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->IsRemoteData(query, result);
246     if (ret != E_OK) {
247         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
248     }
249     return static_cast<Status>(ret);
250 }
251 
SetAppShareOption(const std::string & intention,enum ShareOptions shareOption)252 Status UdmfClient::SetAppShareOption(const std::string &intention, enum ShareOptions shareOption)
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->SetAppShareOption(intention, shareOption);
262     if (ret != E_OK) {
263         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
264     }
265     return static_cast<Status>(ret);
266 }
267 
GetAppShareOption(const std::string & intention,enum ShareOptions & shareOption)268 Status UdmfClient::GetAppShareOption(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 shareOptionRet = SHARE_OPTIONS_BUTT;
278     int32_t ret = service->GetAppShareOption(intention, shareOptionRet);
279     if (ShareOptionsUtil::IsValid(shareOptionRet)) {
280         shareOption = static_cast<ShareOptions>(shareOptionRet);
281     }
282     if (ret != E_OK) {
283         LOG_INFO(UDMF_CLIENT, "No share option was obtained, ret = %{public}d", ret);
284     }
285     return static_cast<Status>(ret);
286 }
287 
288 
RemoveAppShareOption(const std::string & intention)289 Status UdmfClient::RemoveAppShareOption(const std::string &intention)
290 {
291     DdsTrace trace(
292         std::string(TAG) + std::string(__FUNCTION__), TraceSwitch::BYTRACE_ON | TraceSwitch::TRACE_CHAIN_ON);
293     auto service = UdmfServiceClient::GetInstance();
294     if (service == nullptr) {
295         LOG_ERROR(UDMF_CLIENT, "Service unavailable");
296         return E_IPC;
297     }
298     int32_t ret = service->RemoveAppShareOption(intention);
299     if (ret != E_OK) {
300         LOG_ERROR(UDMF_CLIENT, "failed! ret = %{public}d", ret);
301     }
302     return static_cast<Status>(ret);
303 }
304 
GetSelfBundleName()305 std::string UdmfClient::GetSelfBundleName()
306 {
307     uint32_t tokenId = IPCSkeleton::GetSelfTokenID();
308     Security::AccessToken::HapTokenInfo hapInfo;
309     if (Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, hapInfo)
310         != Security::AccessToken::AccessTokenKitRet::RET_SUCCESS) {
311         return "";
312     }
313     return hapInfo.bundleName;
314 }
315 
GetDataFromCache(const QueryOption & query,UnifiedData & unifiedData)316 Status UdmfClient::GetDataFromCache(const QueryOption &query, UnifiedData &unifiedData)
317 {
318     auto it = dataCache_.Find(query.key);
319     if (it.first) {
320         unifiedData = it.second;
321         dataCache_.Erase(query.key);
322         return E_OK;
323     }
324     return E_NOT_FOUND;
325 }
326 
327 } // namespace UDMF
328 } // namespace OHOS