10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DataCallState.SetupResult; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.AsyncChannel; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.Protocol; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.State; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.StateMachine; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.PendingIntent; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkCapabilities; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkProperties; 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.ProxyProperties; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message; 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.TimeUtils; 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Calendar; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.HashMap; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicInteger; 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * DataConnection StateMachine. 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This is an abstract base class for representing a single data connection. 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Instances of this class such as <code>CdmaDataConnection</code> and 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>GsmDataConnection</code>, * represent a connection via the cellular network. 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * There may be multiple data connections and all of them are managed by the 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>DataConnectionTracker</code>. 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Instances are asynchronous state machines and have two primary entry points 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>connect()</code> and <code>disconnect</code>. The message a parameter will be returned 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * hen the operation completes. The <code>msg.obj</code> will contain an AsyncResult 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and <code>AsyncResult.userObj</code> is the original <code>msg.obj</code>. if successful 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * with the <code>AsyncResult.result == null</code> and <code>AsyncResult.exception == null</code>. 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If an error <code>AsyncResult.result = FailCause</code> and 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>AsyncResult.exception = new Exception()</code>. 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The other public methods are provided for debugging. 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic abstract class DataConnection extends StateMachine { 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final boolean DBG = true; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final boolean VDBG = false; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static AtomicInteger mCount = new AtomicInteger(0); 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected AsyncChannel mAc; 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected List<ApnContext> mApnList = null; 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville PendingIntent mReconnectIntent = null; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DataConnectionTracker mDataConnectionTracker = null; 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Used internally for saving connecting parameters. 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static class ConnectionParams { 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public ConnectionParams(ApnSetting apn, Message onCompletedMsg) { 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.apn = apn; 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.onCompletedMsg = onCompletedMsg; 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int tag; 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public ApnSetting apn; 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Message onCompletedMsg; 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Used internally for saving disconnecting parameters. 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static class DisconnectParams { 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public DisconnectParams(String reason, Message onCompletedMsg) { 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.reason = reason; 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.onCompletedMsg = onCompletedMsg; 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int tag; 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String reason; 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Message onCompletedMsg; 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returned as the reason for a connection failure as defined 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * by RIL_DataCallFailCause in ril.h and some local errors. 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public enum FailCause { 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville NONE(0), 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // This series of errors as specified by the standards 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // specified in ril.h 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville OPERATOR_BARRED(0x08), 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville INSUFFICIENT_RESOURCES(0x1A), 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville MISSING_UNKNOWN_APN(0x1B), 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UNKNOWN_PDP_ADDRESS_TYPE(0x1C), 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville USER_AUTHENTICATION(0x1D), 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ACTIVATION_REJECT_GGSN(0x1E), 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ACTIVATION_REJECT_UNSPECIFIED(0x1F), 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SERVICE_OPTION_NOT_SUPPORTED(0x20), 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SERVICE_OPTION_NOT_SUBSCRIBED(0x21), 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SERVICE_OPTION_OUT_OF_ORDER(0x22), 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville NSAPI_IN_USE(0x23), 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ONLY_IPV4_ALLOWED(0x32), 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ONLY_IPV6_ALLOWED(0x33), 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ONLY_SINGLE_BEARER_ALLOWED(0x34), 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville PROTOCOL_ERRORS(0x6F), 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Local errors generated by Vendor RIL 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // specified in ril.h 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville REGISTRATION_FAIL(-1), 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GPRS_REGISTRATION_FAIL(-2), 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SIGNAL_LOST(-3), 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville PREF_RADIO_TECH_CHANGED(-4), 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville RADIO_POWER_OFF(-5), 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TETHERED_CALL_ACTIVE(-6), 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ERROR_UNSPECIFIED(0xFFFF), 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Errors generated by the Framework 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // specified here 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UNKNOWN(0x10000), 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville RADIO_NOT_AVAILABLE(0x10001), 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UNACCEPTABLE_NETWORK_PARAMETER(0x10002), 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CONNECTION_TO_DATACONNECTIONAC_BROKEN(0x10003); 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final int mErrorCode; 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final HashMap<Integer, FailCause> sErrorCodeToFailCauseMap; 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static { 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sErrorCodeToFailCauseMap = new HashMap<Integer, FailCause>(); 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (FailCause fc : values()) { 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sErrorCodeToFailCauseMap.put(fc.getErrorCode(), fc); 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville FailCause(int errorCode) { 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mErrorCode = errorCode; 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int getErrorCode() { 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mErrorCode; 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isPermanentFail() { 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (this == OPERATOR_BARRED) || (this == MISSING_UNKNOWN_APN) || 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) || 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == SERVICE_OPTION_NOT_SUPPORTED) || 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == SERVICE_OPTION_NOT_SUBSCRIBED) || (this == NSAPI_IN_USE) || 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == PROTOCOL_ERRORS); 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isEventLoggable() { 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (this == OPERATOR_BARRED) || (this == INSUFFICIENT_RESOURCES) || 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) || 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == ACTIVATION_REJECT_GGSN) || (this == ACTIVATION_REJECT_UNSPECIFIED) || 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == SERVICE_OPTION_NOT_SUBSCRIBED) || 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == SERVICE_OPTION_NOT_SUPPORTED) || 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == SERVICE_OPTION_OUT_OF_ORDER) || (this == NSAPI_IN_USE) || 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == PROTOCOL_ERRORS) || 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (this == UNACCEPTABLE_NETWORK_PARAMETER); 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static FailCause fromInt(int errorCode) { 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville FailCause fc = sErrorCodeToFailCauseMap.get(errorCode); 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (fc == null) { 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville fc = UNKNOWN; 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return fc; 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static class CallSetupException extends Exception { 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private int mRetryOverride = -1; 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CallSetupException (int retryOverride) { 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRetryOverride = retryOverride; 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getRetryOverride() { 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mRetryOverride; 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // ***** Event codes for driving the state machine 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int BASE = Protocol.BASE_DATA_CONNECTION; 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int EVENT_CONNECT = BASE + 0; 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1; 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2; 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int EVENT_DEACTIVATE_DONE = BASE + 3; 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int EVENT_DISCONNECT = BASE + 4; 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int EVENT_RIL_CONNECTED = BASE + 5; 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int EVENT_DISCONNECT_ALL = BASE + 6; 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int CMD_TO_STRING_COUNT = EVENT_DISCONNECT_ALL - BASE + 1; 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static { 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT"; 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] = 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "EVENT_SETUP_DATA_CONNECTION_DONE"; 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE"; 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE"; 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT"; 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED"; 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL"; 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static String cmdToString(int cmd) { 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmd -= BASE; 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return sCmdToString[cmd]; 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Tag IDs for EventLog 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final int EVENT_LOG_BAD_DNS_ADDRESS = 50100; 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Member Variables 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected ApnSetting mApn; 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected int mTag; 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected PhoneBase phone; 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected int mRilVersion = -1; 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected int cid; 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected LinkProperties mLinkProperties = new LinkProperties(); 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected LinkCapabilities mCapabilities = new LinkCapabilities(); 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected long createTime; 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected long lastFailTime; 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected FailCause lastFailCause; 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected int mRetryOverride = -1; 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected static final String NULL_IP = "0.0.0.0"; 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected int mRefCount; 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Object userData; 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Abstract methods 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public abstract String toString(); 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected abstract void onConnect(ConnectionParams cp); 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected abstract boolean isDnsOk(String[] domainNameServers); 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected abstract void log(String s); 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Constructor 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected DataConnection(PhoneBase phone, String name, int id, RetryManager rm, 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataConnectionTracker dct) { 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super(name); 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setLogRecSize(100); 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DataConnection constructor E"); 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.phone = phone; 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.mDataConnectionTracker = dct; 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mId = id; 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRetryMgr = rm; 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.cid = -1; 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setDbg(false); 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville addState(mDefaultState); 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville addState(mInactiveState, mDefaultState); 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville addState(mActivatingState, mDefaultState); 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville addState(mActiveState, mDefaultState); 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville addState(mDisconnectingState, mDefaultState); 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setInitialState(mInactiveState); 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mApnList = new ArrayList<ApnContext>(); 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DataConnection constructor X"); 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Shut down this instance and its state machine. 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void shutDown() { 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("shutDown"); 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mAc != null) { 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.disconnected(); 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc = null; 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mApnList = null; 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mReconnectIntent = null; 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDataConnectionTracker = null; 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mApn = null; 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone = null; 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLinkProperties = null; 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCapabilities = null; 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville lastFailCause = null; 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville userData = null; 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * TearDown the data connection. 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param o will be returned in AsyncResult.userObj 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and is either a DisconnectParams or ConnectionParams. 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void tearDownData(Object o) { 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((o != null) && (o instanceof DisconnectParams)) { 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DisconnectParams dp = (DisconnectParams)o; 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message m = dp.onCompletedMsg; 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (TextUtils.equals(dp.reason, Phone.REASON_RADIO_TURNED_OFF)) { 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (TextUtils.equals(dp.reason, Phone.REASON_PDP_RESET)) { 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (phone.mCM.getRadioState().isOn()) { 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("tearDownData radio is on, call deactivateDataCall"); 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mCM.deactivateDataCall(cid, discReason, obtainMessage(EVENT_DEACTIVATE_DONE, o)); 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"); 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar = new AsyncResult(o, null, null); 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, ar)); 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Send the connectionCompletedMsg. 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cp is the ConnectionParams 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cause 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void notifyConnectCompleted(ConnectionParams cp, FailCause cause) { 3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message connectionCompletedMsg = cp.onCompletedMsg; 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (connectionCompletedMsg == null) { 3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville long timeStamp = System.currentTimeMillis(); 3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connectionCompletedMsg.arg1 = cid; 3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cause == FailCause.NONE) { 3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville createTime = timeStamp; 3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult.forMessage(connectionCompletedMsg); 3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville lastFailCause = cause; 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville lastFailTime = timeStamp; 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville new CallSetupException(mRetryOverride)); 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("notifyConnectionCompleted at " + timeStamp + " cause=" + cause); 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connectionCompletedMsg.sendToTarget(); 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Send ar.userObj if its a message, which is should be back to originator. 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param dp is the DisconnectParams. 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("NotifyDisconnectCompleted"); 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ApnContext alreadySent = null; 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String reason = null; 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (dp.onCompletedMsg != null) { 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Get ApnContext, but only valid on GSM devices this is a string on CDMA devices. 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message msg = dp.onCompletedMsg; 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (msg.obj instanceof ApnContext) { 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville alreadySent = (ApnContext)msg.obj; 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville reason = dp.reason; 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult.forMessage(msg); 3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville msg.sendToTarget(); 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sendAll) { 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (ApnContext a : mApnList) { 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (a == alreadySent) continue; 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (reason != null) a.setReason(reason); 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message msg = mDataConnectionTracker.obtainMessage( 3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DctConstants.EVENT_DISCONNECT_DONE, a); 3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult.forMessage(msg); 3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville msg.sendToTarget(); 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected int getRilRadioTechnology(int defaultRilRadioTechnology) { 4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int rilRadioTechnology; 4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mRilVersion < 6) { 4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville rilRadioTechnology = defaultRilRadioTechnology; 4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville rilRadioTechnology = phone.getServiceState().getRilRadioTechnology() + 2; 4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return rilRadioTechnology; 4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * ************************************************************************** 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Begin Members and methods owned by DataConnectionTracker but stored 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * in a DataConnection because there is one per connection. 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * ************************************************************************** 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The id is owned by DataConnectionTracker. 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private int mId; 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Get the DataConnection ID 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getDataConnectionId() { 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mId; 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* 4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The retry manager is currently owned by the DataConnectionTracker but is stored 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * in the DataConnection because there is one per connection. These methods 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * should only be used by the DataConnectionTracker although someday the retrying 4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * maybe managed by the DataConnection itself and these methods could disappear. 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private RetryManager mRetryMgr; 4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return retry manager retryCount 4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getRetryCount() { 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mRetryMgr.getRetryCount(); 4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * set retry manager retryCount 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setRetryCount(int retryCount) { 4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("setRetryCount: " + retryCount); 4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRetryMgr.setRetryCount(retryCount); 4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return retry manager retryTimer 4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getRetryTimer() { 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mRetryMgr.getRetryTimer(); 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * increaseRetryCount of retry manager 4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void increaseRetryCount() { 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRetryMgr.increaseRetryCount(); 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return retry manager isRetryNeeded 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isRetryNeeded() { 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mRetryMgr.isRetryNeeded(); 4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * resetRetryCount of retry manager 4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void resetRetryCount() { 4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRetryMgr.resetRetryCount(); 4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * set retryForeverUsingLasttimeout of retry manager 4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void retryForeverUsingLastTimeout() { 4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRetryMgr.retryForeverUsingLastTimeout(); 4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return retry manager isRetryForever 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isRetryForever() { 4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mRetryMgr.isRetryForever(); 4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return whether the retry config is set successfully or not 5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean configureRetry(int maxRetryCount, int retryTime, int randomizationTime) { 5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mRetryMgr.configure(maxRetryCount, retryTime, randomizationTime); 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return whether the retry config is set successfully or not 5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean configureRetry(String configStr) { 5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mRetryMgr.configure(configStr); 5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* 5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * ************************************************************************** 5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * End members owned by DataConnectionTracker 5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * ************************************************************************** 5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Clear all settings called when entering mInactiveState. 5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void clearSettings() { 5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("clearSettings"); 5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville createTime = -1; 5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville lastFailTime = -1; 5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville lastFailCause = FailCause.NONE; 5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRetryOverride = -1; 5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRefCount = 0; 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cid = -1; 5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLinkProperties = new LinkProperties(); 5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mApn = null; 5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Process setup completion. 5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ar is the result 5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return SetupResult. 5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DataCallState.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataCallState response = (DataCallState) ar.result; 5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataCallState.SetupResult result; 5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception != null) { 5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville " response=" + response); 5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception instanceof CommandException 5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && ((CommandException) (ar.exception)).getCommandError() 5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = DataCallState.SetupResult.ERR_BadCommand; 5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result.mFailCause = FailCause.RADIO_NOT_AVAILABLE; 5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if ((response == null) || (response.version < 4)) { 5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = DataCallState.SetupResult.ERR_GetLastErrorFromRil; 5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = DataCallState.SetupResult.ERR_RilError; 5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result.mFailCause = FailCause.fromInt(response.status); 5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (cp.tag != mTag) { 5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("BUG: onSetupConnectionCompleted is stale cp.tag=" + cp.tag + ", mtag=" + mTag); 5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = DataCallState.SetupResult.ERR_Stale; 5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (response.status != 0) { 5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = DataCallState.SetupResult.ERR_RilError; 5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result.mFailCause = FailCause.fromInt(response.status); 5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("onSetupConnectionCompleted received DataCallState: " + response); 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cid = response.cid; 5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = updateLinkProperty(response).setupResult; 5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private int getSuggestedRetryTime(AsyncResult ar) { 5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int retry = -1; 5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception == null) { 5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataCallState response = (DataCallState) ar.result; 5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retry = response.suggestedRetryTime; 5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return retry; 5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DataCallState.SetupResult setLinkProperties(DataCallState response, 5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville LinkProperties lp) { 5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Check if system property dns usable 5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean okToUseSystemPropertyDns = false; 5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String propertyPrefix = "net." + response.ifname + "."; 5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String dnsServers[] = new String[2]; 5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // set link properties based on data call response 6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static class UpdateLinkPropertyResult { 6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public DataCallState.SetupResult setupResult = DataCallState.SetupResult.SUCCESS; 6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public LinkProperties oldLp; 6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public LinkProperties newLp; 6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public UpdateLinkPropertyResult(LinkProperties curLp) { 6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville oldLp = curLp; 6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newLp = curLp; 6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private UpdateLinkPropertyResult updateLinkProperty(DataCallState newState) { 6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); 6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (newState == null) return result; 6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataCallState.SetupResult setupResult; 6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result.newLp = new LinkProperties(); 6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // set link properties based on data call response 6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result.setupResult = setLinkProperties(newState, result.newLp); 6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (result.setupResult != DataCallState.SetupResult.SUCCESS) { 6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("updateLinkProperty failed : " + result.setupResult); 6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // copy HTTP proxy as it is not part DataCallState. 6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); 6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG && (! result.oldLp.equals(result.newLp))) { 6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("updateLinkProperty old LP=" + result.oldLp); 6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("updateLinkProperty new LP=" + result.newLp); 6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLinkProperties = result.newLp; 6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The parent state for all other states. 6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private class DcDefaultState extends State { 6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void enter() { 6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mCM.registerForRilConnected(getHandler(), EVENT_RIL_CONNECTED, null); 6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void exit() { 6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mCM.unregisterForRilConnected(getHandler()); 6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville shutDown(); 6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean processMessage(Message msg) { 6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean retVal = HANDLED; 6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar; 6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mAc != null) { 6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc = new AsyncChannel(); 6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.connected(null, getHandler(), msg.replyTo); 6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("CMD_CHANNEL_DISCONNECTED"); 6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville quit(); 6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_IS_INACTIVE: { 6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean val = getCurrentState() == mInactiveState; 6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_IS_INACTIVE, val ? 1 : 0); 6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_GET_CID: { 6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_CID, cid); 6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_GET_APNSETTING: { 6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_GET_APNSETTING apnSetting=" + mApn); 6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_APNSETTING, mApn); 6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_GET_LINK_PROPERTIES: { 6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville LinkProperties lp = new LinkProperties(mLinkProperties); 6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_LINK_PROPERTIES, lp); 6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ProxyProperties proxy = (ProxyProperties) msg.obj; 7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLinkProperties.setHttpProxy(proxy); 7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE: { 7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataCallState newState = (DataCallState) msg.obj; 7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UpdateLinkPropertyResult result = 7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville updateLinkProperty(newState); 7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE result=" 7120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + result + " newState=" + newState); 7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, 7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataConnectionAc.RSP_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE, 7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result); 7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_GET_LINK_CAPABILITIES: { 7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville LinkCapabilities lc = new LinkCapabilities(mCapabilities); 7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_GET_LINK_CAPABILITIES linkCapabilities" + lc); 7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_LINK_CAPABILITIES, lc); 7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_RESET: 7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_RESET); 7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mInactiveState); 7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_GET_REFCOUNT: { 7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_GET_REFCOUNT refCount=" + mRefCount); 7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_REFCOUNT, mRefCount); 7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_ADD_APNCONTEXT: { 7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ApnContext apnContext = (ApnContext) msg.obj; 7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_ADD_APNCONTEXT apn=" + apnContext.getApnType()); 7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!mApnList.contains(apnContext)) { 7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mApnList.add(apnContext); 7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_ADD_APNCONTEXT); 7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_REMOVE_APNCONTEXT: { 7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ApnContext apnContext = (ApnContext) msg.obj; 7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_REMOVE_APNCONTEXT apn=" + apnContext.getApnType()); 7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mApnList.remove(apnContext); 7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_REMOVE_APNCONTEXT); 7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_GET_APNCONTEXT_LIST: { 7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_GET_APNCONTEXT_LIST num in list=" + mApnList.size()); 7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_APNCONTEXT_LIST, 7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville new ArrayList<ApnContext>(mApnList)); 7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_SET_RECONNECT_INTENT: { 7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville PendingIntent intent = (PendingIntent) msg.obj; 7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_SET_RECONNECT_INTENT"); 7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mReconnectIntent = intent; 7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_SET_RECONNECT_INTENT); 7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_GET_RECONNECT_INTENT: { 7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("REQ_GET_RECONNECT_INTENT"); 7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_RECONNECT_INTENT, 7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mReconnectIntent); 7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_CONNECT: 7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyConnectCompleted(cp, FailCause.UNKNOWN); 7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DISCONNECT: 7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT" + mRefCount); 7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville deferMessage(msg); 7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DISCONNECT_ALL: 7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL" + mRefCount); 7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville deferMessage(msg); 7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_RIL_CONNECTED: 7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception == null) { 7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRilVersion = (Integer)ar.result; 7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcDefaultState: msg.what=EVENT_RIL_CONNECTED mRilVersion=" + 7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRilVersion); 7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("Unexpected exception on EVENT_RIL_CONNECTED"); 8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRilVersion = -1; 8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=0x" + 8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Integer.toHexString(msg.what)); 8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return retVal; 8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The state machine is inactive and expects a EVENT_CONNECT. 8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private class DcInactiveState extends State { 8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ConnectionParams mConnectionParams = null; 8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private FailCause mFailCause = null; 8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DisconnectParams mDisconnectParams = null; 8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setEnterNotificationParams(ConnectionParams cp, FailCause cause, 8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int retryOverride) { 8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause"); 8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mConnectionParams = cp; 8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mFailCause = cause; 8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRetryOverride = retryOverride; 8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setEnterNotificationParams(DisconnectParams dp) { 8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams dp"); 8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisconnectParams = dp; 8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void enter() { 8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mTag += 1; 8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Now that we've transitioned to Inactive state we 8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * can send notifications. Previously we sent the 8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * notifications in the processMessage handler but 8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * that caused a race condition because the synchronous 8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * call to isInactive. 8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((mConnectionParams != null) && (mFailCause != null)) { 8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("DcInactiveState: enter notifyConnectCompleted"); 8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyConnectCompleted(mConnectionParams, mFailCause); 8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mDisconnectParams != null) { 8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("DcInactiveState: enter notifyDisconnectCompleted"); 8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyDisconnectCompleted(mDisconnectParams, true); 8560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clearSettings(); 8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void exit() { 8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // clear notifications 8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mConnectionParams = null; 8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mFailCause = null; 8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisconnectParams = null; 8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean processMessage(Message msg) { 8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean retVal; 8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DataConnectionAc.REQ_RESET: 8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAc.replyToMessage(msg, DataConnectionAc.RSP_RESET); 8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_CONNECT: 8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cp.tag = mTag; 8840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcInactiveState msg.what=EVENT_CONNECT." + "RefCount = " 8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + mRefCount); 8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRefCount = 1; 8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onConnect(cp); 8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mActivatingState); 8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DISCONNECT: 8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 8960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DISCONNECT_ALL: 9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcInactiveState nothandled msg.what=0x" + 9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Integer.toHexString(msg.what)); 9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = NOT_HANDLED; 9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return retVal; 9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The state machine is activating a connection. 9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private class DcActivatingState extends State { 9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean processMessage(Message msg) { 9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean retVal; 9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar; 9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ConnectionParams cp; 9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_CONNECT: 9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcActivatingState deferring msg.what=EVENT_CONNECT refCount = " 9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + mRefCount); 9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville deferMessage(msg); 9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcActivatingState msg.what=EVENT_SETUP_DATA_CONNECTION_DONE"); 9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult) msg.obj; 9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cp = (ConnectionParams) ar.userObj; 9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataCallState.SetupResult result = onSetupConnectionCompleted(ar); 9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcActivatingState onSetupConnectionCompleted result=" + result); 9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (result) { 9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SUCCESS: 9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // All is well 9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mActiveState.setEnterNotificationParams(cp, FailCause.NONE); 9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mActiveState); 9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ERR_BadCommand: 9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Vendor ril rejected the command and didn't connect. 9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Transition to inactive but send notifications after 9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // we've entered the mInactive state. 9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause, -1); 9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mInactiveState); 9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ERR_UnacceptableParameter: 9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // The addresses given from the RIL are bad 9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville tearDownData(cp); 9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mDisconnectingErrorCreatingConnection); 9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ERR_GetLastErrorFromRil: 9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Request failed and this is an old RIL 9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mCM.getLastDataCallFailCause( 9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ERR_RilError: 9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Request failed and mFailCause has the reason 9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause, 9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getSuggestedRetryTime(ar)); 9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mInactiveState); 9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ERR_Stale: 9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Request is stale, ignore. 9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_GET_LAST_FAIL_DONE: 9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult) msg.obj; 9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cp = (ConnectionParams) ar.userObj; 9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville FailCause cause = FailCause.UNKNOWN; 9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cp.tag == mTag) { 9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE"); 9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception == null) { 9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int rilFailCause = ((int[]) (ar.result))[0]; 9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cause = FailCause.fromInt(rilFailCause); 9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Transition to inactive but send notifications after 9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // we've entered the mInactive state. 9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInactiveState.setEnterNotificationParams(cp, cause, -1); 9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mInactiveState); 9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcActivatingState EVENT_GET_LAST_FAIL_DONE is stale cp.tag=" 10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + cp.tag + ", mTag=" + mTag); 10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcActivatingState not handled msg.what=0x" + 10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Integer.toHexString(msg.what)); 10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = NOT_HANDLED; 10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return retVal; 10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private class DcActiveState extends State { 10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ConnectionParams mConnectionParams = null; 10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private FailCause mFailCause = null; 10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setEnterNotificationParams(ConnectionParams cp, FailCause cause) { 10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause"); 10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mConnectionParams = cp; 10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mFailCause = cause; 10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override public void enter() { 10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 10360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Now that we've transitioned to Active state we 10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * can send notifications. Previously we sent the 10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * notifications in the processMessage handler but 10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * that caused a race condition because the synchronous 10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * call to isActive. 10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((mConnectionParams != null) && (mFailCause != null)) { 10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) log("DcActiveState: enter notifyConnectCompleted"); 10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyConnectCompleted(mConnectionParams, mFailCause); 10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void exit() { 10500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // clear notifications 10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mConnectionParams = null; 10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mFailCause = null; 10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean processMessage(Message msg) { 10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean retVal; 10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_CONNECT: 10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRefCount++; 10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcActiveState msg.what=EVENT_CONNECT RefCount=" + mRefCount); 10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (msg.obj != null) { 10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyConnectCompleted((ConnectionParams) msg.obj, FailCause.NONE); 10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 10670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DISCONNECT: 10690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRefCount--; 10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" + mRefCount); 10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mRefCount == 0) 10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville { 10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dp.tag = mTag; 10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville tearDownData(dp); 10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mDisconnectingState); 10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (msg.obj != null) { 10790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyDisconnectCompleted((DisconnectParams) msg.obj, false); 10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DISCONNECT_ALL: 10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcActiveState msg.what=EVENT_DISCONNECT_ALL RefCount=" + mRefCount); 10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRefCount = 0; 10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dp.tag = mTag; 10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville tearDownData(dp); 10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mDisconnectingState); 10940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcActiveState not handled msg.what=0x" + 11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Integer.toHexString(msg.what)); 11010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = NOT_HANDLED; 11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 11040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return retVal; 11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DcActiveState mActiveState = new DcActiveState(); 11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The state machine is disconnecting. 11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private class DcDisconnectingState extends State { 11140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean processMessage(Message msg) { 11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean retVal; 11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_CONNECT: 11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + mRefCount); 11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville deferMessage(msg); 11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 11240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 11250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DEACTIVATE_DONE: 11270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE"); 11280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar = (AsyncResult) msg.obj; 11290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 11300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (dp.tag == mTag) { 11310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Transition to inactive but send notifications after 11320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // we've entered the mInactive state. 11330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 11340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mInactiveState); 11350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 11360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("DcDisconnectState EVENT_DEACTIVATE_DONE stale dp.tag=" 11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + dp.tag + " mTag=" + mTag); 11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 11410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcDisconnectingState not handled msg.what=0x" + 11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Integer.toHexString(msg.what)); 11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = NOT_HANDLED; 11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return retVal; 11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 11540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 11560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The state machine is disconnecting after an creating a connection. 11570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private class DcDisconnectionErrorCreatingConnection extends State { 11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 11600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean processMessage(Message msg) { 11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean retVal; 11620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DEACTIVATE_DONE: 11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar = (AsyncResult) msg.obj; 11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cp.tag == mTag) { 11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcDisconnectionErrorCreatingConnection" + 11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville " msg.what=EVENT_DEACTIVATE_DONE"); 11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Transition to inactive but send notifications after 11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // we've entered the mInactive state. 11750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInactiveState.setEnterNotificationParams(cp, 11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville FailCause.UNACCEPTABLE_NETWORK_PARAMETER, -1); 11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transitionTo(mInactiveState); 11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 11790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 11800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcDisconnectionErrorCreatingConnection EVENT_DEACTIVATE_DONE" + 11810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville " stale dp.tag=" + cp.tag + ", mTag=" + mTag); 11820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = HANDLED; 11850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 11860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 11880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 11890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=0x" 11900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + Integer.toHexString(msg.what)); 11910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville retVal = NOT_HANDLED; 11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 11940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return retVal; 11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 11990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville new DcDisconnectionErrorCreatingConnection(); 12000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // ******* public interface 12020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Bring up a connection to the apn and return an AsyncResult in onCompletedMsg. 12050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Used for cellular networks that use Acesss Point Names (APN) such 12060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * as GSM networks. 12070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 12080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object. 12090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * With AsyncResult.userObj set to the original msg.obj, 12100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.result = FailCause and AsyncResult.exception = Exception(). 12110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param apn is the Access Point Name to bring up a connection to 12120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void bringUp(Message onCompletedMsg, ApnSetting apn) { 12140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendMessage(obtainMessage(EVENT_CONNECT, new ConnectionParams(apn, onCompletedMsg))); 12150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Tear down the connection through the apn on the network. 12190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object. 12210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * With AsyncResult.userObj set to the original msg.obj. 12220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void tearDown(String reason, Message onCompletedMsg) { 12240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendMessage(obtainMessage(EVENT_DISCONNECT, new DisconnectParams(reason, onCompletedMsg))); 12250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Tear down the connection through the apn on the network. Ignores refcount and 12290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and always tears down. 12300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object. 12320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * With AsyncResult.userObj set to the original msg.obj. 12330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void tearDownAll(String reason, Message onCompletedMsg) { 12350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendMessage(obtainMessage(EVENT_DISCONNECT_ALL, 12360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville new DisconnectParams(reason, onCompletedMsg))); 12370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the string for msg.what as our info. 12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 12430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected String getWhatToString(int what) { 12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String info = null; 12450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville info = cmdToString(what); 12460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (info == null) { 12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville info = DataConnectionAc.cmdToString(what); 12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return info; 12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Dump the current state. 12540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 12550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param fd 12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param pw 12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param args 12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 12610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.print("DataConnection "); 12620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 12630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mApnList=" + mApnList); 12640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.flush(); 12650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mDataConnectionTracker=" + mDataConnectionTracker); 12660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mApn=" + mApn); 12670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mTag=" + mTag); 12680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.flush(); 12690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" phone=" + phone); 12700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mRilVersion=" + mRilVersion); 12710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" cid=" + cid); 12720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.flush(); 12730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mLinkProperties=" + mLinkProperties); 12740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.flush(); 12750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mCapabilities=" + mCapabilities); 12760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" createTime=" + TimeUtils.logTimeOfDay(createTime)); 12770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" lastFailTime=" + TimeUtils.logTimeOfDay(lastFailTime)); 12780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" lastFailCause=" + lastFailCause); 12790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.flush(); 12800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mRetryOverride=" + mRetryOverride); 12810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mRefCount=" + mRefCount); 12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" userData=" + userData); 12830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mRetryMgr != null) pw.println(" " + mRetryMgr); 12840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.flush(); 12850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1287