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 "dataobs_mgr_client.h"
17 #include "datashare_ext_ability_context.h"
18 #include "data_storage_errors.h"
19 #include "data_storage_log_wrapper.h"
20 #include "opkey_ability.h"
21 #include "pdp_profile_ability.h"
22 #include "sim_ability.h"
23 #include "sms_mms_ability.h"
24 #include "global_params_ability.h"
25 #include "opkey_version_ability.h"
26 #include "telephony_datashare_stub_impl.h"
27 
28 
29 namespace OHOS {
30 namespace DataShare {
31 using DataObsMgrClient = OHOS::AAFwk::DataObsMgrClient;
32 using namespace OHOS::Telephony;
33 
SetOpKeyAbility(std::shared_ptr<DataShareExtAbility> extension)34 void TelephonyDataShareStubImpl::SetOpKeyAbility(std::shared_ptr<DataShareExtAbility> extension)
35 {
36     std::lock_guard<std::mutex> lock(opKeyMutex_);
37     opKeyAbility_ = extension;
38 }
39 
SetPdpProfileAbility(std::shared_ptr<DataShareExtAbility> extension)40 void TelephonyDataShareStubImpl::SetPdpProfileAbility(std::shared_ptr<DataShareExtAbility> extension)
41 {
42     std::lock_guard<std::mutex> lock(pdpProfileMutex_);
43     pdpProfileAbility_ = extension;
44 }
45 
SetSimAbility(std::shared_ptr<DataShareExtAbility> extension)46 void TelephonyDataShareStubImpl::SetSimAbility(std::shared_ptr<DataShareExtAbility> extension)
47 {
48     std::lock_guard<std::mutex> lock(simMutex_);
49     simAbility_ = extension;
50 }
51 
SetSmsMmsAbility(std::shared_ptr<DataShareExtAbility> extension)52 void TelephonyDataShareStubImpl::SetSmsMmsAbility(std::shared_ptr<DataShareExtAbility> extension)
53 {
54     std::lock_guard<std::mutex> lock(smsMmsMutex_);
55     smsMmsAbility_ = extension;
56 }
57 
SetGlobalParamsAbility(std::shared_ptr<DataShareExtAbility> extension)58 void TelephonyDataShareStubImpl::SetGlobalParamsAbility(std::shared_ptr<DataShareExtAbility> extension)
59 {
60     std::lock_guard<std::mutex> lock(globalParamsMutex_);
61     globalParamsAbility_ = extension;
62 }
63 
GetTelephonyDataAbility()64 std::shared_ptr<DataShareExtAbility> TelephonyDataShareStubImpl::GetTelephonyDataAbility()
65 {
66     return telephonyDataAbility_;
67 }
68 
GetOpKeyAbility()69 std::shared_ptr<DataShareExtAbility> TelephonyDataShareStubImpl::GetOpKeyAbility()
70 {
71     std::lock_guard<std::mutex> lock(opKeyMutex_);
72     if (opKeyAbility_ == nullptr) {
73         opKeyAbility_.reset(OpKeyAbility::Create());
74     }
75     return opKeyAbility_;
76 }
77 
GetPdpProfileAbility()78 std::shared_ptr<DataShareExtAbility> TelephonyDataShareStubImpl::GetPdpProfileAbility()
79 {
80     std::lock_guard<std::mutex> lock(pdpProfileMutex_);
81     if (pdpProfileAbility_ == nullptr) {
82         pdpProfileAbility_.reset(PdpProfileAbility::Create());
83     }
84     return pdpProfileAbility_;
85 }
86 
GetSimAbility()87 std::shared_ptr<DataShareExtAbility> TelephonyDataShareStubImpl::GetSimAbility()
88 {
89     std::lock_guard<std::mutex> lock(simMutex_);
90     if (simAbility_ == nullptr) {
91         simAbility_.reset(SimAbility::Create());
92     }
93     return simAbility_;
94 }
95 
GetSmsMmsAbility()96 std::shared_ptr<DataShareExtAbility> TelephonyDataShareStubImpl::GetSmsMmsAbility()
97 {
98     std::lock_guard<std::mutex> lock(smsMmsMutex_);
99     if (smsMmsAbility_ == nullptr) {
100         smsMmsAbility_.reset(SmsMmsAbility::Create());
101     }
102     return smsMmsAbility_;
103 }
104 
GetGlobalParamsAbility()105 std::shared_ptr<DataShareExtAbility> TelephonyDataShareStubImpl::GetGlobalParamsAbility()
106 {
107     std::lock_guard<std::mutex> lock(globalParamsMutex_);
108     if (globalParamsAbility_ == nullptr) {
109         globalParamsAbility_.reset(GlobalParamsAbility::Create());
110     }
111     return globalParamsAbility_;
112 }
113 
GetOpkeyVersionAbility()114 std::shared_ptr<DataShareExtAbility> TelephonyDataShareStubImpl::GetOpkeyVersionAbility()
115 {
116     if (opkeyVersionAbility_ == nullptr) {
117         opkeyVersionAbility_.reset(OpkeyVersionAbility::Create());
118     }
119     return opkeyVersionAbility_;
120 }
121 
GetOwner(const Uri & uri)122 std::shared_ptr<DataShareExtAbility> TelephonyDataShareStubImpl::GetOwner(const Uri &uri)
123 {
124     OHOS::Uri uriTemp = uri;
125     std::string path = uriTemp.GetPath();
126     DATA_STORAGE_LOGD("GetOwner uri: %{public}s", path.c_str());
127     if (path.find("com.ohos.telephonydataability") != std::string::npos) {
128         return GetTelephonyDataAbility();
129     }
130     if (path.find("com.ohos.opkeyability") != std::string::npos) {
131         return GetOpKeyAbility();
132     }
133     if (path.find("com.ohos.pdpprofileability") != std::string::npos) {
134         return GetPdpProfileAbility();
135     }
136     if (path.find("com.ohos.simability") != std::string::npos) {
137         return GetSimAbility();
138     }
139     if (path.find("com.ohos.smsmmsability") != std::string::npos) {
140         return GetSmsMmsAbility();
141     }
142     if (path.find("com.ohos.globalparamsability") != std::string::npos) {
143         return GetGlobalParamsAbility();
144     }
145 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
146     if (path.find("com.ohos.opkeyversionability") != std::string::npos) {
147         return GetOpkeyVersionAbility();
148     }
149 #endif
150     return nullptr;
151 }
152 
Insert(const Uri & uri,const DataShareValuesBucket & value)153 int TelephonyDataShareStubImpl::Insert(const Uri &uri, const DataShareValuesBucket &value)
154 {
155     DATA_STORAGE_LOGD("Insert begin.");
156     int ret = 0;
157     auto extension = GetOwner(uri);
158     if (extension == nullptr) {
159         DATA_STORAGE_LOGE("Insert failed, extension is null.");
160         return ret;
161     }
162     ret = extension->Insert(uri, value);
163     DATA_STORAGE_LOGI("Insert end successfully. ret: %{public}d", ret);
164     if (ret != Telephony::OPERATION_ERROR) {
165         NotifyChange(uri);
166     }
167     return ret;
168 }
169 
Update(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)170 int TelephonyDataShareStubImpl::Update(const Uri &uri, const DataSharePredicates &predicates,
171     const DataShareValuesBucket &value)
172 {
173     DATA_STORAGE_LOGD("Update begin.");
174     int ret = 0;
175     auto extension = GetOwner(uri);
176     if (extension == nullptr) {
177         DATA_STORAGE_LOGE("Update failed, extension is null.");
178         return ret;
179     }
180     ret = extension->Update(uri, predicates, value);
181     if (ret != Telephony::OPERATION_OK) {
182         DATA_STORAGE_LOGE("Update end failed. ret: %{public}d", ret);
183     }
184     if (ret != Telephony::OPERATION_ERROR) {
185         NotifyChange(uri);
186     }
187     return ret;
188 }
189 
Delete(const Uri & uri,const DataSharePredicates & predicates)190 int TelephonyDataShareStubImpl::Delete(const Uri &uri, const DataSharePredicates &predicates)
191 {
192     DATA_STORAGE_LOGI("Delete begin.");
193     int ret = 0;
194     auto extension = GetOwner(uri);
195     if (extension == nullptr) {
196         DATA_STORAGE_LOGE("Delete failed, extension is null.");
197         return ret;
198     }
199     ret = extension->Delete(uri, predicates);
200     DATA_STORAGE_LOGI("Delete end successfully. ret: %{public}d", ret);
201     if (ret != Telephony::OPERATION_ERROR) {
202         NotifyChange(uri);
203     }
204     return ret;
205 }
206 
Query(const Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns,DatashareBusinessError & businessError)207 std::shared_ptr<DataShareResultSet> TelephonyDataShareStubImpl::Query(const Uri &uri,
208     const DataSharePredicates &predicates, std::vector<std::string> &columns, DatashareBusinessError &businessError)
209 {
210     DATA_STORAGE_LOGD("Query begin.");
211     auto extension = GetOwner(uri);
212     if (extension == nullptr) {
213         DATA_STORAGE_LOGE("Query failed, extension is null.");
214         return nullptr;
215     }
216     auto resultSet = extension->Query(uri, predicates, columns, businessError);
217     DATA_STORAGE_LOGD("Query end successfully.");
218     return resultSet;
219 }
220 
BatchInsert(const Uri & uri,const std::vector<DataShareValuesBucket> & values)221 int TelephonyDataShareStubImpl::BatchInsert(const Uri &uri, const std::vector<DataShareValuesBucket> &values)
222 {
223     DATA_STORAGE_LOGI("BatchInsert begin.");
224     int ret = 0;
225     auto extension = GetOwner(uri);
226     if (extension == nullptr) {
227         DATA_STORAGE_LOGE("BatchInsert failed, extension is null.");
228         return ret;
229     }
230     ret = extension->BatchInsert(uri, values);
231     DATA_STORAGE_LOGI("BatchInsert end successfully. ret: %{public}d", ret);
232     if (ret != Telephony::OPERATION_ERROR) {
233         NotifyChange(uri);
234     }
235     return ret;
236 }
237 
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)238 std::vector<std::string> TelephonyDataShareStubImpl::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
239 {
240     DATA_STORAGE_LOGI("GetFileTypes not supported.");
241     std::vector<std::string> result;
242     return result;
243 }
244 
OpenFile(const Uri & uri,const std::string & mode)245 int TelephonyDataShareStubImpl::OpenFile(const Uri &uri, const std::string &mode)
246 {
247     DATA_STORAGE_LOGI("OpenFile not supported.");
248     return -1;
249 }
250 
OpenRawFile(const Uri & uri,const std::string & mode)251 int TelephonyDataShareStubImpl::OpenRawFile(const Uri &uri, const std::string &mode)
252 {
253     DATA_STORAGE_LOGI("OpenRawFile not supported.");
254     return -1;
255 }
256 
GetType(const Uri & uri)257 std::string TelephonyDataShareStubImpl::GetType(const Uri &uri)
258 {
259     DATA_STORAGE_LOGI("GetType not supported.");
260     return "";
261 }
262 
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)263 bool TelephonyDataShareStubImpl::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
264 {
265     DATA_STORAGE_LOGD("%{public}s begin.", __func__);
266     auto obsMgrClient = DataObsMgrClient::GetInstance();
267     if (obsMgrClient == nullptr) {
268         DATA_STORAGE_LOGE("%{public}s obsMgrClient is nullptr", __func__);
269         return false;
270     }
271 
272     ErrCode ret = obsMgrClient->RegisterObserver(uri, dataObserver);
273     if (ret != ERR_OK) {
274         DATA_STORAGE_LOGE("%{public}s obsMgrClient->RegisterObserver error return %{public}d", __func__, ret);
275         return false;
276     }
277     return true;
278 }
279 
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)280 bool TelephonyDataShareStubImpl::UnregisterObserver(const Uri &uri,
281     const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
282 {
283     DATA_STORAGE_LOGI("%{public}s begin.", __func__);
284     auto obsMgrClient = DataObsMgrClient::GetInstance();
285     if (obsMgrClient == nullptr) {
286         DATA_STORAGE_LOGE("%{public}s obsMgrClient is nullptr", __func__);
287         return false;
288     }
289 
290     ErrCode ret = obsMgrClient->UnregisterObserver(uri, dataObserver);
291     if (ret != ERR_OK) {
292         DATA_STORAGE_LOGE("%{public}s obsMgrClient->UnregisterObserver error return %{public}d", __func__, ret);
293         return false;
294     }
295     return true;
296 }
297 
NotifyChange(const Uri & uri)298 bool TelephonyDataShareStubImpl::NotifyChange(const Uri &uri)
299 {
300     auto obsMgrClient = DataObsMgrClient::GetInstance();
301     if (obsMgrClient == nullptr) {
302         DATA_STORAGE_LOGE("%{public}s obsMgrClient is nullptr", __func__);
303         return false;
304     }
305 
306     ErrCode ret = obsMgrClient->NotifyChange(uri);
307     if (ret != ERR_OK) {
308         DATA_STORAGE_LOGE("%{public}s obsMgrClient->NotifyChange error return %{public}d", __func__, ret);
309         return false;
310     }
311     return true;
312 }
313 
NormalizeUri(const Uri & uri)314 Uri TelephonyDataShareStubImpl::NormalizeUri(const Uri &uri)
315 {
316     DATA_STORAGE_LOGI("NormalizeUri not supported.");
317     return uri;
318 }
319 
DenormalizeUri(const Uri & uri)320 Uri TelephonyDataShareStubImpl::DenormalizeUri(const Uri &uri)
321 {
322     DATA_STORAGE_LOGI("DenormalizeUri not supported.");
323     return uri;
324 }
325 } // namespace DataShare
326 } // namespace OHOS
327