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
16 #include "datashare_helper_impl.h"
17
18 #include "concurrent_map.h"
19 #include "data_ability_observer_interface.h"
20 #include "dataobs_mgr_client.h"
21 #include "datashare_log.h"
22 #include "datashare_result_set.h"
23
24 #include "general_controller_provider_impl.h"
25 #include "general_controller_service_impl.h"
26
27 namespace OHOS {
28 namespace DataShare {
29 using namespace AppExecFwk;
30 constexpr int INVALID_VALUE = -1;
DataShareHelperImpl(const Uri & uri,const sptr<IRemoteObject> & token,std::shared_ptr<DataShareConnection> connection)31 DataShareHelperImpl::DataShareHelperImpl(const Uri &uri, const sptr<IRemoteObject> &token,
32 std::shared_ptr<DataShareConnection> connection)
33 {
34 LOG_DEBUG("starts");
35 generalCtl_ = std::make_shared<GeneralControllerProviderImpl>(connection, uri, token);
36 extSpCtl_ = std::make_shared<ExtSpecialController>(connection, uri, token);
37 }
38
DataShareHelperImpl()39 DataShareHelperImpl::DataShareHelperImpl()
40 {
41 LOG_DEBUG("starts");
42 generalCtl_ = std::make_shared<GeneralControllerServiceImpl>();
43 persistentDataCtl_ = std::make_shared<PersistentDataController>();
44 publishedDataCtl_ = std::make_shared<PublishedDataController>();
45 }
46
~DataShareHelperImpl()47 DataShareHelperImpl::~DataShareHelperImpl()
48 {
49 if (persistentDataCtl_ != nullptr && publishedDataCtl_ != nullptr) {
50 persistentDataCtl_->UnSubscribeRdbData(this, {}, {});
51 publishedDataCtl_->UnSubscribePublishedData(this, {}, {});
52 }
53 }
54
Release()55 bool DataShareHelperImpl::Release()
56 {
57 extSpCtl_ = nullptr;
58 generalCtl_ = nullptr;
59 return true;
60 }
61
GetFileTypes(Uri & uri,const std::string & mimeTypeFilter)62 std::vector<std::string> DataShareHelperImpl::GetFileTypes(Uri &uri, const std::string &mimeTypeFilter)
63 {
64 auto extSpCtl = extSpCtl_;
65 if (extSpCtl == nullptr) {
66 LOG_ERROR("extSpCtl is nullptr");
67 return std::vector<std::string>();
68 }
69 return extSpCtl->GetFileTypes(uri, mimeTypeFilter);
70 }
71
OpenFile(Uri & uri,const std::string & mode)72 int DataShareHelperImpl::OpenFile(Uri &uri, const std::string &mode)
73 {
74 auto extSpCtl = extSpCtl_;
75 if (extSpCtl == nullptr) {
76 LOG_ERROR("extSpCtl is nullptr");
77 return INVALID_VALUE;
78 }
79 return extSpCtl->OpenFile(uri, mode);
80 }
81
OpenRawFile(Uri & uri,const std::string & mode)82 int DataShareHelperImpl::OpenRawFile(Uri &uri, const std::string &mode)
83 {
84 auto extSpCtl = extSpCtl_;
85 if (extSpCtl == nullptr) {
86 LOG_ERROR("extSpCtl is nullptr");
87 return INVALID_VALUE;
88 }
89 return extSpCtl->OpenRawFile(uri, mode);
90 }
91
Insert(Uri & uri,const DataShareValuesBucket & value)92 int DataShareHelperImpl::Insert(Uri &uri, const DataShareValuesBucket &value)
93 {
94 auto generalCtl = generalCtl_;
95 if (generalCtl == nullptr) {
96 LOG_ERROR("generalCtl_ is nullptr");
97 return INVALID_VALUE;
98 }
99 return generalCtl->Insert(uri, value);
100 }
101
InsertExt(Uri & uri,const DataShareValuesBucket & value,std::string & result)102 int DataShareHelperImpl::InsertExt(Uri &uri, const DataShareValuesBucket &value, std::string &result)
103 {
104 auto extSpCtl = extSpCtl_;
105 if (extSpCtl == nullptr) {
106 LOG_ERROR("providerSpCtl is nullptr");
107 return INVALID_VALUE;
108 }
109 return extSpCtl->InsertExt(uri, value, result);
110 }
111
Update(Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)112 int DataShareHelperImpl::Update(Uri &uri, const DataSharePredicates &predicates, const DataShareValuesBucket &value)
113 {
114 auto generalCtl = generalCtl_;
115 if (generalCtl == nullptr) {
116 LOG_ERROR("generalCtl is nullptr");
117 return INVALID_VALUE;
118 }
119 return generalCtl->Update(uri, predicates, value);
120 }
121
Delete(Uri & uri,const DataSharePredicates & predicates)122 int DataShareHelperImpl::Delete(Uri &uri, const DataSharePredicates &predicates)
123 {
124 auto generalCtl = generalCtl_;
125 if (generalCtl == nullptr) {
126 LOG_ERROR("generalCtl is nullptr");
127 return INVALID_VALUE;
128 }
129 return generalCtl->Delete(uri, predicates);
130 }
131
Query(Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns,DatashareBusinessError * businessError)132 std::shared_ptr<DataShareResultSet> DataShareHelperImpl::Query(Uri &uri, const DataSharePredicates &predicates,
133 std::vector<std::string> &columns, DatashareBusinessError *businessError)
134 {
135 auto generalCtl = generalCtl_;
136 if (generalCtl == nullptr) {
137 LOG_ERROR("generalCtl is nullptr");
138 return nullptr;
139 }
140 DatashareBusinessError error;
141 auto resultSet = generalCtl->Query(uri, predicates, columns, error);
142 if (businessError != nullptr) {
143 *businessError = error;
144 }
145 return resultSet;
146 }
147
GetType(Uri & uri)148 std::string DataShareHelperImpl::GetType(Uri &uri)
149 {
150 auto extSpCtl = extSpCtl_;
151 if (extSpCtl == nullptr) {
152 LOG_ERROR("extSpCtl is nullptr");
153 return "";
154 }
155 return extSpCtl->GetType(uri);
156 }
157
BatchInsert(Uri & uri,const std::vector<DataShareValuesBucket> & values)158 int DataShareHelperImpl::BatchInsert(Uri &uri, const std::vector<DataShareValuesBucket> &values)
159 {
160 auto extSpCtl = extSpCtl_;
161 if (extSpCtl == nullptr) {
162 LOG_ERROR("providerSepOperator is nullptr");
163 return INVALID_VALUE;
164 }
165 return extSpCtl->BatchInsert(uri, values);
166 }
167
ExecuteBatch(const std::vector<OperationStatement> & statements,ExecResultSet & result)168 int DataShareHelperImpl::ExecuteBatch(const std::vector<OperationStatement> &statements, ExecResultSet &result)
169 {
170 auto extSpCtl = extSpCtl_;
171 if (extSpCtl == nullptr) {
172 LOG_ERROR("extSpCtl is nullptr");
173 return INVALID_VALUE;
174 }
175 return extSpCtl->ExecuteBatch(statements, result);
176 }
177
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)178 void DataShareHelperImpl::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
179 {
180 if (dataObserver == nullptr) {
181 LOG_ERROR("dataObserver is nullptr");
182 return;
183 }
184 auto generalCtl = generalCtl_;
185 if (generalCtl == nullptr) {
186 LOG_ERROR("generalCtl is nullptr");
187 return;
188 }
189 return generalCtl->RegisterObserver(uri, dataObserver);
190 }
191
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)192 void DataShareHelperImpl::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
193 {
194 if (dataObserver == nullptr) {
195 LOG_ERROR("dataObserver is nullptr");
196 return;
197 }
198 auto generalCtl = generalCtl_;
199 if (generalCtl == nullptr) {
200 LOG_ERROR("generalCtl is nullptr");
201 return;
202 }
203 return generalCtl->UnregisterObserver(uri, dataObserver);
204 }
205
NotifyChange(const Uri & uri)206 void DataShareHelperImpl::NotifyChange(const Uri &uri)
207 {
208 auto generalCtl = generalCtl_;
209 if (generalCtl == nullptr) {
210 LOG_ERROR("extSpCtl is nullptr");
211 return;
212 }
213 return generalCtl->NotifyChange(uri);
214 }
215
NormalizeUri(Uri & uri)216 Uri DataShareHelperImpl::NormalizeUri(Uri &uri)
217 {
218 auto extSpCtl = extSpCtl_;
219 if (extSpCtl == nullptr) {
220 LOG_ERROR("extSpCtl is nullptr");
221 return Uri("");
222 }
223 return extSpCtl->NormalizeUri(uri);
224 }
225
DenormalizeUri(Uri & uri)226 Uri DataShareHelperImpl::DenormalizeUri(Uri &uri)
227 {
228 auto extSpCtl = extSpCtl_;
229 if (extSpCtl == nullptr) {
230 LOG_ERROR("extSpCtl is nullptr");
231 return Uri("");
232 }
233 return extSpCtl->DenormalizeUri(uri);
234 }
235
AddQueryTemplate(const std::string & uri,int64_t subscriberId,Template & tpl)236 int DataShareHelperImpl::AddQueryTemplate(const std::string &uri, int64_t subscriberId, Template &tpl)
237 {
238 auto persistentDataCtl = persistentDataCtl_;
239 if (persistentDataCtl == nullptr) {
240 LOG_ERROR("persistentDataCtl is nullptr");
241 return INVALID_VALUE;
242 }
243 return persistentDataCtl->AddQueryTemplate(uri, subscriberId, tpl);
244 }
245
DelQueryTemplate(const std::string & uri,int64_t subscriberId)246 int DataShareHelperImpl::DelQueryTemplate(const std::string &uri, int64_t subscriberId)
247 {
248 auto persistentDataCtl = persistentDataCtl_;
249 if (persistentDataCtl == nullptr) {
250 LOG_ERROR("persistentDataCtl is nullptr");
251 return INVALID_VALUE;
252 }
253 return persistentDataCtl->DelQueryTemplate(uri, subscriberId);
254 }
255
Publish(const Data & data,const std::string & bundleName)256 std::vector<OperationResult> DataShareHelperImpl::Publish(const Data &data, const std::string &bundleName)
257 {
258 auto publishedDataCtl = publishedDataCtl_;
259 if (publishedDataCtl == nullptr) {
260 LOG_ERROR("publishedDataCtl is nullptr");
261 return std::vector<OperationResult>();
262 }
263 return publishedDataCtl->Publish(data, bundleName);
264 }
265
GetPublishedData(const std::string & bundleName,int & resultCode)266 Data DataShareHelperImpl::GetPublishedData(const std::string &bundleName, int &resultCode)
267 {
268 auto publishedDataCtl = publishedDataCtl_;
269 if (publishedDataCtl == nullptr) {
270 LOG_ERROR("publishedDataCtl is nullptr");
271 return Data();
272 }
273 return publishedDataCtl->GetPublishedData(bundleName, resultCode);
274 }
275
SubscribeRdbData(const std::vector<std::string> & uris,const TemplateId & templateId,const std::function<void (const RdbChangeNode & changeNode)> & callback)276 std::vector<OperationResult> DataShareHelperImpl::SubscribeRdbData(const std::vector<std::string> &uris,
277 const TemplateId &templateId, const std::function<void(const RdbChangeNode &changeNode)> &callback)
278 {
279 LOG_DEBUG("Start SubscribeRdbData");
280 auto persistentDataCtl = persistentDataCtl_;
281 if (persistentDataCtl == nullptr) {
282 LOG_ERROR("persistentDataCtl is nullptr");
283 return std::vector<OperationResult>();
284 }
285 return persistentDataCtl->SubscribeRdbData(this, uris, templateId, callback);
286 }
287
UnsubscribeRdbData(const std::vector<std::string> & uris,const TemplateId & templateId)288 std::vector<OperationResult> DataShareHelperImpl::UnsubscribeRdbData(const std::vector<std::string> &uris,
289 const TemplateId &templateId)
290 {
291 LOG_DEBUG("Start UnsubscribeRdbData");
292 auto persistentDataCtl = persistentDataCtl_;
293 if (persistentDataCtl == nullptr) {
294 LOG_ERROR("persistentDataCtl is nullptr");
295 return std::vector<OperationResult>();
296 }
297 return persistentDataCtl->UnSubscribeRdbData(this, uris, templateId);
298 }
299
EnableRdbSubs(const std::vector<std::string> & uris,const TemplateId & templateId)300 std::vector<OperationResult> DataShareHelperImpl::EnableRdbSubs(const std::vector<std::string> &uris,
301 const TemplateId &templateId)
302 {
303 LOG_DEBUG("Start EnableSubscribeRdbData");
304 auto persistentDataCtl = persistentDataCtl_;
305 if (persistentDataCtl == nullptr) {
306 LOG_ERROR("persistentDataCtl is nullptr");
307 return std::vector<OperationResult>();
308 }
309 return persistentDataCtl->EnableSubscribeRdbData(this, uris, templateId);
310 }
311
DisableRdbSubs(const std::vector<std::string> & uris,const TemplateId & templateId)312 std::vector<OperationResult> DataShareHelperImpl::DisableRdbSubs(const std::vector<std::string> &uris,
313 const TemplateId &templateId)
314 {
315 LOG_DEBUG("Start DisableSubscribeRdbData");
316 auto persistentDataCtl = persistentDataCtl_;
317 if (persistentDataCtl == nullptr) {
318 LOG_ERROR("persistentDataCtl is nullptr");
319 return std::vector<OperationResult>();
320 }
321 return persistentDataCtl->DisableSubscribeRdbData(this, uris, templateId);
322 }
323
SubscribePublishedData(const std::vector<std::string> & uris,int64_t subscriberId,const std::function<void (const PublishedDataChangeNode & changeNode)> & callback)324 std::vector<OperationResult> DataShareHelperImpl::SubscribePublishedData(const std::vector<std::string> &uris,
325 int64_t subscriberId, const std::function<void(const PublishedDataChangeNode &changeNode)> &callback)
326 {
327 LOG_DEBUG("Start SubscribePublishedData");
328 auto publishedDataCtl = publishedDataCtl_;
329 if (publishedDataCtl == nullptr) {
330 LOG_ERROR("publishedDataCtl is nullptr");
331 return std::vector<OperationResult>();
332 }
333 return publishedDataCtl->SubscribePublishedData(this, uris, subscriberId, callback);
334 }
335
UnsubscribePublishedData(const std::vector<std::string> & uris,int64_t subscriberId)336 std::vector<OperationResult> DataShareHelperImpl::UnsubscribePublishedData(const std::vector<std::string> &uris,
337 int64_t subscriberId)
338 {
339 LOG_DEBUG("Start UnSubscribePublishedData");
340 auto publishedDataCtl = publishedDataCtl_;
341 if (publishedDataCtl == nullptr) {
342 LOG_ERROR("publishedDataCtl is nullptr");
343 return std::vector<OperationResult>();
344 }
345 return publishedDataCtl->UnSubscribePublishedData(this, uris, subscriberId);
346 }
347
EnablePubSubs(const std::vector<std::string> & uris,int64_t subscriberId)348 std::vector<OperationResult> DataShareHelperImpl::EnablePubSubs(const std::vector<std::string> &uris,
349 int64_t subscriberId)
350 {
351 LOG_DEBUG("Start UnSubscribePublishedData");
352 auto publishedDataCtl = publishedDataCtl_;
353 if (publishedDataCtl == nullptr) {
354 LOG_ERROR("publishedDataCtl is nullptr");
355 return std::vector<OperationResult>();
356 }
357 return publishedDataCtl->EnableSubscribePublishedData(this, uris, subscriberId);
358 }
359
DisablePubSubs(const std::vector<std::string> & uris,int64_t subscriberId)360 std::vector<OperationResult> DataShareHelperImpl::DisablePubSubs(const std::vector<std::string> &uris,
361 int64_t subscriberId)
362 {
363 LOG_DEBUG("Start UnSubscribePublishedData");
364 auto publishedDataCtl = publishedDataCtl_;
365 if (publishedDataCtl == nullptr) {
366 LOG_ERROR("publishedDataCtl is nullptr");
367 return std::vector<OperationResult>();
368 }
369 return publishedDataCtl->DisableSubscribePublishedData(this, uris, subscriberId);
370 }
371 } // namespace DataShare
372 } // namespace OHOS