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 LOG_INFO("Start");
181 if (dataObserver == nullptr) {
182 LOG_ERROR("dataObserver is nullptr");
183 return;
184 }
185 auto generalCtl = generalCtl_;
186 if (generalCtl == nullptr) {
187 LOG_ERROR("generalCtl is nullptr");
188 return;
189 }
190 return generalCtl->RegisterObserver(uri, dataObserver);
191 }
192
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)193 void DataShareHelperImpl::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
194 {
195 LOG_INFO("Start");
196 if (dataObserver == nullptr) {
197 LOG_ERROR("dataObserver is nullptr");
198 return;
199 }
200 auto generalCtl = generalCtl_;
201 if (generalCtl == nullptr) {
202 LOG_ERROR("generalCtl is nullptr");
203 return;
204 }
205 return generalCtl->UnregisterObserver(uri, dataObserver);
206 }
207
NotifyChange(const Uri & uri)208 void DataShareHelperImpl::NotifyChange(const Uri &uri)
209 {
210 auto generalCtl = generalCtl_;
211 if (generalCtl == nullptr) {
212 LOG_ERROR("extSpCtl is nullptr");
213 return;
214 }
215 return generalCtl->NotifyChange(uri);
216 }
217
NormalizeUri(Uri & uri)218 Uri DataShareHelperImpl::NormalizeUri(Uri &uri)
219 {
220 auto extSpCtl = extSpCtl_;
221 if (extSpCtl == nullptr) {
222 LOG_ERROR("extSpCtl is nullptr");
223 return Uri("");
224 }
225 return extSpCtl->NormalizeUri(uri);
226 }
227
DenormalizeUri(Uri & uri)228 Uri DataShareHelperImpl::DenormalizeUri(Uri &uri)
229 {
230 auto extSpCtl = extSpCtl_;
231 if (extSpCtl == nullptr) {
232 LOG_ERROR("extSpCtl is nullptr");
233 return Uri("");
234 }
235 return extSpCtl->DenormalizeUri(uri);
236 }
237
AddQueryTemplate(const std::string & uri,int64_t subscriberId,Template & tpl)238 int DataShareHelperImpl::AddQueryTemplate(const std::string &uri, int64_t subscriberId, Template &tpl)
239 {
240 auto persistentDataCtl = persistentDataCtl_;
241 if (persistentDataCtl == nullptr) {
242 LOG_ERROR("persistentDataCtl is nullptr");
243 return INVALID_VALUE;
244 }
245 return persistentDataCtl->AddQueryTemplate(uri, subscriberId, tpl);
246 }
247
DelQueryTemplate(const std::string & uri,int64_t subscriberId)248 int DataShareHelperImpl::DelQueryTemplate(const std::string &uri, int64_t subscriberId)
249 {
250 auto persistentDataCtl = persistentDataCtl_;
251 if (persistentDataCtl == nullptr) {
252 LOG_ERROR("persistentDataCtl is nullptr");
253 return INVALID_VALUE;
254 }
255 return persistentDataCtl->DelQueryTemplate(uri, subscriberId);
256 }
257
Publish(const Data & data,const std::string & bundleName)258 std::vector<OperationResult> DataShareHelperImpl::Publish(const Data &data, const std::string &bundleName)
259 {
260 auto publishedDataCtl = publishedDataCtl_;
261 if (publishedDataCtl == nullptr) {
262 LOG_ERROR("publishedDataCtl is nullptr");
263 return std::vector<OperationResult>();
264 }
265 return publishedDataCtl->Publish(data, bundleName);
266 }
267
GetPublishedData(const std::string & bundleName,int & resultCode)268 Data DataShareHelperImpl::GetPublishedData(const std::string &bundleName, int &resultCode)
269 {
270 auto publishedDataCtl = publishedDataCtl_;
271 if (publishedDataCtl == nullptr) {
272 LOG_ERROR("publishedDataCtl is nullptr");
273 return Data();
274 }
275 return publishedDataCtl->GetPublishedData(bundleName, resultCode);
276 }
277
SubscribeRdbData(const std::vector<std::string> & uris,const TemplateId & templateId,const std::function<void (const RdbChangeNode & changeNode)> & callback)278 std::vector<OperationResult> DataShareHelperImpl::SubscribeRdbData(const std::vector<std::string> &uris,
279 const TemplateId &templateId, const std::function<void(const RdbChangeNode &changeNode)> &callback)
280 {
281 LOG_DEBUG("Start SubscribeRdbData");
282 auto persistentDataCtl = persistentDataCtl_;
283 if (persistentDataCtl == nullptr) {
284 LOG_ERROR("persistentDataCtl is nullptr");
285 return std::vector<OperationResult>();
286 }
287 return persistentDataCtl->SubscribeRdbData(this, uris, templateId, callback);
288 }
289
UnsubscribeRdbData(const std::vector<std::string> & uris,const TemplateId & templateId)290 std::vector<OperationResult> DataShareHelperImpl::UnsubscribeRdbData(const std::vector<std::string> &uris,
291 const TemplateId &templateId)
292 {
293 LOG_DEBUG("Start UnsubscribeRdbData");
294 auto persistentDataCtl = persistentDataCtl_;
295 if (persistentDataCtl == nullptr) {
296 LOG_ERROR("persistentDataCtl is nullptr");
297 return std::vector<OperationResult>();
298 }
299 return persistentDataCtl->UnSubscribeRdbData(this, uris, templateId);
300 }
301
EnableRdbSubs(const std::vector<std::string> & uris,const TemplateId & templateId)302 std::vector<OperationResult> DataShareHelperImpl::EnableRdbSubs(const std::vector<std::string> &uris,
303 const TemplateId &templateId)
304 {
305 LOG_DEBUG("Start EnableSubscribeRdbData");
306 auto persistentDataCtl = persistentDataCtl_;
307 if (persistentDataCtl == nullptr) {
308 LOG_ERROR("persistentDataCtl is nullptr");
309 return std::vector<OperationResult>();
310 }
311 return persistentDataCtl->EnableSubscribeRdbData(this, uris, templateId);
312 }
313
DisableRdbSubs(const std::vector<std::string> & uris,const TemplateId & templateId)314 std::vector<OperationResult> DataShareHelperImpl::DisableRdbSubs(const std::vector<std::string> &uris,
315 const TemplateId &templateId)
316 {
317 LOG_DEBUG("Start DisableSubscribeRdbData");
318 auto persistentDataCtl = persistentDataCtl_;
319 if (persistentDataCtl == nullptr) {
320 LOG_ERROR("persistentDataCtl is nullptr");
321 return std::vector<OperationResult>();
322 }
323 return persistentDataCtl->DisableSubscribeRdbData(this, uris, templateId);
324 }
325
SubscribePublishedData(const std::vector<std::string> & uris,int64_t subscriberId,const std::function<void (const PublishedDataChangeNode & changeNode)> & callback)326 std::vector<OperationResult> DataShareHelperImpl::SubscribePublishedData(const std::vector<std::string> &uris,
327 int64_t subscriberId, const std::function<void(const PublishedDataChangeNode &changeNode)> &callback)
328 {
329 LOG_DEBUG("Start SubscribePublishedData");
330 auto publishedDataCtl = publishedDataCtl_;
331 if (publishedDataCtl == nullptr) {
332 LOG_ERROR("publishedDataCtl is nullptr");
333 return std::vector<OperationResult>();
334 }
335 return publishedDataCtl->SubscribePublishedData(this, uris, subscriberId, callback);
336 }
337
UnsubscribePublishedData(const std::vector<std::string> & uris,int64_t subscriberId)338 std::vector<OperationResult> DataShareHelperImpl::UnsubscribePublishedData(const std::vector<std::string> &uris,
339 int64_t subscriberId)
340 {
341 LOG_DEBUG("Start UnSubscribePublishedData");
342 auto publishedDataCtl = publishedDataCtl_;
343 if (publishedDataCtl == nullptr) {
344 LOG_ERROR("publishedDataCtl is nullptr");
345 return std::vector<OperationResult>();
346 }
347 return publishedDataCtl->UnSubscribePublishedData(this, uris, subscriberId);
348 }
349
EnablePubSubs(const std::vector<std::string> & uris,int64_t subscriberId)350 std::vector<OperationResult> DataShareHelperImpl::EnablePubSubs(const std::vector<std::string> &uris,
351 int64_t subscriberId)
352 {
353 LOG_DEBUG("Start UnSubscribePublishedData");
354 auto publishedDataCtl = publishedDataCtl_;
355 if (publishedDataCtl == nullptr) {
356 LOG_ERROR("publishedDataCtl is nullptr");
357 return std::vector<OperationResult>();
358 }
359 return publishedDataCtl->EnableSubscribePublishedData(this, uris, subscriberId);
360 }
361
DisablePubSubs(const std::vector<std::string> & uris,int64_t subscriberId)362 std::vector<OperationResult> DataShareHelperImpl::DisablePubSubs(const std::vector<std::string> &uris,
363 int64_t subscriberId)
364 {
365 LOG_DEBUG("Start UnSubscribePublishedData");
366 auto publishedDataCtl = publishedDataCtl_;
367 if (publishedDataCtl == nullptr) {
368 LOG_ERROR("publishedDataCtl is nullptr");
369 return std::vector<OperationResult>();
370 }
371 return publishedDataCtl->DisableSubscribePublishedData(this, uris, subscriberId);
372 }
373 } // namespace DataShare
374 } // namespace OHOS