blob: bacc87424c3550bcb4877e408dc05664608b8bd9 [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>
Darin Petkov1272a432011-11-10 15:53:37 +010014#include <gtest/gtest_prod.h> // for FRIEND_TEST
Darin Petkovb05315f2011-11-07 10:14:25 +010015
Darin Petkov1272a432011-11-10 15:53:37 +010016#include "shill/accessor_interface.h"
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010017#include "shill/cellular.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020018#include "shill/cellular_capability.h"
Jason Glasgow82f9ab32012-04-04 14:27:19 -040019#include "shill/cellular_capability_classic.h"
Darin Petkovcb547732011-11-09 13:55:26 +010020#include "shill/modem_gsm_card_proxy_interface.h"
Darin Petkov1272a432011-11-10 15:53:37 +010021#include "shill/modem_gsm_network_proxy_interface.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020022
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010023struct mobile_provider;
24
Darin Petkovdaf43862011-10-27 11:37:28 +020025namespace shill {
26
Jason Glasgow82f9ab32012-04-04 14:27:19 -040027class CellularCapabilityGSM : public CellularCapabilityClassic {
Darin Petkovdaf43862011-10-27 11:37:28 +020028 public:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050029 CellularCapabilityGSM(Cellular *cellular, ProxyFactory *proxy_factory);
Darin Petkovdaf43862011-10-27 11:37:28 +020030
Darin Petkovb05315f2011-11-07 10:14:25 +010031 // Inherited from CellularCapability.
Eric Shienbrood9a245532012-03-07 14:20:39 -050032 virtual void StartModem(Error *error, const ResultCallback &callback);
Darin Petkov5f316f62011-11-18 12:10:26 +010033 virtual void OnServiceCreated();
Darin Petkovae0c64e2011-11-15 15:50:27 +010034 virtual void SetupConnectProperties(DBusPropertiesMap *properties);
Nathan Williamsb54974f2012-04-19 11:16:30 -040035 virtual void Connect(const DBusPropertiesMap &properties, Error *error,
36 const ResultCallback &callback);
Eric Shienbrood9a245532012-03-07 14:20:39 -050037 // The following two methods never need to report results
38 // via callbacks, which is why they don't take callbacks
39 // as arguments.
Darin Petkov3e509242011-11-10 14:46:44 +010040 virtual void GetSignalQuality();
Eric Shienbrood9a245532012-03-07 14:20:39 -050041 virtual void GetRegistrationState();
42 // The following six methods are only ever called as
43 // callbacks (from the main loop), which is why they
44 // don't take an Error * argument.
45 virtual void GetProperties(const ResultCallback &callback);
46 virtual void GetIMEI(const ResultCallback &callback);
47 virtual void GetIMSI(const ResultCallback &callback);
48 virtual void GetSPN(const ResultCallback &callback);
49 virtual void GetMSISDN(const ResultCallback &callback);
50 virtual void Register(const ResultCallback &callback);
51
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050052 virtual void RegisterOnNetwork(const std::string &network_id,
Eric Shienbrood9a245532012-03-07 14:20:39 -050053 Error *error,
54 const ResultCallback &callback);
Darin Petkovb72cf402011-11-22 14:51:39 +010055 virtual bool IsRegistered();
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040056 virtual void SetUnregistered(bool searching);
Darin Petkovac635a82012-01-10 16:51:58 +010057 virtual std::string CreateFriendlyServiceName();
Eric Shienbrood9a245532012-03-07 14:20:39 -050058 virtual void RequirePIN(const std::string &pin, bool require,
59 Error *error, const ResultCallback &callback);
60 virtual void EnterPIN(const std::string &pin,
61 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +010062 virtual void UnblockPIN(const std::string &unblock_code,
63 const std::string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050064 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +010065 virtual void ChangePIN(const std::string &old_pin,
66 const std::string &new_pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050067 Error *error, const ResultCallback &callback);
68 virtual void Scan(Error *error, const ResultCallback &callback);
Darin Petkov20c13ec2011-11-09 15:07:15 +010069 virtual std::string GetNetworkTechnologyString() const;
70 virtual std::string GetRoamingStateString() const;
Eric Shienbrood0db6a9b2012-03-30 16:11:39 -040071 virtual std::string GetTypeString() const { return "GSM"; }
Jason Glasgow4c0724a2012-04-17 15:47:40 -040072 virtual void OnDBusPropertiesChanged(
73 const std::string &interface,
74 const DBusPropertiesMap &properties,
75 const std::vector<std::string> &invalidated_properties);
76 virtual bool AllowRoaming();
Darin Petkovdaf43862011-10-27 11:37:28 +020077
Eric Shienbrood9a245532012-03-07 14:20:39 -050078 protected:
79 virtual void InitProxies();
80 virtual void ReleaseProxies();
Jason Glasgow4380f0d2012-05-03 18:05:04 -040081 virtual void UpdateStatus(const DBusPropertiesMap &properties);
Eric Shienbrood9a245532012-03-07 14:20:39 -050082
Darin Petkovdaf43862011-10-27 11:37:28 +020083 private:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050084 friend class CellularTest;
Darin Petkovcb547732011-11-09 13:55:26 +010085 friend class CellularCapabilityGSMTest;
Eric Shienbrood9a245532012-03-07 14:20:39 -050086 friend class CellularCapabilityTest;
Darin Petkov63138a92012-02-06 14:09:15 +010087 FRIEND_TEST(CellularCapabilityGSMTest, CreateDeviceFromProperties);
Darin Petkovac635a82012-01-10 16:51:58 +010088 FRIEND_TEST(CellularCapabilityGSMTest, CreateFriendlyServiceName);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050089 FRIEND_TEST(CellularCapabilityGSMTest, GetIMEI);
90 FRIEND_TEST(CellularCapabilityGSMTest, GetIMSI);
91 FRIEND_TEST(CellularCapabilityGSMTest, GetMSISDN);
92 FRIEND_TEST(CellularCapabilityGSMTest, GetSPN);
93 FRIEND_TEST(CellularCapabilityGSMTest, RequirePIN);
94 FRIEND_TEST(CellularCapabilityGSMTest, EnterPIN);
95 FRIEND_TEST(CellularCapabilityGSMTest, UnblockPIN);
96 FRIEND_TEST(CellularCapabilityGSMTest, ChangePIN);
Darin Petkov3cfbf212011-11-21 16:02:09 +010097 FRIEND_TEST(CellularCapabilityGSMTest, InitAPNList);
Darin Petkov1272a432011-11-10 15:53:37 +010098 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResult);
99 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResultProviderLookup);
Darin Petkov184c54e2011-11-15 12:44:39 +0100100 FRIEND_TEST(CellularCapabilityGSMTest, RegisterOnNetwork);
Darin Petkov1272a432011-11-10 15:53:37 +0100101 FRIEND_TEST(CellularCapabilityGSMTest, Scan);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100102 FRIEND_TEST(CellularCapabilityGSMTest, SetAccessTechnology);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400103 FRIEND_TEST(CellularCapabilityGSMTest, UpdateStatus);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100104 FRIEND_TEST(CellularCapabilityGSMTest, SetHomeProvider);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100105 FRIEND_TEST(CellularCapabilityGSMTest, UpdateOperatorInfo);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500106 FRIEND_TEST(CellularCapabilityGSMTest, GetRegistrationState);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400107 FRIEND_TEST(CellularCapabilityGSMTest, OnDBusPropertiesChanged);
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400108 FRIEND_TEST(CellularCapabilityGSMTest, SetupApnTryList);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500109 FRIEND_TEST(CellularCapabilityTest, AllowRoaming);
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400110 FRIEND_TEST(CellularCapabilityTest, TryApns);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500111 FRIEND_TEST(CellularTest, StartGSMRegister);
Darin Petkov63138a92012-02-06 14:09:15 +0100112 FRIEND_TEST(ModemTest, CreateDeviceFromProperties);
Darin Petkov1272a432011-11-10 15:53:37 +0100113
Darin Petkov721ac932011-11-16 15:43:09 +0100114 struct SimLockStatus {
115 public:
Darin Petkov63138a92012-02-06 14:09:15 +0100116 SimLockStatus() : enabled(false), retries_left(0) {}
Darin Petkov721ac932011-11-16 15:43:09 +0100117
Darin Petkov63138a92012-02-06 14:09:15 +0100118 bool enabled;
Darin Petkov721ac932011-11-16 15:43:09 +0100119 std::string lock_type;
120 uint32 retries_left;
121 };
122
Darin Petkov1272a432011-11-10 15:53:37 +0100123 static const char kNetworkPropertyAccessTechnology[];
124 static const char kNetworkPropertyID[];
125 static const char kNetworkPropertyLongName[];
126 static const char kNetworkPropertyShortName[];
127 static const char kNetworkPropertyStatus[];
Darin Petkovae0c64e2011-11-15 15:50:27 +0100128 static const char kPhoneNumber[];
129 static const char kPropertyAccessTechnology[];
Darin Petkov63138a92012-02-06 14:09:15 +0100130 static const char kPropertyEnabledFacilityLocks[];
131 static const char kPropertyUnlockRequired[];
132 static const char kPropertyUnlockRetries[];
133
Darin Petkovcb547732011-11-09 13:55:26 +0100134
Darin Petkovae0c64e2011-11-15 15:50:27 +0100135 void SetAccessTechnology(uint32 access_technology);
136
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100137 // Sets the upper level information about the home cellular provider from the
138 // modem's IMSI and SPN.
139 void SetHomeProvider();
140
Darin Petkovae0c64e2011-11-15 15:50:27 +0100141 // Updates the GSM operator name and country based on a newly obtained network
142 // id.
143 void UpdateOperatorInfo();
144
145 // Updates the serving operator on the active service.
146 void UpdateServingOperator();
147
Darin Petkov3cfbf212011-11-21 16:02:09 +0100148 // Initializes the |apn_list_| property based on the current |home_provider_|.
149 void InitAPNList();
150
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500151 Stringmap ParseScanResult(const GSMScanResult &result);
Darin Petkovb05315f2011-11-07 10:14:25 +0100152
Darin Petkov63138a92012-02-06 14:09:15 +0100153 KeyValueStore SimLockStatusToProperty(Error *error);
Darin Petkov721ac932011-11-16 15:43:09 +0100154
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400155 void SetupApnTryList();
156 void FillConnectPropertyMap(DBusPropertiesMap *properties);
157
Darin Petkov63138a92012-02-06 14:09:15 +0100158 void HelpRegisterDerivedKeyValueStore(
Darin Petkov721ac932011-11-16 15:43:09 +0100159 const std::string &name,
Darin Petkov63138a92012-02-06 14:09:15 +0100160 KeyValueStore(CellularCapabilityGSM::*get)(Error *error),
161 void(CellularCapabilityGSM::*set)(
162 const KeyValueStore &value, Error *error));
Darin Petkov721ac932011-11-16 15:43:09 +0100163
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400164 bool IsUnderlyingDeviceRegistered() const;
165
Eric Shienbrood9a245532012-03-07 14:20:39 -0500166 // Signal callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400167 void OnNetworkModeSignal(uint32 mode);
168 void OnRegistrationInfoSignal(uint32 status,
169 const std::string &operator_code,
170 const std::string &operator_name);
171 void OnSignalQualitySignal(uint32 quality);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500172
173 // Method callbacks
Nathan Williams3022be52012-04-19 17:40:49 -0400174 void OnGetRegistrationInfoReply(uint32 status,
175 const std::string &operator_code,
176 const std::string &operator_name,
177 const Error &error);
178 void OnGetSignalQualityReply(uint32 quality, const Error &error);
179 void OnRegisterReply(const ResultCallback &callback,
180 const Error &error);
181 void OnGetIMEIReply(const ResultCallback &callback,
182 const std::string &imei,
183 const Error &error);
184 void OnGetIMSIReply(const ResultCallback &callback,
185 const std::string &imsi,
186 const Error &error);
187 void OnGetSPNReply(const ResultCallback &callback,
188 const std::string &spn,
189 const Error &error);
190 void OnGetMSISDNReply(const ResultCallback &callback,
191 const std::string &msisdn,
192 const Error &error);
193 void OnScanReply(const ResultCallback &callback,
194 const GSMScanResults &results,
195 const Error &error);
Nathan Williamsb54974f2012-04-19 11:16:30 -0400196 void OnConnectReply(const ResultCallback &callback, const Error &error);
Darin Petkov184c54e2011-11-15 12:44:39 +0100197
Darin Petkovcb547732011-11-09 13:55:26 +0100198 scoped_ptr<ModemGSMCardProxyInterface> card_proxy_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100199 scoped_ptr<ModemGSMNetworkProxyInterface> network_proxy_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500200 base::WeakPtrFactory<CellularCapabilityGSM> weak_ptr_factory_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100201
Darin Petkov184c54e2011-11-15 12:44:39 +0100202 uint32 registration_state_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100203 uint32 access_technology_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100204 Cellular::Operator serving_operator_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100205 std::string spn_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100206 mobile_provider *home_provider_;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500207 std::string desired_network_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100208
Darin Petkov1272a432011-11-10 15:53:37 +0100209 // Properties.
Darin Petkov184c54e2011-11-15 12:44:39 +0100210 std::string selected_network_;
Darin Petkov1272a432011-11-10 15:53:37 +0100211 Stringmaps found_networks_;
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400212 std::deque<Stringmap> apn_try_list_;
Darin Petkov1272a432011-11-10 15:53:37 +0100213 bool scanning_;
214 uint16 scan_interval_;
Darin Petkov721ac932011-11-16 15:43:09 +0100215 SimLockStatus sim_lock_status_;
Darin Petkov3cfbf212011-11-21 16:02:09 +0100216 Stringmaps apn_list_;
Darin Petkov1272a432011-11-10 15:53:37 +0100217
Darin Petkovac635a82012-01-10 16:51:58 +0100218 static unsigned int friendly_service_name_id_;
219
Darin Petkovdaf43862011-10-27 11:37:28 +0200220 DISALLOW_COPY_AND_ASSIGN(CellularCapabilityGSM);
221};
222
223} // namespace shill
224
225#endif // SHILL_CELLULAR_CAPABILITY_GSM_