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 "global_params_ability.h"
17 
18 #include "ability_context.h"
19 #include "ability_loader.h"
20 #include "abs_rdb_predicates.h"
21 #include "abs_shared_result_set.h"
22 #include "data_storage_errors.h"
23 #include "data_storage_log_wrapper.h"
24 #include "datashare_ext_ability.h"
25 #include "datashare_predicates.h"
26 #include "new"
27 #include "global_params_data.h"
28 #include "permission_util.h"
29 #include "rdb_errno.h"
30 #include "rdb_utils.h"
31 #include "telephony_datashare_stub_impl.h"
32 #include "uri.h"
33 #include "utility"
34 
35 namespace OHOS {
36 using AppExecFwk::AbilityLoader;
37 using AppExecFwk::Ability;
38 namespace Telephony {
39 static const std::map<std::string, GlobalParamsUriType> g_globalParamsTypeMap = {
40     {"/globalparams/num_matchs", GlobalParamsUriType::NUMBER_MATCHS},
41     {"/globalparams/ecc_data", GlobalParamsUriType::ECC_LIST},
42 };
43 
GlobalParamsAbility()44 GlobalParamsAbility::GlobalParamsAbility() : DataShareExtAbility() {}
45 
~GlobalParamsAbility()46 GlobalParamsAbility::~GlobalParamsAbility() {}
47 
Create()48 GlobalParamsAbility* GlobalParamsAbility::Create()
49 {
50     DATA_STORAGE_LOGD("GlobalParamsAbility::Create begin.");
51     auto self = new GlobalParamsAbility();
52     self->DoInit();
53     return self;
54 }
55 
DoInit()56 void GlobalParamsAbility::DoInit()
57 {
58     if (initDatabaseDir_ && initRdbStore_) {
59         DATA_STORAGE_LOGI("DoInit has done.");
60         return;
61     }
62     auto abilityContext = AbilityRuntime::Context::GetApplicationContext();
63     if (abilityContext == nullptr) {
64         DATA_STORAGE_LOGE("abilityContext is nullptr.");
65         return;
66     }
67     // switch database dir to el1 for init before unlock
68     abilityContext->SwitchArea(0);
69     std::string path = abilityContext->GetDatabaseDir();
70     if (!path.empty()) {
71         initDatabaseDir_ = true;
72         path.append("/");
73         helper_.UpdateDbPath(path);
74         if (helper_.Init() == NativeRdb::E_OK) {
75             initRdbStore_ = true;
76         } else {
77             DATA_STORAGE_LOGE("DoInit rdb init fail!");
78             initRdbStore_ = false;
79         }
80     } else {
81         DATA_STORAGE_LOGE("path is empty");
82         initDatabaseDir_ = false;
83     }
84 }
85 
OnConnect(const AAFwk::Want & want)86 sptr<IRemoteObject> GlobalParamsAbility::OnConnect(const AAFwk::Want &want)
87 {
88     DATA_STORAGE_LOGI("GlobalParamsAbility %{public}s begin.", __func__);
89     Extension::OnConnect(want);
90     sptr<DataShare::TelephonyDataShareStubImpl> remoteObject =
91         new (std::nothrow) DataShare::TelephonyDataShareStubImpl();
92     if (remoteObject == nullptr) {
93         DATA_STORAGE_LOGE("%{public}s No memory allocated for DataShareStubImpl", __func__);
94         return nullptr;
95     }
96     remoteObject->SetGlobalParamsAbility(std::static_pointer_cast<GlobalParamsAbility>(shared_from_this()));
97     DATA_STORAGE_LOGI("GlobalParamsAbility %{public}s end.", __func__);
98     return remoteObject->AsObject();
99 }
100 
OnStart(const AppExecFwk::Want & want)101 void GlobalParamsAbility::OnStart(const AppExecFwk::Want &want)
102 {
103     DATA_STORAGE_LOGI("GlobalParamsAbility::OnStart");
104     Extension::OnStart(want);
105     DoInit();
106 }
107 
Insert(const Uri & uri,const DataShare::DataShareValuesBucket & value)108 int32_t GlobalParamsAbility::Insert(const Uri &uri, const DataShare::DataShareValuesBucket &value)
109 {
110     if (!PermissionUtil::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
111         DATA_STORAGE_LOGE("Permission denied!");
112         return DATA_STORAGE_ERR_PERMISSION_ERR;
113     }
114     if (!IsInitOk()) {
115         return DATA_STORAGE_ERROR;
116     }
117     DATA_STORAGE_LOGE("GlobalParamsAbility::The insert capability is not supported.");
118     return DATA_STORAGE_ERROR;
119 }
120 
Query(const Uri & uri,const DataShare::DataSharePredicates & predicates,std::vector<std::string> & columns,DataShare::DatashareBusinessError & businessError)121 std::shared_ptr<DataShare::DataShareResultSet> GlobalParamsAbility::Query(const Uri &uri,
122     const DataShare::DataSharePredicates &predicates, std::vector<std::string> &columns,
123     DataShare::DatashareBusinessError &businessError)
124 {
125     if (!PermissionUtil::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
126         DATA_STORAGE_LOGE("Permission denied!");
127         return nullptr;
128     }
129     std::shared_ptr<DataShare::DataShareResultSet> sharedPtrResult = nullptr;
130     if (!IsInitOk()) {
131         return nullptr;
132     }
133     Uri tempUri = uri;
134     GlobalParamsUriType globalParamsUriType = ParseUriType(tempUri);
135     NativeRdb::AbsRdbPredicates *absRdbPredicates = nullptr;
136     switch (globalParamsUriType) {
137         case GlobalParamsUriType::NUMBER_MATCHS: {
138             absRdbPredicates = new NativeRdb::AbsRdbPredicates(TABLE_NUMBER_MATCH);
139             break;
140         }
141         case GlobalParamsUriType::ECC_LIST: {
142             absRdbPredicates = new NativeRdb::AbsRdbPredicates(TABLE_ECC_DATA);
143             break;
144         }
145         default:
146             DATA_STORAGE_LOGE("GlobalParamsAbility::Query failed##uri = %{public}s", uri.ToString().c_str());
147             break;
148     }
149     if (absRdbPredicates != nullptr) {
150         NativeRdb::RdbPredicates rdbPredicates = ConvertPredicates(absRdbPredicates->GetTableName(), predicates);
151         auto result = helper_.Query(rdbPredicates, columns);
152         if (result == nullptr) {
153             DATA_STORAGE_LOGE("GlobalParamsAbility::Query  NativeRdb::ResultSet is null!");
154             delete absRdbPredicates;
155             absRdbPredicates = nullptr;
156             return nullptr;
157         }
158         auto queryResultSet = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(result);
159         sharedPtrResult = std::make_shared<DataShare::DataShareResultSet>(queryResultSet);
160         delete absRdbPredicates;
161         absRdbPredicates = nullptr;
162     } else {
163         DATA_STORAGE_LOGE("GlobalParamsAbility::Query##uri = %{public}s", uri.ToString().c_str());
164     }
165     return sharedPtrResult;
166 }
167 
Update(const Uri & uri,const DataShare::DataSharePredicates & predicates,const DataShare::DataShareValuesBucket & value)168 int GlobalParamsAbility::Update(
169     const Uri &uri, const DataShare::DataSharePredicates &predicates,
170     const DataShare::DataShareValuesBucket &value)
171 {
172     if (!PermissionUtil::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
173         DATA_STORAGE_LOGE("Permission denied!");
174         return DATA_STORAGE_ERR_PERMISSION_ERR;
175     }
176     int result = DATA_STORAGE_ERROR;
177     if (!IsInitOk()) {
178         return result;
179     }
180     DATA_STORAGE_LOGE("GlobalParamsAbility::The update capability is not supported.");
181     return result;
182 }
183 
Delete(const Uri & uri,const DataShare::DataSharePredicates & predicates)184 int GlobalParamsAbility::Delete(const Uri &uri, const DataShare::DataSharePredicates &predicates)
185 {
186     if (!PermissionUtil::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
187         DATA_STORAGE_LOGE("Permission denied!");
188         return DATA_STORAGE_ERR_PERMISSION_ERR;
189     }
190     int result = DATA_STORAGE_ERROR;
191     if (!IsInitOk()) {
192         return result;
193     }
194     DATA_STORAGE_LOGE("GlobalParamsAbility::The delete capability is not supported.");
195     return result;
196 }
197 
IsInitOk()198 bool GlobalParamsAbility::IsInitOk()
199 {
200     if (!initDatabaseDir_) {
201         DATA_STORAGE_LOGE("GlobalParamsAbility::IsInitOk initDatabaseDir_ failed!");
202         return false;
203     }
204     if (!initRdbStore_) {
205         DATA_STORAGE_LOGE("GlobalParamsAbility::IsInitOk initRdbStore_ failed!");
206         return false;
207     }
208     return true;
209 }
210 
GetType(const Uri & uri)211 std::string GlobalParamsAbility::GetType(const Uri &uri)
212 {
213     DATA_STORAGE_LOGI("GlobalParamsAbility::GetType##uri = %{public}s", uri.ToString().c_str());
214     std::string retval(uri.ToString());
215     return retval;
216 }
217 
OpenFile(const Uri & uri,const std::string & mode)218 int GlobalParamsAbility::OpenFile(const Uri &uri, const std::string &mode)
219 {
220     DATA_STORAGE_LOGI("GlobalParamsAbility::OpenFile##uri = %{public}s", uri.ToString().c_str());
221     Uri tempUri = uri;
222     GlobalParamsUriType globalParamsUriType = ParseUriType(tempUri);
223     return static_cast<int>(globalParamsUriType);
224 }
225 
ParseUriType(Uri & uri)226 GlobalParamsUriType GlobalParamsAbility::ParseUriType(Uri &uri)
227 {
228     DATA_STORAGE_LOGD("GlobalParamsAbility::ParseUriType start");
229     GlobalParamsUriType globalParamsUriType = GlobalParamsUriType::UNKNOW;
230     std::string uriPath = uri.ToString();
231     if (!uriPath.empty()) {
232         helper_.ReplaceAllStr(uriPath, ":///", "://");
233         Uri tempUri(uriPath);
234         std::string path = tempUri.GetPath();
235         if (!path.empty() && !g_globalParamsTypeMap.empty()) {
236             auto it = g_globalParamsTypeMap.find(path);
237             if (it != g_globalParamsTypeMap.end()) {
238                 globalParamsUriType = it->second;
239                 DATA_STORAGE_LOGD(
240                     "GlobalParamsAbility::ParseUriType##globalParamsUriType = %{public}d", globalParamsUriType);
241             }
242         }
243     }
244     return globalParamsUriType;
245 }
246 
ConvertPredicates(const std::string & tableName,const DataShare::DataSharePredicates & predicates)247 OHOS::NativeRdb::RdbPredicates GlobalParamsAbility::ConvertPredicates(
248     const std::string &tableName, const DataShare::DataSharePredicates &predicates)
249 {
250     OHOS::NativeRdb::RdbPredicates res = RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, tableName);
251     return res;
252 }
253 } // namespace Telephony
254 } // namespace OHOS
255