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";
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 Uri uri(PDP_PROFILE_NET_URI);
113 std::vector<std::string> colume;
114 DataShare::DataSharePredicates predicates;
115 std::u16string operatorNumeric;
116 CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId_, operatorNumeric);
117 std::string mccmnc = StringUtils::ToUtf8(operatorNumeric);
118 if (mccmnc.empty()) {
119 TELEPHONY_LOGE("mccmnc is empty");
120 return;
121 }
122 TELEPHONY_LOGI("query mms apn data base");
123 predicates.EqualTo(PdpProfileData::MCCMNC, mccmnc);
124 auto resultSet = helper->Query(uri, predicates, colume);
125 if (resultSet == nullptr) {
126 TELEPHONY_LOGE("resultSet nullptr");
127 helper->Release();
128 return;
129 }
130 int count;
131 resultSet->GetRowCount(count);
132 if (count <= 0) {
133 TELEPHONY_LOGE("count: %{public}d null return", count);
134 resultSet->Close();
135 helper->Release();
136 return;
137 }
138 std::string homeUrlVal;
139 std::string mmsIPAddressVal;
140 if (GetMmsApnValue(resultSet, count, homeUrlVal, mmsIPAddressVal)) {
141 setMmscUrl(homeUrlVal);
142 setMmsProxyAddressAndProxyPort(mmsIPAddressVal);
143 } else {
144 TELEPHONY_LOGI("homeUrlVal and mmsIPAddressVal not matched");
145 }
146 resultSet->Close();
147 helper->Release();
148 }
149
getMmscUrl()150 std::string MmsApnInfo::getMmscUrl()
151 {
152 return mmscUrl_;
153 }
154
setMmscUrl(std::string mmscUrl)155 void MmsApnInfo::setMmscUrl(std::string mmscUrl)
156 {
157 mmscUrl_ = mmscUrl;
158 }
159
getMmsProxyAddressAndProxyPort()160 std::string MmsApnInfo::getMmsProxyAddressAndProxyPort()
161 {
162 return mmsProxyAddressAndProxyPort_;
163 }
164
setMmsProxyAddressAndProxyPort(std::string mmsProxyAddressAndProxyPort)165 void MmsApnInfo::setMmsProxyAddressAndProxyPort(std::string mmsProxyAddressAndProxyPort)
166 {
167 mmsProxyAddressAndProxyPort_ = mmsProxyAddressAndProxyPort;
168 }
169 } // namespace Telephony
170 } // namespace OHOS