cellular_capability_universal.h revision afe636676760df31a8db2f4b77bfd19faae52782
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"
202849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le#include "shill/cellular_bearer.h"
2182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/cellular_capability.h"
2207193fdb601f4cea6301ebb85ebf20596807e126Ben Chan#include "shill/cellular_operator_info.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"
2743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le#include "shill/out_of_credits_detector.h"
2882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
2982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgowstruct mobile_provider;
3082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
3182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgownamespace shill {
3282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
3327526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhuclass ModemInfo;
34c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
3582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// CellularCapabilityUniversal handles modems using the
3682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// org.chromium.ModemManager1 DBUS interface.  This class is used for
3782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// all types of modems, i.e. CDMA, GSM, and LTE modems.
3882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgowclass CellularCapabilityUniversal : public CellularCapability {
3982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow public:
4082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  typedef std::vector<DBusPropertiesMap> ScanResults;
4182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  typedef DBusPropertiesMap ScanResult;
4274924d87cc111f8603751f09cd009c830f43e668Ben Chan  typedef std::map<uint32_t, uint32_t> LockRetryData;
4382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
44145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // Constants used in connect method call.  Make available to test matchers.
45145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // TODO(jglasgow): Generate from modem manager into
46145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // ModemManager-names.h.
47ee6b3d7f9d49fa52072a352fbb59f06127b1ba4cPaul Stewart  // See http://crbug.com/212909.
48145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectPin[];
49145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectOperatorId[];
50145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectApn[];
51145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectIPType[];
52145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectUser[];
53145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectPassword[];
54145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectNumber[];
55145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectAllowRoaming[];
56145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kConnectRMProtocol[];
57145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow
58ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le  CellularCapabilityUniversal(Cellular *cellular,
59ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le                              ProxyFactory *proxy_factory,
6027526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu                              ModemInfo *modem_info);
61f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual ~CellularCapabilityUniversal();
6282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
6382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Inherited from CellularCapability.
64f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual std::string GetTypeString() const override;
65f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void OnDBusPropertiesChanged(
66f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan      const std::string &interface,
67f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan      const DBusPropertiesMap &changed_properties,
68f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan      const std::vector<std::string> &invalidated_properties) override;
69e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // Checks the modem state.  If the state is kModemStateDisabled, then the
70e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // modem is enabled.  Otherwise, the enable command is buffered until the
71e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // modem becomes disabled.  ModemManager rejects the enable command if the
721ee9391c97a19fc6e618d8f23748b49acbf868d0Arman Uguray  // modem is not disabled, for example, if it is initializing instead.
73f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void StartModem(Error *error,
74f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                          const ResultCallback &callback) override;
75f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void StopModem(Error *error, const ResultCallback &callback) override;
76f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void Reset(Error *error, const ResultCallback &callback) override;
77f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual bool IsServiceActivationRequired() const override;
78f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void CompleteActivation(Error *error) override;
79f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void Scan(Error *error,
80f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                    const ResultStringmapsCallback &callback) override;
8182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void RegisterOnNetwork(const std::string &network_id,
8282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                                 Error *error,
83f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                                 const ResultCallback &callback) override;
84f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual bool IsRegistered() const override;
85f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void SetUnregistered(bool searching) override;
86f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void OnServiceCreated() override;
87f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual std::string GetNetworkTechnologyString() const override;
88f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual std::string GetRoamingStateString() const override;
89f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual bool AllowRoaming() override;
90f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void GetSignalQuality() override;
91f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void SetupConnectProperties(DBusPropertiesMap *properties) override;
92f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void Connect(const DBusPropertiesMap &properties,
93f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                       Error *error,
94f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                       const ResultCallback &callback) override;
95f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void Disconnect(Error *error,
96f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                          const ResultCallback &callback) override;
97f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual CellularBearer *GetActiveBearer() const override;
98f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void RequirePIN(const std::string &pin,
99f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                          bool require,
100f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                          Error *error,
101f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                          const ResultCallback &callback) override;
10282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void EnterPIN(const std::string &pin,
103f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                        Error *error,
104f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                        const ResultCallback &callback) override;
10582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void UnblockPIN(const std::string &unblock_code,
10682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                          const std::string &pin,
107f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                          Error *error,
108f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                          const ResultCallback &callback) override;
10982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void ChangePIN(const std::string &old_pin,
11082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow                         const std::string &new_pin,
111f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                         Error *error,
112f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan                         const ResultCallback &callback) override;
11382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
114f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void GetProperties();
115f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan  virtual void Register(const ResultCallback &callback);
116145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow
11782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow protected:
11882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void InitProxies();
11982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  virtual void ReleaseProxies();
12082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
12172fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // Updates the |sim_path_| variable and creates a new proxy to the
12272fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // DBUS ModemManager1.Sim interface.
12372fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // TODO(armansito): Put this method in a 3GPP-only subclass.
12472fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  virtual void OnSimPathChanged(const std::string &sim_path);
12572fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray
12672fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // Updates the online payment portal information, if any, for the cellular
12772fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // provider.
12892df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  virtual void UpdateServiceOLP() override;
12972fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray
1300a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  // Post-payment activation handlers.
1310a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  virtual void UpdatePendingActivationState();
1320a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray
1339f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu  // Returns the operator-specific form of |mdn|, which is passed to the online
13407193fdb601f4cea6301ebb85ebf20596807e126Ben Chan  // payment portal of a cellular operator.
13592df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  std::string GetMdnForOLP(const MobileOperatorInfo *operator_info) const;
13607193fdb601f4cea6301ebb85ebf20596807e126Ben Chan
13782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow private:
13874924d87cc111f8603751f09cd009c830f43e668Ben Chan  struct ModemModes {
13974924d87cc111f8603751f09cd009c830f43e668Ben Chan    ModemModes()
14074924d87cc111f8603751f09cd009c830f43e668Ben Chan        : allowed_modes(MM_MODEM_MODE_NONE),
14174924d87cc111f8603751f09cd009c830f43e668Ben Chan          preferred_mode(MM_MODEM_MODE_NONE) {}
14274924d87cc111f8603751f09cd009c830f43e668Ben Chan
14374924d87cc111f8603751f09cd009c830f43e668Ben Chan    ModemModes(uint32 allowed, MMModemMode preferred)
14474924d87cc111f8603751f09cd009c830f43e668Ben Chan        : allowed_modes(allowed),
14574924d87cc111f8603751f09cd009c830f43e668Ben Chan          preferred_mode(preferred) {}
14674924d87cc111f8603751f09cd009c830f43e668Ben Chan
14774924d87cc111f8603751f09cd009c830f43e668Ben Chan    uint32 allowed_modes;        // Bits based on MMModemMode.
14874924d87cc111f8603751f09cd009c830f43e668Ben Chan    MMModemMode preferred_mode;  // A single MMModemMode bit.
14974924d87cc111f8603751f09cd009c830f43e668Ben Chan  };
15074924d87cc111f8603751f09cd009c830f43e668Ben Chan
151cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  // Constants used in scan results.  Make available to unit tests.
152cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  // TODO(jglasgow): Generate from modem manager into ModemManager-names.h.
153ee6b3d7f9d49fa52072a352fbb59f06127b1ba4cPaul Stewart  // See http://crbug.com/212909.
154cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kStatusProperty[];
155cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kOperatorLongProperty[];
156cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kOperatorShortProperty[];
157cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kOperatorCodeProperty[];
158cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow  static const char kOperatorAccessTechnologyProperty[];
159cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgow
160145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // Modem Model ID strings.  From modem firmware via modemmanager.
16143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  static const char kALT3100ModelId[];
162145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  static const char kE362ModelId[];
163145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow
164a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  static const int64 kActivationRegistrationTimeoutMilliseconds;
165f6366ac746f63e4bacaa03ea8e524c2e8ec65aa8Arman Uguray  static const int64 kEnterPinTimeoutMilliseconds;
1668f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  static const int64 kRegistrationDroppedUpdateTimeoutMilliseconds;
1672cac294eff9415574cb9066e88f5cf43180a5092Thieu Le  static const int kSetPowerStateTimeoutMilliseconds;
168ee464d3c77dc7662973bfa5cb3c6eeb207366eacArman Uguray
1691361c0366043f3d2628dc7c339339116ce31085eArman Uguray
1706552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // Root path. The SIM path is reported by ModemManager to be the root path
1716552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // when no SIM is present.
1726552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  static const char kRootPath[];
1736552f8c74196782e9adf09f4fea01c836f551255Arman Uguray
17482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  friend class CellularTest;
17582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  friend class CellularCapabilityTest;
1763d27539b13590e0b149440ce017fdc401ef6e735Thieu Le  friend class CellularCapabilityUniversalTest;
17772fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  friend class CellularCapabilityUniversalCDMATest;
1780a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, PropertiesChanged);
1791361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, AllowRoaming);
180a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
181a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray              ActivationWaitForRegisterTimeout);
1821361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, Connect);
1831361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, ConnectApns);
1841361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, DisconnectNoProxy);
1857af0fac103deceec063554ef5705901d6d82d42fArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
1868f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu              DisconnectWithDeferredCallback);
18743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  FRIEND_TEST(CellularCapabilityUniversalMainTest, ExtractPcoValue);
18843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  FRIEND_TEST(CellularCapabilityUniversalMainTest, GetMdnForOLP);
1898f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  FRIEND_TEST(CellularCapabilityUniversalMainTest,
1907af0fac103deceec063554ef5705901d6d82d42fArman Uguray              GetNetworkTechnologyStringOnE362);
19143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  FRIEND_TEST(CellularCapabilityUniversalMainTest,
19243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le              GetOutOfCreditsDetectionType);
1931361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, GetTypeString);
194c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, IsMdnValid);
19531ce564d64f68172299d4cde60edd7a5c004b38eBen Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest, IsRegistered);
1961361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, IsServiceActivationRequired);
1976552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, IsValidSimPath);
198d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest, NormalizeMdn);
199c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, OnLockRetriesChanged);
200c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, OnLockTypeChanged);
2011361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
202fcca27bd166ce485d9ef8afce5e060be935ece97Ben Chan              OnModemCurrentCapabilitiesChanged);
203c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, OnSimLockPropertiesChanged);
2041361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, PropertiesChanged);
2051361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, Reset);
2061361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, Scan);
2071361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, ScanFailure);
2081361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusChanged);
209c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusToProperty);
2101361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPathChanged);
2111361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPropertiesChanged);
2121361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, StartModem);
213151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest, StartModemFailure);
214151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest, StartModemInWrongState);
215151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest,
216151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan              StartModemWithDeferredEnableFailure);
2171361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModem);
2182849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le  FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModemALT3100);
219b0074e8a58f829c602231f6387b1e654f657011fThieu Le  FRIEND_TEST(CellularCapabilityUniversalMainTest,
220b0074e8a58f829c602231f6387b1e654f657011fThieu Le              StopModemALT3100DeleteBearerFailure);
221b0074e8a58f829c602231f6387b1e654f657011fThieu Le  FRIEND_TEST(CellularCapabilityUniversalMainTest,
222b0074e8a58f829c602231f6387b1e654f657011fThieu Le              StopModemALT3100NotConnected);
2231361c0366043f3d2628dc7c339339116ce31085eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModemConnected);
2249f3dcf80a84c07701b7c224fca5ed637c966fa3eBen Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest, TerminationAction);
2259f3dcf80a84c07701b7c224fca5ed637c966fa3eBen Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2269f3dcf80a84c07701b7c224fca5ed637c966fa3eBen Chan              TerminationActionRemovedByStopModem);
227539ab0266ef93a3198f12b8be83a6312d35d6ba0Ben Chan  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateActiveBearer);
2280a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2290a3e27994a45a9723f3867fe7f297e089bd2254bArman Uguray              UpdatePendingActivationState);
230efea6e0f28c3270038914e80166702d5ac23095eArman Uguray  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2318f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu              UpdateRegistrationState);
2328f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  FRIEND_TEST(CellularCapabilityUniversalMainTest,
2338f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu              UpdateRegistrationStateModemNotConnected);
2348f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  FRIEND_TEST(CellularCapabilityUniversalMainTest,
235efea6e0f28c3270038914e80166702d5ac23095eArman Uguray              UpdateServiceActivationState);
23692df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateServiceOLP);
237a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  FRIEND_TEST(CellularCapabilityUniversalTimerTest, CompleteActivation);
238d42d8ec85a9a1bdc406870b75d1b9e266fbaaa02Arman Uguray  FRIEND_TEST(CellularTest, EnableTrafficMonitor);
23909fa2a0e9c0feed7b3ca23fc7d8ad59783f4c6a7Ben Chan  FRIEND_TEST(CellularTest,
24009fa2a0e9c0feed7b3ca23fc7d8ad59783f4c6a7Ben Chan              HandleNewRegistrationStateForServiceRequiringActivation);
2415218cf2bb1301197e0e3c9381bc4c66e8adf80b0Thieu Le  FRIEND_TEST(CellularTest, ModemStateChangeLostRegistration);
242f407d5934100e6f2106aeeede46bafb0074cee35mukesh agrawal  FRIEND_TEST(CellularTest, OnPPPDied);
24382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
244c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  // SimLockStatus represents the fields in the Cellular.SIMLockStatus
245c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  // DBUS property of the shill device.
246c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  struct SimLockStatus {
247c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray   public:
248c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray    SimLockStatus() : enabled(false),
249c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray                      lock_type(MM_MODEM_LOCK_UNKNOWN),
250c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray                      retries_left(0) {}
251c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray
252c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray    bool enabled;
253c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray    MMModemLock lock_type;
254c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray    uint32 retries_left;
255c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  };
256c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray
2579a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu  // SubscriptionState represents the provisioned state of SIM. It is used
2589a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu  // currently by activation logic for LTE to determine if activation process is
2599a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu  // complete.
2609a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu  enum SubscriptionState {
2619a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu    kSubscriptionStateUnknown = 0,
2629a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu    kSubscriptionStateUnprovisioned = 1,
2639a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu    kSubscriptionStateProvisioned = 2,
2649a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu    kSubscriptionStateOutOfData = 3
2659a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu  };
2669a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu
267ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  // Methods used in starting a modem
268151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan  void EnableModem(bool deferralbe,
269151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan                   Error *error,
270151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan                   const ResultCallback& callback);
271151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan  void EnableModemCompleted(bool deferrable,
272151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan                            const ResultCallback &callback,
273151d447d1f3a252a3f2ecbca0f75792e693f1d47Ben Chan                            const Error &error);
274ef96556fff984bbc79597669af2465905666ed09Jason Glasgow
275ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  // Methods used in stopping a modem
2762849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le  void Stop_DeleteActiveBearer(const ResultCallback &callback);
2772849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le  void Stop_DeleteActiveBearerCompleted(const ResultCallback &callback,
2782849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le                                        const Error &error);
279ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  void Stop_Disable(const ResultCallback &callback);
280ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  void Stop_DisableCompleted(const ResultCallback &callback,
281ef96556fff984bbc79597669af2465905666ed09Jason Glasgow                             const Error &error);
282ee464d3c77dc7662973bfa5cb3c6eeb207366eacArman Uguray  void Stop_PowerDown(const ResultCallback &callback);
283ee464d3c77dc7662973bfa5cb3c6eeb207366eacArman Uguray  void Stop_PowerDownCompleted(const ResultCallback &callback,
284ee464d3c77dc7662973bfa5cb3c6eeb207366eacArman Uguray                               const Error &error);
285ef96556fff984bbc79597669af2465905666ed09Jason Glasgow
286539ab0266ef93a3198f12b8be83a6312d35d6ba0Ben Chan  // Updates |active_bearer_| to match the currently active bearer.
287539ab0266ef93a3198f12b8be83a6312d35d6ba0Ben Chan  void UpdateActiveBearer();
2886e5639f9ef54db278c5f2265d5364e5994966f4aArman Uguray
28982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  Stringmap ParseScanResult(const ScanResult &result);
29082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
29182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  KeyValueStore SimLockStatusToProperty(Error *error);
29282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
29382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  void SetupApnTryList();
29482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  void FillConnectPropertyMap(DBusPropertiesMap *properties);
29582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
296bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  void HelpRegisterConstDerivedKeyValueStore(
29782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow      const std::string &name,
298bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal      KeyValueStore(CellularCapabilityUniversal::*get)(Error *error));
29982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
300145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // Returns true if a connect error should be retried.  This function
301145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // abstracts modem specific behavior for modems which do a lousy job
302145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  // of returning specific errors on connect failures.
303145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  bool RetriableConnectError(const Error &error) const;
304145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow
30582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Signal callbacks
3063022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnNetworkModeSignal(uint32 mode);
3077fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood  void OnModemStateChangedSignal(int32 old_state,
3087fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood                                 int32 new_state,
3097fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood                                 uint32 reason);
31082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
31182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Property Change notification handlers
3123022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnModemPropertiesChanged(
3134c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow      const DBusPropertiesMap &properties,
3144c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow      const std::vector<std::string> &invalidated_properties);
3154c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow
3163022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnSignalQualityChanged(uint32 quality);
31774924d87cc111f8603751f09cd009c830f43e668Ben Chan
31874924d87cc111f8603751f09cd009c830f43e668Ben Chan  void OnSupportedCapabilitesChanged(
31974924d87cc111f8603751f09cd009c830f43e668Ben Chan      const std::vector<uint32> &supported_capabilities);
320af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnModemCurrentCapabilitiesChanged(uint32 current_capabilities);
321af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnMdnChanged(const std::string &mdn);
322af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnModemRevisionChanged(const std::string &revision);
323af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnModemStateChanged(Cellular::ModemState state);
324af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnAccessTechnologiesChanged(uint32 access_technologies);
32574924d87cc111f8603751f09cd009c830f43e668Ben Chan  void OnSupportedModesChanged(const std::vector<ModemModes> &supported_modes);
32674924d87cc111f8603751f09cd009c830f43e668Ben Chan  void OnCurrentModesChanged(const ModemModes &current_modes);
327cbef8123fa639622b1aa86d7a041a02347ddc69dBen Chan  void OnBearersChanged(const RpcIdentifiers &bearers);
328c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  void OnLockRetriesChanged(const LockRetryData &lock_retries);
329c7e63afa9cfabf9aa022a0bf8e9ec5340f5d13bfArman Uguray  void OnLockTypeChanged(MMModemLock unlock_required);
330af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnSimLockStatusChanged();
331af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow
332c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  // Returns false if the MDN is empty or if the MDN consists of all 0s.
333c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  bool IsMdnValid() const;
334c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
335af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  // 3GPP property change handlers
336af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  virtual void OnModem3GPPPropertiesChanged(
337af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow      const DBusPropertiesMap &properties,
338af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow      const std::vector<std::string> &invalidated_properties);
339af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void On3GPPRegistrationChanged(MMModem3gppRegistrationState state,
340af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow                                 const std::string &operator_code,
341af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow                                 const std::string &operator_name);
3428f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  void Handle3GPPRegistrationChange(
3438f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu      MMModem3gppRegistrationState updated_state,
3448f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu      std::string updated_operator_code,
3458f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu      std::string updated_operator_name);
3469a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu  void On3GPPSubscriptionStateChanged(MMModem3gppSubscriptionState state);
347af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnFacilityLocksChanged(uint32 locks);
348af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow
349af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  // SIM property change handlers
35072fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray  // TODO(armansito): Put these methods in a 3GPP-only subclass.
351af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnSimPropertiesChanged(
352af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow      const DBusPropertiesMap &props,
353af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow      const std::vector<std::string> &invalidated_properties);
354d73783fb016a4c9d7d8644db83c8caeb447b0063Arman Uguray  void OnSpnChanged(const std::string &spn);
355af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnSimIdentifierChanged(const std::string &id);
356af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnOperatorIdChanged(const std::string &operator_id);
357af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  void OnOperatorNameChanged(const std::string &operator_name);
358ef96556fff984bbc79597669af2465905666ed09Jason Glasgow
35982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Method callbacks
3603022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams  void OnRegisterReply(const ResultCallback &callback,
3613022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams                       const Error &error);
3625d0d32c1b5e2370ff0739f7a2dbb641726d4bf87Ben Chan  void OnResetReply(const ResultCallback &callback, const Error &error);
36349ffffd458c2407c67c2d0d572974e91c7e9bea7Prathmesh Prabhu  void OnScanReply(const ResultStringmapsCallback &callback,
3643022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams                   const ScanResults &results,
3653022be5da0e7e158c7f8fc4e3f5d005eb5dde7e7Nathan Williams                   const Error &error);
366b54974f033f713690135f3f3516ca14aa7ee6cfdNathan Williams  void OnConnectReply(const ResultCallback &callback,
367b54974f033f713690135f3f3516ca14aa7ee6cfdNathan Williams                      const DBus::Path &bearer,
368b54974f033f713690135f3f3516ca14aa7ee6cfdNathan Williams                      const Error &error);
36982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
370a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  // Timeout callback that is called if the modem takes too long to register to
371a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  // a network after online payment is complete. Resets the modem.
372a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  void OnActivationWaitForRegisterTimeout();
373a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray
3746552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // Returns true, if |sim_path| constitutes a valid SIM path. Currently, a
3756552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // path is accepted to be valid, as long as it is not equal to one of ""
3766552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  // and "/".
3776552f8c74196782e9adf09f4fea01c836f551255Arman Uguray  bool IsValidSimPath(const std::string &sim_path) const;
3786552f8c74196782e9adf09f4fea01c836f551255Arman Uguray
379d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan  // Returns the normalized version of |mdn| by keeping only digits in |mdn|
380d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan  // and removing other non-digit characters.
381d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan  std::string NormalizeMdn(const std::string &mdn) const;
382d759252158ec07b4a9edbcfdfb265f010b3e7e13Ben Chan
383c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  // Post-payment activation handlers.
384c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  void ResetAfterActivation();
385efea6e0f28c3270038914e80166702d5ac23095eArman Uguray  void UpdateServiceActivationState();
386c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  void OnResetAfterActivationReply(const Error &error);
387c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
3888f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  static bool IsRegisteredState(MMModem3gppRegistrationState state);
3898f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu
39043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  // Returns the out-of-credits detection algorithm to be used on this modem.
39143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  OutOfCreditsDetector::OOCType GetOutOfCreditsDetectionType() const;
39243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le
3932849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le  // For unit tests.
3942849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le  void set_active_bearer(CellularBearer *bearer) {
3952849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le    active_bearer_.reset(bearer);  // Takes ownership
3962849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le  }
3972849214ae17c9bd87c10f9012edfe469cf189a80Thieu Le
39882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  scoped_ptr<mm1::ModemModem3gppProxyInterface> modem_3gpp_proxy_;
39982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  scoped_ptr<mm1::ModemProxyInterface> modem_proxy_;
40082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  scoped_ptr<mm1::ModemSimpleProxyInterface> modem_simple_proxy_;
40182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  scoped_ptr<mm1::SimProxyInterface> sim_proxy_;
402afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu  // Used to enrich information about the network operator in |ParseScanResult|.
403afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu  // TODO(pprabhu) Instead instantiate a local |MobileOperatorInfo| instance
404afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu  // once the context has been separated out. (crbug.com/363874)
405afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu  scoped_ptr<MobileOperatorInfo> mobile_operator_info_;
40682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
40782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  base::WeakPtrFactory<CellularCapabilityUniversal> weak_ptr_factory_;
40882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
40982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  MMModem3gppRegistrationState registration_state_;
410af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow
411af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  // Bits based on MMModemCapabilities
41274924d87cc111f8603751f09cd009c830f43e668Ben Chan  std::vector<uint32> supported_capabilities_;  // Technologies supported
41374924d87cc111f8603751f09cd009c830f43e668Ben Chan  uint32 current_capabilities_;  // Technologies supported without a reload
414145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow  uint32 access_technologies_;   // Bits based on MMModemAccessTechnology
41574924d87cc111f8603751f09cd009c830f43e668Ben Chan  std::vector<ModemModes> supported_modes_;
41674924d87cc111f8603751f09cd009c830f43e668Ben Chan  ModemModes current_modes_;
417af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow
41882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  Cellular::Operator serving_operator_;
41982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string spn_;
420af5832853cf49fcfa34632a736aa4763ef2347d6Jason Glasgow  std::string operator_id_;
42199ec94d3ef0049e5013e590017e8714b5fc9c682Prathmesh Prabhu  mobile_provider *home_provider_info_;
42282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::string desired_network_;
42382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
42482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  // Properties.
42582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  std::deque<Stringmap> apn_try_list_;
4265d0d32c1b5e2370ff0739f7a2dbb641726d4bf87Ben Chan  bool resetting_;
42782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  SimLockStatus sim_lock_status_;
4289a0534e17ad58e38fd5db4ac67a67c964e2bcfbePrathmesh Prabhu  SubscriptionState subscription_state_;
429ef96556fff984bbc79597669af2465905666ed09Jason Glasgow  std::string sim_path_;
430539ab0266ef93a3198f12b8be83a6312d35d6ba0Ben Chan  scoped_ptr<CellularBearer> active_bearer_;
431cbef8123fa639622b1aa86d7a041a02347ddc69dBen Chan  RpcIdentifiers bearer_paths_;
432c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  bool reset_done_;
433c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
434e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // If the modem is not in a state to be enabled when StartModem is called,
435e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  // enabling is deferred using this callback.
436e285a84b38b81f5557b576da187d037ad24ae4afGary Morain  base::Closure deferred_enable_modem_callback_;
437e285a84b38b81f5557b576da187d037ad24ae4afGary Morain
438a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  base::CancelableClosure activation_wait_for_registration_callback_;
439a14941d234722d4f867027a966ef85ae0f7ba3a9Arman Uguray  int64 activation_registration_timeout_milliseconds_;
4401361c0366043f3d2628dc7c339339116ce31085eArman Uguray
4418f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  // Sometimes flaky cellular network causes the 3GPP registration state to
4428f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  // rapidly change from registered --> searching and back. Delay such updates
4438f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  // a little to smooth over temporary registration loss.
4448f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  base::CancelableClosure registration_dropped_update_callback_;
4458f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu  int64 registration_dropped_update_timeout_milliseconds_;
4468f6479fed67969c162aa079eed04c55ee574a841Prathmesh Prabhu
44782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  DISALLOW_COPY_AND_ASSIGN(CellularCapabilityUniversal);
44882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow};
44982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
45082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow}  // namespace shill
45182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
452145218710c2daa27ab55690f2ca372200d2a4cdfJason Glasgow#endif  // SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_
453