• 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 
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