Home | History | Annotate | Download | only in dbus
      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