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_cdma_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/logging.h"
     29 
     30 using std::string;
     31 
     32 namespace shill {
     33 
     34 namespace Logging {
     35 static auto kModuleLogScope = ScopeLogger::kDBus;
     36 static string ObjectID(const dbus::ObjectPath* p) { return p->value(); }
     37 }  // namespace Logging
     38 
     39 // static.
     40 const char ChromeosModemCDMAProxy::kPropertyMeid[] = "Meid";
     41 
     42 ChromeosModemCDMAProxy::PropertySet::PropertySet(
     43     dbus::ObjectProxy* object_proxy,
     44     const std::string& interface_name,
     45     const PropertyChangedCallback& callback)
     46     : dbus::PropertySet(object_proxy, interface_name, callback) {
     47   RegisterProperty(kPropertyMeid, &meid);
     48 }
     49 
     50 ChromeosModemCDMAProxy::ChromeosModemCDMAProxy(
     51     const scoped_refptr<dbus::Bus>& bus,
     52     const string& path,
     53     const string& service)
     54     : proxy_(
     55         new org::freedesktop::ModemManager::Modem::CdmaProxy(
     56             bus, service, dbus::ObjectPath(path))) {
     57   // Register signal handlers.
     58   proxy_->RegisterActivationStateChangedSignalHandler(
     59       base::Bind(&ChromeosModemCDMAProxy::ActivationStateChanged,
     60                  weak_factory_.GetWeakPtr()),
     61       base::Bind(&ChromeosModemCDMAProxy::OnSignalConnected,
     62                  weak_factory_.GetWeakPtr()));
     63   proxy_->RegisterSignalQualitySignalHandler(
     64       base::Bind(&ChromeosModemCDMAProxy::SignalQuality,
     65                  weak_factory_.GetWeakPtr()),
     66       base::Bind(&ChromeosModemCDMAProxy::OnSignalConnected,
     67                  weak_factory_.GetWeakPtr()));
     68   proxy_->RegisterRegistrationStateChangedSignalHandler(
     69       base::Bind(&ChromeosModemCDMAProxy::RegistrationStateChanged,
     70                  weak_factory_.GetWeakPtr()),
     71       base::Bind(&ChromeosModemCDMAProxy::OnSignalConnected,
     72                  weak_factory_.GetWeakPtr()));
     73 
     74   // Register properties.
     75   properties_.reset(
     76       new PropertySet(
     77           proxy_->GetObjectProxy(),
     78           cromo::kModemCdmaInterface,
     79           base::Bind(&ChromeosModemCDMAProxy::OnPropertyChanged,
     80                      weak_factory_.GetWeakPtr())));
     81 
     82   // Connect property signals and initialize cached value. Based on
     83   // recommendations from src/dbus/property.h.
     84   properties_->ConnectSignals();
     85   properties_->GetAll();
     86 }
     87 
     88 ChromeosModemCDMAProxy::~ChromeosModemCDMAProxy() {}
     89 
     90 void ChromeosModemCDMAProxy::Activate(const string& carrier,
     91                                       Error* error,
     92                                       const ActivationResultCallback& callback,
     93                                       int timeout) {
     94   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << carrier;
     95   proxy_->ActivateAsync(
     96       carrier,
     97       base::Bind(&ChromeosModemCDMAProxy::OnActivateSuccess,
     98                  weak_factory_.GetWeakPtr(),
     99                  callback),
    100       base::Bind(&ChromeosModemCDMAProxy::OnActivateFailure,
    101                  weak_factory_.GetWeakPtr(),
    102                  callback));
    103 }
    104 
    105 void ChromeosModemCDMAProxy::GetRegistrationState(
    106     Error* error,
    107     const RegistrationStateCallback& callback,
    108     int timeout) {
    109   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    110   proxy_->GetRegistrationStateAsync(
    111       base::Bind(&ChromeosModemCDMAProxy::OnGetRegistrationStateSuccess,
    112                  weak_factory_.GetWeakPtr(),
    113                  callback),
    114       base::Bind(&ChromeosModemCDMAProxy::OnGetRegistrationStateFailure,
    115                  weak_factory_.GetWeakPtr(),
    116                  callback));
    117 }
    118 
    119 void ChromeosModemCDMAProxy::GetSignalQuality(
    120     Error* error, const SignalQualityCallback& callback, int timeout) {
    121   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    122   proxy_->GetSignalQualityAsync(
    123       base::Bind(&ChromeosModemCDMAProxy::OnGetSignalQualitySuccess,
    124                  weak_factory_.GetWeakPtr(),
    125                  callback),
    126       base::Bind(&ChromeosModemCDMAProxy::OnGetSignalQualityFailure,
    127                  weak_factory_.GetWeakPtr(),
    128                  callback));
    129 }
    130 
    131 const string ChromeosModemCDMAProxy::MEID() {
    132   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    133   if (!properties_->meid.GetAndBlock()) {
    134     LOG(ERROR) << "Failed to get MEID";
    135     return string();
    136   }
    137   return properties_->meid.value();
    138 }
    139 
    140 void ChromeosModemCDMAProxy::ActivationStateChanged(
    141     uint32_t activation_state,
    142     uint32_t activation_error,
    143     const brillo::VariantDictionary& status_changes) {
    144   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << activation_state
    145                                     << ", " << activation_error << ")";
    146   if (activation_state_callback_.is_null()) {
    147     return;
    148   }
    149   KeyValueStore status_changes_store;
    150   KeyValueStore::ConvertFromVariantDictionary(status_changes,
    151                                               &status_changes_store);
    152   activation_state_callback_.Run(activation_state,
    153                                  activation_error,
    154                                  status_changes_store);
    155 }
    156 
    157 void ChromeosModemCDMAProxy::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 ChromeosModemCDMAProxy::RegistrationStateChanged(
    166     uint32_t cdma_1x_state,
    167     uint32_t evdo_state) {
    168   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << cdma_1x_state << ", "
    169                                     << evdo_state << ")";
    170   if (registration_state_callback_.is_null()) {
    171     return;
    172   }
    173   registration_state_callback_.Run(cdma_1x_state, evdo_state);
    174 }
    175 
    176 void ChromeosModemCDMAProxy::OnActivateSuccess(
    177     const ActivationResultCallback& callback, uint32_t status) {
    178   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << status << ")";
    179   callback.Run(status, Error());
    180 }
    181 
    182 void ChromeosModemCDMAProxy::OnActivateFailure(
    183     const ActivationResultCallback& callback, brillo::Error* dbus_error) {
    184   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    185   Error error;
    186   CellularError::FromChromeosDBusError(dbus_error, &error);
    187   callback.Run(0, error);
    188 }
    189 
    190 void ChromeosModemCDMAProxy::OnGetRegistrationStateSuccess(
    191     const RegistrationStateCallback& callback,
    192     uint32_t state_1x,
    193     uint32_t state_evdo) {
    194   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << state_1x
    195                                     << ", " << state_evdo << ")";
    196   callback.Run(state_1x, state_evdo, Error());
    197 }
    198 
    199 void ChromeosModemCDMAProxy::OnGetRegistrationStateFailure(
    200     const RegistrationStateCallback& callback, brillo::Error* dbus_error) {
    201   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    202   Error error;
    203   CellularError::FromChromeosDBusError(dbus_error, &error);
    204   callback.Run(0, 0, error);
    205 }
    206 
    207 void ChromeosModemCDMAProxy::OnGetSignalQualitySuccess(
    208     const SignalQualityCallback& callback, uint32_t quality) {
    209   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << quality << ")";
    210   callback.Run(quality, Error());
    211 }
    212 
    213 void ChromeosModemCDMAProxy::OnGetSignalQualityFailure(
    214     const SignalQualityCallback& callback, brillo::Error* dbus_error) {
    215   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    216   Error error;
    217   CellularError::FromChromeosDBusError(dbus_error, &error);
    218   callback.Run(0, error);
    219 }
    220 
    221 void ChromeosModemCDMAProxy::OnSignalConnected(
    222     const string& interface_name, const string& signal_name, bool success) {
    223   SLOG(&proxy_->GetObjectPath(), 2) << __func__
    224       << "interface: " << interface_name
    225              << " signal: " << signal_name << "success: " << success;
    226   if (!success) {
    227     LOG(ERROR) << "Failed to connect signal " << signal_name
    228         << " to interface " << interface_name;
    229   }
    230 }
    231 
    232 void ChromeosModemCDMAProxy::OnPropertyChanged(
    233     const string& property_name) {
    234   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << property_name;
    235 }
    236 
    237 }  // namespace shill
    238