blob: 916506b39a4b37500e9784389a06454c29a7a1ce [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
Darin Petkovcb547732011-11-09 13:55:26 +01008#include <base/memory/scoped_ptr.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -05009#include <base/memory/weak_ptr.h>
Darin Petkov1272a432011-11-10 15:53:37 +010010#include <gtest/gtest_prod.h> // for FRIEND_TEST
Darin Petkovb05315f2011-11-07 10:14:25 +010011
Darin Petkov1272a432011-11-10 15:53:37 +010012#include "shill/accessor_interface.h"
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010013#include "shill/cellular.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020014#include "shill/cellular_capability.h"
Darin Petkovcb547732011-11-09 13:55:26 +010015#include "shill/modem_gsm_card_proxy_interface.h"
Darin Petkov1272a432011-11-10 15:53:37 +010016#include "shill/modem_gsm_network_proxy_interface.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020017
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010018struct mobile_provider;
19
Darin Petkovdaf43862011-10-27 11:37:28 +020020namespace shill {
21
Eric Shienbrood9a245532012-03-07 14:20:39 -050022class CellularCapabilityGSM : public CellularCapability {
Darin Petkovdaf43862011-10-27 11:37:28 +020023 public:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050024 CellularCapabilityGSM(Cellular *cellular, ProxyFactory *proxy_factory);
Darin Petkovdaf43862011-10-27 11:37:28 +020025
Darin Petkovb05315f2011-11-07 10:14:25 +010026 // Inherited from CellularCapability.
Eric Shienbrood9a245532012-03-07 14:20:39 -050027 virtual void StartModem(Error *error, const ResultCallback &callback);
28 virtual void StopModem(Error *error, const ResultCallback &callback);
Darin Petkov5f316f62011-11-18 12:10:26 +010029 virtual void OnServiceCreated();
Darin Petkovae0c64e2011-11-15 15:50:27 +010030 virtual void UpdateStatus(const DBusPropertiesMap &properties);
31 virtual void SetupConnectProperties(DBusPropertiesMap *properties);
Eric Shienbrood9a245532012-03-07 14:20:39 -050032 // The following two methods never need to report results
33 // via callbacks, which is why they don't take callbacks
34 // as arguments.
Darin Petkov3e509242011-11-10 14:46:44 +010035 virtual void GetSignalQuality();
Eric Shienbrood9a245532012-03-07 14:20:39 -050036 virtual void GetRegistrationState();
37 // The following six methods are only ever called as
38 // callbacks (from the main loop), which is why they
39 // don't take an Error * argument.
40 virtual void GetProperties(const ResultCallback &callback);
41 virtual void GetIMEI(const ResultCallback &callback);
42 virtual void GetIMSI(const ResultCallback &callback);
43 virtual void GetSPN(const ResultCallback &callback);
44 virtual void GetMSISDN(const ResultCallback &callback);
45 virtual void Register(const ResultCallback &callback);
46
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050047 virtual void RegisterOnNetwork(const std::string &network_id,
Eric Shienbrood9a245532012-03-07 14:20:39 -050048 Error *error,
49 const ResultCallback &callback);
Darin Petkovb72cf402011-11-22 14:51:39 +010050 virtual bool IsRegistered();
Darin Petkovac635a82012-01-10 16:51:58 +010051 virtual std::string CreateFriendlyServiceName();
Eric Shienbrood9a245532012-03-07 14:20:39 -050052 virtual void RequirePIN(const std::string &pin, bool require,
53 Error *error, const ResultCallback &callback);
54 virtual void EnterPIN(const std::string &pin,
55 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +010056 virtual void UnblockPIN(const std::string &unblock_code,
57 const std::string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050058 Error *error, const ResultCallback &callback);
Darin Petkovb05315f2011-11-07 10:14:25 +010059 virtual void ChangePIN(const std::string &old_pin,
60 const std::string &new_pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050061 Error *error, const ResultCallback &callback);
62 virtual void Scan(Error *error, const ResultCallback &callback);
Darin Petkov20c13ec2011-11-09 15:07:15 +010063 virtual std::string GetNetworkTechnologyString() const;
64 virtual std::string GetRoamingStateString() const;
Darin Petkovae0c64e2011-11-15 15:50:27 +010065 virtual void OnModemManagerPropertiesChanged(
66 const DBusPropertiesMap &properties);
Darin Petkovdaf43862011-10-27 11:37:28 +020067
Eric Shienbrood9a245532012-03-07 14:20:39 -050068 protected:
69 virtual void InitProxies();
70 virtual void ReleaseProxies();
71
Darin Petkovdaf43862011-10-27 11:37:28 +020072 private:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050073 friend class CellularTest;
Darin Petkovcb547732011-11-09 13:55:26 +010074 friend class CellularCapabilityGSMTest;
Eric Shienbrood9a245532012-03-07 14:20:39 -050075 friend class CellularCapabilityTest;
Darin Petkov63138a92012-02-06 14:09:15 +010076 FRIEND_TEST(CellularCapabilityGSMTest, CreateDeviceFromProperties);
Darin Petkovac635a82012-01-10 16:51:58 +010077 FRIEND_TEST(CellularCapabilityGSMTest, CreateFriendlyServiceName);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050078 FRIEND_TEST(CellularCapabilityGSMTest, GetIMEI);
79 FRIEND_TEST(CellularCapabilityGSMTest, GetIMSI);
80 FRIEND_TEST(CellularCapabilityGSMTest, GetMSISDN);
81 FRIEND_TEST(CellularCapabilityGSMTest, GetSPN);
82 FRIEND_TEST(CellularCapabilityGSMTest, RequirePIN);
83 FRIEND_TEST(CellularCapabilityGSMTest, EnterPIN);
84 FRIEND_TEST(CellularCapabilityGSMTest, UnblockPIN);
85 FRIEND_TEST(CellularCapabilityGSMTest, ChangePIN);
Darin Petkov3cfbf212011-11-21 16:02:09 +010086 FRIEND_TEST(CellularCapabilityGSMTest, InitAPNList);
Darin Petkov1272a432011-11-10 15:53:37 +010087 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResult);
88 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResultProviderLookup);
Darin Petkov184c54e2011-11-15 12:44:39 +010089 FRIEND_TEST(CellularCapabilityGSMTest, RegisterOnNetwork);
Darin Petkov1272a432011-11-10 15:53:37 +010090 FRIEND_TEST(CellularCapabilityGSMTest, Scan);
Darin Petkovae0c64e2011-11-15 15:50:27 +010091 FRIEND_TEST(CellularCapabilityGSMTest, SetAccessTechnology);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010092 FRIEND_TEST(CellularCapabilityGSMTest, SetHomeProvider);
Darin Petkovae0c64e2011-11-15 15:50:27 +010093 FRIEND_TEST(CellularCapabilityGSMTest, UpdateOperatorInfo);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050094 FRIEND_TEST(CellularCapabilityGSMTest, GetRegistrationState);
Darin Petkov63138a92012-02-06 14:09:15 +010095 FRIEND_TEST(CellularCapabilityGSMTest, OnModemManagerPropertiesChanged);
Eric Shienbrood9a245532012-03-07 14:20:39 -050096 FRIEND_TEST(CellularCapabilityTest, AllowRoaming);
97 FRIEND_TEST(CellularTest, StartGSMRegister);
Darin Petkov63138a92012-02-06 14:09:15 +010098 FRIEND_TEST(ModemTest, CreateDeviceFromProperties);
Darin Petkov1272a432011-11-10 15:53:37 +010099
Darin Petkov721ac932011-11-16 15:43:09 +0100100 struct SimLockStatus {
101 public:
Darin Petkov63138a92012-02-06 14:09:15 +0100102 SimLockStatus() : enabled(false), retries_left(0) {}
Darin Petkov721ac932011-11-16 15:43:09 +0100103
Darin Petkov63138a92012-02-06 14:09:15 +0100104 bool enabled;
Darin Petkov721ac932011-11-16 15:43:09 +0100105 std::string lock_type;
106 uint32 retries_left;
107 };
108
Darin Petkov1272a432011-11-10 15:53:37 +0100109 static const char kNetworkPropertyAccessTechnology[];
110 static const char kNetworkPropertyID[];
111 static const char kNetworkPropertyLongName[];
112 static const char kNetworkPropertyShortName[];
113 static const char kNetworkPropertyStatus[];
Darin Petkovae0c64e2011-11-15 15:50:27 +0100114 static const char kPhoneNumber[];
115 static const char kPropertyAccessTechnology[];
Darin Petkov63138a92012-02-06 14:09:15 +0100116 static const char kPropertyEnabledFacilityLocks[];
117 static const char kPropertyUnlockRequired[];
118 static const char kPropertyUnlockRetries[];
119
Darin Petkovcb547732011-11-09 13:55:26 +0100120
Darin Petkovae0c64e2011-11-15 15:50:27 +0100121 void SetAccessTechnology(uint32 access_technology);
122
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100123 // Sets the upper level information about the home cellular provider from the
124 // modem's IMSI and SPN.
125 void SetHomeProvider();
126
Darin Petkovae0c64e2011-11-15 15:50:27 +0100127 // Updates the GSM operator name and country based on a newly obtained network
128 // id.
129 void UpdateOperatorInfo();
130
131 // Updates the serving operator on the active service.
132 void UpdateServingOperator();
133
Darin Petkov3cfbf212011-11-21 16:02:09 +0100134 // Initializes the |apn_list_| property based on the current |home_provider_|.
135 void InitAPNList();
136
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500137 Stringmap ParseScanResult(const GSMScanResult &result);
Darin Petkovb05315f2011-11-07 10:14:25 +0100138
Darin Petkov63138a92012-02-06 14:09:15 +0100139 KeyValueStore SimLockStatusToProperty(Error *error);
Darin Petkov721ac932011-11-16 15:43:09 +0100140
Darin Petkov63138a92012-02-06 14:09:15 +0100141 void HelpRegisterDerivedKeyValueStore(
Darin Petkov721ac932011-11-16 15:43:09 +0100142 const std::string &name,
Darin Petkov63138a92012-02-06 14:09:15 +0100143 KeyValueStore(CellularCapabilityGSM::*get)(Error *error),
144 void(CellularCapabilityGSM::*set)(
145 const KeyValueStore &value, Error *error));
Darin Petkov721ac932011-11-16 15:43:09 +0100146
Eric Shienbrood9a245532012-03-07 14:20:39 -0500147 // Signal callbacks
148 virtual void OnNetworkModeSignal(uint32 mode);
149 virtual void OnRegistrationInfoSignal(uint32 status,
150 const std::string &operator_code,
151 const std::string &operator_name);
152 virtual void OnSignalQualitySignal(uint32 quality);
153
154 // Method callbacks
155 virtual void OnGetRegistrationInfoReply(uint32 status,
156 const std::string &operator_code,
157 const std::string &operator_name,
158 const Error &error);
159 virtual void OnGetSignalQualityReply(uint32 quality, const Error &error);
160 virtual void OnRegisterReply(const ResultCallback &callback,
161 const Error &error);
162 virtual void OnGetIMEIReply(const ResultCallback &callback,
163 const std::string &imei,
164 const Error &error);
165 virtual void OnGetIMSIReply(const ResultCallback &callback,
166 const std::string &imsi,
167 const Error &error);
168 virtual void OnGetSPNReply(const ResultCallback &callback,
169 const std::string &spn,
170 const Error &error);
171 virtual void OnGetMSISDNReply(const ResultCallback &callback,
172 const std::string &msisdn,
173 const Error &error);
174 virtual void OnScanReply(const ResultCallback &callback,
175 const GSMScanResults &results,
176 const Error &error);
Darin Petkov184c54e2011-11-15 12:44:39 +0100177
Darin Petkovcb547732011-11-09 13:55:26 +0100178 scoped_ptr<ModemGSMCardProxyInterface> card_proxy_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100179 scoped_ptr<ModemGSMNetworkProxyInterface> network_proxy_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500180 base::WeakPtrFactory<CellularCapabilityGSM> weak_ptr_factory_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100181
Darin Petkov184c54e2011-11-15 12:44:39 +0100182 uint32 registration_state_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100183 uint32 access_technology_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100184 Cellular::Operator serving_operator_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100185 std::string spn_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100186 mobile_provider *home_provider_;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500187 std::string desired_network_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100188
Darin Petkov1272a432011-11-10 15:53:37 +0100189 // Properties.
Darin Petkov184c54e2011-11-15 12:44:39 +0100190 std::string selected_network_;
Darin Petkov1272a432011-11-10 15:53:37 +0100191 Stringmaps found_networks_;
192 bool scanning_;
193 uint16 scan_interval_;
Darin Petkov721ac932011-11-16 15:43:09 +0100194 SimLockStatus sim_lock_status_;
Darin Petkov3cfbf212011-11-21 16:02:09 +0100195 Stringmaps apn_list_;
Darin Petkov1272a432011-11-10 15:53:37 +0100196
Darin Petkovac635a82012-01-10 16:51:58 +0100197 static unsigned int friendly_service_name_id_;
198
Darin Petkovdaf43862011-10-27 11:37:28 +0200199 DISALLOW_COPY_AND_ASSIGN(CellularCapabilityGSM);
200};
201
202} // namespace shill
203
204#endif // SHILL_CELLULAR_CAPABILITY_GSM_