125c1cde8Sopenharmony_ci/* 225c1cde8Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 325c1cde8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 425c1cde8Sopenharmony_ci * you may not use this file except in compliance with the License. 525c1cde8Sopenharmony_ci * You may obtain a copy of the License at 625c1cde8Sopenharmony_ci * 725c1cde8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 825c1cde8Sopenharmony_ci * 925c1cde8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1025c1cde8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1125c1cde8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1225c1cde8Sopenharmony_ci * See the License for the specific language governing permissions and 1325c1cde8Sopenharmony_ci * limitations under the License. 1425c1cde8Sopenharmony_ci */ 1525c1cde8Sopenharmony_ci 1625c1cde8Sopenharmony_ci#include "pdp_profile_ability.h" 1725c1cde8Sopenharmony_ci 1825c1cde8Sopenharmony_ci#include "ability_context.h" 1925c1cde8Sopenharmony_ci#include "ability_loader.h" 2025c1cde8Sopenharmony_ci#include "abs_rdb_predicates.h" 2125c1cde8Sopenharmony_ci#include "abs_shared_result_set.h" 2225c1cde8Sopenharmony_ci#include "core_service_client.h" 2325c1cde8Sopenharmony_ci#include "data_storage_errors.h" 2425c1cde8Sopenharmony_ci#include "data_storage_log_wrapper.h" 2525c1cde8Sopenharmony_ci#include "datashare_ext_ability.h" 2625c1cde8Sopenharmony_ci#include "datashare_predicates.h" 2725c1cde8Sopenharmony_ci#include "new" 2825c1cde8Sopenharmony_ci#include "pdp_profile_data.h" 2925c1cde8Sopenharmony_ci#include "permission_util.h" 3025c1cde8Sopenharmony_ci#include "preferences_util.h" 3125c1cde8Sopenharmony_ci#include "rdb_errno.h" 3225c1cde8Sopenharmony_ci#include "rdb_utils.h" 3325c1cde8Sopenharmony_ci#include "string_ex.h" 3425c1cde8Sopenharmony_ci#include "telephony_datashare_stub_impl.h" 3525c1cde8Sopenharmony_ci#include "uri.h" 3625c1cde8Sopenharmony_ci#include "utility" 3725c1cde8Sopenharmony_ci 3825c1cde8Sopenharmony_cinamespace OHOS { 3925c1cde8Sopenharmony_ciusing AppExecFwk::Ability; 4025c1cde8Sopenharmony_ciusing AppExecFwk::AbilityLoader; 4125c1cde8Sopenharmony_cinamespace Telephony { 4225c1cde8Sopenharmony_ciconst int32_t CHANGED_ROWS = 0; 4325c1cde8Sopenharmony_cistatic const std::map<std::string, PdpProfileUriType> pdpProfileUriMap_ = { 4425c1cde8Sopenharmony_ci { "/net/pdp_profile", PdpProfileUriType::PDP_PROFILE }, 4525c1cde8Sopenharmony_ci { "/net/pdp_profile/init", PdpProfileUriType::INIT}, 4625c1cde8Sopenharmony_ci { "/net/pdp_profile/reset", PdpProfileUriType::RESET }, 4725c1cde8Sopenharmony_ci { "/net/pdp_profile/preferapn", PdpProfileUriType::PREFER_APN }, 4825c1cde8Sopenharmony_ci}; 4925c1cde8Sopenharmony_ci 5025c1cde8Sopenharmony_ciPdpProfileAbility::PdpProfileAbility() : DataShareExtAbility() {} 5125c1cde8Sopenharmony_ci 5225c1cde8Sopenharmony_ciPdpProfileAbility::~PdpProfileAbility() {} 5325c1cde8Sopenharmony_ci 5425c1cde8Sopenharmony_ciPdpProfileAbility* PdpProfileAbility::Create() 5525c1cde8Sopenharmony_ci{ 5625c1cde8Sopenharmony_ci DATA_STORAGE_LOGD("PdpProfileAbility::Create begin."); 5725c1cde8Sopenharmony_ci auto self = new PdpProfileAbility(); 5825c1cde8Sopenharmony_ci self->DoInit(); 5925c1cde8Sopenharmony_ci return self; 6025c1cde8Sopenharmony_ci} 6125c1cde8Sopenharmony_ci 6225c1cde8Sopenharmony_civoid PdpProfileAbility::DoInit() 6325c1cde8Sopenharmony_ci{ 6425c1cde8Sopenharmony_ci if (initDatabaseDir && initRdbStore) { 6525c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("DoInit has done"); 6625c1cde8Sopenharmony_ci return; 6725c1cde8Sopenharmony_ci } 6825c1cde8Sopenharmony_ci auto abilityContext = AbilityRuntime::Context::GetApplicationContext(); 6925c1cde8Sopenharmony_ci if (abilityContext == nullptr) { 7025c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("DoInit GetAbilityContext is null"); 7125c1cde8Sopenharmony_ci return; 7225c1cde8Sopenharmony_ci } 7325c1cde8Sopenharmony_ci // switch database dir to el1 for init before unlock 7425c1cde8Sopenharmony_ci abilityContext->SwitchArea(0); 7525c1cde8Sopenharmony_ci std::string path = abilityContext->GetDatabaseDir(); 7625c1cde8Sopenharmony_ci if (!path.empty()) { 7725c1cde8Sopenharmony_ci initDatabaseDir = true; 7825c1cde8Sopenharmony_ci path.append("/"); 7925c1cde8Sopenharmony_ci helper_.UpdateDbPath(path); 8025c1cde8Sopenharmony_ci int rdbInitCode = helper_.Init(); 8125c1cde8Sopenharmony_ci if (rdbInitCode == NativeRdb::E_OK) { 8225c1cde8Sopenharmony_ci initRdbStore = true; 8325c1cde8Sopenharmony_ci } else { 8425c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("DoInit rdb init fail!"); 8525c1cde8Sopenharmony_ci initRdbStore = false; 8625c1cde8Sopenharmony_ci } 8725c1cde8Sopenharmony_ci } else { 8825c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("DoInit##databaseDir is empty!"); 8925c1cde8Sopenharmony_ci initDatabaseDir = false; 9025c1cde8Sopenharmony_ci } 9125c1cde8Sopenharmony_ci} 9225c1cde8Sopenharmony_ci 9325c1cde8Sopenharmony_cisptr<IRemoteObject> PdpProfileAbility::OnConnect(const AAFwk::Want &want) 9425c1cde8Sopenharmony_ci{ 9525c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("PdpProfileAbility %{public}s begin.", __func__); 9625c1cde8Sopenharmony_ci Extension::OnConnect(want); 9725c1cde8Sopenharmony_ci sptr<DataShare::TelephonyDataShareStubImpl> remoteObject = 9825c1cde8Sopenharmony_ci new (std::nothrow) DataShare::TelephonyDataShareStubImpl(); 9925c1cde8Sopenharmony_ci if (remoteObject == nullptr) { 10025c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("%{public}s No memory allocated for DataShareStubImpl", __func__); 10125c1cde8Sopenharmony_ci return nullptr; 10225c1cde8Sopenharmony_ci } 10325c1cde8Sopenharmony_ci remoteObject->SetPdpProfileAbility(std::static_pointer_cast<PdpProfileAbility>(shared_from_this())); 10425c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("PdpProfileAbility %{public}s end.", __func__); 10525c1cde8Sopenharmony_ci return remoteObject->AsObject(); 10625c1cde8Sopenharmony_ci} 10725c1cde8Sopenharmony_ci 10825c1cde8Sopenharmony_civoid PdpProfileAbility::OnStart(const AppExecFwk::Want &want) 10925c1cde8Sopenharmony_ci{ 11025c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("PdpProfileAbility::OnStart"); 11125c1cde8Sopenharmony_ci Extension::OnStart(want); 11225c1cde8Sopenharmony_ci DoInit(); 11325c1cde8Sopenharmony_ci} 11425c1cde8Sopenharmony_ci 11525c1cde8Sopenharmony_ciint PdpProfileAbility::BatchInsert(const Uri &uri, const std::vector<DataShare::DataShareValuesBucket> &values) 11625c1cde8Sopenharmony_ci{ 11725c1cde8Sopenharmony_ci if (!PermissionUtil::CheckPermission(Permission::SET_TELEPHONY_STATE)) { 11825c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("Permission denied!"); 11925c1cde8Sopenharmony_ci return DATA_STORAGE_ERR_PERMISSION_ERR; 12025c1cde8Sopenharmony_ci } 12125c1cde8Sopenharmony_ci if (!IsInitOk()) { 12225c1cde8Sopenharmony_ci return DATA_STORAGE_ERROR; 12325c1cde8Sopenharmony_ci } 12425c1cde8Sopenharmony_ci Uri tempUri = uri; 12525c1cde8Sopenharmony_ci PdpProfileUriType pdpProfileUriType = ParseUriType(tempUri); 12625c1cde8Sopenharmony_ci int result = DATA_STORAGE_ERROR; 12725c1cde8Sopenharmony_ci if (pdpProfileUriType == PdpProfileUriType::INIT && !values.empty()) { 12825c1cde8Sopenharmony_ci for (const auto &item : values) { 12925c1cde8Sopenharmony_ci OHOS::NativeRdb::ValuesBucket valuesBucket = RdbDataShareAdapter::RdbUtils::ToValuesBucket(item); 13025c1cde8Sopenharmony_ci int slotId = 0; 13125c1cde8Sopenharmony_ci if (GetIntFromValuesBucket(valuesBucket, "slotId", slotId) != NativeRdb::E_OK) { 13225c1cde8Sopenharmony_ci continue; 13325c1cde8Sopenharmony_ci } 13425c1cde8Sopenharmony_ci std::string opkey; 13525c1cde8Sopenharmony_ci GetTargetOpkey(slotId, opkey); 13625c1cde8Sopenharmony_ci result = helper_.InitAPNDatabase(slotId, opkey, true); 13725c1cde8Sopenharmony_ci DATA_STORAGE_LOGI( 13825c1cde8Sopenharmony_ci "PdpProfileAbility::BatchInsert INIT, slotId = %{public}d, result = %{public}d", slotId, result); 13925c1cde8Sopenharmony_ci } 14025c1cde8Sopenharmony_ci } 14125c1cde8Sopenharmony_ci return result; 14225c1cde8Sopenharmony_ci} 14325c1cde8Sopenharmony_ci 14425c1cde8Sopenharmony_ciint PdpProfileAbility::Insert(const Uri &uri, const DataShare::DataShareValuesBucket &value) 14525c1cde8Sopenharmony_ci{ 14625c1cde8Sopenharmony_ci if (!PermissionUtil::CheckPermission(Permission::SET_TELEPHONY_STATE)) { 14725c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("Permission denied!"); 14825c1cde8Sopenharmony_ci return DATA_STORAGE_ERR_PERMISSION_ERR; 14925c1cde8Sopenharmony_ci } 15025c1cde8Sopenharmony_ci if (!IsInitOk()) { 15125c1cde8Sopenharmony_ci return DATA_STORAGE_ERROR; 15225c1cde8Sopenharmony_ci } 15325c1cde8Sopenharmony_ci std::lock_guard<std::mutex> guard(lock_); 15425c1cde8Sopenharmony_ci Uri tempUri = uri; 15525c1cde8Sopenharmony_ci PdpProfileUriType pdpProfileUriType = ParseUriType(tempUri); 15625c1cde8Sopenharmony_ci int64_t id = DATA_STORAGE_ERROR; 15725c1cde8Sopenharmony_ci if (pdpProfileUriType == PdpProfileUriType::PDP_PROFILE) { 15825c1cde8Sopenharmony_ci OHOS::NativeRdb::ValuesBucket values = RdbDataShareAdapter::RdbUtils::ToValuesBucket(value); 15925c1cde8Sopenharmony_ci helper_.Insert(id, values, TABLE_PDP_PROFILE); 16025c1cde8Sopenharmony_ci } else { 16125c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::Insert##uri = %{public}s", uri.ToString().c_str()); 16225c1cde8Sopenharmony_ci } 16325c1cde8Sopenharmony_ci return id; 16425c1cde8Sopenharmony_ci} 16525c1cde8Sopenharmony_ci 16625c1cde8Sopenharmony_cistd::string PdpProfileAbility::GetQueryKey(const std::string &queryString, const std::string &key) 16725c1cde8Sopenharmony_ci{ 16825c1cde8Sopenharmony_ci size_t pos = queryString.find(key); 16925c1cde8Sopenharmony_ci if (pos != std::string::npos) { 17025c1cde8Sopenharmony_ci return queryString.substr(pos + key.length()); 17125c1cde8Sopenharmony_ci } 17225c1cde8Sopenharmony_ci return ""; 17325c1cde8Sopenharmony_ci} 17425c1cde8Sopenharmony_ci 17525c1cde8Sopenharmony_ciint PdpProfileAbility::GetPreferApn(const std::string &queryString) 17625c1cde8Sopenharmony_ci{ 17725c1cde8Sopenharmony_ci auto preferencesUtil = DelayedSingleton<PreferencesUtil>::GetInstance(); 17825c1cde8Sopenharmony_ci if (preferencesUtil == nullptr) { 17925c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("preferencesUtil is nullptr!"); 18025c1cde8Sopenharmony_ci return NativePreferences::E_ERROR; 18125c1cde8Sopenharmony_ci } 18225c1cde8Sopenharmony_ci int preferApnId = preferencesUtil->ObtainInt(PREFER_APN_ID + GetQueryKey(queryString, "simId="), 18325c1cde8Sopenharmony_ci INVALID_PROFILE_ID); 18425c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("%{public}d.", preferApnId); 18525c1cde8Sopenharmony_ci return preferApnId; 18625c1cde8Sopenharmony_ci} 18725c1cde8Sopenharmony_ci 18825c1cde8Sopenharmony_ciint PdpProfileAbility::SetPreferApn(int simId, int profileId) 18925c1cde8Sopenharmony_ci{ 19025c1cde8Sopenharmony_ci auto preferencesUtil = DelayedSingleton<PreferencesUtil>::GetInstance(); 19125c1cde8Sopenharmony_ci if (preferencesUtil == nullptr) { 19225c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("preferencesUtil is nullptr!"); 19325c1cde8Sopenharmony_ci return NativePreferences::E_ERROR; 19425c1cde8Sopenharmony_ci } 19525c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("simId:%{public}d profileId:%{public}d", simId, profileId); 19625c1cde8Sopenharmony_ci return preferencesUtil->SaveInt(PREFER_APN_ID + std::to_string(simId), profileId); 19725c1cde8Sopenharmony_ci} 19825c1cde8Sopenharmony_ci 19925c1cde8Sopenharmony_cistd::shared_ptr<DataShare::DataShareResultSet> PdpProfileAbility::Query(const Uri &uri, 20025c1cde8Sopenharmony_ci const DataShare::DataSharePredicates &predicates, std::vector<std::string> &columns, 20125c1cde8Sopenharmony_ci DataShare::DatashareBusinessError &businessError) 20225c1cde8Sopenharmony_ci{ 20325c1cde8Sopenharmony_ci if (!PermissionUtil::CheckPermission(Permission::GET_TELEPHONY_STATE)) { 20425c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("Permission denied!"); 20525c1cde8Sopenharmony_ci return nullptr; 20625c1cde8Sopenharmony_ci } 20725c1cde8Sopenharmony_ci std::shared_ptr<DataShare::DataShareResultSet> sharedPtrResult = nullptr; 20825c1cde8Sopenharmony_ci if (!IsInitOk()) { 20925c1cde8Sopenharmony_ci return nullptr; 21025c1cde8Sopenharmony_ci } 21125c1cde8Sopenharmony_ci Uri tempUri = uri; 21225c1cde8Sopenharmony_ci PdpProfileUriType pdpProfileUriType = ParseUriType(tempUri); 21325c1cde8Sopenharmony_ci if (pdpProfileUriType == PdpProfileUriType::PDP_PROFILE || pdpProfileUriType == PdpProfileUriType::PREFER_APN) { 21425c1cde8Sopenharmony_ci NativeRdb::AbsRdbPredicates *absRdbPredicates = new NativeRdb::AbsRdbPredicates(TABLE_PDP_PROFILE); 21525c1cde8Sopenharmony_ci if (absRdbPredicates == nullptr) { 21625c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::Query NativeRdb::AbsRdbPredicates is null!"); 21725c1cde8Sopenharmony_ci return sharedPtrResult; 21825c1cde8Sopenharmony_ci } 21925c1cde8Sopenharmony_ci std::shared_ptr<NativeRdb::ResultSet> result = nullptr; 22025c1cde8Sopenharmony_ci if (pdpProfileUriType == PdpProfileUriType::PREFER_APN) { 22125c1cde8Sopenharmony_ci DataShare::DataSharePredicates preferapnPredicates; 22225c1cde8Sopenharmony_ci preferapnPredicates.EqualTo(PdpProfileData::PROFILE_ID, GetPreferApn(tempUri.GetQuery())); 22325c1cde8Sopenharmony_ci result = helper_.Query(ConvertPredicates(absRdbPredicates->GetTableName(), preferapnPredicates), columns); 22425c1cde8Sopenharmony_ci } else if (pdpProfileUriType == PdpProfileUriType::PDP_PROFILE) { 22525c1cde8Sopenharmony_ci result = QueryPdpProfile(tempUri, absRdbPredicates->GetTableName(), predicates, columns); 22625c1cde8Sopenharmony_ci } 22725c1cde8Sopenharmony_ci if (result == nullptr) { 22825c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::Query NativeRdb::ResultSet is null!"); 22925c1cde8Sopenharmony_ci delete absRdbPredicates; 23025c1cde8Sopenharmony_ci return nullptr; 23125c1cde8Sopenharmony_ci } 23225c1cde8Sopenharmony_ci auto queryResultSet = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(result); 23325c1cde8Sopenharmony_ci sharedPtrResult = std::make_shared<DataShare::DataShareResultSet>(queryResultSet); 23425c1cde8Sopenharmony_ci delete absRdbPredicates; 23525c1cde8Sopenharmony_ci return sharedPtrResult; 23625c1cde8Sopenharmony_ci } 23725c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::Query##uri = %{public}s", uri.ToString().c_str()); 23825c1cde8Sopenharmony_ci return sharedPtrResult; 23925c1cde8Sopenharmony_ci} 24025c1cde8Sopenharmony_ci 24125c1cde8Sopenharmony_ciint PdpProfileAbility::Update( 24225c1cde8Sopenharmony_ci const Uri &uri, const DataShare::DataSharePredicates &predicates, 24325c1cde8Sopenharmony_ci const DataShare::DataShareValuesBucket &value) 24425c1cde8Sopenharmony_ci{ 24525c1cde8Sopenharmony_ci if (!PermissionUtil::CheckPermission(Permission::SET_TELEPHONY_STATE)) { 24625c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("Permission denied!"); 24725c1cde8Sopenharmony_ci return DATA_STORAGE_ERR_PERMISSION_ERR; 24825c1cde8Sopenharmony_ci } 24925c1cde8Sopenharmony_ci int result = DATA_STORAGE_ERROR; 25025c1cde8Sopenharmony_ci if (!IsInitOk()) { 25125c1cde8Sopenharmony_ci return result; 25225c1cde8Sopenharmony_ci } 25325c1cde8Sopenharmony_ci std::lock_guard<std::mutex> guard(lock_); 25425c1cde8Sopenharmony_ci Uri tempUri = uri; 25525c1cde8Sopenharmony_ci PdpProfileUriType pdpProfileUriType = ParseUriType(tempUri); 25625c1cde8Sopenharmony_ci NativeRdb::AbsRdbPredicates *absRdbPredicates = nullptr; 25725c1cde8Sopenharmony_ci switch (pdpProfileUriType) { 25825c1cde8Sopenharmony_ci case PdpProfileUriType::PDP_PROFILE: { 25925c1cde8Sopenharmony_ci absRdbPredicates = new NativeRdb::AbsRdbPredicates(TABLE_PDP_PROFILE); 26025c1cde8Sopenharmony_ci break; 26125c1cde8Sopenharmony_ci } 26225c1cde8Sopenharmony_ci case PdpProfileUriType::RESET: { 26325c1cde8Sopenharmony_ci result = ResetApn(value); 26425c1cde8Sopenharmony_ci if (result != NativeRdb::E_OK) { 26525c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::Update ResetApn fail!"); 26625c1cde8Sopenharmony_ci result = static_cast<int>(LoadProFileErrorType::RESET_APN_FAIL); 26725c1cde8Sopenharmony_ci } 26825c1cde8Sopenharmony_ci break; 26925c1cde8Sopenharmony_ci } 27025c1cde8Sopenharmony_ci case PdpProfileUriType::PREFER_APN: { 27125c1cde8Sopenharmony_ci result = (UpdatePreferApn(value) == NativeRdb::E_OK) 27225c1cde8Sopenharmony_ci ? NativeRdb::E_OK 27325c1cde8Sopenharmony_ci : static_cast<int>(LoadProFileErrorType::PREFER_APN_FAIL); 27425c1cde8Sopenharmony_ci break; 27525c1cde8Sopenharmony_ci } 27625c1cde8Sopenharmony_ci default: 27725c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::Update##uri = %{public}s", uri.ToString().c_str()); 27825c1cde8Sopenharmony_ci break; 27925c1cde8Sopenharmony_ci } 28025c1cde8Sopenharmony_ci if (absRdbPredicates != nullptr) { 28125c1cde8Sopenharmony_ci int changedRows = CHANGED_ROWS; 28225c1cde8Sopenharmony_ci NativeRdb::RdbPredicates rdbPredicates = ConvertPredicates(absRdbPredicates->GetTableName(), predicates); 28325c1cde8Sopenharmony_ci OHOS::NativeRdb::ValuesBucket values = RdbDataShareAdapter::RdbUtils::ToValuesBucket(value); 28425c1cde8Sopenharmony_ci result = helper_.Update(changedRows, values, rdbPredicates); 28525c1cde8Sopenharmony_ci delete absRdbPredicates; 28625c1cde8Sopenharmony_ci absRdbPredicates = nullptr; 28725c1cde8Sopenharmony_ci } else if (result == DATA_STORAGE_ERROR) { 28825c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::Update NativeRdb::AbsRdbPredicates is null!"); 28925c1cde8Sopenharmony_ci } 29025c1cde8Sopenharmony_ci return result; 29125c1cde8Sopenharmony_ci} 29225c1cde8Sopenharmony_ci 29325c1cde8Sopenharmony_ciint PdpProfileAbility::UpdatePreferApn(const DataShare::DataShareValuesBucket &sharedValue) 29425c1cde8Sopenharmony_ci{ 29525c1cde8Sopenharmony_ci OHOS::NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(sharedValue); 29625c1cde8Sopenharmony_ci int result = DATA_STORAGE_ERROR; 29725c1cde8Sopenharmony_ci NativeRdb::ValueObject valueObject; 29825c1cde8Sopenharmony_ci if (!HasColumnValue(value, PdpProfileData::PROFILE_ID, valueObject)) { 29925c1cde8Sopenharmony_ci return result; 30025c1cde8Sopenharmony_ci } 30125c1cde8Sopenharmony_ci double temp = 0; 30225c1cde8Sopenharmony_ci int profileId = INVALID_PROFILE_ID; 30325c1cde8Sopenharmony_ci if (valueObject.GetDouble(temp) == NativeRdb::E_OK) { 30425c1cde8Sopenharmony_ci profileId = ceil(temp); 30525c1cde8Sopenharmony_ci } 30625c1cde8Sopenharmony_ci if (!HasColumnValue(value, PdpProfileData::SIM_ID, valueObject)) { 30725c1cde8Sopenharmony_ci return result; 30825c1cde8Sopenharmony_ci } 30925c1cde8Sopenharmony_ci int simId = DEFAULT_SIM_ID; 31025c1cde8Sopenharmony_ci if (valueObject.GetDouble(temp) == NativeRdb::E_OK) { 31125c1cde8Sopenharmony_ci simId = ceil(temp); 31225c1cde8Sopenharmony_ci } 31325c1cde8Sopenharmony_ci return SetPreferApn(simId, profileId); 31425c1cde8Sopenharmony_ci} 31525c1cde8Sopenharmony_ci 31625c1cde8Sopenharmony_cibool PdpProfileAbility::HasColumnValue( 31725c1cde8Sopenharmony_ci const OHOS::NativeRdb::ValuesBucket &value, const char *columnName, NativeRdb::ValueObject &valueObject) 31825c1cde8Sopenharmony_ci{ 31925c1cde8Sopenharmony_ci if (!value.HasColumn(columnName)) { 32025c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("the column in valuesBucket does not exist!"); 32125c1cde8Sopenharmony_ci return false; 32225c1cde8Sopenharmony_ci } 32325c1cde8Sopenharmony_ci bool isExistValue = value.GetObject(columnName, valueObject); 32425c1cde8Sopenharmony_ci if (!isExistValue) { 32525c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("failed to get value in valuesBucket!"); 32625c1cde8Sopenharmony_ci return false; 32725c1cde8Sopenharmony_ci } 32825c1cde8Sopenharmony_ci return true; 32925c1cde8Sopenharmony_ci} 33025c1cde8Sopenharmony_ci 33125c1cde8Sopenharmony_ciint PdpProfileAbility::Delete(const Uri &uri, const DataShare::DataSharePredicates &predicates) 33225c1cde8Sopenharmony_ci{ 33325c1cde8Sopenharmony_ci if (!PermissionUtil::CheckPermission(Permission::SET_TELEPHONY_STATE)) { 33425c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("Permission denied!"); 33525c1cde8Sopenharmony_ci return DATA_STORAGE_ERR_PERMISSION_ERR; 33625c1cde8Sopenharmony_ci } 33725c1cde8Sopenharmony_ci int result = DATA_STORAGE_ERROR; 33825c1cde8Sopenharmony_ci if (!IsInitOk()) { 33925c1cde8Sopenharmony_ci return result; 34025c1cde8Sopenharmony_ci } 34125c1cde8Sopenharmony_ci std::lock_guard<std::mutex> guard(lock_); 34225c1cde8Sopenharmony_ci Uri tempUri = uri; 34325c1cde8Sopenharmony_ci PdpProfileUriType pdpProfileUriType = ParseUriType(tempUri); 34425c1cde8Sopenharmony_ci if (pdpProfileUriType == PdpProfileUriType::PDP_PROFILE) { 34525c1cde8Sopenharmony_ci NativeRdb::AbsRdbPredicates *absRdbPredicates = new NativeRdb::AbsRdbPredicates(TABLE_PDP_PROFILE); 34625c1cde8Sopenharmony_ci if (absRdbPredicates != nullptr) { 34725c1cde8Sopenharmony_ci NativeRdb::RdbPredicates rdbPredicates = ConvertPredicates(absRdbPredicates->GetTableName(), predicates); 34825c1cde8Sopenharmony_ci int deletedRows = CHANGED_ROWS; 34925c1cde8Sopenharmony_ci result = helper_.Delete(deletedRows, rdbPredicates); 35025c1cde8Sopenharmony_ci delete absRdbPredicates; 35125c1cde8Sopenharmony_ci absRdbPredicates = nullptr; 35225c1cde8Sopenharmony_ci } else { 35325c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::Delete NativeRdb::AbsRdbPredicates is null!"); 35425c1cde8Sopenharmony_ci } 35525c1cde8Sopenharmony_ci } else { 35625c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("PdpProfileAbility::Delete##uri = %{public}s", uri.ToString().c_str()); 35725c1cde8Sopenharmony_ci } 35825c1cde8Sopenharmony_ci return result; 35925c1cde8Sopenharmony_ci} 36025c1cde8Sopenharmony_ci 36125c1cde8Sopenharmony_cibool PdpProfileAbility::IsInitOk() 36225c1cde8Sopenharmony_ci{ 36325c1cde8Sopenharmony_ci if (!initDatabaseDir) { 36425c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::IsInitOk initDatabaseDir failed!"); 36525c1cde8Sopenharmony_ci return false; 36625c1cde8Sopenharmony_ci } 36725c1cde8Sopenharmony_ci if (!initRdbStore) { 36825c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::IsInitOk initRdbStore failed!"); 36925c1cde8Sopenharmony_ci return false; 37025c1cde8Sopenharmony_ci } 37125c1cde8Sopenharmony_ci return true; 37225c1cde8Sopenharmony_ci} 37325c1cde8Sopenharmony_ci 37425c1cde8Sopenharmony_cistd::string PdpProfileAbility::GetType(const Uri &uri) 37525c1cde8Sopenharmony_ci{ 37625c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("PdpProfileAbility::GetType##uri = %{public}s", uri.ToString().c_str()); 37725c1cde8Sopenharmony_ci std::string retval(uri.ToString()); 37825c1cde8Sopenharmony_ci return retval; 37925c1cde8Sopenharmony_ci} 38025c1cde8Sopenharmony_ci 38125c1cde8Sopenharmony_ciint PdpProfileAbility::OpenFile(const Uri &uri, const std::string &mode) 38225c1cde8Sopenharmony_ci{ 38325c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("PdpProfileAbility::OpenFile##uri = %{public}s", uri.ToString().c_str()); 38425c1cde8Sopenharmony_ci Uri tempUri = uri; 38525c1cde8Sopenharmony_ci PdpProfileUriType pdpProfileUriType = ParseUriType(tempUri); 38625c1cde8Sopenharmony_ci return static_cast<int>(pdpProfileUriType); 38725c1cde8Sopenharmony_ci} 38825c1cde8Sopenharmony_ci 38925c1cde8Sopenharmony_ciPdpProfileUriType PdpProfileAbility::ParseUriType(Uri &uri) 39025c1cde8Sopenharmony_ci{ 39125c1cde8Sopenharmony_ci DATA_STORAGE_LOGD("PdpProfileAbility::ParseUriType start"); 39225c1cde8Sopenharmony_ci PdpProfileUriType pdpProfileUriType = PdpProfileUriType::UNKNOW; 39325c1cde8Sopenharmony_ci std::string uriPath = uri.ToString(); 39425c1cde8Sopenharmony_ci if (!uriPath.empty()) { 39525c1cde8Sopenharmony_ci helper_.ReplaceAllStr(uriPath, ":///", "://"); 39625c1cde8Sopenharmony_ci Uri tempUri(uriPath); 39725c1cde8Sopenharmony_ci std::string path = tempUri.GetPath(); 39825c1cde8Sopenharmony_ci if (!path.empty() && !pdpProfileUriMap_.empty()) { 39925c1cde8Sopenharmony_ci auto it = pdpProfileUriMap_.find(path); 40025c1cde8Sopenharmony_ci if (it != pdpProfileUriMap_.end()) { 40125c1cde8Sopenharmony_ci pdpProfileUriType = it->second; 40225c1cde8Sopenharmony_ci DATA_STORAGE_LOGD("PdpProfileAbility::ParseUriType##pdpProfileUriType = %{public}d", 40325c1cde8Sopenharmony_ci pdpProfileUriType); 40425c1cde8Sopenharmony_ci } 40525c1cde8Sopenharmony_ci } 40625c1cde8Sopenharmony_ci } 40725c1cde8Sopenharmony_ci return pdpProfileUriType; 40825c1cde8Sopenharmony_ci} 40925c1cde8Sopenharmony_ci 41025c1cde8Sopenharmony_ciOHOS::NativeRdb::RdbPredicates PdpProfileAbility::ConvertPredicates( 41125c1cde8Sopenharmony_ci const std::string &tableName, const DataShare::DataSharePredicates &predicates) 41225c1cde8Sopenharmony_ci{ 41325c1cde8Sopenharmony_ci OHOS::NativeRdb::RdbPredicates res = RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, tableName); 41425c1cde8Sopenharmony_ci return res; 41525c1cde8Sopenharmony_ci} 41625c1cde8Sopenharmony_ci 41725c1cde8Sopenharmony_cistd::shared_ptr<NativeRdb::ResultSet> PdpProfileAbility::QueryPdpProfile(Uri &uri, const std::string &tableName, 41825c1cde8Sopenharmony_ci const DataShare::DataSharePredicates &predicates, std::vector<std::string> &columns) 41925c1cde8Sopenharmony_ci{ 42025c1cde8Sopenharmony_ci const std::string &simIdStr = GetQueryKey(uri.GetQuery(), "simId="); 42125c1cde8Sopenharmony_ci std::string opkey; 42225c1cde8Sopenharmony_ci int simId = DEFAULT_SIM_ID; 42325c1cde8Sopenharmony_ci if (StrToInt(simIdStr, simId)) { 42425c1cde8Sopenharmony_ci int32_t slotId = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSlotId(simId); 42525c1cde8Sopenharmony_ci GetTargetOpkey(slotId, opkey); 42625c1cde8Sopenharmony_ci } 42725c1cde8Sopenharmony_ci if (opkey.empty() || strcmp(opkey.c_str(), INVALID_OPKEY) == 0) { 42825c1cde8Sopenharmony_ci return helper_.Query(ConvertPredicates(tableName, predicates), columns); 42925c1cde8Sopenharmony_ci } 43025c1cde8Sopenharmony_ci constexpr int32_t FIELD_IDX = 0; 43125c1cde8Sopenharmony_ci auto &operations = predicates.GetOperationList(); 43225c1cde8Sopenharmony_ci std::vector<DataShare::OperationItem> operationsRes; 43325c1cde8Sopenharmony_ci bool isMccMnc = false; 43425c1cde8Sopenharmony_ci for (const auto &oper : operations) { 43525c1cde8Sopenharmony_ci if (oper.singleParams.empty()) { 43625c1cde8Sopenharmony_ci operationsRes.push_back(oper); 43725c1cde8Sopenharmony_ci continue; 43825c1cde8Sopenharmony_ci } 43925c1cde8Sopenharmony_ci std::string filed = static_cast<std::string>(oper.GetSingle(FIELD_IDX)); 44025c1cde8Sopenharmony_ci if (strcmp(filed.c_str(), PdpProfileData::MCCMNC) == 0 && oper.operation == DataShare::EQUAL_TO) { 44125c1cde8Sopenharmony_ci isMccMnc = true; 44225c1cde8Sopenharmony_ci operationsRes.push_back({DataShare::EQUAL_TO, {PdpProfileData::OPKEY, opkey}}); 44325c1cde8Sopenharmony_ci continue; 44425c1cde8Sopenharmony_ci } 44525c1cde8Sopenharmony_ci operationsRes.push_back(oper); 44625c1cde8Sopenharmony_ci } 44725c1cde8Sopenharmony_ci DATA_STORAGE_LOGI( 44825c1cde8Sopenharmony_ci "PdpProfileAbility::QueryPdpProfile, simId= %{public}d, isMccMnc= %{public}d", simId, isMccMnc); 44925c1cde8Sopenharmony_ci if (isMccMnc) { 45025c1cde8Sopenharmony_ci const std::shared_ptr<NativeRdb::ResultSet> &result = 45125c1cde8Sopenharmony_ci helper_.Query(ConvertPredicates(tableName, DataShare::DataSharePredicates(move(operationsRes))), columns); 45225c1cde8Sopenharmony_ci if (result != nullptr) { 45325c1cde8Sopenharmony_ci int count = 0; 45425c1cde8Sopenharmony_ci result->GetRowCount(count); 45525c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("PdpProfileAbility::QueryPdpProfile, count= %{public}d", count); 45625c1cde8Sopenharmony_ci if (count > 0) { 45725c1cde8Sopenharmony_ci return result; 45825c1cde8Sopenharmony_ci } 45925c1cde8Sopenharmony_ci } 46025c1cde8Sopenharmony_ci } 46125c1cde8Sopenharmony_ci return helper_.Query(ConvertPredicates(tableName, predicates), columns); 46225c1cde8Sopenharmony_ci} 46325c1cde8Sopenharmony_ci 46425c1cde8Sopenharmony_ciint PdpProfileAbility::ResetApn(const DataShare::DataShareValuesBucket &valuesBucket) 46525c1cde8Sopenharmony_ci{ 46625c1cde8Sopenharmony_ci OHOS::NativeRdb::ValuesBucket values = RdbDataShareAdapter::RdbUtils::ToValuesBucket(valuesBucket); 46725c1cde8Sopenharmony_ci int simId = DEFAULT_SIM_ID; 46825c1cde8Sopenharmony_ci if (GetIntFromValuesBucket(values, "simId", simId) != NativeRdb::E_OK) { 46925c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::ResetApn no simId!"); 47025c1cde8Sopenharmony_ci return helper_.ResetApn(); 47125c1cde8Sopenharmony_ci } 47225c1cde8Sopenharmony_ci int32_t slotId = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSlotId(simId); 47325c1cde8Sopenharmony_ci std::string opkey; 47425c1cde8Sopenharmony_ci GetTargetOpkey(slotId, opkey); 47525c1cde8Sopenharmony_ci if (opkey.empty() || strcmp(opkey.c_str(), INVALID_OPKEY) == 0) { 47625c1cde8Sopenharmony_ci DATA_STORAGE_LOGW("PdpProfileAbility::ResetApn opkey empty!"); 47725c1cde8Sopenharmony_ci return helper_.ResetApn(); 47825c1cde8Sopenharmony_ci } 47925c1cde8Sopenharmony_ci DATA_STORAGE_LOGI("PdpProfileAbility::ResetApn##simId = %{public}d", simId); 48025c1cde8Sopenharmony_ci SetPreferApn(simId, -1); 48125c1cde8Sopenharmony_ci NativeRdb::RdbPredicates rdbPredicates(TABLE_PDP_PROFILE); 48225c1cde8Sopenharmony_ci rdbPredicates.EqualTo(PdpProfileData::OPKEY, opkey); 48325c1cde8Sopenharmony_ci int deletedRows = CHANGED_ROWS; 48425c1cde8Sopenharmony_ci helper_.Delete(deletedRows, rdbPredicates); 48525c1cde8Sopenharmony_ci int result = helper_.InitAPNDatabase(slotId, opkey, false); 48625c1cde8Sopenharmony_ci if (result != NativeRdb::E_OK) { 48725c1cde8Sopenharmony_ci DATA_STORAGE_LOGE("PdpProfileAbility::ResetApn fail!"); 48825c1cde8Sopenharmony_ci result = static_cast<int>(LoadProFileErrorType::RESET_APN_FAIL); 48925c1cde8Sopenharmony_ci } 49025c1cde8Sopenharmony_ci return result; 49125c1cde8Sopenharmony_ci} 49225c1cde8Sopenharmony_ci 49325c1cde8Sopenharmony_ciint PdpProfileAbility::GetIntFromValuesBucket(OHOS::NativeRdb::ValuesBucket &bucket, const char *key, int &value) 49425c1cde8Sopenharmony_ci{ 49525c1cde8Sopenharmony_ci NativeRdb::ValueObject valueObject; 49625c1cde8Sopenharmony_ci if (!HasColumnValue(bucket, key, valueObject)) { 49725c1cde8Sopenharmony_ci return OPERATION_ERROR; 49825c1cde8Sopenharmony_ci } 49925c1cde8Sopenharmony_ci if (valueObject.GetType() == NativeRdb::ValueObject::TYPE_INT) { 50025c1cde8Sopenharmony_ci return valueObject.GetInt(value); 50125c1cde8Sopenharmony_ci } 50225c1cde8Sopenharmony_ci if (valueObject.GetType() == NativeRdb::ValueObject::TYPE_DOUBLE) { 50325c1cde8Sopenharmony_ci double temp = 0; 50425c1cde8Sopenharmony_ci if (valueObject.GetDouble(temp) == NativeRdb::E_OK) { 50525c1cde8Sopenharmony_ci value = ceil(temp); 50625c1cde8Sopenharmony_ci return NativeRdb::E_OK; 50725c1cde8Sopenharmony_ci } 50825c1cde8Sopenharmony_ci } 50925c1cde8Sopenharmony_ci return OPERATION_ERROR; 51025c1cde8Sopenharmony_ci} 51125c1cde8Sopenharmony_ci 51225c1cde8Sopenharmony_civoid PdpProfileAbility::GetTargetOpkey(int slotId, std::string &opkey) 51325c1cde8Sopenharmony_ci{ 51425c1cde8Sopenharmony_ci std::u16string opkeyU16; 51525c1cde8Sopenharmony_ci DelayedRefSingleton<CoreServiceClient>::GetInstance().GetTargetOpkey(slotId, opkeyU16); 51625c1cde8Sopenharmony_ci opkey = Str16ToStr8(opkeyU16); 51725c1cde8Sopenharmony_ci DATA_STORAGE_LOGI( 51825c1cde8Sopenharmony_ci "PdpProfileAbility::GetTargetOpkey##slotId = %{public}d, opkey = %{public}s", slotId, opkey.c_str()); 51925c1cde8Sopenharmony_ci} 52025c1cde8Sopenharmony_ci} // namespace Telephony 52125c1cde8Sopenharmony_ci} // namespace OHOS 522