blob: 7a72eb0fe08432f7f70ed8a9587130d5e9b8948d [file] [log] [blame]
Chris Masone3bd3c8c2011-06-13 08:20:26 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular.h"
6
7#include <string>
Chris Masone889666b2011-07-03 12:58:50 -07008#include <utility>
9#include <vector>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070010
11#include <base/logging.h>
Darin Petkove9d12e02011-07-27 15:09:37 -070012#include <base/stringprintf.h>
Chris Masoneb925cc82011-06-22 15:39:57 -070013#include <chromeos/dbus/service_constants.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070014
15#include "shill/cellular_service.h"
16#include "shill/control_interface.h"
17#include "shill/device.h"
18#include "shill/device_info.h"
19#include "shill/manager.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070020#include "shill/modem_proxy_interface.h"
Darin Petkove604f702011-07-28 15:51:17 -070021#include "shill/modem_simple_proxy_interface.h"
Chris Masone7aa5f902011-07-11 11:13:35 -070022#include "shill/profile.h"
Chris Masone889666b2011-07-03 12:58:50 -070023#include "shill/property_accessor.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070024#include "shill/proxy_factory.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070025#include "shill/shill_event.h"
26
Chris Masone889666b2011-07-03 12:58:50 -070027using std::make_pair;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070028using std::string;
Chris Masone889666b2011-07-03 12:58:50 -070029using std::vector;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070030
31namespace shill {
32
Chris Masone889666b2011-07-03 12:58:50 -070033Cellular::Network::Network() {
34 dict_[flimflam::kStatusProperty] = "";
35 dict_[flimflam::kNetworkIdProperty] = "";
36 dict_[flimflam::kShortNameProperty] = "";
37 dict_[flimflam::kLongNameProperty] = "";
38 dict_[flimflam::kTechnologyProperty] = "";
39}
40
41Cellular::Network::~Network() {}
42
43const std::string &Cellular::Network::GetStatus() const {
44 return dict_.find(flimflam::kStatusProperty)->second;
45}
46
47void Cellular::Network::SetStatus(const std::string &status) {
48 dict_[flimflam::kStatusProperty] = status;
49}
50
51const std::string &Cellular::Network::GetId() const {
52 return dict_.find(flimflam::kNetworkIdProperty)->second;
53}
54
55void Cellular::Network::SetId(const std::string &id) {
56 dict_[flimflam::kNetworkIdProperty] = id;
57}
58
59const std::string &Cellular::Network::GetShortName() const {
60 return dict_.find(flimflam::kShortNameProperty)->second;
61}
62
63void Cellular::Network::SetShortName(const std::string &name) {
64 dict_[flimflam::kShortNameProperty] = name;
65}
66
67const std::string &Cellular::Network::GetLongName() const {
68 return dict_.find(flimflam::kLongNameProperty)->second;
69}
70
71void Cellular::Network::SetLongName(const std::string &name) {
72 dict_[flimflam::kLongNameProperty] = name;
73}
74
75const std::string &Cellular::Network::GetTechnology() const {
76 return dict_.find(flimflam::kTechnologyProperty)->second;
77}
78
79void Cellular::Network::SetTechnology(const std::string &technology) {
80 dict_[flimflam::kTechnologyProperty] = technology;
81}
82
83const Stringmap &Cellular::Network::ToDict() const {
84 return dict_;
85}
86
Chris Masone3bd3c8c2011-06-13 08:20:26 -070087Cellular::Cellular(ControlInterface *control_interface,
88 EventDispatcher *dispatcher,
89 Manager *manager,
Darin Petkove9d12e02011-07-27 15:09:37 -070090 const string &link_name,
91 int interface_index,
92 Type type,
93 const string &owner,
94 const string &path)
Chris Masone3bd3c8c2011-06-13 08:20:26 -070095 : Device(control_interface,
96 dispatcher,
97 manager,
Darin Petkove9d12e02011-07-27 15:09:37 -070098 link_name,
Chris Masone3bd3c8c2011-06-13 08:20:26 -070099 interface_index),
Darin Petkove9d12e02011-07-27 15:09:37 -0700100 type_(type),
101 state_(kStateDisabled),
102 dbus_owner_(owner),
103 dbus_path_(path),
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700104 service_(new CellularService(control_interface,
105 dispatcher,
Chris Masone6791a432011-07-12 13:23:19 -0700106 manager,
mukesh agrawal51a7e932011-07-27 16:18:26 -0700107 this)),
Darin Petkove9d12e02011-07-27 15:09:37 -0700108 service_registered_(false),
109 allow_roaming_(false),
110 prl_version_(0),
111 scanning_(false),
112 scan_interval_(0) {
113 store_.RegisterConstString(flimflam::kDBusConnectionProperty, &dbus_owner_);
114 store_.RegisterConstString(flimflam::kDBusObjectProperty, &dbus_path_);
Chris Masone27c4aa52011-07-02 13:10:14 -0700115 store_.RegisterConstString(flimflam::kCarrierProperty, &carrier_);
Chris Masone4d42df82011-07-02 17:09:39 -0700116 store_.RegisterBool(flimflam::kCellularAllowRoamingProperty, &allow_roaming_);
Chris Masone27c4aa52011-07-02 13:10:14 -0700117 store_.RegisterConstString(flimflam::kEsnProperty, &esn_);
Chris Masone27c4aa52011-07-02 13:10:14 -0700118 store_.RegisterConstString(flimflam::kFirmwareRevisionProperty,
119 &firmware_revision_);
120 store_.RegisterConstString(flimflam::kHardwareRevisionProperty,
121 &hardware_revision_);
Chris Masone4d42df82011-07-02 17:09:39 -0700122 store_.RegisterConstString(flimflam::kImeiProperty, &imei_);
123 store_.RegisterConstString(flimflam::kImsiProperty, &imsi_);
124 store_.RegisterConstString(flimflam::kManufacturerProperty, &manufacturer_);
125 store_.RegisterConstString(flimflam::kMdnProperty, &mdn_);
126 store_.RegisterConstString(flimflam::kMeidProperty, &meid_);
127 store_.RegisterConstString(flimflam::kMinProperty, &min_);
128 store_.RegisterConstString(flimflam::kModelIDProperty, &model_id_);
Chris Masone27c4aa52011-07-02 13:10:14 -0700129 store_.RegisterConstInt16(flimflam::kPRLVersionProperty, &prl_version_);
Chris Masoneb925cc82011-06-22 15:39:57 -0700130
Chris Masone889666b2011-07-03 12:58:50 -0700131 HelpRegisterDerivedStrIntPair(flimflam::kSIMLockStatusProperty,
132 &Cellular::SimLockStatusToProperty,
133 NULL);
134 HelpRegisterDerivedStringmaps(flimflam::kFoundNetworksProperty,
135 &Cellular::EnumerateNetworks,
136 NULL);
Chris Masoneb925cc82011-06-22 15:39:57 -0700137
Chris Masone4d42df82011-07-02 17:09:39 -0700138 store_.RegisterConstBool(flimflam::kScanningProperty, &scanning_);
139 store_.RegisterUint16(flimflam::kScanIntervalProperty, &scan_interval_);
140
Darin Petkove9d12e02011-07-27 15:09:37 -0700141 VLOG(2) << "Cellular device " << link_name_ << " initialized: "
142 << GetTypeString();
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700143}
144
Darin Petkove9d12e02011-07-27 15:09:37 -0700145Cellular::~Cellular() {}
146
147std::string Cellular::GetTypeString() {
148 switch (type_) {
149 case kTypeGSM: return "CellularTypeGSM";
150 case kTypeCDMA: return "CellularTypeCDMA";
151 default: return StringPrintf("CellularTypeUnknown-%d", type_);
152 }
153}
154
155std::string Cellular::GetStateString() {
156 switch (state_) {
157 case kStateDisabled: return "CellularStateDisabled";
158 case kStateEnabled: return "CellularStateEnabled";
159 case kStateRegistered: return "CellularStateRegistered";
160 case kStateConnected: return "CellularStateConnected";
161 default: return StringPrintf("CellularStateUnknown-%d", state_);
162 }
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700163}
164
165void Cellular::Start() {
Darin Petkove9d12e02011-07-27 15:09:37 -0700166 proxy_.reset(
167 ProxyFactory::factory()->CreateModemProxy(dbus_path_, dbus_owner_));
Darin Petkove604f702011-07-28 15:51:17 -0700168 simple_proxy_.reset(
Darin Petkovf5f61e02011-07-29 11:35:40 -0700169 ProxyFactory::factory()->CreateModemSimpleProxy(
170 dbus_path_, dbus_owner_));
171
172 VLOG(2) << __func__ << ": " << GetStateString();
173 EnableModem();
174 // TODO(petkov): If GSM, invoke ModemManager.Modem.Gsm.Network.Register.
175 GetModemStatus();
Darin Petkove9d12e02011-07-27 15:09:37 -0700176 // TODO(petkov): Device::Start();
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700177}
178
179void Cellular::Stop() {
Darin Petkove9d12e02011-07-27 15:09:37 -0700180 proxy_.reset();
Darin Petkove604f702011-07-28 15:51:17 -0700181 simple_proxy_.reset();
Chris Masone2b105542011-06-22 10:58:09 -0700182 manager_->DeregisterService(service_);
Darin Petkove9d12e02011-07-27 15:09:37 -0700183 service_ = NULL; // Breaks a reference cycle.
184 // TODO(petkov): Device::Stop();
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700185}
186
Darin Petkovf5f61e02011-07-29 11:35:40 -0700187void Cellular::EnableModem() {
188 CHECK_EQ(kStateDisabled, state_);
189 // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
190 proxy_->Enable(true);
191 state_ = kStateEnabled;
192}
193
194void Cellular::GetModemStatus() {
195 // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
196 DBusPropertiesMap properties = simple_proxy_->GetStatus();
197 for (DBusPropertiesMap::const_iterator it = properties.begin();
198 it != properties.end(); ++it) {
199 VLOG(2) << "ModemManager.Modem.Simple: " << it->first;
200 }
201}
202
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700203bool Cellular::TechnologyIs(const Device::Technology type) {
204 return type == Device::kCellular;
205}
206
Chris Masone889666b2011-07-03 12:58:50 -0700207Stringmaps Cellular::EnumerateNetworks() {
208 Stringmaps to_return;
209 for (vector<Network>::const_iterator it = found_networks_.begin();
210 it != found_networks_.end();
211 ++it) {
212 to_return.push_back(it->ToDict());
213 }
214 return to_return;
215}
216
217StrIntPair Cellular::SimLockStatusToProperty() {
218 return StrIntPair(make_pair(flimflam::kSIMLockTypeProperty,
219 sim_lock_status_.lock_type),
220 make_pair(flimflam::kSIMLockRetriesLeftProperty,
221 sim_lock_status_.retries_left));
222}
223
224void Cellular::HelpRegisterDerivedStringmaps(
225 const string &name,
226 Stringmaps(Cellular::*get)(void),
227 bool(Cellular::*set)(const Stringmaps&)) {
228 store_.RegisterDerivedStringmaps(
229 name,
230 StringmapsAccessor(
231 new CustomAccessor<Cellular, Stringmaps>(this, get, set)));
232}
233
234void Cellular::HelpRegisterDerivedStrIntPair(
235 const string &name,
236 StrIntPair(Cellular::*get)(void),
237 bool(Cellular::*set)(const StrIntPair&)) {
238 store_.RegisterDerivedStrIntPair(
239 name,
240 StrIntPairAccessor(
241 new CustomAccessor<Cellular, StrIntPair>(this, get, set)));
242}
243
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700244} // namespace shill