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