Home | History | Annotate | Download | only in dataconnection
      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.dataconnection;
     18 
     19 import com.android.internal.telephony.PhoneConstants;
     20 import com.android.internal.telephony.RILConstants;
     21 
     22 /**
     23  * This class represents a apn setting for create PDP link
     24  */
     25 public class ApnSetting {
     26 
     27     static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*";
     28 
     29     public final String carrier;
     30     public final String apn;
     31     public final String proxy;
     32     public final String port;
     33     public final String mmsc;
     34     public final String mmsProxy;
     35     public final String mmsPort;
     36     public final String user;
     37     public final String password;
     38     public final int authType;
     39     public final String[] types;
     40     public final int id;
     41     public final String numeric;
     42     public final String protocol;
     43     public final String roamingProtocol;
     44     /**
     45       * Current status of APN
     46       * true : enabled APN, false : disabled APN.
     47       */
     48     public final boolean carrierEnabled;
     49     /**
     50       * Radio Access Technology info
     51       * To check what values can hold, refer to ServiceState.java.
     52       * This should be spread to other technologies,
     53       * but currently only used for LTE(14) and EHRPD(13).
     54       */
     55     public final int bearer;
     56 
     57     public ApnSetting(int id, String numeric, String carrier, String apn,
     58             String proxy, String port,
     59             String mmsc, String mmsProxy, String mmsPort,
     60             String user, String password, int authType, String[] types,
     61             String protocol, String roamingProtocol, boolean carrierEnabled, int bearer) {
     62         this.id = id;
     63         this.numeric = numeric;
     64         this.carrier = carrier;
     65         this.apn = apn;
     66         this.proxy = proxy;
     67         this.port = port;
     68         this.mmsc = mmsc;
     69         this.mmsProxy = mmsProxy;
     70         this.mmsPort = mmsPort;
     71         this.user = user;
     72         this.password = password;
     73         this.authType = authType;
     74         this.types = types;
     75         this.protocol = protocol;
     76         this.roamingProtocol = roamingProtocol;
     77         this.carrierEnabled = carrierEnabled;
     78         this.bearer = bearer;
     79     }
     80 
     81     /**
     82      * Creates an ApnSetting object from a string.
     83      *
     84      * @param data the string to read.
     85      *
     86      * The string must be in one of two formats (newlines added for clarity,
     87      * spaces are optional):
     88      *
     89      * v1 format:
     90      *   <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
     91      *   <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>,
     92      *   <type>[, <type>...]
     93      *
     94      * v2 format:
     95      *   [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
     96      *   <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>,
     97      *   <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer>
     98      *
     99      * Note that the strings generated by toString() do not contain the username
    100      * and password and thus cannot be read by this method.
    101      */
    102     public static ApnSetting fromString(String data) {
    103         if (data == null) return null;
    104 
    105         int version;
    106         // matches() operates on the whole string, so append .* to the regex.
    107         if (data.matches(V2_FORMAT_REGEX + ".*")) {
    108             version = 2;
    109             data = data.replaceFirst(V2_FORMAT_REGEX, "");
    110         } else {
    111             version = 1;
    112         }
    113 
    114         String[] a = data.split("\\s*,\\s*");
    115         if (a.length < 14) {
    116             return null;
    117         }
    118 
    119         int authType;
    120         try {
    121             authType = Integer.parseInt(a[12]);
    122         } catch (Exception e) {
    123             authType = 0;
    124         }
    125 
    126         String[] typeArray;
    127         String protocol, roamingProtocol;
    128         boolean carrierEnabled;
    129         int bearer;
    130         if (version == 1) {
    131             typeArray = new String[a.length - 13];
    132             System.arraycopy(a, 13, typeArray, 0, a.length - 13);
    133             protocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
    134             roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
    135             carrierEnabled = true;
    136             bearer = 0;
    137         } else {
    138             if (a.length < 18) {
    139                 return null;
    140             }
    141             typeArray = a[13].split("\\s*\\|\\s*");
    142             protocol = a[14];
    143             roamingProtocol = a[15];
    144             try {
    145                 carrierEnabled = Boolean.parseBoolean(a[16]);
    146             } catch (Exception e) {
    147                 carrierEnabled = true;
    148             }
    149             bearer = Integer.parseInt(a[17]);
    150         }
    151 
    152         return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8],
    153                 a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,carrierEnabled,bearer);
    154     }
    155 
    156     @Override
    157     public String toString() {
    158         StringBuilder sb = new StringBuilder();
    159         sb.append("[ApnSettingV2] ")
    160         .append(carrier)
    161         .append(", ").append(id)
    162         .append(", ").append(numeric)
    163         .append(", ").append(apn)
    164         .append(", ").append(proxy)
    165         .append(", ").append(mmsc)
    166         .append(", ").append(mmsProxy)
    167         .append(", ").append(mmsPort)
    168         .append(", ").append(port)
    169         .append(", ").append(authType).append(", ");
    170         for (int i = 0; i < types.length; i++) {
    171             sb.append(types[i]);
    172             if (i < types.length - 1) {
    173                 sb.append(" | ");
    174             }
    175         }
    176         sb.append(", ").append(protocol);
    177         sb.append(", ").append(roamingProtocol);
    178         sb.append(", ").append(carrierEnabled);
    179         sb.append(", ").append(bearer);
    180         return sb.toString();
    181     }
    182 
    183     public boolean canHandleType(String type) {
    184         for (String t : types) {
    185             // DEFAULT handles all, and HIPRI is handled by DEFAULT
    186             if (t.equalsIgnoreCase(type) ||
    187                     t.equalsIgnoreCase(PhoneConstants.APN_TYPE_ALL) ||
    188                     (t.equalsIgnoreCase(PhoneConstants.APN_TYPE_DEFAULT) &&
    189                     type.equalsIgnoreCase(PhoneConstants.APN_TYPE_HIPRI))) {
    190                 return true;
    191             }
    192         }
    193         return false;
    194     }
    195 
    196     // TODO - if we have this function we should also have hashCode.
    197     // Also should handle changes in type order and perhaps case-insensitivity
    198     @Override
    199     public boolean equals(Object o) {
    200         if (o instanceof ApnSetting == false) return false;
    201         return (toString().equals(o.toString()));
    202     }
    203 }
    204