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