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 "mms_apn_info.h"
17
18 #include "core_manager_inner.h"
19 #include "pdp_profile_data.h"
20 #include "string_utils.h"
21 #include "telephony_log_wrapper.h"
22
23 namespace OHOS {
24 namespace Telephony {
25 const std::string PDP_PROFILE_NET_URI = "datashare:///com.ohos.pdpprofileability/net/pdp_profile?simId=";
26 const std::string MMS_APN_TYPE = "mms";
27 const std::string ALL_APN_TYPE = "*";
28
MmsApnInfo(int32_t slotId)29 MmsApnInfo::MmsApnInfo(int32_t slotId) : slotId_(slotId)
30 {
31 getMmsApn();
32 }
33
~MmsApnInfo()34 MmsApnInfo::~MmsApnInfo() {}
35
getMmsApn()36 void MmsApnInfo::getMmsApn()
37 {
38 std::shared_ptr<DataShare::DataShareHelper> helper = CreatePdpProfileHelper();
39 if (helper == nullptr) {
40 TELEPHONY_LOGE("getMmsApn helper is nullptr");
41 return;
42 }
43 PdpProfileSelect(helper);
44 }
45
CreatePdpProfileHelper()46 std::shared_ptr<DataShare::DataShareHelper> MmsApnInfo::CreatePdpProfileHelper()
47 {
48 if (mmsPdpProfileDataAbilityHelper == nullptr) {
49 mmsPdpProfileDataAbilityHelper = CreateDataAHelper(TELEPHONY_SMS_MMS_SYS_ABILITY_ID, PDP_PROFILE_URI);
50 }
51 return mmsPdpProfileDataAbilityHelper;
52 }
53
CreateDataAHelper(int32_t systemAbilityId,const std::string & dataAbilityUri) const54 std::shared_ptr<DataShare::DataShareHelper> MmsApnInfo::CreateDataAHelper(
55 int32_t systemAbilityId, const std::string &dataAbilityUri) const
56 {
57 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
58 if (saManager == nullptr) {
59 TELEPHONY_LOGE("Get system ability mgr failed");
60 return nullptr;
61 }
62 auto remoteObj = saManager->GetSystemAbility(systemAbilityId);
63 if (remoteObj == nullptr) {
64 TELEPHONY_LOGE("GetSystemAbility Service Failed");
65 return nullptr;
66 }
67 return DataShare::DataShareHelper::Creator(remoteObj, dataAbilityUri);
68 }
69
SplitAndMatchApnTypes(std::string apn)70 bool MmsApnInfo::SplitAndMatchApnTypes(std::string apn)
71 {
72 std::vector<std::string> apns;
73 size_t pos = 0;
74 size_t found = 0;
75 while ((found = apn.find(',', pos)) != std::string::npos) {
76 apns.push_back(apn.substr(pos, found - pos));
77 pos = found + 1;
78 }
79 apns.push_back(apn.substr(pos));
80
81 for (size_t i = 0; i < apns.size(); i++) {
82 if (apns[i] == MMS_APN_TYPE || (apns[i] == ALL_APN_TYPE && apns.size() == 1)) {
83 TELEPHONY_LOGI("ApnType match success");
84 return true;
85 }
86 }
87 return false;
88 }
89
GetMmsApnValue(std::shared_ptr<DataShare::ResultSet> resultSet,int count,std::string & homeUrlVal,std::string & mmsIPAddressVal)90 bool MmsApnInfo::GetMmsApnValue(
91 std::shared_ptr<DataShare::ResultSet> resultSet, int count, std::string &homeUrlVal, std::string &mmsIPAddressVal)
92 {
93 int columnIndex;
94 std::string apn;
95 for (int row = 0; row < count; row++) {
96 resultSet->GoToRow(row);
97 resultSet->GetColumnIndex(PdpProfileData::APN_TYPES, columnIndex);
98 resultSet->GetString(columnIndex, apn);
99 if (SplitAndMatchApnTypes(apn)) {
100 resultSet->GetColumnIndex(PdpProfileData::HOME_URL, columnIndex);
101 resultSet->GetString(columnIndex, homeUrlVal);
102 resultSet->GetColumnIndex(PdpProfileData::MMS_IP_ADDRESS, columnIndex);
103 resultSet->GetString(columnIndex, mmsIPAddressVal);
104 return true;
105 }
106 }
107 return false;
108 }
109
PdpProfileSelect(const std::shared_ptr<DataShare::DataShareHelper> & helper)110 void MmsApnInfo::PdpProfileSelect(const std::shared_ptr<DataShare::DataShareHelper> &helper)
111 {
112 int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
113 Uri uri(static_cast<std::string>(PDP_PROFILE_NET_URI) + std::to_string(simId));
114 std::vector<std::string> colume;
115 DataShare::DataSharePredicates predicates;
116 std::u16string operatorNumeric;
117 CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId_, operatorNumeric);
118 std::string mccmnc = StringUtils::ToUtf8(operatorNumeric);
119 if (mccmnc.empty()) {
120 TELEPHONY_LOGE("mccmnc is empty");
121 return;
122 }
123 TELEPHONY_LOGI("query mms apn data base");
124 predicates.EqualTo(PdpProfileData::MCCMNC, mccmnc);
125 auto resultSet = helper->Query(uri, predicates, colume);
126 if (resultSet == nullptr) {
127 TELEPHONY_LOGE("resultSet nullptr");
128 helper->Release();
129 return;
130 }
131 int count;
132 resultSet->GetRowCount(count);
133 if (count <= 0) {
134 TELEPHONY_LOGE("count: %{public}d null return", count);
135 resultSet->Close();
136 helper->Release();
137 return;
138 }
139 std::string homeUrlVal;
140 std::string mmsIPAddressVal;
141 if (GetMmsApnValue(resultSet, count, homeUrlVal, mmsIPAddressVal)) {
142 setMmscUrl(homeUrlVal);
143 setMmsProxyAddressAndProxyPort(mmsIPAddressVal);
144 } else {
145 TELEPHONY_LOGI("homeUrlVal and mmsIPAddressVal not matched");
146 }
147 resultSet->Close();
148 helper->Release();
149 }
150
getMmscUrl()151 std::string MmsApnInfo::getMmscUrl()
152 {
153 return mmscUrl_;
154 }
155
setMmscUrl(std::string mmscUrl)156 void MmsApnInfo::setMmscUrl(std::string mmscUrl)
157 {
158 mmscUrl_ = mmscUrl;
159 }
160
getMmsProxyAddressAndProxyPort()161 std::string MmsApnInfo::getMmsProxyAddressAndProxyPort()
162 {
163 return mmsProxyAddressAndProxyPort_;
164 }
165
setMmsProxyAddressAndProxyPort(std::string mmsProxyAddressAndProxyPort)166 void MmsApnInfo::setMmsProxyAddressAndProxyPort(std::string mmsProxyAddressAndProxyPort)
167 {
168 mmsProxyAddressAndProxyPort_ = mmsProxyAddressAndProxyPort;
169 }
170 } // namespace Telephony
171 } // namespace OHOS