blob: 413a270c8d8d172b3bbd507c1c8e2feace9408c0 [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>
9
Darin Petkovcb547732011-11-09 13:55:26 +010010#include <base/memory/scoped_ptr.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -050011#include <base/memory/weak_ptr.h>
Darin Petkov1272a432011-11-10 15:53:37 +010012#include <gtest/gtest_prod.h> // for FRIEND_TEST
Darin Petkovb05315f2011-11-07 10:14:25 +010013
Darin Petkov1272a432011-11-10 15:53:37 +010014#include "shill/accessor_interface.h"
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010015#include "shill/cellular.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020016#include "shill/cellular_capability.h"
Darin Petkovcb547732011-11-09 13:55:26 +010017#include "shill/modem_gsm_card_proxy_interface.h"
Darin Petkov1272a432011-11-10 15:53:37 +010018#include "shill/modem_gsm_network_proxy_interface.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020019
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010020struct mobile_provider;
21
Darin Petkovdaf43862011-10-27 11:37:28 +020022namespace shill {
23
Eric Shienbrood9a245532012-03-07 14:20:39 -050024class CellularCapabilityGSM : public CellularCapability {
Darin Petkovdaf43862011-10-27 11:37:28 +020025 public:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050026 CellularCapabilityGSM(Cellular *cellular, ProxyFactory *proxy_factory);
Darin Petkovdaf43862011-10-27 11:37:28 +020027
Darin Petkovb05315f2011-11-07 10:14:25 +010028 // Inherited from CellularCapability.
Eric Shienbrood9a245532012-03-07 14:20:39 -050029 virtual void StartModem(Error *error, const ResultCallback &callback);
Darin Petkov5f316f62011-11-18 12:10:26 +010030 virtual void OnServiceCreated();
Darin Petkovae0c64e2011-11-15 15:50:27 +010031 virtual void UpdateStatus(const DBusPropertiesMap &properties);
32 virtual void SetupConnectProperties(DBusPropertiesMap *properties);
Eric Shienbrood9a245532012-03-07 14:20:39 -050033 // The following two methods never need to report results
34 // via callbacks, which is why they don't take callbacks
35 // as arguments.
Darin Petkov3e509242011-11-10 14:46:44 +010036 virtual void GetSignalQuality();
Eric Shienbrood9a245532012-03-07 14:20:39 -050037 virtual void GetRegistrationState();
38 // The following six methods are only ever called as
39 // callbacks (from the main loop), which is why they
40 // don't take an Error * argument.
41 virtual void GetProperties(const ResultCallback &callback);
42 virtual void GetIMEI(const ResultCallback &callback);
43 virtual void GetIMSI(const ResultCallback &callback);
44 virtual void GetSPN(const ResultCallback &callback);
45 virtual void GetMSISDN(const ResultCallback &callback);
46 virtual void Register(const ResultCallback &callback);
47
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050048 virtual void RegisterOnNetwork(const std::string &network_id,
Eric Shienbrood9a245532012-03-07 14:20:39 -050049 Error *error,
50 const ResultCallback &callback);
Darin Petkovb72cf402011-11-22 14:51:39 +010051 virtual bool IsRegistered();
Darin Petkovac635a82012-01-10 16:51:58 +010052 virtual std::string CreateFriendlyServiceName();
Eric Shienbrood9a245532012-03-07 14:20:39 -050053 virtual void RequirePIN(const std::string &pin, bool require,
54 Error *error, const ResultCallback &callback);
55 virtual void EnterPIN(const std::string &pin,
56 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +010057 virtual void UnblockPIN(const std::string &unblock_code,
58 const std::string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050059 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +010060 virtual void ChangePIN(const std::string &old_pin,
61 const std::string &new_pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050062 Error *error, const ResultCallback &callback);
63 virtual void Scan(Error *error, const ResultCallback &callback);
Darin Petkov20c13ec2011-11-09 15:07:15 +010064 virtual std::string GetNetworkTechnologyString() const;
65 virtual std::string GetRoamingStateString() const;
Eric Shienbrood0db6a9b2012-03-30 16:11:39 -040066 virtual std::string GetTypeString() const { return "GSM"; }
Darin Petkovae0c64e2011-11-15 15:50:27 +010067 virtual void OnModemManagerPropertiesChanged(
68 const DBusPropertiesMap &properties);
Darin Petkovdaf43862011-10-27 11:37:28 +020069
Eric Shienbrood9a245532012-03-07 14:20:39 -050070 protected:
71 virtual void InitProxies();
72 virtual void ReleaseProxies();
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040073 // Override OnConnectReply in order to handle the possibility of
74 // retrying the Connect operation.
75 virtual void OnConnectReply(const ResultCallback &callback,
76 const Error &error);
Eric Shienbrood9a245532012-03-07 14:20:39 -050077
Darin Petkovdaf43862011-10-27 11:37:28 +020078 private:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050079 friend class CellularTest;
Darin Petkovcb547732011-11-09 13:55:26 +010080 friend class CellularCapabilityGSMTest;
Eric Shienbrood9a245532012-03-07 14:20:39 -050081 friend class CellularCapabilityTest;
Darin Petkov63138a92012-02-06 14:09:15 +010082 FRIEND_TEST(CellularCapabilityGSMTest, CreateDeviceFromProperties);
Darin Petkovac635a82012-01-10 16:51:58 +010083 FRIEND_TEST(CellularCapabilityGSMTest, CreateFriendlyServiceName);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050084 FRIEND_TEST(CellularCapabilityGSMTest, GetIMEI);
85 FRIEND_TEST(CellularCapabilityGSMTest, GetIMSI);
86 FRIEND_TEST(CellularCapabilityGSMTest, GetMSISDN);
87 FRIEND_TEST(CellularCapabilityGSMTest, GetSPN);
88 FRIEND_TEST(CellularCapabilityGSMTest, RequirePIN);
89 FRIEND_TEST(CellularCapabilityGSMTest, EnterPIN);
90 FRIEND_TEST(CellularCapabilityGSMTest, UnblockPIN);
91 FRIEND_TEST(CellularCapabilityGSMTest, ChangePIN);
Darin Petkov3cfbf212011-11-21 16:02:09 +010092 FRIEND_TEST(CellularCapabilityGSMTest, InitAPNList);
Darin Petkov1272a432011-11-10 15:53:37 +010093 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResult);
94 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResultProviderLookup);
Darin Petkov184c54e2011-11-15 12:44:39 +010095 FRIEND_TEST(CellularCapabilityGSMTest, RegisterOnNetwork);
Darin Petkov1272a432011-11-10 15:53:37 +010096 FRIEND_TEST(CellularCapabilityGSMTest, Scan);
Darin Petkovae0c64e2011-11-15 15:50:27 +010097 FRIEND_TEST(CellularCapabilityGSMTest, SetAccessTechnology);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010098 FRIEND_TEST(CellularCapabilityGSMTest, SetHomeProvider);
Darin Petkovae0c64e2011-11-15 15:50:27 +010099 FRIEND_TEST(CellularCapabilityGSMTest, UpdateOperatorInfo);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500100 FRIEND_TEST(CellularCapabilityGSMTest, GetRegistrationState);
Darin Petkov63138a92012-02-06 14:09:15 +0100101 FRIEND_TEST(CellularCapabilityGSMTest, OnModemManagerPropertiesChanged);
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400102 FRIEND_TEST(CellularCapabilityGSMTest, SetupApnTryList);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500103 FRIEND_TEST(CellularCapabilityTest, AllowRoaming);
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400104 FRIEND_TEST(CellularCapabilityTest, TryApns);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500105 FRIEND_TEST(CellularTest, StartGSMRegister);
Darin Petkov63138a92012-02-06 14:09:15 +0100106 FRIEND_TEST(ModemTest, CreateDeviceFromProperties);
Darin Petkov1272a432011-11-10 15:53:37 +0100107
Darin Petkov721ac932011-11-16 15:43:09 +0100108 struct SimLockStatus {
109 public:
Darin Petkov63138a92012-02-06 14:09:15 +0100110 SimLockStatus() : enabled(false), retries_left(0) {}
Darin Petkov721ac932011-11-16 15:43:09 +0100111
Darin Petkov63138a92012-02-06 14:09:15 +0100112 bool enabled;
Darin Petkov721ac932011-11-16 15:43:09 +0100113 std::string lock_type;
114 uint32 retries_left;
115 };
116
Darin Petkov1272a432011-11-10 15:53:37 +0100117 static const char kNetworkPropertyAccessTechnology[];
118 static const char kNetworkPropertyID[];
119 static const char kNetworkPropertyLongName[];
120 static const char kNetworkPropertyShortName[];
121 static const char kNetworkPropertyStatus[];
Darin Petkovae0c64e2011-11-15 15:50:27 +0100122 static const char kPhoneNumber[];
123 static const char kPropertyAccessTechnology[];
Darin Petkov63138a92012-02-06 14:09:15 +0100124 static const char kPropertyEnabledFacilityLocks[];
125 static const char kPropertyUnlockRequired[];
126 static const char kPropertyUnlockRetries[];
127
Darin Petkovcb547732011-11-09 13:55:26 +0100128
Darin Petkovae0c64e2011-11-15 15:50:27 +0100129 void SetAccessTechnology(uint32 access_technology);
130
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100131 // Sets the upper level information about the home cellular provider from the
132 // modem's IMSI and SPN.
133 void SetHomeProvider();
134
Darin Petkovae0c64e2011-11-15 15:50:27 +0100135 // Updates the GSM operator name and country based on a newly obtained network
136 // id.
137 void UpdateOperatorInfo();
138
139 // Updates the serving operator on the active service.
140 void UpdateServingOperator();
141
Darin Petkov3cfbf212011-11-21 16:02:09 +0100142 // Initializes the |apn_list_| property based on the current |home_provider_|.
143 void InitAPNList();
144
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500145 Stringmap ParseScanResult(const GSMScanResult &result);
Darin Petkovb05315f2011-11-07 10:14:25 +0100146
Darin Petkov63138a92012-02-06 14:09:15 +0100147 KeyValueStore SimLockStatusToProperty(Error *error);
Darin Petkov721ac932011-11-16 15:43:09 +0100148
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400149 void SetupApnTryList();
150 void FillConnectPropertyMap(DBusPropertiesMap *properties);
151
Darin Petkov63138a92012-02-06 14:09:15 +0100152 void HelpRegisterDerivedKeyValueStore(
Darin Petkov721ac932011-11-16 15:43:09 +0100153 const std::string &name,
Darin Petkov63138a92012-02-06 14:09:15 +0100154 KeyValueStore(CellularCapabilityGSM::*get)(Error *error),
155 void(CellularCapabilityGSM::*set)(
156 const KeyValueStore &value, Error *error));
Darin Petkov721ac932011-11-16 15:43:09 +0100157
Eric Shienbrood9a245532012-03-07 14:20:39 -0500158 // Signal callbacks
159 virtual void OnNetworkModeSignal(uint32 mode);
160 virtual void OnRegistrationInfoSignal(uint32 status,
161 const std::string &operator_code,
162 const std::string &operator_name);
163 virtual void OnSignalQualitySignal(uint32 quality);
164
165 // Method callbacks
166 virtual void OnGetRegistrationInfoReply(uint32 status,
167 const std::string &operator_code,
168 const std::string &operator_name,
169 const Error &error);
170 virtual void OnGetSignalQualityReply(uint32 quality, const Error &error);
171 virtual void OnRegisterReply(const ResultCallback &callback,
172 const Error &error);
173 virtual void OnGetIMEIReply(const ResultCallback &callback,
174 const std::string &imei,
175 const Error &error);
176 virtual void OnGetIMSIReply(const ResultCallback &callback,
177 const std::string &imsi,
178 const Error &error);
179 virtual void OnGetSPNReply(const ResultCallback &callback,
180 const std::string &spn,
181 const Error &error);
182 virtual void OnGetMSISDNReply(const ResultCallback &callback,
183 const std::string &msisdn,
184 const Error &error);
185 virtual void OnScanReply(const ResultCallback &callback,
186 const GSMScanResults &results,
187 const Error &error);
Darin Petkov184c54e2011-11-15 12:44:39 +0100188
Darin Petkovcb547732011-11-09 13:55:26 +0100189 scoped_ptr<ModemGSMCardProxyInterface> card_proxy_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100190 scoped_ptr<ModemGSMNetworkProxyInterface> network_proxy_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500191 base::WeakPtrFactory<CellularCapabilityGSM> weak_ptr_factory_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100192
Darin Petkov184c54e2011-11-15 12:44:39 +0100193 uint32 registration_state_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100194 uint32 access_technology_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100195 Cellular::Operator serving_operator_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100196 std::string spn_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100197 mobile_provider *home_provider_;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500198 std::string desired_network_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100199
Darin Petkov1272a432011-11-10 15:53:37 +0100200 // Properties.
Darin Petkov184c54e2011-11-15 12:44:39 +0100201 std::string selected_network_;
Darin Petkov1272a432011-11-10 15:53:37 +0100202 Stringmaps found_networks_;
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400203 std::deque<Stringmap> apn_try_list_;
Darin Petkov1272a432011-11-10 15:53:37 +0100204 bool scanning_;
205 uint16 scan_interval_;
Darin Petkov721ac932011-11-16 15:43:09 +0100206 SimLockStatus sim_lock_status_;
Darin Petkov3cfbf212011-11-21 16:02:09 +0100207 Stringmaps apn_list_;
Darin Petkov1272a432011-11-10 15:53:37 +0100208
Darin Petkovac635a82012-01-10 16:51:58 +0100209 static unsigned int friendly_service_name_id_;
210
Darin Petkovdaf43862011-10-27 11:37:28 +0200211 DISALLOW_COPY_AND_ASSIGN(CellularCapabilityGSM);
212};
213
214} // namespace shill
215
216#endif // SHILL_CELLULAR_CAPABILITY_GSM_