1 /*
2 * Copyright (c) 2022 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 "UdmfServiceClient"
16 #include "udmf_service_client.h"
17
18 #include "iservice_registry.h"
19 #include "datamgr_service_proxy.h"
20 #include "system_ability_definition.h"
21 #include "udmf_utils.h"
22 #include "unified_data_helper.h"
23
24 #include "logger.h"
25
26 namespace OHOS {
27 namespace UDMF {
28 std::shared_ptr<UdmfServiceClient> UdmfServiceClient::instance_;
29 std::mutex UdmfServiceClient::mutex_;
30 sptr<DistributedKv::IKvStoreDataService> UdmfServiceClient::kvDataServiceProxy_;
31
UdmfServiceClient(const sptr<UdmfServiceProxy> & proxy)32 UdmfServiceClient::UdmfServiceClient(const sptr<UdmfServiceProxy> &proxy) : udmfProxy_(proxy)
33 {
34 LOG_INFO(UDMF_SERVICE, "construct");
35 }
36
GetInstance()37 std::shared_ptr<UdmfServiceClient> UdmfServiceClient::GetInstance()
38 {
39 std::lock_guard<decltype(mutex_)> lockGuard(mutex_);
40 if (instance_ != nullptr) {
41 return instance_;
42 }
43 sptr<DistributedKv::IKvStoreDataService> ability = GetDistributedKvDataService();
44 if (ability == nullptr) {
45 return nullptr;
46 }
47 sptr<IRemoteObject> service = ability->GetFeatureInterface("udmf");
48 if (service == nullptr) {
49 return nullptr;
50 }
51 sptr<UdmfServiceProxy> proxy = iface_cast<UdmfServiceProxy>(service);
52 if (proxy == nullptr) {
53 return nullptr;
54 }
55 instance_ = std::make_shared<UdmfServiceClient>(proxy);
56 return instance_;
57 }
58
GetDistributedKvDataService()59 sptr<DistributedKv::IKvStoreDataService> UdmfServiceClient::GetDistributedKvDataService()
60 {
61 if (kvDataServiceProxy_ != nullptr) {
62 return kvDataServiceProxy_;
63 }
64 LOG_INFO(UDMF_SERVICE, "create remote proxy.");
65 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
66 if (samgr == nullptr) {
67 LOG_ERROR(UDMF_SERVICE, "get samgr fail.");
68 return nullptr;
69 }
70
71 auto remote = samgr->CheckSystemAbility(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
72 kvDataServiceProxy_ = iface_cast<DistributedKv::DataMgrServiceProxy>(remote);
73 if (kvDataServiceProxy_ == nullptr) {
74 LOG_ERROR(UDMF_SERVICE, "initialize proxy failed.");
75 return nullptr;
76 }
77 sptr<UdmfServiceClient::ServiceDeathRecipient> deathRecipientPtr = new (std::nothrow)ServiceDeathRecipient();
78 if (deathRecipientPtr == nullptr) {
79 return nullptr;
80 }
81 if ((remote->IsProxyObject()) && (!remote->AddDeathRecipient(deathRecipientPtr))) {
82 LOG_ERROR(UDMF_SERVICE, "Add death recipient fail!");
83 }
84 return kvDataServiceProxy_;
85 }
86
ServiceDeathRecipient()87 UdmfServiceClient::ServiceDeathRecipient::ServiceDeathRecipient()
88 {
89 LOG_INFO(UDMF_SERVICE, "Construct!");
90 }
91
~ServiceDeathRecipient()92 UdmfServiceClient::ServiceDeathRecipient::~ServiceDeathRecipient()
93 {
94 LOG_INFO(UDMF_SERVICE, "Destruct!");
95 }
96
OnRemoteDied(const wptr<IRemoteObject> & remote)97 void UdmfServiceClient::ServiceDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
98 {
99 LOG_WARN(UDMF_SERVICE, "DistributedDataService die!");
100 std::lock_guard<decltype(mutex_)> lockGuard(mutex_);
101 kvDataServiceProxy_ = nullptr;
102 instance_ = nullptr;
103 }
104
SetData(CustomOption & option,UnifiedData & unifiedData,std::string & key)105 int32_t UdmfServiceClient::SetData(CustomOption &option, UnifiedData &unifiedData, std::string &key)
106 {
107 LOG_DEBUG(UDMF_SERVICE, "start, tag: %{public}d", option.intention);
108 if (!UnifiedDataUtils::IsValidIntention(option.intention)) {
109 LOG_ERROR(UDMF_SERVICE, "Invalid intention");
110 return E_INVALID_PARAMETERS;
111 }
112
113 if (!unifiedData.IsValid()) {
114 LOG_ERROR(UDMF_SERVICE, "UnifiedData is invalid.");
115 return E_INVALID_PARAMETERS;
116 }
117 bool isSaInvoke = UTILS::IsTokenNative();
118 if (isSaInvoke && unifiedData.HasFileType()) {
119 LOG_ERROR(UDMF_SERVICE, "The setting data initiated by the SA cannot contain the file type");
120 return E_INVALID_PARAMETERS;
121 }
122 if (UnifiedDataHelper::ExceedKVSizeLimit(unifiedData)) {
123 auto status = UnifiedDataHelper::ProcessBigData(unifiedData, option.intention, isSaInvoke);
124 if (status != E_OK) {
125 LOG_ERROR(UDMF_SERVICE, "Process big data error, status = %{public}d", status);
126 return status;
127 }
128 }
129 return udmfProxy_->SetData(option, unifiedData, key);
130 }
131
GetData(const QueryOption & query,UnifiedData & unifiedData)132 int32_t UdmfServiceClient::GetData(const QueryOption &query, UnifiedData &unifiedData)
133 {
134 LOG_DEBUG(UDMF_SERVICE, "start, tag: %{public}s", query.key.c_str());
135 UnifiedKey key(query.key);
136 if (!key.IsValid()) {
137 LOG_ERROR(UDMF_SERVICE, "invalid key");
138 return E_INVALID_PARAMETERS;
139 }
140
141 auto err = udmfProxy_->GetData(query, unifiedData);
142 if (err == E_OK) {
143 if (UnifiedDataHelper::IsTempUData(unifiedData)) {
144 if (!UnifiedDataHelper::Unpack(unifiedData)) {
145 LOG_ERROR(UDMF_SERVICE, "failed to unpack unified data");
146 return E_FS_ERROR;
147 }
148 }
149 }
150 return err;
151 }
152
GetBatchData(const QueryOption & query,std::vector<UnifiedData> & unifiedDataSet)153 int32_t UdmfServiceClient::GetBatchData(const QueryOption &query, std::vector<UnifiedData> &unifiedDataSet)
154 {
155 LOG_DEBUG(UDMF_SERVICE, "start, tag: intention = %{public}d, key = %{public}s", query.intention, query.key.c_str());
156 auto find = UD_INTENTION_MAP.find(query.intention);
157 std::string intention = find == UD_INTENTION_MAP.end() ? intention : find->second;
158 if (!UnifiedDataUtils::IsValidOptions(query.key, intention)) {
159 LOG_ERROR(UDMF_SERVICE, "invalid option, query.key: %{public}s, intention: %{public}s", query.key.c_str(),
160 intention.c_str());
161 return E_INVALID_PARAMETERS;
162 }
163 std::vector<UnifiedData> tempDataSet {};
164 auto err = udmfProxy_->GetBatchData(query, tempDataSet);
165 if (err != E_OK) {
166 return err;
167 }
168 for (auto &data : tempDataSet) {
169 if (UnifiedDataHelper::IsTempUData(data)) {
170 if (!UnifiedDataHelper::Unpack(data)) {
171 LOG_ERROR(UDMF_SERVICE, "failed to unpack unified data");
172 return E_FS_ERROR;
173 }
174 }
175 unifiedDataSet.emplace_back(data);
176 }
177 return E_OK;
178 }
179
UpdateData(const QueryOption & query,UnifiedData & unifiedData)180 int32_t UdmfServiceClient::UpdateData(const QueryOption &query, UnifiedData &unifiedData)
181 {
182 LOG_DEBUG(UDMF_SERVICE, "start, tag: %{public}s", query.key.c_str());
183 UnifiedKey key(query.key);
184 if (!key.IsValid() || !UnifiedDataUtils::IsPersist(key.intention)) {
185 LOG_ERROR(UDMF_SERVICE, "invalid key, key.intention: %{public}s", key.intention.c_str());
186 return E_INVALID_PARAMETERS;
187 }
188
189 if (!unifiedData.IsValid()) {
190 LOG_ERROR(UDMF_SERVICE, "UnifiedData is invalid.");
191 return E_INVALID_PARAMETERS;
192 }
193 if (UnifiedDataHelper::ExceedKVSizeLimit(unifiedData)) {
194 if (!UnifiedDataHelper::Pack(unifiedData)) {
195 LOG_ERROR(UDMF_SERVICE, "Failed to pack unified data.");
196 return E_FS_ERROR;
197 }
198 }
199 return udmfProxy_->UpdateData(query, unifiedData);
200 }
201
DeleteData(const QueryOption & query,std::vector<UnifiedData> & unifiedDataSet)202 int32_t UdmfServiceClient::DeleteData(const QueryOption &query, std::vector<UnifiedData> &unifiedDataSet)
203 {
204 LOG_DEBUG(UDMF_SERVICE, "start, tag: intention = %{public}d, key = %{public}s", query.intention, query.key.c_str());
205 auto find = UD_INTENTION_MAP.find(query.intention);
206 std::string intention = find == UD_INTENTION_MAP.end() ? intention : find->second;
207 if (!UnifiedDataUtils::IsValidOptions(query.key, intention)) {
208 LOG_ERROR(UDMF_SERVICE, "invalid option, query.key: %{public}s, intention: %{public}s", query.key.c_str(),
209 intention.c_str());
210 return E_INVALID_PARAMETERS;
211 }
212 return udmfProxy_->DeleteData(query, unifiedDataSet);
213 }
214
GetSummary(const QueryOption & query,Summary & summary)215 int32_t UdmfServiceClient::GetSummary(const QueryOption &query, Summary &summary)
216 {
217 LOG_DEBUG(UDMF_SERVICE, "start, tag: %{public}s", query.key.c_str());
218 UnifiedKey key(query.key);
219 if (!key.IsValid()) {
220 LOG_ERROR(UDMF_SERVICE, "invalid key");
221 return E_INVALID_PARAMETERS;
222 }
223 return udmfProxy_->GetSummary(query, summary);
224 }
225
AddPrivilege(const QueryOption & query,Privilege & privilege)226 int32_t UdmfServiceClient::AddPrivilege(const QueryOption &query, Privilege &privilege)
227 {
228 LOG_DEBUG(UDMF_SERVICE, "start, key: %{public}s", query.key.c_str());
229 UnifiedKey key(query.key);
230 if (!key.IsValid()) {
231 LOG_ERROR(UDMF_SERVICE, "invalid key");
232 return E_INVALID_PARAMETERS;
233 }
234 return udmfProxy_->AddPrivilege(query, privilege);
235 }
236
Sync(const QueryOption & query,const std::vector<std::string> & devices)237 int32_t UdmfServiceClient::Sync(const QueryOption &query, const std::vector<std::string> &devices)
238 {
239 LOG_DEBUG(UDMF_SERVICE, "start, key: %{public}s", query.key.c_str());
240 UnifiedKey key(query.key);
241 if (!key.IsValid()) {
242 LOG_ERROR(UDMF_SERVICE, "invalid key");
243 return E_INVALID_PARAMETERS;
244 }
245 return udmfProxy_->Sync(query, devices);
246 }
247
IsRemoteData(const QueryOption & query,bool & result)248 int32_t UdmfServiceClient::IsRemoteData(const QueryOption &query, bool &result)
249 {
250 LOG_DEBUG(UDMF_SERVICE, "start, key: %{public}s", query.key.c_str());
251 UnifiedKey key(query.key);
252 if (!key.IsValid()) {
253 LOG_ERROR(UDMF_SERVICE, "invalid key");
254 return E_INVALID_PARAMETERS;
255 }
256 return udmfProxy_->IsRemoteData(query, result);
257 }
258
SetAppShareOption(const std::string & intention,int32_t shareOption)259 int32_t UdmfServiceClient::SetAppShareOption(const std::string &intention, int32_t shareOption)
260 {
261 LOG_DEBUG(UDMF_SERVICE, "start, intention: %{public}s, shareOption: %{public}d",
262 intention.c_str(), shareOption);
263 if (intention.empty() || shareOption < IN_APP || shareOption > CROSS_APP) {
264 LOG_ERROR(UDMF_SERVICE, "invalid parameters");
265 return E_INVALID_PARAMETERS;
266 }
267 return udmfProxy_->SetAppShareOption(intention, shareOption);
268 }
269
GetAppShareOption(const std::string & intention,int32_t & shareOption)270 int32_t UdmfServiceClient::GetAppShareOption(const std::string &intention, int32_t &shareOption)
271 {
272 LOG_DEBUG(UDMF_SERVICE, "start, intention: %{public}s", intention.c_str());
273 if (intention.empty()) {
274 LOG_ERROR(UDMF_SERVICE, "invalid parameters");
275 return E_INVALID_PARAMETERS;
276 }
277 return udmfProxy_->GetAppShareOption(intention, shareOption);
278 }
279
RemoveAppShareOption(const std::string & intention)280 int32_t UdmfServiceClient::RemoveAppShareOption(const std::string &intention)
281 {
282 LOG_DEBUG(UDMF_SERVICE, "start, intention: %{public}s", intention.c_str());
283 if (intention.empty()) {
284 LOG_ERROR(UDMF_SERVICE, "invalid parameters");
285 return E_INVALID_PARAMETERS;
286 }
287 return udmfProxy_->RemoveAppShareOption(intention);
288 }
289
ObtainAsynProcess(AsyncProcessInfo & processInfo)290 int32_t UdmfServiceClient::ObtainAsynProcess(AsyncProcessInfo& processInfo)
291 {
292 return udmfProxy_->ObtainAsynProcess(processInfo);
293 }
294
ClearAsynProcessByKey(const std::string & businessUdKey)295 int32_t UdmfServiceClient::ClearAsynProcessByKey(const std::string &businessUdKey)
296 {
297 return udmfProxy_->ClearAsynProcessByKey(businessUdKey);
298 }
299 } // namespace UDMF
300 } // namespace OHOS