blob: 7724f4f1b771a05f6f62d3ffde67ef15a0ba819e [file] [log] [blame]
Arman Uguray72fab6a2013-01-10 19:32:42 -08001// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
Jason Glasgow82f9ab32012-04-04 14:27:19 -04002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Jason Glasgow14521872012-05-07 19:12:15 -04005#ifndef SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_
6#define SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_
Jason Glasgow82f9ab32012-04-04 14:27:19 -04007
8#include <deque>
Jason Glasgowaf583282012-04-18 15:18:22 -04009#include <map>
Jason Glasgow82f9ab32012-04-04 14:27:19 -040010#include <string>
11#include <vector>
12
13#include <base/memory/scoped_ptr.h>
14#include <base/memory/weak_ptr.h>
15#include <gtest/gtest_prod.h> // for FRIEND_TEST
Ben Chan5c853ef2012-10-05 00:05:37 -070016#include <ModemManager/ModemManager.h>
Jason Glasgow82f9ab32012-04-04 14:27:19 -040017
18#include "shill/accessor_interface.h"
19#include "shill/cellular.h"
20#include "shill/cellular_capability.h"
Arman Uguray6e5639f2012-11-15 20:30:19 -080021#include "shill/mm1_bearer_proxy_interface.h"
Jason Glasgow82f9ab32012-04-04 14:27:19 -040022#include "shill/mm1_modem_modem3gpp_proxy_interface.h"
Jason Glasgow82f9ab32012-04-04 14:27:19 -040023#include "shill/mm1_modem_proxy_interface.h"
24#include "shill/mm1_modem_simple_proxy_interface.h"
25#include "shill/mm1_sim_proxy_interface.h"
26
Jason Glasgow82f9ab32012-04-04 14:27:19 -040027struct mobile_provider;
28
29namespace shill {
30
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070031class ModemInfo;
Arman Ugurayc7b15602013-02-16 00:56:18 -080032
Jason Glasgow82f9ab32012-04-04 14:27:19 -040033// CellularCapabilityUniversal handles modems using the
34// org.chromium.ModemManager1 DBUS interface. This class is used for
35// all types of modems, i.e. CDMA, GSM, and LTE modems.
36class CellularCapabilityUniversal : public CellularCapability {
37 public:
38 typedef std::vector<DBusPropertiesMap> ScanResults;
39 typedef DBusPropertiesMap ScanResult;
Ben Chan74924d82013-06-15 17:52:55 -070040 typedef std::map<uint32_t, uint32_t> LockRetryData;
Jason Glasgow82f9ab32012-04-04 14:27:19 -040041
Jason Glasgow14521872012-05-07 19:12:15 -040042 // Constants used in connect method call. Make available to test matchers.
43 // TODO(jglasgow): Generate from modem manager into
44 // ModemManager-names.h.
45 // See http://crosbug.com/30551.
46 static const char kConnectPin[];
47 static const char kConnectOperatorId[];
Jason Glasgow14521872012-05-07 19:12:15 -040048 static const char kConnectApn[];
49 static const char kConnectIPType[];
50 static const char kConnectUser[];
51 static const char kConnectPassword[];
52 static const char kConnectNumber[];
53 static const char kConnectAllowRoaming[];
54 static const char kConnectRMProtocol[];
55
Thieu Lece4483e2013-01-23 15:12:03 -080056 CellularCapabilityUniversal(Cellular *cellular,
57 ProxyFactory *proxy_factory,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070058 ModemInfo *modem_info);
Jason Glasgow82f9ab32012-04-04 14:27:19 -040059
60 // Inherited from CellularCapability.
Gary Moraine285a842012-08-15 08:23:57 -070061 // Checks the modem state. If the state is kModemStateDisabled, then the
62 // modem is enabled. Otherwise, the enable command is buffered until the
63 // modem becomes disabled. ModemManager rejects the enable command if the
64 // modem is not disabled, for exmaple, if it is initializing insted.
Jason Glasgow82f9ab32012-04-04 14:27:19 -040065 virtual void StartModem(Error *error, const ResultCallback &callback);
66 virtual void StopModem(Error *error, const ResultCallback &callback);
67 virtual void Connect(const DBusPropertiesMap &properties, Error *error,
68 const ResultCallback &callback);
69 virtual void Disconnect(Error *error, const ResultCallback &callback);
Christopher Wiley8a468902012-11-30 11:52:38 -080070 virtual void DisconnectCleanup();
Jason Glasgow82f9ab32012-04-04 14:27:19 -040071 virtual void Activate(const std::string &carrier,
72 Error *error, const ResultCallback &callback);
Arman Ugurayc7b15602013-02-16 00:56:18 -080073 virtual void CompleteActivation(Error *error);
Jason Glasgow82f9ab32012-04-04 14:27:19 -040074
75 virtual void OnServiceCreated();
Jason Glasgow82f9ab32012-04-04 14:27:19 -040076 virtual void SetupConnectProperties(DBusPropertiesMap *properties);
Jason Glasgowef965562012-04-10 16:12:35 -040077 virtual void GetProperties();
Arman Uguray72fab6a2013-01-10 19:32:42 -080078 virtual bool IsRegistered();
Ben Chan15786032012-11-04 21:28:02 -080079 virtual bool IsServiceActivationRequired() const;
Jason Glasgow82f9ab32012-04-04 14:27:19 -040080 virtual void Register(const ResultCallback &callback);
81
82 virtual void RegisterOnNetwork(const std::string &network_id,
83 Error *error,
84 const ResultCallback &callback);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040085 virtual void SetUnregistered(bool searching);
Jason Glasgow82f9ab32012-04-04 14:27:19 -040086 virtual std::string CreateFriendlyServiceName();
87 virtual void RequirePIN(const std::string &pin, bool require,
88 Error *error, const ResultCallback &callback);
89 virtual void EnterPIN(const std::string &pin,
90 Error *error, const ResultCallback &callback);
91 virtual void UnblockPIN(const std::string &unblock_code,
92 const std::string &pin,
93 Error *error, const ResultCallback &callback);
94 virtual void ChangePIN(const std::string &old_pin,
95 const std::string &new_pin,
96 Error *error, const ResultCallback &callback);
Ben Chan5d0d32c2013-01-08 02:05:29 -080097 virtual void Reset(Error *error, const ResultCallback &callback);
Jason Glasgow82f9ab32012-04-04 14:27:19 -040098
99 virtual void Scan(Error *error, const ResultCallback &callback);
100 virtual std::string GetNetworkTechnologyString() const;
101 virtual std::string GetRoamingStateString() const;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400102 virtual void GetSignalQuality();
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400103 virtual std::string GetTypeString() const;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400104 virtual void OnDBusPropertiesChanged(
105 const std::string &interface,
106 const DBusPropertiesMap &changed_properties,
107 const std::vector<std::string> &invalidated_properties);
Jason Glasgowaf583282012-04-18 15:18:22 -0400108 virtual bool AllowRoaming();
Arman Ugurayf84a4242013-04-09 20:01:07 -0700109 virtual bool ShouldDetectOutOfCredit() const;
Jason Glasgow14521872012-05-07 19:12:15 -0400110
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400111 protected:
112 virtual void InitProxies();
113 virtual void ReleaseProxies();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400114
Arman Uguray72fab6a2013-01-10 19:32:42 -0800115 // Updates the |sim_path_| variable and creates a new proxy to the
116 // DBUS ModemManager1.Sim interface.
117 // TODO(armansito): Put this method in a 3GPP-only subclass.
118 virtual void OnSimPathChanged(const std::string &sim_path);
119
120 // Updates the online payment portal information, if any, for the cellular
121 // provider.
122 virtual void UpdateOLP();
123
Arman Uguray0a3e2792013-01-17 16:31:50 -0800124 // Post-payment activation handlers.
125 virtual void UpdatePendingActivationState();
126
127 const std::string &mdn() const { return mdn_; }
128 void set_mdn(const std::string &mdn) { mdn_ = mdn; }
129
130 const std::string &min() const { return min_; }
131 void set_min(const std::string &min) { min_ = min; }
Arman Uguray72fab6a2013-01-10 19:32:42 -0800132
133 const std::string &meid() const { return meid_; }
134 void set_meid(const std::string &meid) { meid_ = meid; }
135
136 const std::string &esn() const { return esn_; }
137 void set_esn(const std::string &esn) { esn_ = esn; }
138
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400139 private:
Ben Chan74924d82013-06-15 17:52:55 -0700140 struct ModemModes {
141 ModemModes()
142 : allowed_modes(MM_MODEM_MODE_NONE),
143 preferred_mode(MM_MODEM_MODE_NONE) {}
144
145 ModemModes(uint32 allowed, MMModemMode preferred)
146 : allowed_modes(allowed),
147 preferred_mode(preferred) {}
148
149 uint32 allowed_modes; // Bits based on MMModemMode.
150 MMModemMode preferred_mode; // A single MMModemMode bit.
151 };
152
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400153 // Constants used in scan results. Make available to unit tests.
154 // TODO(jglasgow): Generate from modem manager into ModemManager-names.h.
155 // See http://crosbug.com/30551.
156 static const char kStatusProperty[];
157 static const char kOperatorLongProperty[];
158 static const char kOperatorShortProperty[];
159 static const char kOperatorCodeProperty[];
160 static const char kOperatorAccessTechnologyProperty[];
161
mukesh agrawal9da07772013-05-15 14:15:17 -0700162 // As above, consider having this in ModemManager-names.h.
163 static const char kIpConfigPropertyMethod[];
164
Jason Glasgow14521872012-05-07 19:12:15 -0400165 // Modem Model ID strings. From modem firmware via modemmanager.
166 static const char kE362ModelId[];
167
Arman Uguray2717a102013-01-29 23:36:06 -0800168 // Generic service name prefix, shown when the correct carrier name is
169 // unknown.
170 static const char kGenericServiceNamePrefix[];
171
Arman Uguraya14941d2013-04-12 16:58:26 -0700172 static const int64 kActivationRegistrationTimeoutMilliseconds;
173 static const int64 kDefaultScanningOrSearchingTimeoutMilliseconds;
Arman Ugurayf6366ac2013-06-12 16:02:28 -0700174 static const int64 kEnterPinTimeoutMilliseconds;
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700175 static const int64 kRegistrationDroppedUpdateTimeoutMilliseconds;
Thieu Le2cac2942013-03-05 18:41:08 -0800176 static const int kSetPowerStateTimeoutMilliseconds;
Arman Ugurayee464d32013-02-13 17:14:36 -0800177
Arman Uguray1361c032013-02-11 17:53:39 -0800178
Arman Uguray6552f8c2013-02-12 15:33:18 -0800179 // Root path. The SIM path is reported by ModemManager to be the root path
180 // when no SIM is present.
181 static const char kRootPath[];
182
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400183 friend class CellularTest;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400184 friend class CellularCapabilityTest;
Thieu Le3d275392012-07-20 15:32:58 -0700185 friend class CellularCapabilityUniversalTest;
Arman Uguray72fab6a2013-01-10 19:32:42 -0800186 friend class CellularCapabilityUniversalCDMATest;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800187 FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, PropertiesChanged);
188 FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, UpdateOLP);
Arman Uguray1361c032013-02-11 17:53:39 -0800189 FRIEND_TEST(CellularCapabilityUniversalMainTest, AllowRoaming);
Arman Uguraya14941d2013-04-12 16:58:26 -0700190 FRIEND_TEST(CellularCapabilityUniversalMainTest,
191 ActivationWaitForRegisterTimeout);
Arman Uguray1361c032013-02-11 17:53:39 -0800192 FRIEND_TEST(CellularCapabilityUniversalMainTest, Connect);
193 FRIEND_TEST(CellularCapabilityUniversalMainTest, ConnectApns);
194 FRIEND_TEST(CellularCapabilityUniversalMainTest, CreateFriendlyServiceName);
195 FRIEND_TEST(CellularCapabilityUniversalMainTest, DisconnectNoProxy);
Arman Uguray7af0fac2013-03-18 17:35:35 -0700196 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700197 DisconnectWithDeferredCallback);
198 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Arman Uguray7af0fac2013-03-18 17:35:35 -0700199 GetNetworkTechnologyStringOnE362);
Arman Uguray1361c032013-02-11 17:53:39 -0800200 FRIEND_TEST(CellularCapabilityUniversalMainTest, GetTypeString);
Arman Ugurayc7b15602013-02-16 00:56:18 -0800201 FRIEND_TEST(CellularCapabilityUniversalMainTest, IsMdnValid);
Arman Uguray1361c032013-02-11 17:53:39 -0800202 FRIEND_TEST(CellularCapabilityUniversalMainTest, IsServiceActivationRequired);
Arman Uguray6552f8c2013-02-12 15:33:18 -0800203 FRIEND_TEST(CellularCapabilityUniversalMainTest, IsValidSimPath);
Ben Chand7592522013-02-13 16:02:01 -0800204 FRIEND_TEST(CellularCapabilityUniversalMainTest, NormalizeMdn);
Arman Uguray1361c032013-02-11 17:53:39 -0800205 FRIEND_TEST(CellularCapabilityUniversalMainTest, OnListBearersReply);
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700206 FRIEND_TEST(CellularCapabilityUniversalMainTest, OnLockRetriesChanged);
207 FRIEND_TEST(CellularCapabilityUniversalMainTest, OnLockTypeChanged);
Arman Uguray1361c032013-02-11 17:53:39 -0800208 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Ben Chanfcca27b2013-01-22 15:03:44 -0800209 OnModemCurrentCapabilitiesChanged);
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700210 FRIEND_TEST(CellularCapabilityUniversalMainTest, OnSimLockPropertiesChanged);
Arman Uguray1361c032013-02-11 17:53:39 -0800211 FRIEND_TEST(CellularCapabilityUniversalMainTest, PropertiesChanged);
212 FRIEND_TEST(CellularCapabilityUniversalMainTest, Reset);
213 FRIEND_TEST(CellularCapabilityUniversalMainTest, Scan);
214 FRIEND_TEST(CellularCapabilityUniversalMainTest, ScanFailure);
215 FRIEND_TEST(CellularCapabilityUniversalMainTest, SetHomeProvider);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700216 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Arman Ugurayf84a4242013-04-09 20:01:07 -0700217 ShouldDetectOutOfCredit);
Arman Uguray1361c032013-02-11 17:53:39 -0800218 FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusChanged);
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700219 FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusToProperty);
Arman Uguray1361c032013-02-11 17:53:39 -0800220 FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPathChanged);
221 FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPropertiesChanged);
222 FRIEND_TEST(CellularCapabilityUniversalMainTest, StartModem);
223 FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModem);
224 FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModemConnected);
Arman Uguray0a3e2792013-01-17 16:31:50 -0800225 FRIEND_TEST(CellularCapabilityUniversalMainTest,
226 UpdatePendingActivationState);
Arman Ugurayefea6e02013-02-21 13:28:04 -0800227 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700228 UpdateRegistrationState);
229 FRIEND_TEST(CellularCapabilityUniversalMainTest,
230 UpdateRegistrationStateModemNotConnected);
231 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Arman Ugurayefea6e02013-02-21 13:28:04 -0800232 UpdateServiceActivationState);
Arman Uguray1361c032013-02-11 17:53:39 -0800233 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateServiceName);
234 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateStorageIdentifier);
235 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateOLP);
236 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateOperatorInfo);
237 FRIEND_TEST(CellularCapabilityUniversalMainTest,
238 UpdateOperatorInfoViaOperatorId);
239 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateScanningProperty);
Arman Uguraya14941d2013-04-12 16:58:26 -0700240 FRIEND_TEST(CellularCapabilityUniversalTimerTest, CompleteActivation);
Arman Uguray1361c032013-02-11 17:53:39 -0800241 FRIEND_TEST(CellularCapabilityUniversalTimerTest,
242 UpdateScanningPropertyTimeout);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700243 FRIEND_TEST(CellularTest, EnableTrafficMonitor);
Ben Chan09fa2a02012-11-07 22:09:09 -0800244 FRIEND_TEST(CellularTest,
245 HandleNewRegistrationStateForServiceRequiringActivation);
Thieu Le5218cf22012-11-26 11:52:57 -0800246 FRIEND_TEST(CellularTest, ModemStateChangeLostRegistration);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400247
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700248 // SimLockStatus represents the fields in the Cellular.SIMLockStatus
249 // DBUS property of the shill device.
250 struct SimLockStatus {
251 public:
252 SimLockStatus() : enabled(false),
253 lock_type(MM_MODEM_LOCK_UNKNOWN),
254 retries_left(0) {}
255
256 bool enabled;
257 MMModemLock lock_type;
258 uint32 retries_left;
259 };
260
Jason Glasgowef965562012-04-10 16:12:35 -0400261 // Methods used in starting a modem
Gary Moraine285a842012-08-15 08:23:57 -0700262 void EnableModem(Error *error, const ResultCallback &callback);
Thieu Leb9c05e02013-03-04 14:09:32 -0800263 void Start_ModemAlreadyEnabled(const ResultCallback &callback);
Jason Glasgowef965562012-04-10 16:12:35 -0400264 void Start_EnableModemCompleted(const ResultCallback &callback,
265 const Error &error);
Jason Glasgowef965562012-04-10 16:12:35 -0400266
267 // Methods used in stopping a modem
268 void Stop_DisconnectCompleted(const ResultCallback &callback,
269 const Error &error);
270 void Stop_Disable(const ResultCallback &callback);
271 void Stop_DisableCompleted(const ResultCallback &callback,
272 const Error &error);
Arman Ugurayee464d32013-02-13 17:14:36 -0800273 void Stop_PowerDown(const ResultCallback &callback);
274 void Stop_PowerDownCompleted(const ResultCallback &callback,
275 const Error &error);
Jason Glasgowef965562012-04-10 16:12:35 -0400276
Arman Uguray2717a102013-01-29 23:36:06 -0800277 // Updates the name property that is exposed by the service to Chrome.
278 void UpdateServiceName();
279
Ben Chan8a2c01e2013-01-23 10:09:14 -0800280 void UpdateScanningProperty();
281
Arman Ugurayd73783f2013-01-31 16:11:21 -0800282 // Methods used in acquiring information related to the carrier;
283
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400284 // Updates the Universal operator name and country based on a newly
285 // obtained network id.
286 void UpdateOperatorInfo();
287
Arman Ugurayd73783f2013-01-31 16:11:21 -0800288 // Sets the upper level information about the home cellular provider from the
289 // modem's IMSI and SPN.
290 void SetHomeProvider();
291
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400292 // Updates the serving operator on the active service.
293 void UpdateServingOperator();
294
Arman Ugurayd73783f2013-01-31 16:11:21 -0800295 // Initializes the |apn_list_| property based on the current |home_provider_|.
296 void InitAPNList();
297
Arman Uguray6e5639f2012-11-15 20:30:19 -0800298 // Updates |bearer_path_| to match the currently active bearer.
299 void UpdateBearerPath();
300
Arman Ugurayc9533572013-01-22 17:34:20 -0800301 // Updates the storage identifier used for the current cellular service.
302 void UpdateStorageIdentifier();
303
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400304
305 Stringmap ParseScanResult(const ScanResult &result);
306
307 KeyValueStore SimLockStatusToProperty(Error *error);
308
309 void SetupApnTryList();
310 void FillConnectPropertyMap(DBusPropertiesMap *properties);
311
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700312 void HelpRegisterConstDerivedKeyValueStore(
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400313 const std::string &name,
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700314 KeyValueStore(CellularCapabilityUniversal::*get)(Error *error));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400315
Jason Glasgow14521872012-05-07 19:12:15 -0400316 // Returns true if a connect error should be retried. This function
317 // abstracts modem specific behavior for modems which do a lousy job
318 // of returning specific errors on connect failures.
319 bool RetriableConnectError(const Error &error) const;
320
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400321 // Signal callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400322 void OnNetworkModeSignal(uint32 mode);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400323 void OnModemStateChangedSignal(int32 old_state,
324 int32 new_state,
325 uint32 reason);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400326
327 // Property Change notification handlers
Nathan Williams3022be52012-04-19 17:40:49 -0400328 void OnModemPropertiesChanged(
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400329 const DBusPropertiesMap &properties,
330 const std::vector<std::string> &invalidated_properties);
331
Nathan Williams3022be52012-04-19 17:40:49 -0400332 void OnSignalQualityChanged(uint32 quality);
Ben Chan74924d82013-06-15 17:52:55 -0700333
334 void OnSupportedCapabilitesChanged(
335 const std::vector<uint32> &supported_capabilities);
Jason Glasgowaf583282012-04-18 15:18:22 -0400336 void OnModemCurrentCapabilitiesChanged(uint32 current_capabilities);
337 void OnMdnChanged(const std::string &mdn);
338 void OnModemManufacturerChanged(const std::string &manufacturer);
339 void OnModemModelChanged(const std::string &model);
340 void OnModemRevisionChanged(const std::string &revision);
341 void OnModemStateChanged(Cellular::ModemState state);
342 void OnAccessTechnologiesChanged(uint32 access_technologies);
Ben Chan74924d82013-06-15 17:52:55 -0700343 void OnSupportedModesChanged(const std::vector<ModemModes> &supported_modes);
344 void OnCurrentModesChanged(const ModemModes &current_modes);
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700345 void OnLockRetriesChanged(const LockRetryData &lock_retries);
346 void OnLockTypeChanged(MMModemLock unlock_required);
Jason Glasgowaf583282012-04-18 15:18:22 -0400347 void OnSimLockStatusChanged();
348
Arman Ugurayc7b15602013-02-16 00:56:18 -0800349 // Returns false if the MDN is empty or if the MDN consists of all 0s.
350 bool IsMdnValid() const;
351
Jason Glasgowaf583282012-04-18 15:18:22 -0400352 // 3GPP property change handlers
353 virtual void OnModem3GPPPropertiesChanged(
354 const DBusPropertiesMap &properties,
355 const std::vector<std::string> &invalidated_properties);
356 void OnImeiChanged(const std::string &imei);
357 void On3GPPRegistrationChanged(MMModem3gppRegistrationState state,
358 const std::string &operator_code,
359 const std::string &operator_name);
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700360 void Handle3GPPRegistrationChange(
361 MMModem3gppRegistrationState updated_state,
362 std::string updated_operator_code,
363 std::string updated_operator_name);
Jason Glasgowaf583282012-04-18 15:18:22 -0400364 void OnFacilityLocksChanged(uint32 locks);
365
366 // SIM property change handlers
Arman Uguray72fab6a2013-01-10 19:32:42 -0800367 // TODO(armansito): Put these methods in a 3GPP-only subclass.
Jason Glasgowaf583282012-04-18 15:18:22 -0400368 void OnSimPropertiesChanged(
369 const DBusPropertiesMap &props,
370 const std::vector<std::string> &invalidated_properties);
371 void OnImsiChanged(const std::string &imsi);
Arman Ugurayd73783f2013-01-31 16:11:21 -0800372 void OnSpnChanged(const std::string &spn);
Jason Glasgowaf583282012-04-18 15:18:22 -0400373 void OnSimIdentifierChanged(const std::string &id);
374 void OnOperatorIdChanged(const std::string &operator_id);
375 void OnOperatorNameChanged(const std::string &operator_name);
Jason Glasgowef965562012-04-10 16:12:35 -0400376
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400377 // Method callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400378 void OnRegisterReply(const ResultCallback &callback,
379 const Error &error);
Ben Chan5d0d32c2013-01-08 02:05:29 -0800380 void OnResetReply(const ResultCallback &callback, const Error &error);
Nathan Williams3022be52012-04-19 17:40:49 -0400381 void OnScanReply(const ResultCallback &callback,
382 const ScanResults &results,
383 const Error &error);
Nathan Williamsb54974f2012-04-19 11:16:30 -0400384 void OnConnectReply(const ResultCallback &callback,
385 const DBus::Path &bearer,
386 const Error &error);
Arman Uguray6e5639f2012-11-15 20:30:19 -0800387 void OnListBearersReply(const std::vector<DBus::Path> &paths,
388 const Error &error);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400389
Arman Uguray1361c032013-02-11 17:53:39 -0800390 // Timeout callback for the network scan initiated when Cellular connectivity
391 // gets enabled.
392 void OnScanningOrSearchingTimeout();
393
Arman Uguraya14941d2013-04-12 16:58:26 -0700394 // Timeout callback that is called if the modem takes too long to register to
395 // a network after online payment is complete. Resets the modem.
396 void OnActivationWaitForRegisterTimeout();
397
Arman Uguray6552f8c2013-02-12 15:33:18 -0800398 // Returns true, if |sim_path| constitutes a valid SIM path. Currently, a
399 // path is accepted to be valid, as long as it is not equal to one of ""
400 // and "/".
401 bool IsValidSimPath(const std::string &sim_path) const;
402
Ben Chand7592522013-02-13 16:02:01 -0800403 // Returns the normalized version of |mdn| by keeping only digits in |mdn|
404 // and removing other non-digit characters.
405 std::string NormalizeMdn(const std::string &mdn) const;
406
Arman Uguray2717a102013-01-29 23:36:06 -0800407 static std::string GenerateNewGenericServiceName();
408
Arman Ugurayc7b15602013-02-16 00:56:18 -0800409 // Post-payment activation handlers.
Arman Ugurayc7b15602013-02-16 00:56:18 -0800410 void ResetAfterActivation();
Arman Ugurayefea6e02013-02-21 13:28:04 -0800411 void UpdateServiceActivationState();
Arman Ugurayc7b15602013-02-16 00:56:18 -0800412 void OnResetAfterActivationReply(const Error &error);
413
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700414 static bool IsRegisteredState(MMModem3gppRegistrationState state);
415
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400416 scoped_ptr<mm1::ModemModem3gppProxyInterface> modem_3gpp_proxy_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400417 scoped_ptr<mm1::ModemProxyInterface> modem_proxy_;
418 scoped_ptr<mm1::ModemSimpleProxyInterface> modem_simple_proxy_;
419 scoped_ptr<mm1::SimProxyInterface> sim_proxy_;
420
421 base::WeakPtrFactory<CellularCapabilityUniversal> weak_ptr_factory_;
422
423 MMModem3gppRegistrationState registration_state_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400424
425 // Bits based on MMModemCapabilities
Ben Chan74924d82013-06-15 17:52:55 -0700426 std::vector<uint32> supported_capabilities_; // Technologies supported
427 uint32 current_capabilities_; // Technologies supported without a reload
Jason Glasgow14521872012-05-07 19:12:15 -0400428 uint32 access_technologies_; // Bits based on MMModemAccessTechnology
Ben Chan74924d82013-06-15 17:52:55 -0700429 std::vector<ModemModes> supported_modes_;
430 ModemModes current_modes_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400431
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400432 Cellular::Operator serving_operator_;
433 std::string spn_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400434 std::string sim_identifier_;
435 std::string operator_id_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400436 mobile_provider *home_provider_;
Darin Petkovf508c822012-09-21 13:43:17 +0200437 bool provider_requires_roaming_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400438 std::string desired_network_;
439
440 // Properties.
441 std::string carrier_;
442 std::string esn_;
443 std::string firmware_revision_;
444 std::string hardware_revision_;
445 std::string imei_;
446 std::string imsi_;
447 std::string manufacturer_;
448 std::string mdn_;
449 std::string meid_;
450 std::string min_;
451 std::string model_id_;
452 std::string selected_network_;
453 Stringmaps found_networks_;
454 std::deque<Stringmap> apn_try_list_;
Ben Chan5d0d32c2013-01-08 02:05:29 -0800455 bool resetting_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400456 bool scanning_supported_;
457 bool scanning_;
Ben Chan8a2c01e2013-01-23 10:09:14 -0800458 bool scanning_or_searching_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400459 uint16 scan_interval_;
460 SimLockStatus sim_lock_status_;
461 Stringmaps apn_list_;
Jason Glasgowef965562012-04-10 16:12:35 -0400462 std::string sim_path_;
Ben Chanbd3aee82012-10-16 23:52:04 -0700463 bool sim_present_;
Nathan Williamsb54974f2012-04-19 11:16:30 -0400464 DBus::Path bearer_path_;
Arman Ugurayc7b15602013-02-16 00:56:18 -0800465 bool reset_done_;
466
Gary Moraine285a842012-08-15 08:23:57 -0700467 // If the modem is not in a state to be enabled when StartModem is called,
468 // enabling is deferred using this callback.
469 base::Closure deferred_enable_modem_callback_;
470
Arman Uguray1361c032013-02-11 17:53:39 -0800471 // Sometimes modems may be stuck in the SEARCHING state during the lack of
472 // presence of a network. During this indefinite duration of time, keeping
473 // the Device.Scanning property as |true| causes a bad user experience.
474 // This callback sets it to |false| after a timeout period has passed.
475 base::CancelableClosure scanning_or_searching_timeout_callback_;
Arman Uguraya14941d2013-04-12 16:58:26 -0700476 int64 scanning_or_searching_timeout_milliseconds_;
477
478 base::CancelableClosure activation_wait_for_registration_callback_;
479 int64 activation_registration_timeout_milliseconds_;
Arman Uguray1361c032013-02-11 17:53:39 -0800480
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700481 // Sometimes flaky cellular network causes the 3GPP registration state to
482 // rapidly change from registered --> searching and back. Delay such updates
483 // a little to smooth over temporary registration loss.
484 base::CancelableClosure registration_dropped_update_callback_;
485 int64 registration_dropped_update_timeout_milliseconds_;
486
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400487 static unsigned int friendly_service_name_id_;
488
489 DISALLOW_COPY_AND_ASSIGN(CellularCapabilityUniversal);
490};
491
492} // namespace shill
493
Jason Glasgow14521872012-05-07 19:12:15 -0400494#endif // SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_