blob: 2ce9c6857a27271e378577cdd43df1be159d909a [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;
Jason Glasgowaf583282012-04-18 15:18:22 -040040 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:
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400140 // Constants used in scan results. Make available to unit tests.
141 // TODO(jglasgow): Generate from modem manager into ModemManager-names.h.
142 // See http://crosbug.com/30551.
143 static const char kStatusProperty[];
144 static const char kOperatorLongProperty[];
145 static const char kOperatorShortProperty[];
146 static const char kOperatorCodeProperty[];
147 static const char kOperatorAccessTechnologyProperty[];
148
mukesh agrawal9da07772013-05-15 14:15:17 -0700149 // As above, consider having this in ModemManager-names.h.
150 static const char kIpConfigPropertyMethod[];
151
Jason Glasgow14521872012-05-07 19:12:15 -0400152 // Modem Model ID strings. From modem firmware via modemmanager.
153 static const char kE362ModelId[];
154
Arman Uguray2717a102013-01-29 23:36:06 -0800155 // Generic service name prefix, shown when the correct carrier name is
156 // unknown.
157 static const char kGenericServiceNamePrefix[];
158
Arman Uguraya14941d2013-04-12 16:58:26 -0700159 static const int64 kActivationRegistrationTimeoutMilliseconds;
160 static const int64 kDefaultScanningOrSearchingTimeoutMilliseconds;
Arman Ugurayf6366ac2013-06-12 16:02:28 -0700161 static const int64 kEnterPinTimeoutMilliseconds;
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700162 static const int64 kRegistrationDroppedUpdateTimeoutMilliseconds;
Thieu Le2cac2942013-03-05 18:41:08 -0800163 static const int kSetPowerStateTimeoutMilliseconds;
Arman Ugurayee464d32013-02-13 17:14:36 -0800164
Arman Uguray1361c032013-02-11 17:53:39 -0800165
Arman Uguray6552f8c2013-02-12 15:33:18 -0800166 // Root path. The SIM path is reported by ModemManager to be the root path
167 // when no SIM is present.
168 static const char kRootPath[];
169
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400170 friend class CellularTest;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400171 friend class CellularCapabilityTest;
Thieu Le3d275392012-07-20 15:32:58 -0700172 friend class CellularCapabilityUniversalTest;
Arman Uguray72fab6a2013-01-10 19:32:42 -0800173 friend class CellularCapabilityUniversalCDMATest;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800174 FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, PropertiesChanged);
175 FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, UpdateOLP);
Arman Uguray1361c032013-02-11 17:53:39 -0800176 FRIEND_TEST(CellularCapabilityUniversalMainTest, AllowRoaming);
Arman Uguraya14941d2013-04-12 16:58:26 -0700177 FRIEND_TEST(CellularCapabilityUniversalMainTest,
178 ActivationWaitForRegisterTimeout);
Arman Uguray1361c032013-02-11 17:53:39 -0800179 FRIEND_TEST(CellularCapabilityUniversalMainTest, Connect);
180 FRIEND_TEST(CellularCapabilityUniversalMainTest, ConnectApns);
181 FRIEND_TEST(CellularCapabilityUniversalMainTest, CreateFriendlyServiceName);
182 FRIEND_TEST(CellularCapabilityUniversalMainTest, DisconnectNoProxy);
Arman Uguray7af0fac2013-03-18 17:35:35 -0700183 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700184 DisconnectWithDeferredCallback);
185 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Arman Uguray7af0fac2013-03-18 17:35:35 -0700186 GetNetworkTechnologyStringOnE362);
Arman Uguray1361c032013-02-11 17:53:39 -0800187 FRIEND_TEST(CellularCapabilityUniversalMainTest, GetTypeString);
Arman Ugurayc7b15602013-02-16 00:56:18 -0800188 FRIEND_TEST(CellularCapabilityUniversalMainTest, IsMdnValid);
Arman Uguray1361c032013-02-11 17:53:39 -0800189 FRIEND_TEST(CellularCapabilityUniversalMainTest, IsServiceActivationRequired);
Arman Uguray6552f8c2013-02-12 15:33:18 -0800190 FRIEND_TEST(CellularCapabilityUniversalMainTest, IsValidSimPath);
Ben Chand7592522013-02-13 16:02:01 -0800191 FRIEND_TEST(CellularCapabilityUniversalMainTest, NormalizeMdn);
Arman Uguray1361c032013-02-11 17:53:39 -0800192 FRIEND_TEST(CellularCapabilityUniversalMainTest, OnListBearersReply);
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700193 FRIEND_TEST(CellularCapabilityUniversalMainTest, OnLockRetriesChanged);
194 FRIEND_TEST(CellularCapabilityUniversalMainTest, OnLockTypeChanged);
Arman Uguray1361c032013-02-11 17:53:39 -0800195 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Ben Chanfcca27b2013-01-22 15:03:44 -0800196 OnModemCurrentCapabilitiesChanged);
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700197 FRIEND_TEST(CellularCapabilityUniversalMainTest, OnSimLockPropertiesChanged);
Arman Uguray1361c032013-02-11 17:53:39 -0800198 FRIEND_TEST(CellularCapabilityUniversalMainTest, PropertiesChanged);
199 FRIEND_TEST(CellularCapabilityUniversalMainTest, Reset);
200 FRIEND_TEST(CellularCapabilityUniversalMainTest, Scan);
201 FRIEND_TEST(CellularCapabilityUniversalMainTest, ScanFailure);
202 FRIEND_TEST(CellularCapabilityUniversalMainTest, SetHomeProvider);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700203 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Arman Ugurayf84a4242013-04-09 20:01:07 -0700204 ShouldDetectOutOfCredit);
Arman Uguray1361c032013-02-11 17:53:39 -0800205 FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusChanged);
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700206 FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusToProperty);
Arman Uguray1361c032013-02-11 17:53:39 -0800207 FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPathChanged);
208 FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPropertiesChanged);
209 FRIEND_TEST(CellularCapabilityUniversalMainTest, StartModem);
210 FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModem);
211 FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModemConnected);
Arman Uguray0a3e2792013-01-17 16:31:50 -0800212 FRIEND_TEST(CellularCapabilityUniversalMainTest,
213 UpdatePendingActivationState);
Arman Ugurayefea6e02013-02-21 13:28:04 -0800214 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700215 UpdateRegistrationState);
216 FRIEND_TEST(CellularCapabilityUniversalMainTest,
217 UpdateRegistrationStateModemNotConnected);
218 FRIEND_TEST(CellularCapabilityUniversalMainTest,
Arman Ugurayefea6e02013-02-21 13:28:04 -0800219 UpdateServiceActivationState);
Arman Uguray1361c032013-02-11 17:53:39 -0800220 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateServiceName);
221 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateStorageIdentifier);
222 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateOLP);
223 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateOperatorInfo);
224 FRIEND_TEST(CellularCapabilityUniversalMainTest,
225 UpdateOperatorInfoViaOperatorId);
226 FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateScanningProperty);
Arman Uguraya14941d2013-04-12 16:58:26 -0700227 FRIEND_TEST(CellularCapabilityUniversalTimerTest, CompleteActivation);
Arman Uguray1361c032013-02-11 17:53:39 -0800228 FRIEND_TEST(CellularCapabilityUniversalTimerTest,
229 UpdateScanningPropertyTimeout);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700230 FRIEND_TEST(CellularTest, EnableTrafficMonitor);
Ben Chan09fa2a02012-11-07 22:09:09 -0800231 FRIEND_TEST(CellularTest,
232 HandleNewRegistrationStateForServiceRequiringActivation);
Thieu Le5218cf22012-11-26 11:52:57 -0800233 FRIEND_TEST(CellularTest, ModemStateChangeLostRegistration);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400234
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700235 // SimLockStatus represents the fields in the Cellular.SIMLockStatus
236 // DBUS property of the shill device.
237 struct SimLockStatus {
238 public:
239 SimLockStatus() : enabled(false),
240 lock_type(MM_MODEM_LOCK_UNKNOWN),
241 retries_left(0) {}
242
243 bool enabled;
244 MMModemLock lock_type;
245 uint32 retries_left;
246 };
247
Jason Glasgowef965562012-04-10 16:12:35 -0400248 // Methods used in starting a modem
Gary Moraine285a842012-08-15 08:23:57 -0700249 void EnableModem(Error *error, const ResultCallback &callback);
Thieu Leb9c05e02013-03-04 14:09:32 -0800250 void Start_ModemAlreadyEnabled(const ResultCallback &callback);
Jason Glasgowef965562012-04-10 16:12:35 -0400251 void Start_EnableModemCompleted(const ResultCallback &callback,
252 const Error &error);
Jason Glasgowef965562012-04-10 16:12:35 -0400253
254 // Methods used in stopping a modem
255 void Stop_DisconnectCompleted(const ResultCallback &callback,
256 const Error &error);
257 void Stop_Disable(const ResultCallback &callback);
258 void Stop_DisableCompleted(const ResultCallback &callback,
259 const Error &error);
Arman Ugurayee464d32013-02-13 17:14:36 -0800260 void Stop_PowerDown(const ResultCallback &callback);
261 void Stop_PowerDownCompleted(const ResultCallback &callback,
262 const Error &error);
Jason Glasgowef965562012-04-10 16:12:35 -0400263
Arman Uguray2717a102013-01-29 23:36:06 -0800264 // Updates the name property that is exposed by the service to Chrome.
265 void UpdateServiceName();
266
Ben Chan8a2c01e2013-01-23 10:09:14 -0800267 void UpdateScanningProperty();
268
Arman Ugurayd73783f2013-01-31 16:11:21 -0800269 // Methods used in acquiring information related to the carrier;
270
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400271 // Updates the Universal operator name and country based on a newly
272 // obtained network id.
273 void UpdateOperatorInfo();
274
Arman Ugurayd73783f2013-01-31 16:11:21 -0800275 // Sets the upper level information about the home cellular provider from the
276 // modem's IMSI and SPN.
277 void SetHomeProvider();
278
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400279 // Updates the serving operator on the active service.
280 void UpdateServingOperator();
281
Arman Ugurayd73783f2013-01-31 16:11:21 -0800282 // Initializes the |apn_list_| property based on the current |home_provider_|.
283 void InitAPNList();
284
Arman Uguray6e5639f2012-11-15 20:30:19 -0800285 // Updates |bearer_path_| to match the currently active bearer.
286 void UpdateBearerPath();
287
Arman Ugurayc9533572013-01-22 17:34:20 -0800288 // Updates the storage identifier used for the current cellular service.
289 void UpdateStorageIdentifier();
290
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400291
292 Stringmap ParseScanResult(const ScanResult &result);
293
294 KeyValueStore SimLockStatusToProperty(Error *error);
295
296 void SetupApnTryList();
297 void FillConnectPropertyMap(DBusPropertiesMap *properties);
298
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700299 void HelpRegisterConstDerivedKeyValueStore(
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400300 const std::string &name,
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700301 KeyValueStore(CellularCapabilityUniversal::*get)(Error *error));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400302
Jason Glasgow14521872012-05-07 19:12:15 -0400303 // Returns true if a connect error should be retried. This function
304 // abstracts modem specific behavior for modems which do a lousy job
305 // of returning specific errors on connect failures.
306 bool RetriableConnectError(const Error &error) const;
307
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400308 // Signal callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400309 void OnNetworkModeSignal(uint32 mode);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400310 void OnModemStateChangedSignal(int32 old_state,
311 int32 new_state,
312 uint32 reason);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400313
314 // Property Change notification handlers
Nathan Williams3022be52012-04-19 17:40:49 -0400315 void OnModemPropertiesChanged(
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400316 const DBusPropertiesMap &properties,
317 const std::vector<std::string> &invalidated_properties);
318
Nathan Williams3022be52012-04-19 17:40:49 -0400319 void OnSignalQualityChanged(uint32 quality);
Jason Glasgowaf583282012-04-18 15:18:22 -0400320 void OnModemCurrentCapabilitiesChanged(uint32 current_capabilities);
321 void OnMdnChanged(const std::string &mdn);
322 void OnModemManufacturerChanged(const std::string &manufacturer);
323 void OnModemModelChanged(const std::string &model);
324 void OnModemRevisionChanged(const std::string &revision);
325 void OnModemStateChanged(Cellular::ModemState state);
326 void OnAccessTechnologiesChanged(uint32 access_technologies);
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700327 void OnLockRetriesChanged(const LockRetryData &lock_retries);
328 void OnLockTypeChanged(MMModemLock unlock_required);
Jason Glasgowaf583282012-04-18 15:18:22 -0400329 void OnSimLockStatusChanged();
330
Arman Ugurayc7b15602013-02-16 00:56:18 -0800331 // Returns false if the MDN is empty or if the MDN consists of all 0s.
332 bool IsMdnValid() const;
333
Jason Glasgowaf583282012-04-18 15:18:22 -0400334 // 3GPP property change handlers
335 virtual void OnModem3GPPPropertiesChanged(
336 const DBusPropertiesMap &properties,
337 const std::vector<std::string> &invalidated_properties);
338 void OnImeiChanged(const std::string &imei);
339 void On3GPPRegistrationChanged(MMModem3gppRegistrationState state,
340 const std::string &operator_code,
341 const std::string &operator_name);
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700342 void Handle3GPPRegistrationChange(
343 MMModem3gppRegistrationState updated_state,
344 std::string updated_operator_code,
345 std::string updated_operator_name);
Jason Glasgowaf583282012-04-18 15:18:22 -0400346 void OnFacilityLocksChanged(uint32 locks);
347
348 // SIM property change handlers
Arman Uguray72fab6a2013-01-10 19:32:42 -0800349 // TODO(armansito): Put these methods in a 3GPP-only subclass.
Jason Glasgowaf583282012-04-18 15:18:22 -0400350 void OnSimPropertiesChanged(
351 const DBusPropertiesMap &props,
352 const std::vector<std::string> &invalidated_properties);
353 void OnImsiChanged(const std::string &imsi);
Arman Ugurayd73783f2013-01-31 16:11:21 -0800354 void OnSpnChanged(const std::string &spn);
Jason Glasgowaf583282012-04-18 15:18:22 -0400355 void OnSimIdentifierChanged(const std::string &id);
356 void OnOperatorIdChanged(const std::string &operator_id);
357 void OnOperatorNameChanged(const std::string &operator_name);
Jason Glasgowef965562012-04-10 16:12:35 -0400358
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400359 // Method callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400360 void OnRegisterReply(const ResultCallback &callback,
361 const Error &error);
Ben Chan5d0d32c2013-01-08 02:05:29 -0800362 void OnResetReply(const ResultCallback &callback, const Error &error);
Nathan Williams3022be52012-04-19 17:40:49 -0400363 void OnScanReply(const ResultCallback &callback,
364 const ScanResults &results,
365 const Error &error);
Nathan Williamsb54974f2012-04-19 11:16:30 -0400366 void OnConnectReply(const ResultCallback &callback,
367 const DBus::Path &bearer,
368 const Error &error);
Arman Uguray6e5639f2012-11-15 20:30:19 -0800369 void OnListBearersReply(const std::vector<DBus::Path> &paths,
370 const Error &error);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400371
Arman Uguray1361c032013-02-11 17:53:39 -0800372 // Timeout callback for the network scan initiated when Cellular connectivity
373 // gets enabled.
374 void OnScanningOrSearchingTimeout();
375
Arman Uguraya14941d2013-04-12 16:58:26 -0700376 // Timeout callback that is called if the modem takes too long to register to
377 // a network after online payment is complete. Resets the modem.
378 void OnActivationWaitForRegisterTimeout();
379
Arman Uguray6552f8c2013-02-12 15:33:18 -0800380 // Returns true, if |sim_path| constitutes a valid SIM path. Currently, a
381 // path is accepted to be valid, as long as it is not equal to one of ""
382 // and "/".
383 bool IsValidSimPath(const std::string &sim_path) const;
384
Ben Chand7592522013-02-13 16:02:01 -0800385 // Returns the normalized version of |mdn| by keeping only digits in |mdn|
386 // and removing other non-digit characters.
387 std::string NormalizeMdn(const std::string &mdn) const;
388
Arman Uguray2717a102013-01-29 23:36:06 -0800389 static std::string GenerateNewGenericServiceName();
390
Arman Ugurayc7b15602013-02-16 00:56:18 -0800391 // Post-payment activation handlers.
Arman Ugurayc7b15602013-02-16 00:56:18 -0800392 void ResetAfterActivation();
Arman Ugurayefea6e02013-02-21 13:28:04 -0800393 void UpdateServiceActivationState();
Arman Ugurayc7b15602013-02-16 00:56:18 -0800394 void OnResetAfterActivationReply(const Error &error);
395
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700396 static bool IsRegisteredState(MMModem3gppRegistrationState state);
397
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400398 scoped_ptr<mm1::ModemModem3gppProxyInterface> modem_3gpp_proxy_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400399 scoped_ptr<mm1::ModemProxyInterface> modem_proxy_;
400 scoped_ptr<mm1::ModemSimpleProxyInterface> modem_simple_proxy_;
401 scoped_ptr<mm1::SimProxyInterface> sim_proxy_;
402
403 base::WeakPtrFactory<CellularCapabilityUniversal> weak_ptr_factory_;
404
405 MMModem3gppRegistrationState registration_state_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400406
407 // Bits based on MMModemCapabilities
Jason Glasgow14521872012-05-07 19:12:15 -0400408 uint32 current_capabilities_; // technologies supportsed without a reload
409 uint32 access_technologies_; // Bits based on MMModemAccessTechnology
Jason Glasgowaf583282012-04-18 15:18:22 -0400410
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400411 Cellular::Operator serving_operator_;
412 std::string spn_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400413 std::string sim_identifier_;
414 std::string operator_id_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400415 mobile_provider *home_provider_;
Darin Petkovf508c822012-09-21 13:43:17 +0200416 bool provider_requires_roaming_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400417 std::string desired_network_;
418
419 // Properties.
420 std::string carrier_;
421 std::string esn_;
422 std::string firmware_revision_;
423 std::string hardware_revision_;
424 std::string imei_;
425 std::string imsi_;
426 std::string manufacturer_;
427 std::string mdn_;
428 std::string meid_;
429 std::string min_;
430 std::string model_id_;
431 std::string selected_network_;
432 Stringmaps found_networks_;
433 std::deque<Stringmap> apn_try_list_;
Ben Chan5d0d32c2013-01-08 02:05:29 -0800434 bool resetting_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400435 bool scanning_supported_;
436 bool scanning_;
Ben Chan8a2c01e2013-01-23 10:09:14 -0800437 bool scanning_or_searching_;
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400438 uint16 scan_interval_;
439 SimLockStatus sim_lock_status_;
440 Stringmaps apn_list_;
Jason Glasgowef965562012-04-10 16:12:35 -0400441 std::string sim_path_;
Ben Chanbd3aee82012-10-16 23:52:04 -0700442 bool sim_present_;
Nathan Williamsb54974f2012-04-19 11:16:30 -0400443 DBus::Path bearer_path_;
Arman Ugurayc7b15602013-02-16 00:56:18 -0800444 bool reset_done_;
445
Gary Moraine285a842012-08-15 08:23:57 -0700446 // If the modem is not in a state to be enabled when StartModem is called,
447 // enabling is deferred using this callback.
448 base::Closure deferred_enable_modem_callback_;
449
Arman Uguray1361c032013-02-11 17:53:39 -0800450 // Sometimes modems may be stuck in the SEARCHING state during the lack of
451 // presence of a network. During this indefinite duration of time, keeping
452 // the Device.Scanning property as |true| causes a bad user experience.
453 // This callback sets it to |false| after a timeout period has passed.
454 base::CancelableClosure scanning_or_searching_timeout_callback_;
Arman Uguraya14941d2013-04-12 16:58:26 -0700455 int64 scanning_or_searching_timeout_milliseconds_;
456
457 base::CancelableClosure activation_wait_for_registration_callback_;
458 int64 activation_registration_timeout_milliseconds_;
Arman Uguray1361c032013-02-11 17:53:39 -0800459
Prathmesh Prabhu8f6479f2013-05-15 12:56:13 -0700460 // Sometimes flaky cellular network causes the 3GPP registration state to
461 // rapidly change from registered --> searching and back. Delay such updates
462 // a little to smooth over temporary registration loss.
463 base::CancelableClosure registration_dropped_update_callback_;
464 int64 registration_dropped_update_timeout_milliseconds_;
465
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400466 static unsigned int friendly_service_name_id_;
467
468 DISALLOW_COPY_AND_ASSIGN(CellularCapabilityUniversal);
469};
470
471} // namespace shill
472
Jason Glasgow14521872012-05-07 19:12:15 -0400473#endif // SHILL_CELLULAR_CAPABILITY_UNIVERSAL_H_