• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 (option.intention == UD_INTENTION_DATA_HUB) {
109         if (option.visibility != Visibility::VISIBILITY_ALL &&
110             option.visibility != Visibility::VISIBILITY_OWN_PROCESS) {
111             option.visibility = Visibility::VISIBILITY_ALL;
112         }
113     }
114     if (!unifiedData.IsValid()) {
115         LOG_ERROR(UDMF_SERVICE, "UnifiedData is invalid.");
116         return E_INVALID_PARAMETERS;
117     }
118     bool isSaInvoke = UTILS::IsTokenNative();
119     if (isSaInvoke && unifiedData.HasFileType()) {
120         LOG_ERROR(UDMF_SERVICE, "The setting data initiated by the SA cannot contain the file type");
121         return E_INVALID_PARAMETERS;
122     }
123     if (UnifiedDataHelper::ExceedKVSizeLimit(unifiedData)) {
124         auto status = UnifiedDataHelper::ProcessBigData(unifiedData, option.intention, isSaInvoke);
125         if (status != E_OK) {
126             LOG_ERROR(UDMF_SERVICE, "Process big data error, status = %{public}d", status);
127             return status;
128         }
129     }
130     return udmfProxy_->SetData(option, unifiedData, key);
131 }
132 
GetData(const QueryOption & query,UnifiedData & unifiedData)133 int32_t UdmfServiceClient::GetData(const QueryOption &query, UnifiedData &unifiedData)
134 {
135     LOG_DEBUG(UDMF_SERVICE, "start, tag: %{public}s", query.key.c_str());
136     UnifiedKey key(query.key);
137     if (!key.IsValid()) {
138         LOG_ERROR(UDMF_SERVICE, "invalid key");
139         return E_INVALID_PARAMETERS;
140     }
141 
142     auto err = udmfProxy_->GetData(query, unifiedData);
143     if (err == E_OK) {
144         if (UnifiedDataHelper::IsTempUData(unifiedData)) {
145             if (!UnifiedDataHelper::Unpack(unifiedData)) {
146                 LOG_ERROR(UDMF_SERVICE, "failed to unpack unified data");
147                 return E_FS_ERROR;
148             }
149         }
150     }
151     return err;
152 }
153 
GetBatchData(const QueryOption & query,std::vector<UnifiedData> & unifiedDataSet)154 int32_t UdmfServiceClient::GetBatchData(const QueryOption &query, std::vector<UnifiedData> &unifiedDataSet)
155 {
156     LOG_DEBUG(UDMF_SERVICE, "start, tag: intention = %{public}d, key = %{public}s", query.intention, query.key.c_str());
157     auto find = UD_INTENTION_MAP.find(query.intention);
158     std::string intention = find == UD_INTENTION_MAP.end() ? intention : find->second;
159     UnifiedKey key(query.key);
160     if (!key.IsValid() && !UnifiedDataUtils::IsValidOptionsNonDrag(key, intention)) {
161         LOG_ERROR(UDMF_SERVICE, "invalid option, query.key: %{public}s, intention: %{public}s", query.key.c_str(),
162             intention.c_str());
163         return E_INVALID_PARAMETERS;
164     }
165     std::vector<UnifiedData> tempDataSet {};
166     auto err = udmfProxy_->GetBatchData(query, tempDataSet);
167     if (err != E_OK) {
168         return err;
169     }
170     for (auto &data : tempDataSet) {
171         if (UnifiedDataHelper::IsTempUData(data)) {
172             if (!UnifiedDataHelper::Unpack(data)) {
173                 LOG_ERROR(UDMF_SERVICE, "failed to unpack unified data");
174                 return E_FS_ERROR;
175             }
176         }
177         unifiedDataSet.emplace_back(data);
178     }
179     return E_OK;
180 }
181 
UpdateData(const QueryOption & query,UnifiedData & unifiedData)182 int32_t UdmfServiceClient::UpdateData(const QueryOption &query, UnifiedData &unifiedData)
183 {
184     LOG_DEBUG(UDMF_SERVICE, "start, tag: %{public}s", query.key.c_str());
185     UnifiedKey key(query.key);
186     if (!key.IsValid() || !UnifiedDataUtils::IsPersist(key.intention)) {
187         LOG_ERROR(UDMF_SERVICE, "invalid key, key.intention: %{public}s", key.intention.c_str());
188         return E_INVALID_PARAMETERS;
189     }
190     std::string intention = UnifiedDataUtils::FindIntentionMap(query.intention);
191     if (!UnifiedDataUtils::IsValidOptionsNonDrag(key, intention)) {
192         LOG_ERROR(UDMF_SERVICE, "invalid option, query.key: %{public}s, intention: %{public}s", query.key.c_str(),
193             intention.c_str());
194         return E_INVALID_PARAMETERS;
195     }
196     if (key.intention != UD_INTENTION_MAP.at(Intention::UD_INTENTION_DATA_HUB)) {
197         LOG_ERROR(UDMF_SERVICE, "key.intention: %{public}s is invalid.", key.intention.c_str());
198         return E_INVALID_PARAMETERS;
199     }
200     if (!unifiedData.IsValid()) {
201         LOG_ERROR(UDMF_SERVICE, "UnifiedData is invalid.");
202         return E_INVALID_PARAMETERS;
203     }
204     if (UnifiedDataHelper::ExceedKVSizeLimit(unifiedData)) {
205         if (!UnifiedDataHelper::Pack(unifiedData)) {
206             LOG_ERROR(UDMF_SERVICE, "Failed to pack unified data.");
207             return E_FS_ERROR;
208         }
209     }
210     return udmfProxy_->UpdateData(query, unifiedData);
211 }
212 
DeleteData(const QueryOption & query,std::vector<UnifiedData> & unifiedDataSet)213 int32_t UdmfServiceClient::DeleteData(const QueryOption &query, std::vector<UnifiedData> &unifiedDataSet)
214 {
215     LOG_DEBUG(UDMF_SERVICE, "start, tag: intention = %{public}d, key = %{public}s", query.intention, query.key.c_str());
216     auto find = UD_INTENTION_MAP.find(query.intention);
217     std::string intention = find == UD_INTENTION_MAP.end() ? intention : find->second;
218     UnifiedKey key(query.key);
219     if (!key.IsValid() && !UnifiedDataUtils::IsValidOptionsNonDrag(key, intention)) {
220         LOG_ERROR(UDMF_SERVICE, "invalid option, query.key: %{public}s, intention: %{public}s", query.key.c_str(),
221             intention.c_str());
222         return E_INVALID_PARAMETERS;
223     }
224     return udmfProxy_->DeleteData(query, unifiedDataSet);
225 }
226 
GetSummary(const QueryOption & query,Summary & summary)227 int32_t UdmfServiceClient::GetSummary(const QueryOption &query, Summary &summary)
228 {
229     LOG_DEBUG(UDMF_SERVICE, "start, tag: %{public}s", query.key.c_str());
230     UnifiedKey key(query.key);
231     if (!key.IsValid()) {
232         LOG_ERROR(UDMF_SERVICE, "invalid key");
233         return E_INVALID_PARAMETERS;
234     }
235     return udmfProxy_->GetSummary(query, summary);
236 }
237 
AddPrivilege(const QueryOption & query,Privilege & privilege)238 int32_t UdmfServiceClient::AddPrivilege(const QueryOption &query, Privilege &privilege)
239 {
240     LOG_DEBUG(UDMF_SERVICE, "start, key: %{public}s", query.key.c_str());
241     UnifiedKey key(query.key);
242     if (!key.IsValid()) {
243         LOG_ERROR(UDMF_SERVICE, "invalid key");
244         return E_INVALID_PARAMETERS;
245     }
246     return udmfProxy_->AddPrivilege(query, privilege);
247 }
248 
Sync(const QueryOption & query,const std::vector<std::string> & devices)249 int32_t UdmfServiceClient::Sync(const QueryOption &query, const std::vector<std::string> &devices)
250 {
251     LOG_DEBUG(UDMF_SERVICE, "start, key: %{public}s", query.key.c_str());
252     UnifiedKey key(query.key);
253     if (!key.IsValid()) {
254         LOG_ERROR(UDMF_SERVICE, "invalid key");
255         return E_INVALID_PARAMETERS;
256     }
257     return udmfProxy_->Sync(query, devices);
258 }
259 
IsRemoteData(const QueryOption & query,bool & result)260 int32_t UdmfServiceClient::IsRemoteData(const QueryOption &query, bool &result)
261 {
262     LOG_DEBUG(UDMF_SERVICE, "start, key: %{public}s", query.key.c_str());
263     UnifiedKey key(query.key);
264     if (!key.IsValid()) {
265         LOG_ERROR(UDMF_SERVICE, "invalid key");
266         return E_INVALID_PARAMETERS;
267     }
268     return udmfProxy_->IsRemoteData(query, result);
269 }
270 
SetAppShareOption(const std::string & intention,int32_t shareOption)271 int32_t UdmfServiceClient::SetAppShareOption(const std::string &intention, int32_t shareOption)
272 {
273     LOG_DEBUG(UDMF_SERVICE, "start, intention: %{public}s, shareOption: %{public}d",
274               intention.c_str(), shareOption);
275     if (intention.empty() || shareOption < IN_APP || shareOption > CROSS_APP) {
276         LOG_ERROR(UDMF_SERVICE, "invalid parameters");
277         return E_INVALID_PARAMETERS;
278     }
279     return udmfProxy_->SetAppShareOption(intention, shareOption);
280 }
281 
GetAppShareOption(const std::string & intention,int32_t & shareOption)282 int32_t UdmfServiceClient::GetAppShareOption(const std::string &intention, int32_t &shareOption)
283 {
284     LOG_DEBUG(UDMF_SERVICE, "start, intention: %{public}s", intention.c_str());
285     if (intention.empty()) {
286         LOG_ERROR(UDMF_SERVICE, "invalid parameters");
287         return E_INVALID_PARAMETERS;
288     }
289     return udmfProxy_->GetAppShareOption(intention, shareOption);
290 }
291 
RemoveAppShareOption(const std::string & intention)292 int32_t UdmfServiceClient::RemoveAppShareOption(const std::string &intention)
293 {
294     LOG_DEBUG(UDMF_SERVICE, "start, intention: %{public}s", intention.c_str());
295     if (intention.empty()) {
296         LOG_ERROR(UDMF_SERVICE, "invalid parameters");
297         return E_INVALID_PARAMETERS;
298     }
299     return udmfProxy_->RemoveAppShareOption(intention);
300 }
301 
ObtainAsynProcess(AsyncProcessInfo & processInfo)302 int32_t UdmfServiceClient::ObtainAsynProcess(AsyncProcessInfo& processInfo)
303 {
304     return udmfProxy_->ObtainAsynProcess(processInfo);
305 }
306 
ClearAsynProcessByKey(const std::string & businessUdKey)307 int32_t UdmfServiceClient::ClearAsynProcessByKey(const std::string &businessUdKey)
308 {
309     return udmfProxy_->ClearAsynProcessByKey(businessUdKey);
310 }
311 
SetDelayInfo(const DataLoadInfo & dataLoadInfo,sptr<IRemoteObject> iUdmfNotifier,std::string & key)312 int32_t UdmfServiceClient::SetDelayInfo(const DataLoadInfo &dataLoadInfo, sptr<IRemoteObject> iUdmfNotifier,
313     std::string &key)
314 {
315     return udmfProxy_->SetDelayInfo(dataLoadInfo, iUdmfNotifier, key);
316 }
317 
PushDelayData(const std::string & key,UnifiedData & unifiedData)318 int32_t UdmfServiceClient::PushDelayData(const std::string &key, UnifiedData &unifiedData)
319 {
320     return udmfProxy_->PushDelayData(key, unifiedData);
321 }
322 
GetDataIfAvailable(const std::string & key,const DataLoadInfo & dataLoadInfo,sptr<IRemoteObject> iUdmfNotifier,std::shared_ptr<UnifiedData> unifiedData)323 int32_t UdmfServiceClient::GetDataIfAvailable(const std::string &key, const DataLoadInfo &dataLoadInfo,
324     sptr<IRemoteObject> iUdmfNotifier, std::shared_ptr<UnifiedData> unifiedData)
325 {
326     return udmfProxy_->GetDataIfAvailable(key, dataLoadInfo, iUdmfNotifier, unifiedData);
327 }
328 } // namespace UDMF
329 } // namespace OHOS