blob: eddcda38556cf7523437d6c795897abe435e3a3b [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_GSM_
6#define SHILL_CELLULAR_CAPABILITY_GSM_
7
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -04008#include <deque>
Jason Glasgow82f9ab32012-04-04 14:27:19 -04009#include <string>
Jason Glasgow4c0724a2012-04-17 15:47:40 -040010#include <vector>
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040011
Darin Petkovcb547732011-11-09 13:55:26 +010012#include <base/memory/scoped_ptr.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -050013#include <base/memory/weak_ptr.h>
Jason Glasgow9f09aef2012-05-08 16:26:55 -040014#include <chromeos/dbus/service_constants.h>
Darin Petkov1272a432011-11-10 15:53:37 +010015#include <gtest/gtest_prod.h> // for FRIEND_TEST
Darin Petkovb05315f2011-11-07 10:14:25 +010016
Darin Petkov1272a432011-11-10 15:53:37 +010017#include "shill/accessor_interface.h"
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010018#include "shill/cellular.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020019#include "shill/cellular_capability.h"
Jason Glasgow82f9ab32012-04-04 14:27:19 -040020#include "shill/cellular_capability_classic.h"
Darin Petkovcb547732011-11-09 13:55:26 +010021#include "shill/modem_gsm_card_proxy_interface.h"
Darin Petkov1272a432011-11-10 15:53:37 +010022#include "shill/modem_gsm_network_proxy_interface.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020023
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010024struct mobile_provider;
25
Darin Petkovdaf43862011-10-27 11:37:28 +020026namespace shill {
27
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070028class ModemInfo;
29
Jason Glasgow82f9ab32012-04-04 14:27:19 -040030class CellularCapabilityGSM : public CellularCapabilityClassic {
Darin Petkovdaf43862011-10-27 11:37:28 +020031 public:
Thieu Lece4483e2013-01-23 15:12:03 -080032 CellularCapabilityGSM(Cellular *cellular,
33 ProxyFactory *proxy_factory,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070034 ModemInfo *modem_info);
Darin Petkovdaf43862011-10-27 11:37:28 +020035
Darin Petkovb05315f2011-11-07 10:14:25 +010036 // Inherited from CellularCapability.
Eric Shienbrood9a245532012-03-07 14:20:39 -050037 virtual void StartModem(Error *error, const ResultCallback &callback);
Darin Petkov5f316f62011-11-18 12:10:26 +010038 virtual void OnServiceCreated();
Darin Petkovae0c64e2011-11-15 15:50:27 +010039 virtual void SetupConnectProperties(DBusPropertiesMap *properties);
Nathan Williamsb54974f2012-04-19 11:16:30 -040040 virtual void Connect(const DBusPropertiesMap &properties, Error *error,
41 const ResultCallback &callback);
Eric Shienbrood9a245532012-03-07 14:20:39 -050042 // The following two methods never need to report results
43 // via callbacks, which is why they don't take callbacks
44 // as arguments.
Darin Petkov3e509242011-11-10 14:46:44 +010045 virtual void GetSignalQuality();
Eric Shienbrood9a245532012-03-07 14:20:39 -050046 virtual void GetRegistrationState();
47 // The following six methods are only ever called as
48 // callbacks (from the main loop), which is why they
49 // don't take an Error * argument.
50 virtual void GetProperties(const ResultCallback &callback);
51 virtual void GetIMEI(const ResultCallback &callback);
52 virtual void GetIMSI(const ResultCallback &callback);
53 virtual void GetSPN(const ResultCallback &callback);
54 virtual void GetMSISDN(const ResultCallback &callback);
55 virtual void Register(const ResultCallback &callback);
56
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050057 virtual void RegisterOnNetwork(const std::string &network_id,
Eric Shienbrood9a245532012-03-07 14:20:39 -050058 Error *error,
59 const ResultCallback &callback);
Ben Chan31ce5642013-11-14 13:37:40 -080060 virtual bool IsRegistered() const;
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040061 virtual void SetUnregistered(bool searching);
Darin Petkovac635a82012-01-10 16:51:58 +010062 virtual std::string CreateFriendlyServiceName();
Eric Shienbrood9a245532012-03-07 14:20:39 -050063 virtual void RequirePIN(const std::string &pin, bool require,
64 Error *error, const ResultCallback &callback);
65 virtual void EnterPIN(const std::string &pin,
66 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +010067 virtual void UnblockPIN(const std::string &unblock_code,
68 const std::string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050069 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +010070 virtual void ChangePIN(const std::string &old_pin,
71 const std::string &new_pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050072 Error *error, const ResultCallback &callback);
73 virtual void Scan(Error *error, const ResultCallback &callback);
Darin Petkov20c13ec2011-11-09 15:07:15 +010074 virtual std::string GetNetworkTechnologyString() const;
75 virtual std::string GetRoamingStateString() const;
Jason Glasgow9f09aef2012-05-08 16:26:55 -040076 virtual std::string GetTypeString() const {
Ben Chan7ea768e2013-09-20 15:08:40 -070077 return kTechnologyFamilyGsm;
Jason Glasgow9f09aef2012-05-08 16:26:55 -040078 }
Jason Glasgow4c0724a2012-04-17 15:47:40 -040079 virtual void OnDBusPropertiesChanged(
80 const std::string &interface,
81 const DBusPropertiesMap &properties,
82 const std::vector<std::string> &invalidated_properties);
83 virtual bool AllowRoaming();
Darin Petkovdaf43862011-10-27 11:37:28 +020084
Eric Shienbrood9a245532012-03-07 14:20:39 -050085 protected:
86 virtual void InitProxies();
87 virtual void ReleaseProxies();
Ben Chan3ecdf822012-08-06 12:29:23 -070088
89 // Initializes properties, such as IMSI, which are required before the device
90 // is enabled.
91 virtual void InitProperties();
92
Jason Glasgow4380f0d2012-05-03 18:05:04 -040093 virtual void UpdateStatus(const DBusPropertiesMap &properties);
Eric Shienbrood9a245532012-03-07 14:20:39 -050094
Darin Petkovdaf43862011-10-27 11:37:28 +020095 private:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050096 friend class CellularTest;
Darin Petkovcb547732011-11-09 13:55:26 +010097 friend class CellularCapabilityGSMTest;
Eric Shienbrood9a245532012-03-07 14:20:39 -050098 friend class CellularCapabilityTest;
Darin Petkovf508c822012-09-21 13:43:17 +020099 FRIEND_TEST(CellularCapabilityGSMTest, AllowRoaming);
Darin Petkov63138a92012-02-06 14:09:15 +0100100 FRIEND_TEST(CellularCapabilityGSMTest, CreateDeviceFromProperties);
Darin Petkovac635a82012-01-10 16:51:58 +0100101 FRIEND_TEST(CellularCapabilityGSMTest, CreateFriendlyServiceName);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500102 FRIEND_TEST(CellularCapabilityGSMTest, GetIMEI);
103 FRIEND_TEST(CellularCapabilityGSMTest, GetIMSI);
Gary Morain82a31a02012-08-02 18:03:32 -0700104 FRIEND_TEST(CellularCapabilityGSMTest, GetIMSIFails);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500105 FRIEND_TEST(CellularCapabilityGSMTest, GetMSISDN);
106 FRIEND_TEST(CellularCapabilityGSMTest, GetSPN);
107 FRIEND_TEST(CellularCapabilityGSMTest, RequirePIN);
108 FRIEND_TEST(CellularCapabilityGSMTest, EnterPIN);
109 FRIEND_TEST(CellularCapabilityGSMTest, UnblockPIN);
110 FRIEND_TEST(CellularCapabilityGSMTest, ChangePIN);
Darin Petkov3cfbf212011-11-21 16:02:09 +0100111 FRIEND_TEST(CellularCapabilityGSMTest, InitAPNList);
Darin Petkov1272a432011-11-10 15:53:37 +0100112 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResult);
113 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResultProviderLookup);
Darin Petkov184c54e2011-11-15 12:44:39 +0100114 FRIEND_TEST(CellularCapabilityGSMTest, RegisterOnNetwork);
Darin Petkov1272a432011-11-10 15:53:37 +0100115 FRIEND_TEST(CellularCapabilityGSMTest, Scan);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100116 FRIEND_TEST(CellularCapabilityGSMTest, SetAccessTechnology);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400117 FRIEND_TEST(CellularCapabilityGSMTest, UpdateStatus);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100118 FRIEND_TEST(CellularCapabilityGSMTest, SetHomeProvider);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100119 FRIEND_TEST(CellularCapabilityGSMTest, UpdateOperatorInfo);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500120 FRIEND_TEST(CellularCapabilityGSMTest, GetRegistrationState);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400121 FRIEND_TEST(CellularCapabilityGSMTest, OnDBusPropertiesChanged);
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400122 FRIEND_TEST(CellularCapabilityGSMTest, SetupApnTryList);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500123 FRIEND_TEST(CellularCapabilityTest, AllowRoaming);
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400124 FRIEND_TEST(CellularCapabilityTest, TryApns);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500125 FRIEND_TEST(CellularTest, StartGSMRegister);
Darin Petkov63138a92012-02-06 14:09:15 +0100126 FRIEND_TEST(ModemTest, CreateDeviceFromProperties);
Darin Petkov1272a432011-11-10 15:53:37 +0100127
Arman Ugurayc7e63af2013-06-13 17:07:32 -0700128 // SimLockStatus represents the fields in the Cellular.SIMLockStatus
129 // DBUS property of the shill device.
Darin Petkov721ac932011-11-16 15:43:09 +0100130 struct SimLockStatus {
131 public:
Darin Petkov63138a92012-02-06 14:09:15 +0100132 SimLockStatus() : enabled(false), retries_left(0) {}
Darin Petkov721ac932011-11-16 15:43:09 +0100133
Darin Petkov63138a92012-02-06 14:09:15 +0100134 bool enabled;
Darin Petkov721ac932011-11-16 15:43:09 +0100135 std::string lock_type;
136 uint32 retries_left;
137 };
138
Darin Petkov1272a432011-11-10 15:53:37 +0100139 static const char kNetworkPropertyAccessTechnology[];
140 static const char kNetworkPropertyID[];
141 static const char kNetworkPropertyLongName[];
142 static const char kNetworkPropertyShortName[];
143 static const char kNetworkPropertyStatus[];
Darin Petkovae0c64e2011-11-15 15:50:27 +0100144 static const char kPhoneNumber[];
145 static const char kPropertyAccessTechnology[];
Darin Petkov63138a92012-02-06 14:09:15 +0100146 static const char kPropertyEnabledFacilityLocks[];
147 static const char kPropertyUnlockRequired[];
148 static const char kPropertyUnlockRetries[];
149
Gary Morain82a31a02012-08-02 18:03:32 -0700150 // Calls to the proxy's GetIMSI() will be retried this many times.
151 static const int kGetIMSIRetryLimit;
152
153 // This much time will pass between retries of GetIMSI().
154 static const int64 kGetIMSIRetryDelayMilliseconds;
Darin Petkovcb547732011-11-09 13:55:26 +0100155
Darin Petkovae0c64e2011-11-15 15:50:27 +0100156 void SetAccessTechnology(uint32 access_technology);
157
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100158 // Sets the upper level information about the home cellular provider from the
159 // modem's IMSI and SPN.
160 void SetHomeProvider();
161
Darin Petkovae0c64e2011-11-15 15:50:27 +0100162 // Updates the GSM operator name and country based on a newly obtained network
163 // id.
164 void UpdateOperatorInfo();
165
166 // Updates the serving operator on the active service.
167 void UpdateServingOperator();
168
Darin Petkov3cfbf212011-11-21 16:02:09 +0100169 // Initializes the |apn_list_| property based on the current |home_provider_|.
170 void InitAPNList();
171
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500172 Stringmap ParseScanResult(const GSMScanResult &result);
Darin Petkovb05315f2011-11-07 10:14:25 +0100173
Darin Petkov63138a92012-02-06 14:09:15 +0100174 KeyValueStore SimLockStatusToProperty(Error *error);
Darin Petkov721ac932011-11-16 15:43:09 +0100175
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400176 void SetupApnTryList();
177 void FillConnectPropertyMap(DBusPropertiesMap *properties);
178
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700179 void HelpRegisterConstDerivedKeyValueStore(
Darin Petkov721ac932011-11-16 15:43:09 +0100180 const std::string &name,
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700181 KeyValueStore(CellularCapabilityGSM::*get)(Error *error));
Darin Petkov721ac932011-11-16 15:43:09 +0100182
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400183 bool IsUnderlyingDeviceRegistered() const;
184
Eric Shienbrood9a245532012-03-07 14:20:39 -0500185 // Signal callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400186 void OnNetworkModeSignal(uint32 mode);
187 void OnRegistrationInfoSignal(uint32 status,
188 const std::string &operator_code,
189 const std::string &operator_name);
190 void OnSignalQualitySignal(uint32 quality);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500191
192 // Method callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400193 void OnGetRegistrationInfoReply(uint32 status,
194 const std::string &operator_code,
195 const std::string &operator_name,
196 const Error &error);
197 void OnGetSignalQualityReply(uint32 quality, const Error &error);
198 void OnRegisterReply(const ResultCallback &callback,
199 const Error &error);
200 void OnGetIMEIReply(const ResultCallback &callback,
201 const std::string &imei,
202 const Error &error);
203 void OnGetIMSIReply(const ResultCallback &callback,
204 const std::string &imsi,
205 const Error &error);
206 void OnGetSPNReply(const ResultCallback &callback,
207 const std::string &spn,
208 const Error &error);
209 void OnGetMSISDNReply(const ResultCallback &callback,
210 const std::string &msisdn,
211 const Error &error);
212 void OnScanReply(const ResultCallback &callback,
213 const GSMScanResults &results,
214 const Error &error);
Nathan Williamsb54974f2012-04-19 11:16:30 -0400215 void OnConnectReply(const ResultCallback &callback, const Error &error);
Darin Petkov184c54e2011-11-15 12:44:39 +0100216
Darin Petkovcb547732011-11-09 13:55:26 +0100217 scoped_ptr<ModemGSMCardProxyInterface> card_proxy_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100218 scoped_ptr<ModemGSMNetworkProxyInterface> network_proxy_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500219 base::WeakPtrFactory<CellularCapabilityGSM> weak_ptr_factory_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100220
Darin Petkov184c54e2011-11-15 12:44:39 +0100221 uint32 registration_state_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100222 uint32 access_technology_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100223 Cellular::Operator serving_operator_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100224 std::string spn_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100225 mobile_provider *home_provider_;
Darin Petkovf508c822012-09-21 13:43:17 +0200226 bool provider_requires_roaming_;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500227 std::string desired_network_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100228
Gary Morain82a31a02012-08-02 18:03:32 -0700229 // The number of times GetIMSI() has been retried.
230 int get_imsi_retries_;
231
232 // Amount of time to wait between retries of GetIMSI. Defaults to
233 // kGetIMSIRetryDelayMilliseconds, but can be altered by a unit test.
234 int64 get_imsi_retry_delay_milliseconds_;
235
Darin Petkov1272a432011-11-10 15:53:37 +0100236 // Properties.
Darin Petkov184c54e2011-11-15 12:44:39 +0100237 std::string selected_network_;
Darin Petkov1272a432011-11-10 15:53:37 +0100238 Stringmaps found_networks_;
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400239 std::deque<Stringmap> apn_try_list_;
Darin Petkov1272a432011-11-10 15:53:37 +0100240 bool scanning_;
241 uint16 scan_interval_;
Darin Petkov721ac932011-11-16 15:43:09 +0100242 SimLockStatus sim_lock_status_;
Ben Chanbd3aee82012-10-16 23:52:04 -0700243 bool sim_present_;
Darin Petkov3cfbf212011-11-21 16:02:09 +0100244 Stringmaps apn_list_;
Darin Petkov1272a432011-11-10 15:53:37 +0100245
Darin Petkovac635a82012-01-10 16:51:58 +0100246 static unsigned int friendly_service_name_id_;
247
Darin Petkovdaf43862011-10-27 11:37:28 +0200248 DISALLOW_COPY_AND_ASSIGN(CellularCapabilityGSM);
249};
250
251} // namespace shill
252
253#endif // SHILL_CELLULAR_CAPABILITY_GSM_