blob: 7c02ff97a703d8075832a2d889dca3a348f15d19 [file] [log] [blame]
Darin Petkovc64fe5e2012-01-11 12:46:13 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovdaf43862011-10-27 11:37:28 +02002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Darin Petkovc37a9c42012-09-06 15:28:22 +02005#ifndef SHILL_CELLULAR_CAPABILITY_H_
6#define SHILL_CELLULAR_CAPABILITY_H_
Darin Petkovdaf43862011-10-27 11:37:28 +02007
Darin Petkovb05315f2011-11-07 10:14:25 +01008#include <string>
Eric Shienbrood3e20a232012-02-16 11:35:56 -05009#include <vector>
Darin Petkovb05315f2011-11-07 10:14:25 +010010
Darin Petkovdaf43862011-10-27 11:37:28 +020011#include <base/basictypes.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -050012#include <base/callback.h>
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050013#include <base/memory/scoped_ptr.h>
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050014#include <gtest/gtest_prod.h> // for FRIEND_TEST
Darin Petkovdaf43862011-10-27 11:37:28 +020015
Jason Glasgow82f9ab32012-04-04 14:27:19 -040016#include "shill/callbacks.h"
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040017#include "shill/cellular.h"
Darin Petkovae0c64e2011-11-15 15:50:27 +010018#include "shill/dbus_properties.h"
Thieu Lece4483e2013-01-23 15:12:03 -080019#include "shill/metrics.h"
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050020
Darin Petkovdaf43862011-10-27 11:37:28 +020021namespace shill {
22
23class Cellular;
Darin Petkovb05315f2011-11-07 10:14:25 +010024class Error;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070025class ModemInfo;
Darin Petkovdaf43862011-10-27 11:37:28 +020026class ProxyFactory;
27
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050028// Cellular devices instantiate subclasses of CellularCapability that
29// handle the specific modem technologies and capabilities.
Jason Glasgow82f9ab32012-04-04 14:27:19 -040030//
31// The CellularCapability is directly subclassed by:
32// * CelllularCapabilityUniversal which handles all modems managed by
33// a modem manager using the the org.chromium.ModemManager1 DBUS
Arman Uguray72fab6a2013-01-10 19:32:42 -080034// interface.
Jason Glasgow82f9ab32012-04-04 14:27:19 -040035// * CellularCapabilityClassic which handles all modems managed by a
36// modem manager using the older org.chromium.ModemManager DBUS
37// interface. This class is further subclassed to represent CDMA
Arman Uguray72fab6a2013-01-10 19:32:42 -080038// and GSM modems.
Jason Glasgow82f9ab32012-04-04 14:27:19 -040039//
40// Pictorially:
41//
42// CellularCapability
43// |
44// |-- CellularCapabilityUniversal
Arman Uguray72fab6a2013-01-10 19:32:42 -080045// | |
46// | |-- CellularCapabilityUniversalCDMA
Jason Glasgow82f9ab32012-04-04 14:27:19 -040047// |
48// |-- CellularCapabilityClassic
49// |
50// |-- CellularCapabilityGSM
51// |
52// |-- CellularCapabilityCDMA
53//
Arman Uguray72fab6a2013-01-10 19:32:42 -080054// TODO(armansito): Currently, 3GPP logic is handled by
55// CellularCapabilityUniversal. Eventually CellularCapabilityUniversal will
56// only serve as the abstract base class for ModemManager1 3GPP and CDMA
57// capabilities.
Eric Shienbrood9a245532012-03-07 14:20:39 -050058class CellularCapability {
Darin Petkovdaf43862011-10-27 11:37:28 +020059 public:
Jason Glasgow82f9ab32012-04-04 14:27:19 -040060 // SimLockStatus represents the fields in the Cellular.SIMLockStatus
61 // DBUS property of the shill device.
62 struct SimLockStatus {
63 SimLockStatus() : enabled(false), retries_left(0) {}
64
65 bool enabled;
66 std::string lock_type;
67 uint32 retries_left;
68 };
69
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050070 static const int kTimeoutActivate;
71 static const int kTimeoutConnect;
72 static const int kTimeoutDefault;
Thieu Le049adb52012-11-12 17:14:51 -080073 static const int kTimeoutDisconnect;
Eric Shienbrood9a245532012-03-07 14:20:39 -050074 static const int kTimeoutEnable;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050075 static const int kTimeoutRegister;
Ben Chan5d0d32c2013-01-08 02:05:29 -080076 static const int kTimeoutReset;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050077 static const int kTimeoutScan;
78
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040079 static const char kModemPropertyIMSI[];
80 static const char kModemPropertyState[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050081
Darin Petkovdaf43862011-10-27 11:37:28 +020082 // |cellular| is the parent Cellular device.
Thieu Lece4483e2013-01-23 15:12:03 -080083 CellularCapability(Cellular *cellular,
84 ProxyFactory *proxy_factory,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070085 ModemInfo *modem_info);
Darin Petkovdaf43862011-10-27 11:37:28 +020086 virtual ~CellularCapability();
87
88 Cellular *cellular() const { return cellular_; }
89 ProxyFactory *proxy_factory() const { return proxy_factory_; }
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070090 ModemInfo *modem_info() const { return modem_info_; }
Darin Petkov5f316f62011-11-18 12:10:26 +010091
92 // Invoked by the parent Cellular device when a new service is created.
93 virtual void OnServiceCreated() = 0;
Darin Petkovdaf43862011-10-27 11:37:28 +020094
Darin Petkovae0c64e2011-11-15 15:50:27 +010095 virtual void SetupConnectProperties(DBusPropertiesMap *properties) = 0;
96
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050097 // StartModem attempts to put the modem in a state in which it is
98 // usable for creating services and establishing connections (if
99 // network conditions permit). It potentially consists of multiple
100 // non-blocking calls to the modem-manager server. After each call,
101 // control is passed back up to the main loop. Each time a reply to
102 // a non-blocking call is received, the operation advances to the next
103 // step, until either an error occurs in one of them, or all the steps
104 // have been completed, at which point StartModem() is finished.
Eric Shienbrood9a245532012-03-07 14:20:39 -0500105 virtual void StartModem(Error *error,
106 const ResultCallback &callback) = 0;
Thieu Le923006b2012-04-05 16:32:58 -0700107 // StopModem disconnects and disables a modem asynchronously.
108 // |callback| is invoked when this completes and the result is passed
109 // to the callback.
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400110 virtual void StopModem(Error *error, const ResultCallback &callback) = 0;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500111 virtual void Connect(const DBusPropertiesMap &properties, Error *error,
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400112 const ResultCallback &callback) = 0;
113 virtual void Disconnect(Error *error, const ResultCallback &callback) = 0;
Christopher Wiley8a468902012-11-30 11:52:38 -0800114 // Called when a disconnect completes, successful or not.
115 virtual void DisconnectCleanup() = 0;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500116
117 // Activates the modem. Returns an Error on failure.
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500118 virtual void Activate(const std::string &carrier,
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400119 Error *error, const ResultCallback &callback) = 0;
Darin Petkova3d3be52011-11-14 21:34:16 +0100120
Arman Ugurayc7b15602013-02-16 00:56:18 -0800121 // Initiates the necessary to steps to verify that the cellular service has
122 // been activated. Once these steps have been completed, the service should
123 // be marked as activated.
124 //
125 // The default implementation fails by returning a kNotSupported error
126 // to the caller.
127 virtual void CompleteActivation(Error *error);
128
Ben Chan15786032012-11-04 21:28:02 -0800129 // Returns true if service activation is required. Returns false by default
130 // in this base class.
131 virtual bool IsServiceActivationRequired() const;
132
Darin Petkov184c54e2011-11-15 12:44:39 +0100133 // Network registration.
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500134 virtual void RegisterOnNetwork(const std::string &network_id,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500135 Error *error,
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400136 const ResultCallback &callback) = 0;
Darin Petkovb72cf402011-11-22 14:51:39 +0100137 virtual bool IsRegistered() = 0;
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400138 // If we are informed by means of something other than a signal indicating
139 // a registration state change that the modem has unregistered from the
140 // network, we need to update the network-type-specific capability object.
141 virtual void SetUnregistered(bool searching) = 0;
Darin Petkov184c54e2011-11-15 12:44:39 +0100142
Darin Petkovac635a82012-01-10 16:51:58 +0100143 virtual std::string CreateFriendlyServiceName() = 0;
144
Darin Petkovc64fe5e2012-01-11 12:46:13 +0100145 // PIN management. The default implementation fails by returning an error.
Eric Shienbrood9a245532012-03-07 14:20:39 -0500146 virtual void RequirePIN(const std::string &pin, bool require,
147 Error *error, const ResultCallback &callback);
148 virtual void EnterPIN(const std::string &pin,
149 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +0100150 virtual void UnblockPIN(const std::string &unblock_code,
151 const std::string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500152 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +0100153 virtual void ChangePIN(const std::string &old_pin,
154 const std::string &new_pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500155 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +0100156
Darin Petkovc37a9c42012-09-06 15:28:22 +0200157 // The default implementation fails by returning an error.
Ben Chan5d0d32c2013-01-08 02:05:29 -0800158 virtual void Reset(Error *error, const ResultCallback &callback);
Darin Petkovc37a9c42012-09-06 15:28:22 +0200159 virtual void SetCarrier(const std::string &carrier,
160 Error *error, const ResultCallback &callback);
161
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400162 // Asks the modem to scan for networks.
163 //
164 // The default implementation fails by filling error with
165 // kNotSupported.
166 //
167 // Subclasses should implement this by fetching scan results
168 // asynchronously. When the results are ready, update the
169 // flimflam::kFoundNetworksProperty and send a property change
170 // notification. Finally, callback must be invoked to inform the
171 // caller that the scan has completed.
172 //
173 // Errors are not generally reported, but on error the
174 // kFoundNetworksProperty should be cleared and a property change
175 // notification sent out.
176 //
177 // TODO(jglasgow): Refactor to reuse code by putting notification
178 // logic into Cellular or CellularCapability.
179 //
180 // TODO(jglasgow): Implement real error handling.
Eric Shienbrood9a245532012-03-07 14:20:39 -0500181 virtual void Scan(Error *error, const ResultCallback &callback);
Darin Petkov1272a432011-11-10 15:53:37 +0100182
Darin Petkov20c13ec2011-11-09 15:07:15 +0100183 // Returns an empty string if the network technology is unknown.
184 virtual std::string GetNetworkTechnologyString() const = 0;
185
186 virtual std::string GetRoamingStateString() const = 0;
187
Eric Shienbrood9a245532012-03-07 14:20:39 -0500188 virtual void GetSignalQuality() = 0;
189
Eric Shienbrood0db6a9b2012-03-30 16:11:39 -0400190 virtual std::string GetTypeString() const = 0;
191
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400192 // Called when ModemManager has sent a property change notification
193 // signal over DBUS.
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400194 virtual void OnDBusPropertiesChanged(
195 const std::string &interface,
196 const DBusPropertiesMap &changed_properties,
197 const std::vector<std::string> &invalidated_properties) = 0;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100198
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400199 // Should this device allow roaming?
200 // The decision to allow roaming or not is based on the home
201 // provider as well as on the user modifiable "allow_roaming"
202 // property.
203 virtual bool AllowRoaming() = 0;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500204
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800205 virtual bool IsActivating() const;
206
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700207 // Returns true if the cellular device should initiate passive traffic
208 // monitoring to trigger active out-of-credit detection checks. This
209 // implementation returns false by default.
Arman Ugurayf84a4242013-04-09 20:01:07 -0700210 virtual bool ShouldDetectOutOfCredit() const;
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700211
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400212 protected:
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400213 // Releases all proxies held by the object. This is most useful
214 // during unit tests.
215 virtual void ReleaseProxies() = 0;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500216
Eric Shienbrood9a245532012-03-07 14:20:39 -0500217 static void OnUnsupportedOperation(const char *operation, Error *error);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500218
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400219 // accessor for subclasses to read the allow roaming property
Jason Glasgow7b461df2012-05-01 16:38:45 -0400220 bool allow_roaming_property() const {
221 return cellular_->allow_roaming_property();
222 }
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500223
Darin Petkovdaf43862011-10-27 11:37:28 +0200224 private:
Thieu Le923006b2012-04-05 16:32:58 -0700225 friend class CellularCapabilityGSMTest;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500226 friend class CellularCapabilityTest;
Jason Glasgowef965562012-04-10 16:12:35 -0400227 friend class CellularCapabilityUniversalTest;
Arman Uguray72fab6a2013-01-10 19:32:42 -0800228 friend class CellularCapabilityUniversalCDMATest;
Thieu Le923006b2012-04-05 16:32:58 -0700229 friend class CellularTest;
Darin Petkov9c1dcef2012-02-07 15:58:26 +0100230 FRIEND_TEST(CellularCapabilityTest, AllowRoaming);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500231 FRIEND_TEST(CellularTest, Connect);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400232 FRIEND_TEST(CellularTest, TearDown);
Darin Petkov721ac932011-11-16 15:43:09 +0100233
Darin Petkovdaf43862011-10-27 11:37:28 +0200234 Cellular *cellular_;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500235
Darin Petkovdaf43862011-10-27 11:37:28 +0200236 ProxyFactory *proxy_factory_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700237 ModemInfo *modem_info_;
Darin Petkovdaf43862011-10-27 11:37:28 +0200238
Darin Petkovdaf43862011-10-27 11:37:28 +0200239 DISALLOW_COPY_AND_ASSIGN(CellularCapability);
240};
241
242} // namespace shill
243
Darin Petkovc37a9c42012-09-06 15:28:22 +0200244#endif // SHILL_CELLULAR_CAPABILITY_H_