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