1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.telephony; 18 19 /** 20 * This class represents a apn setting for create PDP link 21 */ 22 public class ApnSetting { 23 24 static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*"; 25 26 public final String carrier; 27 public final String apn; 28 public final String proxy; 29 public final String port; 30 public final String mmsc; 31 public final String mmsProxy; 32 public final String mmsPort; 33 public final String user; 34 public final String password; 35 public final int authType; 36 public final String[] types; 37 public final int id; 38 public final String numeric; 39 public final String protocol; 40 public final String roamingProtocol; 41 /** 42 * Current status of APN 43 * true : enabled APN, false : disabled APN. 44 */ 45 public final boolean carrierEnabled; 46 /** 47 * Radio Access Technology info 48 * To check what values can hold, refer to ServiceState.java. 49 * This should be spread to other technologies, 50 * but currently only used for LTE(14) and EHRPD(13). 51 */ 52 public final int bearer; 53 54 public ApnSetting(int id, String numeric, String carrier, String apn, 55 String proxy, String port, 56 String mmsc, String mmsProxy, String mmsPort, 57 String user, String password, int authType, String[] types, 58 String protocol, String roamingProtocol, boolean carrierEnabled, int bearer) { 59 this.id = id; 60 this.numeric = numeric; 61 this.carrier = carrier; 62 this.apn = apn; 63 this.proxy = proxy; 64 this.port = port; 65 this.mmsc = mmsc; 66 this.mmsProxy = mmsProxy; 67 this.mmsPort = mmsPort; 68 this.user = user; 69 this.password = password; 70 this.authType = authType; 71 this.types = types; 72 this.protocol = protocol; 73 this.roamingProtocol = roamingProtocol; 74 this.carrierEnabled = carrierEnabled; 75 this.bearer = bearer; 76 } 77 78 /** 79 * Creates an ApnSetting object from a string. 80 * 81 * @param data the string to read. 82 * 83 * The string must be in one of two formats (newlines added for clarity, 84 * spaces are optional): 85 * 86 * v1 format: 87 * <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, 88 * <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>, 89 * <type>[, <type>...] 90 * 91 * v2 format: 92 * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, 93 * <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>, 94 * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer> 95 * 96 * Note that the strings generated by toString() do not contain the username 97 * and password and thus cannot be read by this method. 98 * 99 * @see ApnSettingTest 100 */ 101 public static ApnSetting fromString(String data) { 102 if (data == null) return null; 103 104 int version; 105 // matches() operates on the whole string, so append .* to the regex. 106 if (data.matches(V2_FORMAT_REGEX + ".*")) { 107 version = 2; 108 data = data.replaceFirst(V2_FORMAT_REGEX, ""); 109 } else { 110 version = 1; 111 } 112 113 String[] a = data.split("\\s*,\\s*"); 114 if (a.length < 14) { 115 return null; 116 } 117 118 int authType; 119 try { 120 authType = Integer.parseInt(a[12]); 121 } catch (Exception e) { 122 authType = 0; 123 } 124 125 String[] typeArray; 126 String protocol, roamingProtocol; 127 boolean carrierEnabled; 128 int bearer; 129 if (version == 1) { 130 typeArray = new String[a.length - 13]; 131 System.arraycopy(a, 13, typeArray, 0, a.length - 13); 132 protocol = RILConstants.SETUP_DATA_PROTOCOL_IP; 133 roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP; 134 carrierEnabled = true; 135 bearer = 0; 136 } else { 137 if (a.length < 18) { 138 return null; 139 } 140 typeArray = a[13].split("\\s*\\|\\s*"); 141 protocol = a[14]; 142 roamingProtocol = a[15]; 143 try { 144 carrierEnabled = Boolean.parseBoolean(a[16]); 145 } catch (Exception e) { 146 carrierEnabled = true; 147 } 148 bearer = Integer.parseInt(a[17]); 149 } 150 151 return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8], 152 a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,carrierEnabled,bearer); 153 } 154 155 public String toString() { 156 StringBuilder sb = new StringBuilder(); 157 sb.append("[ApnSettingV2] ") 158 .append(carrier) 159 .append(", ").append(id) 160 .append(", ").append(numeric) 161 .append(", ").append(apn) 162 .append(", ").append(proxy) 163 .append(", ").append(mmsc) 164 .append(", ").append(mmsProxy) 165 .append(", ").append(mmsPort) 166 .append(", ").append(port) 167 .append(", ").append(authType).append(", "); 168 for (int i = 0; i < types.length; i++) { 169 sb.append(types[i]); 170 if (i < types.length - 1) { 171 sb.append(" | "); 172 } 173 } 174 sb.append(", ").append(protocol); 175 sb.append(", ").append(roamingProtocol); 176 sb.append(", ").append(carrierEnabled); 177 sb.append(", ").append(bearer); 178 return sb.toString(); 179 } 180 181 public boolean canHandleType(String type) { 182 for (String t : types) { 183 // DEFAULT handles all, and HIPRI is handled by DEFAULT 184 if (t.equals(type) || t.equals(Phone.APN_TYPE_ALL) || 185 (t.equals(Phone.APN_TYPE_DEFAULT) && 186 type.equals(Phone.APN_TYPE_HIPRI))) { 187 return true; 188 } 189 } 190 return false; 191 } 192 } 193