blob: 6c5e6233730bed625e496287547686a79c8bf43a [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
5#ifndef SHILL_CELLULAR_CAPABILITY_
6#define SHILL_CELLULAR_CAPABILITY_
7
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"
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050019
Darin Petkovdaf43862011-10-27 11:37:28 +020020namespace shill {
21
22class Cellular;
Darin Petkovb05315f2011-11-07 10:14:25 +010023class Error;
Darin Petkovdaf43862011-10-27 11:37:28 +020024class ProxyFactory;
25
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050026// Cellular devices instantiate subclasses of CellularCapability that
27// handle the specific modem technologies and capabilities.
Jason Glasgow82f9ab32012-04-04 14:27:19 -040028//
29// The CellularCapability is directly subclassed by:
30// * CelllularCapabilityUniversal which handles all modems managed by
31// a modem manager using the the org.chromium.ModemManager1 DBUS
32// interface
33// * CellularCapabilityClassic which handles all modems managed by a
34// modem manager using the older org.chromium.ModemManager DBUS
35// interface. This class is further subclassed to represent CDMA
36// and GSM modems
37//
38// Pictorially:
39//
40// CellularCapability
41// |
42// |-- CellularCapabilityUniversal
43// |
44// |-- CellularCapabilityClassic
45// |
46// |-- CellularCapabilityGSM
47// |
48// |-- CellularCapabilityCDMA
49//
Eric Shienbrood9a245532012-03-07 14:20:39 -050050class CellularCapability {
Darin Petkovdaf43862011-10-27 11:37:28 +020051 public:
Jason Glasgow82f9ab32012-04-04 14:27:19 -040052 // SimLockStatus represents the fields in the Cellular.SIMLockStatus
53 // DBUS property of the shill device.
54 struct SimLockStatus {
55 SimLockStatus() : enabled(false), retries_left(0) {}
56
57 bool enabled;
58 std::string lock_type;
59 uint32 retries_left;
60 };
61
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050062 static const int kTimeoutActivate;
63 static const int kTimeoutConnect;
64 static const int kTimeoutDefault;
Eric Shienbrood9a245532012-03-07 14:20:39 -050065 static const int kTimeoutEnable;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050066 static const int kTimeoutRegister;
67 static const int kTimeoutScan;
68
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040069 static const char kModemPropertyIMSI[];
70 static const char kModemPropertyState[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050071
Darin Petkovdaf43862011-10-27 11:37:28 +020072 // |cellular| is the parent Cellular device.
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050073 CellularCapability(Cellular *cellular, ProxyFactory *proxy_factory);
Darin Petkovdaf43862011-10-27 11:37:28 +020074 virtual ~CellularCapability();
75
76 Cellular *cellular() const { return cellular_; }
77 ProxyFactory *proxy_factory() const { return proxy_factory_; }
Darin Petkov5f316f62011-11-18 12:10:26 +010078
79 // Invoked by the parent Cellular device when a new service is created.
80 virtual void OnServiceCreated() = 0;
Darin Petkovdaf43862011-10-27 11:37:28 +020081
Darin Petkovae0c64e2011-11-15 15:50:27 +010082 virtual void SetupConnectProperties(DBusPropertiesMap *properties) = 0;
83
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050084 // StartModem attempts to put the modem in a state in which it is
85 // usable for creating services and establishing connections (if
86 // network conditions permit). It potentially consists of multiple
87 // non-blocking calls to the modem-manager server. After each call,
88 // control is passed back up to the main loop. Each time a reply to
89 // a non-blocking call is received, the operation advances to the next
90 // step, until either an error occurs in one of them, or all the steps
91 // have been completed, at which point StartModem() is finished.
Eric Shienbrood9a245532012-03-07 14:20:39 -050092 virtual void StartModem(Error *error,
93 const ResultCallback &callback) = 0;
Thieu Le923006b2012-04-05 16:32:58 -070094 // StopModem disconnects and disables a modem asynchronously.
95 // |callback| is invoked when this completes and the result is passed
96 // to the callback.
Jason Glasgow82f9ab32012-04-04 14:27:19 -040097 virtual void StopModem(Error *error, const ResultCallback &callback) = 0;
Eric Shienbrood9a245532012-03-07 14:20:39 -050098 virtual void Connect(const DBusPropertiesMap &properties, Error *error,
Jason Glasgow82f9ab32012-04-04 14:27:19 -040099 const ResultCallback &callback) = 0;
100 virtual void Disconnect(Error *error, const ResultCallback &callback) = 0;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500101
102 // Activates the modem. Returns an Error on failure.
103 // The default implementation fails by returning a kNotSupported error
104 // to the caller.
105 virtual void Activate(const std::string &carrier,
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400106 Error *error, const ResultCallback &callback) = 0;
Darin Petkova3d3be52011-11-14 21:34:16 +0100107
Darin Petkov184c54e2011-11-15 12:44:39 +0100108 // Network registration.
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500109 virtual void RegisterOnNetwork(const std::string &network_id,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500110 Error *error,
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400111 const ResultCallback &callback) = 0;
Darin Petkovb72cf402011-11-22 14:51:39 +0100112 virtual bool IsRegistered() = 0;
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400113 // If we are informed by means of something other than a signal indicating
114 // a registration state change that the modem has unregistered from the
115 // network, we need to update the network-type-specific capability object.
116 virtual void SetUnregistered(bool searching) = 0;
Darin Petkov184c54e2011-11-15 12:44:39 +0100117
Darin Petkovac635a82012-01-10 16:51:58 +0100118 virtual std::string CreateFriendlyServiceName() = 0;
119
Darin Petkovc64fe5e2012-01-11 12:46:13 +0100120 // PIN management. The default implementation fails by returning an error.
Eric Shienbrood9a245532012-03-07 14:20:39 -0500121 virtual void RequirePIN(const std::string &pin, bool require,
122 Error *error, const ResultCallback &callback);
123 virtual void EnterPIN(const std::string &pin,
124 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +0100125 virtual void UnblockPIN(const std::string &unblock_code,
126 const std::string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500127 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +0100128 virtual void ChangePIN(const std::string &old_pin,
129 const std::string &new_pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500130 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +0100131
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400132 // Asks the modem to scan for networks.
133 //
134 // The default implementation fails by filling error with
135 // kNotSupported.
136 //
137 // Subclasses should implement this by fetching scan results
138 // asynchronously. When the results are ready, update the
139 // flimflam::kFoundNetworksProperty and send a property change
140 // notification. Finally, callback must be invoked to inform the
141 // caller that the scan has completed.
142 //
143 // Errors are not generally reported, but on error the
144 // kFoundNetworksProperty should be cleared and a property change
145 // notification sent out.
146 //
147 // TODO(jglasgow): Refactor to reuse code by putting notification
148 // logic into Cellular or CellularCapability.
149 //
150 // TODO(jglasgow): Implement real error handling.
Eric Shienbrood9a245532012-03-07 14:20:39 -0500151 virtual void Scan(Error *error, const ResultCallback &callback);
Darin Petkov1272a432011-11-10 15:53:37 +0100152
Darin Petkov20c13ec2011-11-09 15:07:15 +0100153 // Returns an empty string if the network technology is unknown.
154 virtual std::string GetNetworkTechnologyString() const = 0;
155
156 virtual std::string GetRoamingStateString() const = 0;
157
Eric Shienbrood9a245532012-03-07 14:20:39 -0500158 virtual void GetSignalQuality() = 0;
159
Eric Shienbrood0db6a9b2012-03-30 16:11:39 -0400160 virtual std::string GetTypeString() const = 0;
161
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400162 // Called when ModemManager has sent a property change notification
163 // signal over DBUS.
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400164 virtual void OnDBusPropertiesChanged(
165 const std::string &interface,
166 const DBusPropertiesMap &changed_properties,
167 const std::vector<std::string> &invalidated_properties) = 0;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100168
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400169 // Should this device allow roaming?
170 // The decision to allow roaming or not is based on the home
171 // provider as well as on the user modifiable "allow_roaming"
172 // property.
173 virtual bool AllowRoaming() = 0;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500174
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400175 protected:
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400176 // Releases all proxies held by the object. This is most useful
177 // during unit tests.
178 virtual void ReleaseProxies() = 0;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500179
Eric Shienbrood9a245532012-03-07 14:20:39 -0500180 static void OnUnsupportedOperation(const char *operation, Error *error);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500181
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400182 // accessor for subclasses to read the allow roaming property
Jason Glasgow7b461df2012-05-01 16:38:45 -0400183 bool allow_roaming_property() const {
184 return cellular_->allow_roaming_property();
185 }
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500186
Darin Petkovdaf43862011-10-27 11:37:28 +0200187 private:
Thieu Le923006b2012-04-05 16:32:58 -0700188 friend class CellularCapabilityGSMTest;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500189 friend class CellularCapabilityTest;
Jason Glasgowef965562012-04-10 16:12:35 -0400190 friend class CellularCapabilityUniversalTest;
Thieu Le923006b2012-04-05 16:32:58 -0700191 friend class CellularTest;
Darin Petkov9c1dcef2012-02-07 15:58:26 +0100192 FRIEND_TEST(CellularCapabilityTest, AllowRoaming);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500193 FRIEND_TEST(CellularTest, Connect);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400194 FRIEND_TEST(CellularTest, TearDown);
Darin Petkov721ac932011-11-16 15:43:09 +0100195
Darin Petkovdaf43862011-10-27 11:37:28 +0200196 Cellular *cellular_;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500197
198 // Store cached copies of singletons for speed/ease of testing.
Darin Petkovdaf43862011-10-27 11:37:28 +0200199 ProxyFactory *proxy_factory_;
200
Darin Petkovdaf43862011-10-27 11:37:28 +0200201 DISALLOW_COPY_AND_ASSIGN(CellularCapability);
202};
203
204} // namespace shill
205
206#endif // SHILL_CELLULAR_CAPABILITY_