• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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