blob: fe1001e2f6d8d3671e8e74b9d0dee73b7020cd01 [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>
Darin Petkovb05315f2011-11-07 10:14:25 +01009#include <base/task.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
Darin Petkovcb547732011-11-09 13:55:26 +010022class CellularCapabilityGSM : public CellularCapability,
Darin Petkov184c54e2011-11-15 12:44:39 +010023 public ModemGSMCardProxyDelegate,
24 public ModemGSMNetworkProxyDelegate {
Darin Petkovdaf43862011-10-27 11:37:28 +020025 public:
Darin Petkov721ac932011-11-16 15:43:09 +010026 static const char kPropertyUnlockRequired[];
27 static const char kPropertyUnlockRetries[];
28
Darin Petkovdaf43862011-10-27 11:37:28 +020029 CellularCapabilityGSM(Cellular *cellular);
30
Darin Petkovb05315f2011-11-07 10:14:25 +010031 // Inherited from CellularCapability.
Darin Petkov5f316f62011-11-18 12:10:26 +010032 virtual void OnDeviceStarted();
33 virtual void OnDeviceStopped();
34 virtual void OnServiceCreated();
Darin Petkovae0c64e2011-11-15 15:50:27 +010035 virtual void UpdateStatus(const DBusPropertiesMap &properties);
36 virtual void SetupConnectProperties(DBusPropertiesMap *properties);
Darin Petkov3e509242011-11-10 14:46:44 +010037 virtual void GetSignalQuality();
Darin Petkov184c54e2011-11-15 12:44:39 +010038 virtual void GetRegistrationState();
39 virtual void GetProperties();
40 virtual void Register();
41 virtual void RegisterOnNetwork(const std::string &network_id, Error *error);
Darin Petkovb72cf402011-11-22 14:51:39 +010042 virtual bool IsRegistered();
Darin Petkovac635a82012-01-10 16:51:58 +010043 virtual std::string CreateFriendlyServiceName();
Darin Petkovc64fe5e2012-01-11 12:46:13 +010044 virtual void RequirePIN(
45 const std::string &pin, bool require, ReturnerInterface *returner);
Darin Petkove5bc2cb2011-12-07 14:47:32 +010046 virtual void EnterPIN(const std::string &pin, ReturnerInterface *returner);
Darin Petkovb05315f2011-11-07 10:14:25 +010047 virtual void UnblockPIN(const std::string &unblock_code,
48 const std::string &pin,
Darin Petkovc64fe5e2012-01-11 12:46:13 +010049 ReturnerInterface *returner);
Darin Petkovb05315f2011-11-07 10:14:25 +010050 virtual void ChangePIN(const std::string &old_pin,
51 const std::string &new_pin,
Darin Petkovc64fe5e2012-01-11 12:46:13 +010052 ReturnerInterface *returner);
Darin Petkov1272a432011-11-10 15:53:37 +010053 virtual void Scan(Error *error);
Darin Petkov20c13ec2011-11-09 15:07:15 +010054 virtual std::string GetNetworkTechnologyString() const;
55 virtual std::string GetRoamingStateString() const;
Darin Petkovae0c64e2011-11-15 15:50:27 +010056 virtual void OnModemManagerPropertiesChanged(
57 const DBusPropertiesMap &properties);
Darin Petkovdaf43862011-10-27 11:37:28 +020058
Darin Petkovcb547732011-11-09 13:55:26 +010059 // Obtains the IMEI, IMSI, SPN and MSISDN.
60 virtual void GetIdentifiers();
61
Darin Petkovae0c64e2011-11-15 15:50:27 +010062 const std::string &spn() const { return spn_; }
Darin Petkov721ac932011-11-16 15:43:09 +010063 const std::string &sim_lock_type() const {
64 return sim_lock_status_.lock_type;
65 }
66 uint32 sim_lock_retries_left() const { return sim_lock_status_.retries_left; }
Darin Petkovae0c64e2011-11-15 15:50:27 +010067
Darin Petkovdaf43862011-10-27 11:37:28 +020068 private:
Darin Petkovcb547732011-11-09 13:55:26 +010069 friend class CellularCapabilityGSMTest;
Darin Petkovac635a82012-01-10 16:51:58 +010070 FRIEND_TEST(CellularCapabilityGSMTest, CreateFriendlyServiceName);
Darin Petkov3cfbf212011-11-21 16:02:09 +010071 FRIEND_TEST(CellularCapabilityGSMTest, InitAPNList);
Darin Petkov1272a432011-11-10 15:53:37 +010072 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResult);
73 FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResultProviderLookup);
Darin Petkov184c54e2011-11-15 12:44:39 +010074 FRIEND_TEST(CellularCapabilityGSMTest, RegisterOnNetwork);
Darin Petkov1272a432011-11-10 15:53:37 +010075 FRIEND_TEST(CellularCapabilityGSMTest, Scan);
Darin Petkovae0c64e2011-11-15 15:50:27 +010076 FRIEND_TEST(CellularCapabilityGSMTest, SetAccessTechnology);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +010077 FRIEND_TEST(CellularCapabilityGSMTest, SetHomeProvider);
Darin Petkovae0c64e2011-11-15 15:50:27 +010078 FRIEND_TEST(CellularCapabilityGSMTest, UpdateOperatorInfo);
Darin Petkov1272a432011-11-10 15:53:37 +010079
Darin Petkov721ac932011-11-16 15:43:09 +010080 struct SimLockStatus {
81 public:
82 SimLockStatus() : retries_left(0) {}
83 SimLockStatus(const std::string &in_lock_type, uint32 in_retries_left)
84 : lock_type(in_lock_type),
85 retries_left(in_retries_left) {}
86
87 std::string lock_type;
88 uint32 retries_left;
89 };
90
Darin Petkov1272a432011-11-10 15:53:37 +010091 static const char kNetworkPropertyAccessTechnology[];
92 static const char kNetworkPropertyID[];
93 static const char kNetworkPropertyLongName[];
94 static const char kNetworkPropertyShortName[];
95 static const char kNetworkPropertyStatus[];
Darin Petkovae0c64e2011-11-15 15:50:27 +010096 static const char kPhoneNumber[];
97 static const char kPropertyAccessTechnology[];
Darin Petkovcb547732011-11-09 13:55:26 +010098
Darin Petkov184c54e2011-11-15 12:44:39 +010099 void RegisterOnNetworkTask(const std::string &network_id);
Darin Petkovc64fe5e2012-01-11 12:46:13 +0100100 void RequirePINTask(
101 const std::string &pin, bool require, ReturnerInterface *returner);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100102 void EnterPINTask(const std::string &pin, ReturnerInterface *returner);
Darin Petkovc64fe5e2012-01-11 12:46:13 +0100103 void UnblockPINTask(const std::string &unblock_code,
104 const std::string &pin,
105 ReturnerInterface *returner);
106 void ChangePINTask(const std::string &old_pin,
107 const std::string &new_pin,
108 ReturnerInterface *returner);
Darin Petkov1272a432011-11-10 15:53:37 +0100109 void ScanTask();
110
Darin Petkovae0c64e2011-11-15 15:50:27 +0100111 void SetAccessTechnology(uint32 access_technology);
112
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100113 // Sets the upper level information about the home cellular provider from the
114 // modem's IMSI and SPN.
115 void SetHomeProvider();
116
Darin Petkovae0c64e2011-11-15 15:50:27 +0100117 // Updates the GSM operator name and country based on a newly obtained network
118 // id.
119 void UpdateOperatorInfo();
120
121 // Updates the serving operator on the active service.
122 void UpdateServingOperator();
123
Darin Petkov3cfbf212011-11-21 16:02:09 +0100124 // Initializes the |apn_list_| property based on the current |home_provider_|.
125 void InitAPNList();
126
Darin Petkov1272a432011-11-10 15:53:37 +0100127 Stringmap ParseScanResult(
128 const ModemGSMNetworkProxyInterface::ScanResult &result);
Darin Petkovb05315f2011-11-07 10:14:25 +0100129
Darin Petkov721ac932011-11-16 15:43:09 +0100130 StrIntPair SimLockStatusToProperty(Error *error);
131
132 void HelpRegisterDerivedStrIntPair(
133 const std::string &name,
134 StrIntPair(CellularCapabilityGSM::*get)(Error *),
135 void(CellularCapabilityGSM::*set)(const StrIntPair&, Error *));
136
Darin Petkov184c54e2011-11-15 12:44:39 +0100137 // Signal callbacks inherited from ModemGSMNetworkProxyDelegate.
138 virtual void OnGSMNetworkModeChanged(uint32 mode);
139 virtual void OnGSMRegistrationInfoChanged(uint32 status,
140 const std::string &operator_code,
141 const std::string &operator_name);
142 virtual void OnGSMSignalQualityChanged(uint32 quality);
143
Darin Petkovcb547732011-11-09 13:55:26 +0100144 scoped_ptr<ModemGSMCardProxyInterface> card_proxy_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100145 scoped_ptr<ModemGSMNetworkProxyInterface> network_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100146
Darin Petkovb05315f2011-11-07 10:14:25 +0100147 ScopedRunnableMethodFactory<CellularCapabilityGSM> task_factory_;
148
Darin Petkov184c54e2011-11-15 12:44:39 +0100149 uint32 registration_state_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100150 uint32 access_technology_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100151 Cellular::Operator serving_operator_;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100152 std::string spn_;
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100153 mobile_provider *home_provider_;
Darin Petkov184c54e2011-11-15 12:44:39 +0100154
Darin Petkov1272a432011-11-10 15:53:37 +0100155 // Properties.
Darin Petkov184c54e2011-11-15 12:44:39 +0100156 std::string selected_network_;
Darin Petkov1272a432011-11-10 15:53:37 +0100157 Stringmaps found_networks_;
158 bool scanning_;
159 uint16 scan_interval_;
Darin Petkov721ac932011-11-16 15:43:09 +0100160 SimLockStatus sim_lock_status_;
Darin Petkov3cfbf212011-11-21 16:02:09 +0100161 Stringmaps apn_list_;
Darin Petkov1272a432011-11-10 15:53:37 +0100162
Darin Petkovac635a82012-01-10 16:51:58 +0100163 static unsigned int friendly_service_name_id_;
164
Darin Petkovdaf43862011-10-27 11:37:28 +0200165 DISALLOW_COPY_AND_ASSIGN(CellularCapabilityGSM);
166};
167
168} // namespace shill
169
170#endif // SHILL_CELLULAR_CAPABILITY_GSM_