cellular_capability_universal.h revision f407d5934100e6f2106aeeede46bafb0074cee35
172fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// Use of this source code is governed by a BSD-style license that can be
382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// found in the LICENSE file.
482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
5145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow#ifndef SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_
6145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow#define SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_
782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <deque>
9af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow#include <map>
1082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <string>
1182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <vector>
1282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
1382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <base/memory/scoped_ptr.h>
1482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <base/memory/weak_ptr.h>
1582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <gtest/gtest_prod.h>  // for FRIEND_TEST
165c853ef21b9247d2ad3d60736b3dea77b8681ed8Ben Chan#include <ModemManager/ModemManager.h>
1782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
1882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/accessor_interface.h"
1982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/cellular.h"
2082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/cellular_capability.h"
2107193fdb601f4cea6301ebb85ebf20596807e126Ben Chan#include "shill/cellular_operator_info.h"
226e5639f9ef54db278c5f2265d5364e5994966f4aArman Uguray#include "shill/mm1_bearer_proxy_interface.h"
2382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/mm1_modem_modem3gpp_proxy_interface.h"
2482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/mm1_modem_proxy_interface.h"
2582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/mm1_modem_simple_proxy_interface.h"
2682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/mm1_sim_proxy_interface.h"
2782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
2882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgowstruct mobile_provider;
2982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
3082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgownamespace shill {
3182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
3227526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhuclass ModemInfo;
33c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
3482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// CellularCapabilityUniversal handles modems using the
3582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// org.chromium.ModemManager1 DBUS interface.  This class is used for
3682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// all types of modems, i.e. CDMA, GSM, and LTE modems.
3782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgowclass CellularCapabilityUniversal : public CellularCapability {
3882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow public:
3982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  typedef std::vector<DBusPropertiesMap> ScanResults;
4082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  typedef DBusPropertiesMap ScanResult;
4174924d87cc111f8603751f09cd009c830f43e668Ben Chan  typedef std::map<uint32_t, uint32_t> LockRetryData;
4282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
43145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // Constants used in connect method call.  Make available to test matchers.
44145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // TODO(jglasgow): Generate from modem manager into
45145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // ModemManager-names.h.
46ee6b3d7f9d49fa52072a352fbb59f06127b1ba4cPaul Stewart  // See http://crbug.com/212909.
47145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectPin[];
48145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectOperatorId[];
49145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectApn[];
50145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectIPType[];
51145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectUser[];
52145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectPassword[];
53145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectNumber[];
54145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectAllowRoaming[];
55145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectRMProtocol[];
56145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow
57ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le  CellularCapabilityUniversal(Cellular *cellular,
58ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le                              ProxyFactory *proxy_factory,
5927526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu                              ModemInfo *modem_info);
6082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
6182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Inherited from CellularCapability.
62e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // Checks the modem state.  If the state is kModemStateDisabled, then the
63e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // modem is enabled.  Otherwise, the enable command is buffered until the
64e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // modem becomes disabled.  ModemManager rejects the enable command if the
65e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // modem is not disabled, for exmaple, if it is initializing insted.
6682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void StartModem(Error *error, const ResultCallback &callback);
6782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void StopModem(Error *error, const ResultCallback &callback);
6882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void Connect(const DBusPropertiesMap &properties, Error *error,
6982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                       const ResultCallback &callback);
7082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void Disconnect(Error *error, const ResultCallback &callback);
718a46890363301a4e28fe3175e194703409e344dcChristopher Wiley  virtual void DisconnectCleanup();
7282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void Activate(const std::string &carrier,
7382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                        Error *error, const ResultCallback &callback);
74c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  virtual void CompleteActivation(Error *error);
7582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
7682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void OnServiceCreated();
7782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void SetupConnectProperties(DBusPropertiesMap *properties);
78ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  virtual void GetProperties();
7972fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  virtual bool IsRegistered();
8015786033dc85e3dd7fea18ba936957b8b2c34e29Ben Chan  virtual bool IsServiceActivationRequired() const;
8182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void Register(const ResultCallback &callback);
8282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
8382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void RegisterOnNetwork(const std::string &network_id,
8482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                                 Error *error,
8582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                                 const ResultCallback &callback);
867fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood  virtual void SetUnregistered(bool searching);
8782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual std::string CreateFriendlyServiceName();
8882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void RequirePIN(const std::string &pin, bool require,
8982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                          Error *error, const ResultCallback &callback);
9082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void EnterPIN(const std::string &pin,
9182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                        Error *error, const ResultCallback &callback);
9282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void UnblockPIN(const std::string &unblock_code,
9382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                          const std::string &pin,
9482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                          Error *error, const ResultCallback &callback);
9582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void ChangePIN(const std::string &old_pin,
9682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                         const std::string &new_pin,
9782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                         Error *error, const ResultCallback &callback);
985d0d32c1b5e2370ff0739f7a2dbb641726d4bf87Ben Chan  virtual void Reset(Error *error, const ResultCallback &callback);
9982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
10082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void Scan(Error *error, const ResultCallback &callback);
10182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual std::string GetNetworkTechnologyString() const;
10282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual std::string GetRoamingStateString() const;
10382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void GetSignalQuality();
1049f09aeffcd088960c5b1a7d507c3705ce14b2b0dJason Glasgow  virtual std::string GetTypeString() const;
10582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void OnDBusPropertiesChanged(
10682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow      const std::string &interface,
10782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow      const DBusPropertiesMap &changed_properties,
10882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow      const std::vector<std::string> &invalidated_properties);
109af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  virtual bool AllowRoaming();
110f84a4242b4218dc375449ab2d68085226f43ce5bArman Uguray  virtual bool ShouldDetectOutOfCredit() const;
111145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow
11282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow protected:
11382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void InitProxies();
11482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void ReleaseProxies();
11582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
11672fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // Updates the |sim_path_| variable and creates a new proxy to the
11772fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // DBUS ModemManager1.Sim interface.
11872fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // TODO(armansito): Put this method in a 3GPP-only subclass.
11972fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  virtual void OnSimPathChanged(const std::string &sim_path);
12072fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray
12172fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // Updates the online payment portal information, if any, for the cellular
12272fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // provider.
12372fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  virtual void UpdateOLP();
12472fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray
1250a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  // Post-payment activation handlers.
1260a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  virtual void UpdatePendingActivationState();
1270a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray
12807193fdb601f4cea6301ebb85ebf20596807e126Ben Chan  // Returns the operator-specific form of |mdn_|, which is passed to the online
12907193fdb601f4cea6301ebb85ebf20596807e126Ben Chan  // payment portal of a cellular operator.
13007193fdb601f4cea6301ebb85ebf20596807e126Ben Chan  std::string GetMdnForOLP(
13107193fdb601f4cea6301ebb85ebf20596807e126Ben Chan      const CellularOperatorInfo::CellularOperator &cellular_operator) const;
13207193fdb601f4cea6301ebb85ebf20596807e126Ben Chan
1330a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  const std::string &mdn() const { return mdn_; }
1340a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  void set_mdn(const std::string &mdn) { mdn_ = mdn; }
1350a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray
1360a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  const std::string &min() const { return min_; }
1370a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  void set_min(const std::string &min) { min_ = min; }
13872fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray
13972fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  const std::string &meid() const { return meid_; }
14072fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  void set_meid(const std::string &meid) { meid_ = meid; }
14172fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray
14272fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  const std::string &esn() const { return esn_; }
14372fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  void set_esn(const std::string &esn) { esn_ = esn; }
14472fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray
14582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow private:
14674924d87cc111f8603751f09cd009c830f43e668Ben Chan  struct ModemModes {
14774924d87cc111f8603751f09cd009c830f43e668Ben Chan    ModemModes()
14874924d87cc111f8603751f09cd009c830f43e668Ben Chan        : allowed_modes(MM_MODEM_MODE_NONE),
14974924d87cc111f8603751f09cd009c830f43e668Ben Chan          preferred_mode(MM_MODEM_MODE_NONE) {}
15074924d87cc111f8603751f09cd009c830f43e668Ben Chan
15174924d87cc111f8603751f09cd009c830f43e668Ben Chan    ModemModes(uint32 allowed, MMModemMode preferred)
15274924d87cc111f8603751f09cd009c830f43e668Ben Chan        : allowed_modes(allowed),
15374924d87cc111f8603751f09cd009c830f43e668Ben Chan          preferred_mode(preferred) {}
15474924d87cc111f8603751f09cd009c830f43e668Ben Chan
15574924d87cc111f8603751f09cd009c830f43e668Ben Chan    uint32 allowed_modes;        // Bits based on MMModemMode.
15674924d87cc111f8603751f09cd009c830f43e668Ben Chan    MMModemMode preferred_mode;  // A single MMModemMode bit.
15774924d87cc111f8603751f09cd009c830f43e668Ben Chan  };
15874924d87cc111f8603751f09cd009c830f43e668Ben Chan
159cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  // Constants used in scan results.  Make available to unit tests.
160cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  // TODO(jglasgow): Generate from modem manager into ModemManager-names.h.
161ee6b3d7f9d49fa52072a352fbb59f06127b1ba4cPaul Stewart  // See http://crbug.com/212909.
162cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kStatusProperty[];
163cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kOperatorLongProperty[];
164cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kOperatorShortProperty[];
165cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kOperatorCodeProperty[];
166cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kOperatorAccessTechnologyProperty[];
167cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow
1689da07771df3dbbc99ff99114c26317d01f29f7fcmukesh agrawal  // As above, consider having this in ModemManager-names.h.
1699da07771df3dbbc99ff99114c26317d01f29f7fcmukesh agrawal  static const char kIpConfigPropertyMethod[];
1709da07771df3dbbc99ff99114c26317d01f29f7fcmukesh agrawal
171145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // Modem Model ID strings.  From modem firmware via modemmanager.
172145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kE362ModelId[];
173145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow
1742717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray  // Generic service name prefix, shown when the correct carrier name is
1752717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray  // unknown.
1762717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray  static const char kGenericServiceNamePrefix[];
1772717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray
178a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  static const int64 kActivationRegistrationTimeoutMilliseconds;
179a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  static const int64 kDefaultScanningOrSearchingTimeoutMilliseconds;
180f6366ac746f63e4bacaa03ea8e524c2e8ec65aa8Arman Uguray  static const int64 kEnterPinTimeoutMilliseconds;
1818f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  static const int64 kRegistrationDroppedUpdateTimeoutMilliseconds;
1822cac294eff9415574cb9066e88f5cf43180a5092Thieu Le  static const int kSetPowerStateTimeoutMilliseconds;
183ee464d3c77dc7662973bfa5cb3c6eeb207366eacArman Uguray
1841361c0366043f3d2628dc7c339339116ce31085eArman Uguray
1856552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // Root path. The SIM path is reported by ModemManager to be the root path
1866552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // when no SIM is present.
1876552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  static const char kRootPath[];
1886552f8c74196782e9adf09f4fea01c836f551255Arman Uguray
18982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  friend class CellularTest;
19082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  friend class CellularCapabilityTest;
1913d27539b13590e0b149440ce017fdc401ef6e735Thieu Le  friend class CellularCapabilityUniversalTest;
19272fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  friend class CellularCapabilityUniversalCDMATest;
1930a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, PropertiesChanged);
1940a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, UpdateOLP);
1951361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, AllowRoaming);
196a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
197a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray              ActivationWaitForRegisterTimeout);
1981361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, Connect);
1991361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, ConnectApns);
2001361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, CreateFriendlyServiceName);
2011361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, DisconnectNoProxy);
2027af0fac103deceec063554ef5705901d6d82d42fArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2038f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu              DisconnectWithDeferredCallback);
2048f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2057af0fac103deceec063554ef5705901d6d82d42fArman Uguray              GetNetworkTechnologyStringOnE362);
20607193fdb601f4cea6301ebb85ebf20596807e126Ben Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest, GetMdnForOLP);
2071361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, GetTypeString);
208c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, IsMdnValid);
2091361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, IsServiceActivationRequired);
2106552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, IsValidSimPath);
211d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest, NormalizeMdn);
2121361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, OnListBearersReply);
213c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, OnLockRetriesChanged);
214c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, OnLockTypeChanged);
2151361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
216fcca27bd166ce485d9ef8afce5e060be935ece97Ben Chan              OnModemCurrentCapabilitiesChanged);
217c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, OnSimLockPropertiesChanged);
2181361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, PropertiesChanged);
2191361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, Reset);
2201361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, Scan);
2211361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, ScanFailure);
2221361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SetHomeProvider);
223d42d8ec85a9a1bdc406870b75d1b9e266fbaaa02Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
224f84a4242b4218dc375449ab2d68085226f43ce5bArman Uguray              ShouldDetectOutOfCredit);
2251361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusChanged);
226c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusToProperty);
2271361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPathChanged);
2281361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPropertiesChanged);
2291361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, StartModem);
2301361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModem);
2311361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModemConnected);
2320a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2330a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray              UpdatePendingActivationState);
234efea6e0f28c3270038914e80166702d5ac23095eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2358f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu              UpdateRegistrationState);
2368f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2378f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu              UpdateRegistrationStateModemNotConnected);
2388f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  FRIEND_TEST(CellularCapabilityUniversalMainTest,
239efea6e0f28c3270038914e80166702d5ac23095eArman Uguray              UpdateServiceActivationState);
2401361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateServiceName);
2411361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateStorageIdentifier);
2421361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateOLP);
2431361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateOperatorInfo);
2441361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2451361c0366043f3d2628dc7c339339116ce31085eArman Uguray              UpdateOperatorInfoViaOperatorId);
2461361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateScanningProperty);
247a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalTimerTest, CompleteActivation);
2481361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalTimerTest,
2491361c0366043f3d2628dc7c339339116ce31085eArman Uguray              UpdateScanningPropertyTimeout);
250d42d8ec85a9a1bdc406870b75d1b9e266fbaaa02Arman Uguray  FRIEND_TEST(CellularTest, EnableTrafficMonitor);
25109fa2a0e9c0feed7b3ca23fc7d8ad59783f4c6a7Ben Chan  FRIEND_TEST(CellularTest,
25209fa2a0e9c0feed7b3ca23fc7d8ad59783f4c6a7Ben Chan              HandleNewRegistrationStateForServiceRequiringActivation);
2535218cf2bb1301197e0e3c9381bc4c66e8adf80b0Thieu Le  FRIEND_TEST(CellularTest, ModemStateChangeLostRegistration);
254f407d5934100e6f2106aeeede46bafb0074cee35mukesh agrawal  FRIEND_TEST(CellularTest, OnPPPDied);
25582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
256c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  // SimLockStatus represents the fields in the Cellular.SIMLockStatus
257c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  // DBUS property of the shill device.
258c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  struct SimLockStatus {
259c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray   public:
260c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray    SimLockStatus() : enabled(false),
261c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray                      lock_type(MM_MODEM_LOCK_UNKNOWN),
262c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray                      retries_left(0) {}
263c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray
264c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray    bool enabled;
265c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray    MMModemLock lock_type;
266c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray    uint32 retries_left;
267c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  };
268c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray
269ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  // Methods used in starting a modem
270e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  void EnableModem(Error *error, const ResultCallback &callback);
271b9c05e082cf4afc03dc4d0748a08feb2340ded92Thieu Le  void Start_ModemAlreadyEnabled(const ResultCallback &callback);
272ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  void Start_EnableModemCompleted(const ResultCallback &callback,
273ef96556fff984bbc79597669af2465905666ed09Jason Glasgow                                  const Error &error);
274ef96556fff984bbc79597669af2465905666ed09Jason Glasgow
275ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  // Methods used in stopping a modem
276ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  void Stop_DisconnectCompleted(const ResultCallback &callback,
277ef96556fff984bbc79597669af2465905666ed09Jason Glasgow                               const Error &error);
278ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  void Stop_Disable(const ResultCallback &callback);
279ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  void Stop_DisableCompleted(const ResultCallback &callback,
280ef96556fff984bbc79597669af2465905666ed09Jason Glasgow                             const Error &error);
281ee464d3c77dc7662973bfa5cb3c6eeb207366eacArman Uguray  void Stop_PowerDown(const ResultCallback &callback);
282ee464d3c77dc7662973bfa5cb3c6eeb207366eacArman Uguray  void Stop_PowerDownCompleted(const ResultCallback &callback,
283ee464d3c77dc7662973bfa5cb3c6eeb207366eacArman Uguray                               const Error &error);
284ef96556fff984bbc79597669af2465905666ed09Jason Glasgow
2852717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray  // Updates the name property that is exposed by the service to Chrome.
2862717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray  void UpdateServiceName();
2872717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray
2888a2c01e2d7fb27724f529adc3a0aa2daba9b1b44Ben Chan  void UpdateScanningProperty();
2898a2c01e2d7fb27724f529adc3a0aa2daba9b1b44Ben Chan
290d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray  // Methods used in acquiring information related to the carrier;
291d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray
29282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Updates the Universal operator name and country based on a newly
29382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // obtained network id.
29482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  void UpdateOperatorInfo();
29582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
296d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray  // Sets the upper level information about the home cellular provider from the
297d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray  // modem's IMSI and SPN.
298d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray  void SetHomeProvider();
299d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray
30082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Updates the serving operator on the active service.
30182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  void UpdateServingOperator();
30282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
303d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray  // Initializes the |apn_list_| property based on the current |home_provider_|.
304d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray  void InitAPNList();
305d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray
3066e5639f9ef54db278c5f2265d5364e5994966f4aArman Uguray  // Updates |bearer_path_| to match the currently active bearer.
3076e5639f9ef54db278c5f2265d5364e5994966f4aArman Uguray  void UpdateBearerPath();
3086e5639f9ef54db278c5f2265d5364e5994966f4aArman Uguray
309c953357b248a9559c95097892d1458ff1a4e43bfArman Uguray  // Updates the storage identifier used for the current cellular service.
310c953357b248a9559c95097892d1458ff1a4e43bfArman Uguray  void UpdateStorageIdentifier();
311c953357b248a9559c95097892d1458ff1a4e43bfArman Uguray
31282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
31382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  Stringmap ParseScanResult(const ScanResult &result);
31482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
31582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  KeyValueStore SimLockStatusToProperty(Error *error);
31682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
31782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  void SetupApnTryList();
31882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  void FillConnectPropertyMap(DBusPropertiesMap *properties);
31982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
320bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  void HelpRegisterConstDerivedKeyValueStore(
32182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow      const std::string &name,
322bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal      KeyValueStore(CellularCapabilityUniversal::*get)(Error *error));
32382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
324145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // Returns true if a connect error should be retried.  This function
325145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // abstracts modem specific behavior for modems which do a lousy job
326145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // of returning specific errors on connect failures.
327145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  bool RetriableConnectError(const Error &error) const;
328145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow
32982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Signal callbacks
3303022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnNetworkModeSignal(uint32 mode);
3317fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood  void OnModemStateChangedSignal(int32 old_state,
3327fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood                                 int32 new_state,
3337fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood                                 uint32 reason);
33482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
33582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Property Change notification handlers
3363022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnModemPropertiesChanged(
3374c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow      const DBusPropertiesMap &properties,
3384c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow      const std::vector<std::string> &invalidated_properties);
3394c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow
3403022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnSignalQualityChanged(uint32 quality);
34174924d87cc111f8603751f09cd009c830f43e668Ben Chan
34274924d87cc111f8603751f09cd009c830f43e668Ben Chan  void OnSupportedCapabilitesChanged(
34374924d87cc111f8603751f09cd009c830f43e668Ben Chan      const std::vector<uint32> &supported_capabilities);
344af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnModemCurrentCapabilitiesChanged(uint32 current_capabilities);
345af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnMdnChanged(const std::string &mdn);
346af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnModemManufacturerChanged(const std::string &manufacturer);
347af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnModemModelChanged(const std::string &model);
348af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnModemRevisionChanged(const std::string &revision);
349af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnModemStateChanged(Cellular::ModemState state);
350af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnAccessTechnologiesChanged(uint32 access_technologies);
35174924d87cc111f8603751f09cd009c830f43e668Ben Chan  void OnSupportedModesChanged(const std::vector<ModemModes> &supported_modes);
35274924d87cc111f8603751f09cd009c830f43e668Ben Chan  void OnCurrentModesChanged(const ModemModes &current_modes);
353c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  void OnLockRetriesChanged(const LockRetryData &lock_retries);
354c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  void OnLockTypeChanged(MMModemLock unlock_required);
355af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnSimLockStatusChanged();
356af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow
357c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  // Returns false if the MDN is empty or if the MDN consists of all 0s.
358c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  bool IsMdnValid() const;
359c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
360af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  // 3GPP property change handlers
361af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  virtual void OnModem3GPPPropertiesChanged(
362af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow      const DBusPropertiesMap &properties,
363af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow      const std::vector<std::string> &invalidated_properties);
364af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnImeiChanged(const std::string &imei);
365af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void On3GPPRegistrationChanged(MMModem3gppRegistrationState state,
366af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow                                 const std::string &operator_code,
367af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow                                 const std::string &operator_name);
3688f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  void Handle3GPPRegistrationChange(
3698f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu      MMModem3gppRegistrationState updated_state,
3708f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu      std::string updated_operator_code,
3718f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu      std::string updated_operator_name);
372af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnFacilityLocksChanged(uint32 locks);
373af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow
374af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  // SIM property change handlers
37572fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // TODO(armansito): Put these methods in a 3GPP-only subclass.
376af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnSimPropertiesChanged(
377af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow      const DBusPropertiesMap &props,
378af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow      const std::vector<std::string> &invalidated_properties);
379af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnImsiChanged(const std::string &imsi);
380d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray  void OnSpnChanged(const std::string &spn);
381af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnSimIdentifierChanged(const std::string &id);
382af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnOperatorIdChanged(const std::string &operator_id);
383af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnOperatorNameChanged(const std::string &operator_name);
384ef96556fff984bbc79597669af2465905666ed09Jason Glasgow
38582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Method callbacks
3863022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnRegisterReply(const ResultCallback &callback,
3873022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams                       const Error &error);
3885d0d32c1b5e2370ff0739f7a2dbb641726d4bf87Ben Chan  void OnResetReply(const ResultCallback &callback, const Error &error);
3893022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnScanReply(const ResultCallback &callback,
3903022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams                   const ScanResults &results,
3913022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams                   const Error &error);
392b54974f033f713690135f3f3516ca14aa7ee6cfdNathan Williams  void OnConnectReply(const ResultCallback &callback,
393b54974f033f713690135f3f3516ca14aa7ee6cfdNathan Williams                      const DBus::Path &bearer,
394b54974f033f713690135f3f3516ca14aa7ee6cfdNathan Williams                      const Error &error);
3956e5639f9ef54db278c5f2265d5364e5994966f4aArman Uguray  void OnListBearersReply(const std::vector<DBus::Path> &paths,
3966e5639f9ef54db278c5f2265d5364e5994966f4aArman Uguray                          const Error &error);
39782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
3981361c0366043f3d2628dc7c339339116ce31085eArman Uguray  // Timeout callback for the network scan initiated when Cellular connectivity
3991361c0366043f3d2628dc7c339339116ce31085eArman Uguray  // gets enabled.
4001361c0366043f3d2628dc7c339339116ce31085eArman Uguray  void OnScanningOrSearchingTimeout();
4011361c0366043f3d2628dc7c339339116ce31085eArman Uguray
402a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  // Timeout callback that is called if the modem takes too long to register to
403a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  // a network after online payment is complete. Resets the modem.
404a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  void OnActivationWaitForRegisterTimeout();
405a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray
4066552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // Returns true, if |sim_path| constitutes a valid SIM path. Currently, a
4076552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // path is accepted to be valid, as long as it is not equal to one of ""
4086552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // and "/".
4096552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  bool IsValidSimPath(const std::string &sim_path) const;
4106552f8c74196782e9adf09f4fea01c836f551255Arman Uguray
411d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan  // Returns the normalized version of |mdn| by keeping only digits in |mdn|
412d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan  // and removing other non-digit characters.
413d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan  std::string NormalizeMdn(const std::string &mdn) const;
414d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan
4152717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray  static std::string GenerateNewGenericServiceName();
4162717a10096e12e46413adf47b39c5b19cd33bce7Arman Uguray
417c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  // Post-payment activation handlers.
418c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  void ResetAfterActivation();
419efea6e0f28c3270038914e80166702d5ac23095eArman Uguray  void UpdateServiceActivationState();
420c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  void OnResetAfterActivationReply(const Error &error);
421c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
4228f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  static bool IsRegisteredState(MMModem3gppRegistrationState state);
4238f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu
42482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  scoped_ptr<mm1::ModemModem3gppProxyInterface> modem_3gpp_proxy_;
42582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  scoped_ptr<mm1::ModemProxyInterface> modem_proxy_;
42682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  scoped_ptr<mm1::ModemSimpleProxyInterface> modem_simple_proxy_;
42782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  scoped_ptr<mm1::SimProxyInterface> sim_proxy_;
42882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
42982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  base::WeakPtrFactory<CellularCapabilityUniversal> weak_ptr_factory_;
43082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
43182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  MMModem3gppRegistrationState registration_state_;
432af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow
433af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  // Bits based on MMModemCapabilities
43474924d87cc111f8603751f09cd009c830f43e668Ben Chan  std::vector<uint32> supported_capabilities_;  // Technologies supported
43574924d87cc111f8603751f09cd009c830f43e668Ben Chan  uint32 current_capabilities_;  // Technologies supported without a reload
436145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  uint32 access_technologies_;   // Bits based on MMModemAccessTechnology
43774924d87cc111f8603751f09cd009c830f43e668Ben Chan  std::vector<ModemModes> supported_modes_;
43874924d87cc111f8603751f09cd009c830f43e668Ben Chan  ModemModes current_modes_;
439af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow
44082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  Cellular::Operator serving_operator_;
44182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string spn_;
442af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  std::string sim_identifier_;
443af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  std::string operator_id_;
44482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  mobile_provider *home_provider_;
445f508c8273e6265599f184189a424e697598eb980Darin Petkov  bool provider_requires_roaming_;
44682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string desired_network_;
44782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
44882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Properties.
44982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string carrier_;
45082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string esn_;
45182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string firmware_revision_;
45282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string hardware_revision_;
45382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string imei_;
45482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string imsi_;
45582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string manufacturer_;
45682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string mdn_;
45782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string meid_;
45882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string min_;
45982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string model_id_;
46082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string selected_network_;
46182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  Stringmaps found_networks_;
46282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::deque<Stringmap> apn_try_list_;
4635d0d32c1b5e2370ff0739f7a2dbb641726d4bf87Ben Chan  bool resetting_;
46482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  bool scanning_supported_;
46582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  bool scanning_;
4668a2c01e2d7fb27724f529adc3a0aa2daba9b1b44Ben Chan  bool scanning_or_searching_;
46782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  uint16 scan_interval_;
46882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  SimLockStatus sim_lock_status_;
46982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  Stringmaps apn_list_;
470ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  std::string sim_path_;
471bd3aee80be371d838863eccf708fd107153503efBen Chan  bool sim_present_;
472b54974f033f713690135f3f3516ca14aa7ee6cfdNathan Williams  DBus::Path bearer_path_;
473c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  bool reset_done_;
474c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
475e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // If the modem is not in a state to be enabled when StartModem is called,
476e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // enabling is deferred using this callback.
477e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  base::Closure deferred_enable_modem_callback_;
478e285a84b38b81f5557b576da187d037ad24ae4afGary Morain
4791361c0366043f3d2628dc7c339339116ce31085eArman Uguray  // Sometimes modems may be stuck in the SEARCHING state during the lack of
4801361c0366043f3d2628dc7c339339116ce31085eArman Uguray  // presence of a network. During this indefinite duration of time, keeping
4811361c0366043f3d2628dc7c339339116ce31085eArman Uguray  // the Device.Scanning property as |true| causes a bad user experience.
4821361c0366043f3d2628dc7c339339116ce31085eArman Uguray  // This callback sets it to |false| after a timeout period has passed.
4831361c0366043f3d2628dc7c339339116ce31085eArman Uguray  base::CancelableClosure scanning_or_searching_timeout_callback_;
484a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  int64 scanning_or_searching_timeout_milliseconds_;
485a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray
486a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  base::CancelableClosure activation_wait_for_registration_callback_;
487a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  int64 activation_registration_timeout_milliseconds_;
4881361c0366043f3d2628dc7c339339116ce31085eArman Uguray
4898f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  // Sometimes flaky cellular network causes the 3GPP registration state to
4908f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  // rapidly change from registered --> searching and back. Delay such updates
4918f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  // a little to smooth over temporary registration loss.
4928f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  base::CancelableClosure registration_dropped_update_callback_;
4938f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  int64 registration_dropped_update_timeout_milliseconds_;
4948f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu
49582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  static unsigned int friendly_service_name_id_;
49682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
49782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  DISALLOW_COPY_AND_ASSIGN(CellularCapabilityUniversal);
49882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow};
49982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
50082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow}  // namespace shill
50182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
502145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow#endif  // SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_
503