1 // 2 // Copyright (C) 2015 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "shill/dbus/chromeos_modem_gsm_network_proxy.h" 18 19 #include <memory> 20 21 #if defined(__ANDROID__) 22 #include <dbus/service_constants.h> 23 #else 24 #include <chromeos/dbus/service_constants.h> 25 #endif // __ANDROID__ 26 27 #include "shill/cellular/cellular_error.h" 28 #include "shill/error.h" 29 #include "shill/logging.h" 30 31 using std::string; 32 33 namespace shill { 34 35 namespace Logging { 36 static auto kModuleLogScope = ScopeLogger::kDBus; 37 static string ObjectID(const dbus::ObjectPath* p) { return p->value(); } 38 } // namespace Logging 39 40 // static. 41 const char ChromeosModemGSMNetworkProxy::kPropertyAccessTechnology[] = 42 "AccessTechnology"; 43 44 ChromeosModemGSMNetworkProxy::PropertySet::PropertySet( 45 dbus::ObjectProxy* object_proxy, 46 const std::string& interface_name, 47 const PropertyChangedCallback& callback) 48 : dbus::PropertySet(object_proxy, interface_name, callback) { 49 RegisterProperty(kPropertyAccessTechnology, &access_technology); 50 } 51 52 ChromeosModemGSMNetworkProxy::ChromeosModemGSMNetworkProxy( 53 const scoped_refptr<dbus::Bus>& bus, 54 const string& path, 55 const string& service) 56 : proxy_( 57 new org::freedesktop::ModemManager::Modem::Gsm::NetworkProxy( 58 bus, service, dbus::ObjectPath(path))) { 59 // Register signal handlers. 60 proxy_->RegisterSignalQualitySignalHandler( 61 base::Bind(&ChromeosModemGSMNetworkProxy::SignalQuality, 62 weak_factory_.GetWeakPtr()), 63 base::Bind(&ChromeosModemGSMNetworkProxy::OnSignalConnected, 64 weak_factory_.GetWeakPtr())); 65 proxy_->RegisterRegistrationInfoSignalHandler( 66 base::Bind(&ChromeosModemGSMNetworkProxy::RegistrationInfo, 67 weak_factory_.GetWeakPtr()), 68 base::Bind(&ChromeosModemGSMNetworkProxy::OnSignalConnected, 69 weak_factory_.GetWeakPtr())); 70 proxy_->RegisterNetworkModeSignalHandler( 71 base::Bind(&ChromeosModemGSMNetworkProxy::NetworkMode, 72 weak_factory_.GetWeakPtr()), 73 base::Bind(&ChromeosModemGSMNetworkProxy::OnSignalConnected, 74 weak_factory_.GetWeakPtr())); 75 76 // Register properties. 77 properties_.reset( 78 new PropertySet( 79 proxy_->GetObjectProxy(), 80 cromo::kModemGsmNetworkInterface, 81 base::Bind(&ChromeosModemGSMNetworkProxy::OnPropertyChanged, 82 weak_factory_.GetWeakPtr()))); 83 84 // Connect property signals and initialize cached values. Based on 85 // recommendations from src/dbus/property.h. 86 properties_->ConnectSignals(); 87 properties_->GetAll(); 88 } 89 90 ChromeosModemGSMNetworkProxy::~ChromeosModemGSMNetworkProxy() {} 91 92 void ChromeosModemGSMNetworkProxy::GetRegistrationInfo( 93 Error* error, 94 const RegistrationInfoCallback& callback, 95 int timeout) { 96 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 97 proxy_->GetRegistrationInfoAsync( 98 base::Bind(&ChromeosModemGSMNetworkProxy::OnGetRegistrationInfoSuccess, 99 weak_factory_.GetWeakPtr(), 100 callback), 101 base::Bind(&ChromeosModemGSMNetworkProxy::OnGetRegistrationInfoFailure, 102 weak_factory_.GetWeakPtr(), 103 callback)); 104 } 105 106 void ChromeosModemGSMNetworkProxy::GetSignalQuality( 107 Error* error, 108 const SignalQualityCallback& callback, 109 int timeout) { 110 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 111 proxy_->GetSignalQualityAsync( 112 base::Bind(&ChromeosModemGSMNetworkProxy::OnGetSignalQualitySuccess, 113 weak_factory_.GetWeakPtr(), 114 callback), 115 base::Bind(&ChromeosModemGSMNetworkProxy::OnGetSignalQualityFailure, 116 weak_factory_.GetWeakPtr(), 117 callback)); 118 } 119 120 void ChromeosModemGSMNetworkProxy::Register(const string& network_id, 121 Error* error, 122 const ResultCallback& callback, 123 int timeout) { 124 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << network_id; 125 proxy_->RegisterAsync( 126 network_id, 127 base::Bind(&ChromeosModemGSMNetworkProxy::OnRegisterSuccess, 128 weak_factory_.GetWeakPtr(), 129 callback), 130 base::Bind(&ChromeosModemGSMNetworkProxy::OnRegisterFailure, 131 weak_factory_.GetWeakPtr(), 132 callback)); 133 } 134 135 void ChromeosModemGSMNetworkProxy::Scan(Error* error, 136 const ScanResultsCallback& callback, 137 int timeout) { 138 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 139 proxy_->ScanAsync( 140 base::Bind(&ChromeosModemGSMNetworkProxy::OnScanSuccess, 141 weak_factory_.GetWeakPtr(), 142 callback), 143 base::Bind(&ChromeosModemGSMNetworkProxy::OnScanFailure, 144 weak_factory_.GetWeakPtr(), 145 callback)); 146 } 147 148 uint32_t ChromeosModemGSMNetworkProxy::AccessTechnology() { 149 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 150 if (!properties_->access_technology.GetAndBlock()) { 151 LOG(ERROR) << "Failed to get AccessTechnology"; 152 return 0; 153 } 154 return properties_->access_technology.value(); 155 } 156 157 void ChromeosModemGSMNetworkProxy::SignalQuality(uint32_t quality) { 158 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << quality << ")"; 159 if (signal_quality_callback_.is_null()) { 160 return; 161 } 162 signal_quality_callback_.Run(quality); 163 } 164 165 void ChromeosModemGSMNetworkProxy::RegistrationInfo( 166 uint32_t status, const string& operator_code, const string& operator_name) { 167 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << status << ", " 168 << operator_code << ", " << operator_name << ")"; 169 if (registration_info_callback_.is_null()) { 170 return; 171 } 172 registration_info_callback_.Run(status, operator_code, operator_name); 173 } 174 175 void ChromeosModemGSMNetworkProxy::NetworkMode(uint32_t mode) { 176 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << mode << ")"; 177 if (network_mode_callback_.is_null()) { 178 return; 179 } 180 network_mode_callback_.Run(mode); 181 } 182 183 void ChromeosModemGSMNetworkProxy::OnRegisterSuccess( 184 const ResultCallback& callback) { 185 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 186 callback.Run(Error()); 187 } 188 189 void ChromeosModemGSMNetworkProxy::OnRegisterFailure( 190 const ResultCallback& callback, brillo::Error* dbus_error) { 191 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 192 Error error; 193 CellularError::FromChromeosDBusError(dbus_error, &error); 194 callback.Run(error); 195 } 196 197 void ChromeosModemGSMNetworkProxy::OnGetRegistrationInfoSuccess( 198 const RegistrationInfoCallback& callback, 199 const GSMRegistrationInfo& info) { 200 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 201 callback.Run( 202 std::get<0>(info), std::get<1>(info), std::get<2>(info), Error()); 203 } 204 205 void ChromeosModemGSMNetworkProxy::OnGetRegistrationInfoFailure( 206 const RegistrationInfoCallback& callback, 207 brillo::Error* dbus_error) { 208 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 209 Error error; 210 CellularError::FromChromeosDBusError(dbus_error, &error); 211 callback.Run(0, "", "", error); 212 } 213 214 void ChromeosModemGSMNetworkProxy::OnGetSignalQualitySuccess( 215 const SignalQualityCallback& callback, uint32_t quality) { 216 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << quality << ")"; 217 callback.Run(quality, Error()); 218 } 219 220 void ChromeosModemGSMNetworkProxy::OnGetSignalQualityFailure( 221 const SignalQualityCallback& callback, brillo::Error* dbus_error) { 222 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 223 Error error; 224 CellularError::FromChromeosDBusError(dbus_error, &error); 225 callback.Run(0, error); 226 } 227 228 void ChromeosModemGSMNetworkProxy::OnScanSuccess( 229 const ScanResultsCallback& callback, const GSMScanResults& results) { 230 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 231 callback.Run(results, Error()); 232 } 233 234 void ChromeosModemGSMNetworkProxy::OnScanFailure( 235 const ScanResultsCallback& callback, brillo::Error* dbus_error) { 236 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 237 Error error; 238 CellularError::FromChromeosDBusError(dbus_error, &error); 239 callback.Run(GSMScanResults(), error); 240 } 241 242 void ChromeosModemGSMNetworkProxy::OnSignalConnected( 243 const string& interface_name, const string& signal_name, bool success) { 244 SLOG(&proxy_->GetObjectPath(), 2) << __func__ 245 << "interface: " << interface_name 246 << " signal: " << signal_name << "success: " << success; 247 if (!success) { 248 LOG(ERROR) << "Failed to connect signal " << signal_name 249 << " to interface " << interface_name; 250 } 251 } 252 253 void ChromeosModemGSMNetworkProxy::OnPropertyChanged( 254 const string& property_name) { 255 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << property_name; 256 } 257 258 } // namespace shill 259