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