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