| /* |
| * Copyright (C) 2006 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.internal.telephony.dataconnection; |
| |
| import com.android.internal.telephony.PhoneConstants; |
| import com.android.internal.telephony.RILConstants; |
| |
| import java.util.Locale; |
| |
| /** |
| * This class represents a apn setting for create PDP link |
| */ |
| public class ApnSetting { |
| |
| static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*"; |
| static final String V3_FORMAT_REGEX = "^\\[ApnSettingV3\\]\\s*"; |
| |
| public final String carrier; |
| public final String apn; |
| public final String proxy; |
| public final String port; |
| public final String mmsc; |
| public final String mmsProxy; |
| public final String mmsPort; |
| public final String user; |
| public final String password; |
| public final int authType; |
| public final String[] types; |
| public final int id; |
| public final String numeric; |
| public final String protocol; |
| public final String roamingProtocol; |
| /** |
| * Current status of APN |
| * true : enabled APN, false : disabled APN. |
| */ |
| public final boolean carrierEnabled; |
| /** |
| * Radio Access Technology info |
| * To check what values can hold, refer to ServiceState.java. |
| * This should be spread to other technologies, |
| * but currently only used for LTE(14) and EHRPD(13). |
| */ |
| public final int bearer; |
| |
| /* ID of the profile in the modem */ |
| public final int profileId; |
| public final boolean modemCognitive; |
| public final int maxConns; |
| public final int waitTime; |
| public final int maxConnsTime; |
| |
| public ApnSetting(int id, String numeric, String carrier, String apn, |
| String proxy, String port, |
| String mmsc, String mmsProxy, String mmsPort, |
| String user, String password, int authType, String[] types, |
| String protocol, String roamingProtocol, boolean carrierEnabled, int bearer, |
| int profileId, boolean modemCognitive, int maxConns, int waitTime, int maxConnsTime) { |
| this.id = id; |
| this.numeric = numeric; |
| this.carrier = carrier; |
| this.apn = apn; |
| this.proxy = proxy; |
| this.port = port; |
| this.mmsc = mmsc; |
| this.mmsProxy = mmsProxy; |
| this.mmsPort = mmsPort; |
| this.user = user; |
| this.password = password; |
| this.authType = authType; |
| this.types = new String[types.length]; |
| for (int i = 0; i < types.length; i++) { |
| this.types[i] = types[i].toLowerCase(Locale.ROOT); |
| } |
| this.protocol = protocol; |
| this.roamingProtocol = roamingProtocol; |
| this.carrierEnabled = carrierEnabled; |
| this.bearer = bearer; |
| this.profileId = profileId; |
| this.modemCognitive = modemCognitive; |
| this.maxConns = maxConns; |
| this.waitTime = waitTime; |
| this.maxConnsTime = maxConnsTime; |
| } |
| |
| /** |
| * Creates an ApnSetting object from a string. |
| * |
| * @param data the string to read. |
| * |
| * The string must be in one of two formats (newlines added for clarity, |
| * spaces are optional): |
| * |
| * v1 format: |
| * <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, |
| * <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>, |
| * <type>[, <type>...] |
| * |
| * v2 format: |
| * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, |
| * <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>, |
| * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer> |
| * |
| * v3 format: |
| * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, |
| * <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>, |
| * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer>, |
| * <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime> |
| * |
| * Note that the strings generated by toString() do not contain the username |
| * and password and thus cannot be read by this method. |
| */ |
| public static ApnSetting fromString(String data) { |
| if (data == null) return null; |
| |
| int version; |
| // matches() operates on the whole string, so append .* to the regex. |
| if (data.matches(V3_FORMAT_REGEX + ".*")) { |
| version = 3; |
| data = data.replaceFirst(V3_FORMAT_REGEX, ""); |
| } else if (data.matches(V2_FORMAT_REGEX + ".*")) { |
| version = 2; |
| data = data.replaceFirst(V2_FORMAT_REGEX, ""); |
| } else { |
| version = 1; |
| } |
| |
| String[] a = data.split("\\s*,\\s*"); |
| if (a.length < 14) { |
| return null; |
| } |
| |
| int authType; |
| try { |
| authType = Integer.parseInt(a[12]); |
| } catch (Exception e) { |
| authType = 0; |
| } |
| |
| String[] typeArray; |
| String protocol, roamingProtocol; |
| boolean carrierEnabled; |
| int bearer; |
| int profileId = 0; |
| boolean modemCognitive = false; |
| int maxConns = 0; |
| int waitTime = 0; |
| int maxConnsTime = 0; |
| if (version == 1) { |
| typeArray = new String[a.length - 13]; |
| System.arraycopy(a, 13, typeArray, 0, a.length - 13); |
| protocol = RILConstants.SETUP_DATA_PROTOCOL_IP; |
| roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP; |
| carrierEnabled = true; |
| bearer = 0; |
| } else { |
| if (a.length < 18) { |
| return null; |
| } |
| typeArray = a[13].split("\\s*\\|\\s*"); |
| protocol = a[14]; |
| roamingProtocol = a[15]; |
| try { |
| carrierEnabled = Boolean.parseBoolean(a[16]); |
| } catch (Exception e) { |
| carrierEnabled = true; |
| } |
| bearer = Integer.parseInt(a[17]); |
| if(a.length > 22) { |
| try { |
| profileId = Integer.parseInt(a[18]); |
| modemCognitive = Boolean.parseBoolean(a[19]); |
| maxConns = Integer.parseInt(a[20]); |
| waitTime = Integer.parseInt(a[21]); |
| maxConnsTime = Integer.parseInt(a[22]); |
| } catch (Exception e) { |
| } |
| } |
| } |
| |
| return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8], |
| a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,carrierEnabled,bearer, |
| profileId, modemCognitive, maxConns, waitTime, maxConnsTime); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append("[ApnSettingV2] ") |
| .append(carrier) |
| .append(", ").append(id) |
| .append(", ").append(numeric) |
| .append(", ").append(apn) |
| .append(", ").append(proxy) |
| .append(", ").append(mmsc) |
| .append(", ").append(mmsProxy) |
| .append(", ").append(mmsPort) |
| .append(", ").append(port) |
| .append(", ").append(authType).append(", "); |
| for (int i = 0; i < types.length; i++) { |
| sb.append(types[i]); |
| if (i < types.length - 1) { |
| sb.append(" | "); |
| } |
| } |
| sb.append(", ").append(protocol); |
| sb.append(", ").append(roamingProtocol); |
| sb.append(", ").append(carrierEnabled); |
| sb.append(", ").append(bearer); |
| sb.append(", ").append(profileId); |
| sb.append(", ").append(modemCognitive); |
| sb.append(", ").append(maxConns); |
| sb.append(", ").append(waitTime); |
| sb.append(", ").append(maxConnsTime); |
| return sb.toString(); |
| } |
| |
| public boolean canHandleType(String type) { |
| if (!carrierEnabled) return false; |
| for (String t : types) { |
| // DEFAULT handles all, and HIPRI is handled by DEFAULT |
| if (t.equalsIgnoreCase(type) || |
| t.equalsIgnoreCase(PhoneConstants.APN_TYPE_ALL) || |
| (t.equalsIgnoreCase(PhoneConstants.APN_TYPE_DEFAULT) && |
| type.equalsIgnoreCase(PhoneConstants.APN_TYPE_HIPRI))) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| // TODO - if we have this function we should also have hashCode. |
| // Also should handle changes in type order and perhaps case-insensitivity |
| @Override |
| public boolean equals(Object o) { |
| if (o instanceof ApnSetting == false) return false; |
| return (toString().equals(o.toString())); |
| } |
| } |