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