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