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 
16 #include "calllog_ability.h"
17 #include "common.h"
18 #include "contacts_datashare_stub_impl.h"
19 #include "dataobs_mgr_client.h"
20 #include "hilog_wrapper.h"
21 #include "voicemail_ability.h"
22 
23 namespace OHOS {
24 namespace DataShare {
25 using DataObsMgrClient = OHOS::AAFwk::DataObsMgrClient;
26 
SetContactsDataAbility(std::shared_ptr<DataShareExtAbility> extension)27 void ContactsDataShareStubImpl::SetContactsDataAbility(std::shared_ptr<DataShareExtAbility> extension)
28 {
29     std::lock_guard<std::mutex> lock(contactsMutex_);
30     contactsDataAbility_ = extension;
31 }
32 
SetCallLogAbility(std::shared_ptr<DataShareExtAbility> extension)33 void ContactsDataShareStubImpl::SetCallLogAbility(std::shared_ptr<DataShareExtAbility> extension)
34 {
35     std::lock_guard<std::mutex> lock(callogMutex_);
36     callLogAbility_ = extension;
37 }
38 
SetVoiceMailAbility(std::shared_ptr<DataShareExtAbility> extension)39 void ContactsDataShareStubImpl::SetVoiceMailAbility(std::shared_ptr<DataShareExtAbility> extension)
40 {
41     std::lock_guard<std::mutex> lock(voiceMailMutex_);
42     voiceMailAbility_ = extension;
43 }
44 
GetContactsDataAbility()45 std::shared_ptr<DataShareExtAbility> ContactsDataShareStubImpl::GetContactsDataAbility()
46 {
47     std::lock_guard<std::mutex> lock(contactsMutex_);
48     return contactsDataAbility_;
49 }
50 
GetCallLogAbility()51 std::shared_ptr<DataShareExtAbility> ContactsDataShareStubImpl::GetCallLogAbility()
52 {
53     std::lock_guard<std::mutex> lock(callogMutex_);
54     if (callLogAbility_ == nullptr) {
55         callLogAbility_.reset(CallLogAbility::Create());
56     }
57     return callLogAbility_;
58 }
59 
GetVoiceMailAbility()60 std::shared_ptr<DataShareExtAbility> ContactsDataShareStubImpl::GetVoiceMailAbility()
61 {
62     std::lock_guard<std::mutex> lock(voiceMailMutex_);
63     if (voiceMailAbility_ == nullptr) {
64         voiceMailAbility_.reset(VoiceMailAbility::Create());
65     }
66     return voiceMailAbility_;
67 }
68 
GetOwner(const Uri &uri)69 std::shared_ptr<DataShareExtAbility> ContactsDataShareStubImpl::GetOwner(const Uri &uri)
70 {
71     OHOS::Uri uriTemp = uri;
72     std::string path = uriTemp.GetPath();
73     if (path.find("com.ohos.contactsdataability") != std::string::npos) {
74         return GetContactsDataAbility();
75     }
76     if (path.find("com.ohos.calllogability") != std::string::npos) {
77         return GetCallLogAbility();
78     }
79     if (path.find("com.ohos.voicemailability") != std::string::npos) {
80         return GetVoiceMailAbility();
81     }
82     return nullptr;
83 }
84 
Insert(const Uri &uri, const DataShareValuesBucket &value)85 int ContactsDataShareStubImpl::Insert(const Uri &uri, const DataShareValuesBucket &value)
86 {
87     HILOG_INFO("insert begin.");
88     int ret = 0;
89     auto extension = GetOwner(uri);
90     if (extension == nullptr) {
91         HILOG_ERROR("insert failed, extension is null.");
92         return ret;
93     }
94     ret = extension->Insert(uri, value);
95     HILOG_INFO("insert end successfully. ret: %{public}d", ret);
96     if (ret != Contacts::OPERATION_ERROR) {
97         NotifyChange(uri);
98     }
99     return ret;
100 }
101 
Update(const Uri &uri, const DataSharePredicates &predicates, const DataShareValuesBucket &value)102 int ContactsDataShareStubImpl::Update(const Uri &uri, const DataSharePredicates &predicates,
103     const DataShareValuesBucket &value)
104 {
105     HILOG_INFO("update begin.");
106     int ret = 0;
107     auto extension = GetOwner(uri);
108     if (extension == nullptr) {
109         HILOG_ERROR("update failed, extension is null.");
110         return ret;
111     }
112     ret = extension->Update(uri, predicates, value);
113     HILOG_INFO("update end successfully. ret: %{public}d", ret);
114     if (ret != Contacts::OPERATION_ERROR) {
115         NotifyChange(uri);
116     }
117     return ret;
118 }
119 
Delete(const Uri &uri, const DataSharePredicates &predicates)120 int ContactsDataShareStubImpl::Delete(const Uri &uri, const DataSharePredicates &predicates)
121 {
122     HILOG_INFO("delete begin.");
123     int ret = 0;
124     auto extension = GetOwner(uri);
125     if (extension == nullptr) {
126         HILOG_ERROR("delete failed, extension is null.");
127         return ret;
128     }
129     ret = extension->Delete(uri, predicates);
130     HILOG_INFO("delete end successfully. ret: %{public}d", ret);
131     if (ret != Contacts::OPERATION_ERROR) {
132         NotifyChange(uri);
133     }
134     return ret;
135 }
136 
Query(const Uri &uri, const DataSharePredicates &predicates, std::vector<std::string> &columns, DatashareBusinessError &businessError)137 std::shared_ptr<DataShareResultSet> ContactsDataShareStubImpl::Query(const Uri &uri,
138     const DataSharePredicates &predicates, std::vector<std::string> &columns, DatashareBusinessError &businessError)
139 {
140     HILOG_INFO("query begin.");
141     auto extension = GetOwner(uri);
142     if (extension == nullptr) {
143         HILOG_ERROR("query failed, extension is null.");
144         return nullptr;
145     }
146     auto resultSet = extension->Query(uri, predicates, columns, businessError);
147     HILOG_INFO("query end successfully.");
148     return resultSet;
149 }
150 
BatchInsert(const Uri &uri, const std::vector<DataShareValuesBucket> &values)151 int ContactsDataShareStubImpl::BatchInsert(const Uri &uri, const std::vector<DataShareValuesBucket> &values)
152 {
153     HILOG_INFO("batch insert begin.");
154     int ret = 0;
155     auto extension = GetOwner(uri);
156     if (extension == nullptr) {
157         HILOG_ERROR("batch insert failed, extension is null.");
158         return ret;
159     }
160     ret = extension->BatchInsert(uri, values);
161     HILOG_INFO("batch insert end successfully. ret: %{public}d", ret);
162     if (ret != Contacts::OPERATION_ERROR) {
163         NotifyChange(uri);
164     }
165     return ret;
166 }
167 
GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)168 std::vector<std::string> ContactsDataShareStubImpl::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
169 {
170     HILOG_INFO("GetFileTypes not supported");
171     std::vector<std::string> result;
172     return result;
173 }
174 
OpenFile(const Uri &uri, const std::string &mode)175 int ContactsDataShareStubImpl::OpenFile(const Uri &uri, const std::string &mode)
176 {
177     HILOG_INFO("OpenFile not supported");
178     return -1;
179 }
180 
OpenRawFile(const Uri &uri, const std::string &mode)181 int ContactsDataShareStubImpl::OpenRawFile(const Uri &uri, const std::string &mode)
182 {
183     HILOG_INFO("OpenRawFile not supported");
184     return -1;
185 }
186 
GetType(const Uri &uri)187 std::string ContactsDataShareStubImpl::GetType(const Uri &uri)
188 {
189     HILOG_INFO("GetType not supported");
190     return "";
191 }
192 
RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)193 bool ContactsDataShareStubImpl::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
194 {
195     HILOG_INFO("%{public}s begin.", __func__);
196     auto obsMgrClient = DataObsMgrClient::GetInstance();
197     if (obsMgrClient == nullptr) {
198         HILOG_ERROR("%{public}s obsMgrClient is nullptr", __func__);
199         return false;
200     }
201 
202     ErrCode ret = obsMgrClient->RegisterObserver(uri, dataObserver);
203     if (ret != ERR_OK) {
204         HILOG_ERROR("%{public}s obsMgrClient->RegisterObserver error return %{public}d", __func__, ret);
205         return false;
206     }
207     return true;
208 }
209 
UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)210 bool ContactsDataShareStubImpl::UnregisterObserver(const Uri &uri,
211     const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
212 {
213     HILOG_INFO("%{public}s begin.", __func__);
214     auto obsMgrClient = DataObsMgrClient::GetInstance();
215     if (obsMgrClient == nullptr) {
216         HILOG_ERROR("%{public}s obsMgrClient is nullptr", __func__);
217         return false;
218     }
219 
220     ErrCode ret = obsMgrClient->UnregisterObserver(uri, dataObserver);
221     if (ret != ERR_OK) {
222         HILOG_ERROR("%{public}s obsMgrClient->UnregisterObserver error return %{public}d", __func__, ret);
223         return false;
224     }
225     return true;
226 }
227 
NotifyChange(const Uri &uri)228 bool ContactsDataShareStubImpl::NotifyChange(const Uri &uri)
229 {
230     auto obsMgrClient = DataObsMgrClient::GetInstance();
231     if (obsMgrClient == nullptr) {
232         HILOG_ERROR("%{public}s obsMgrClient is nullptr", __func__);
233         return false;
234     }
235 
236     ErrCode ret = obsMgrClient->NotifyChange(uri);
237     if (ret != ERR_OK) {
238         HILOG_ERROR("%{public}s obsMgrClient->NotifyChange error return %{public}d", __func__, ret);
239         return false;
240     }
241     return true;
242 }
243 
NormalizeUri(const Uri &uri)244 Uri ContactsDataShareStubImpl::NormalizeUri(const Uri &uri)
245 {
246     HILOG_INFO("NormalizeUri not supported");
247     return uri;
248 }
249 
DenormalizeUri(const Uri &uri)250 Uri ContactsDataShareStubImpl::DenormalizeUri(const Uri &uri)
251 {
252     HILOG_INFO("DenormalizeUri not supported");
253     return uri;
254 }
255 } // namespace DataShare
256 } // namespace OHOS
257