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_wimax_device_proxy.h"
     18 
     19 #include <memory>
     20 
     21 #include <base/bind.h>
     22 #include <base/strings/stringprintf.h>
     23 #if defined(__ANDROID__)
     24 #include <dbus/service_constants.h>
     25 #else
     26 #include <chromeos/dbus/service_constants.h>
     27 #endif  // __ANDROID__
     28 
     29 #include "shill/error.h"
     30 #include "shill/logging.h"
     31 
     32 using std::string;
     33 using std::vector;
     34 using wimax_manager::DeviceStatus;
     35 
     36 namespace shill {
     37 
     38 namespace Logging {
     39 static auto kModuleLogScope = ScopeLogger::kDBus;
     40 static string ObjectID(const dbus::ObjectPath* path) {
     41   return "wimax_device_proxy (" + path->value() + ")";
     42 }
     43 }
     44 
     45 // static.
     46 const char ChromeosWiMaxDeviceProxy::kPropertyIndex[] = "Index";
     47 const char ChromeosWiMaxDeviceProxy::kPropertyName[] = "Name";
     48 const char ChromeosWiMaxDeviceProxy::kPropertyNetworks[] = "Networks";
     49 
     50 ChromeosWiMaxDeviceProxy::PropertySet::PropertySet(
     51     dbus::ObjectProxy* object_proxy,
     52     const std::string& interface_name,
     53     const PropertyChangedCallback& callback)
     54     : dbus::PropertySet(object_proxy, interface_name, callback) {
     55   RegisterProperty(kPropertyIndex, &index);
     56   RegisterProperty(kPropertyName, &name);
     57   RegisterProperty(kPropertyNetworks, &networks);
     58 }
     59 
     60 ChromeosWiMaxDeviceProxy::ChromeosWiMaxDeviceProxy(
     61     const scoped_refptr<dbus::Bus>& bus,
     62     const std::string& rpc_identifier)
     63     : proxy_(
     64         new org::chromium::WiMaxManager::DeviceProxy(
     65             bus,
     66             wimax_manager::kWiMaxManagerServiceName,
     67             dbus::ObjectPath(rpc_identifier))) {
     68   // Register signal handlers.
     69   proxy_->RegisterNetworksChangedSignalHandler(
     70       base::Bind(&ChromeosWiMaxDeviceProxy::NetworksChanged,
     71                  weak_factory_.GetWeakPtr()),
     72       base::Bind(&ChromeosWiMaxDeviceProxy::OnSignalConnected,
     73                  weak_factory_.GetWeakPtr()));
     74   proxy_->RegisterStatusChangedSignalHandler(
     75       base::Bind(&ChromeosWiMaxDeviceProxy::StatusChanged,
     76                  weak_factory_.GetWeakPtr()),
     77       base::Bind(&ChromeosWiMaxDeviceProxy::OnSignalConnected,
     78                  weak_factory_.GetWeakPtr()));
     79 
     80   // Register properties.
     81   properties_.reset(
     82       new PropertySet(
     83           proxy_->GetObjectProxy(),
     84           wimax_manager::kWiMaxManagerDeviceInterface,
     85           base::Bind(&ChromeosWiMaxDeviceProxy::OnPropertyChanged,
     86                      weak_factory_.GetWeakPtr())));
     87   properties_->ConnectSignals();
     88   properties_->GetAll();
     89 }
     90 
     91 ChromeosWiMaxDeviceProxy::~ChromeosWiMaxDeviceProxy() {
     92   proxy_->ReleaseObjectProxy(base::Bind(&base::DoNothing));
     93 }
     94 
     95 void ChromeosWiMaxDeviceProxy::Enable(Error* /*error*/,
     96                                       const ResultCallback& callback,
     97                                       int /*timeout*/) {
     98   proxy_->EnableAsync(
     99       base::Bind(&ChromeosWiMaxDeviceProxy::OnSuccess,
    100                  weak_factory_.GetWeakPtr(),
    101                  callback,
    102                  __func__),
    103       base::Bind(&ChromeosWiMaxDeviceProxy::OnFailure,
    104                  weak_factory_.GetWeakPtr(),
    105                  callback,
    106                  __func__));
    107 }
    108 
    109 void ChromeosWiMaxDeviceProxy::Disable(Error* /*error*/,
    110                                        const ResultCallback& callback,
    111                                        int /*timeout*/) {
    112   proxy_->DisableAsync(
    113       base::Bind(&ChromeosWiMaxDeviceProxy::OnSuccess,
    114                  weak_factory_.GetWeakPtr(),
    115                  callback,
    116                  __func__),
    117       base::Bind(&ChromeosWiMaxDeviceProxy::OnFailure,
    118                  weak_factory_.GetWeakPtr(),
    119                  callback,
    120                  __func__));
    121 }
    122 
    123 void ChromeosWiMaxDeviceProxy::ScanNetworks(Error* /*error*/,
    124                                             const ResultCallback& callback,
    125                                             int /*timeout*/) {
    126   proxy_->ScanNetworksAsync(
    127       base::Bind(&ChromeosWiMaxDeviceProxy::OnSuccess,
    128                  weak_factory_.GetWeakPtr(),
    129                  callback,
    130                  __func__),
    131       base::Bind(&ChromeosWiMaxDeviceProxy::OnFailure,
    132                  weak_factory_.GetWeakPtr(),
    133                  callback,
    134                  __func__));
    135 }
    136 
    137 void ChromeosWiMaxDeviceProxy::Connect(const RpcIdentifier& network,
    138                                        const KeyValueStore& parameters,
    139                                        Error* /*error*/,
    140                                        const ResultCallback& callback,
    141                                        int /*timeout*/) {
    142   proxy_->ConnectAsync(
    143       dbus::ObjectPath(network),
    144       parameters.properties(),
    145       base::Bind(&ChromeosWiMaxDeviceProxy::OnSuccess,
    146                  weak_factory_.GetWeakPtr(),
    147                  callback,
    148                  __func__),
    149       base::Bind(&ChromeosWiMaxDeviceProxy::OnFailure,
    150                  weak_factory_.GetWeakPtr(),
    151                  callback,
    152                  __func__));
    153 }
    154 
    155 void ChromeosWiMaxDeviceProxy::Disconnect(Error* /*error*/,
    156                                           const ResultCallback& callback,
    157                                           int /*timeout*/) {
    158   proxy_->DisconnectAsync(
    159       base::Bind(&ChromeosWiMaxDeviceProxy::OnSuccess,
    160                  weak_factory_.GetWeakPtr(),
    161                  callback,
    162                  __func__),
    163       base::Bind(&ChromeosWiMaxDeviceProxy::OnFailure,
    164                  weak_factory_.GetWeakPtr(),
    165                  callback,
    166                  __func__));
    167 }
    168 
    169 void ChromeosWiMaxDeviceProxy::set_networks_changed_callback(
    170     const NetworksChangedCallback& callback) {
    171   networks_changed_callback_ = callback;
    172 }
    173 
    174 void ChromeosWiMaxDeviceProxy::set_status_changed_callback(
    175     const StatusChangedCallback& callback) {
    176   status_changed_callback_ = callback;
    177 }
    178 
    179 uint8_t ChromeosWiMaxDeviceProxy::Index(Error* /*error*/) {
    180   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    181   if (!properties_->index.GetAndBlock()) {
    182     LOG(ERROR) << "Failed to get Index";
    183     return 0;
    184   }
    185   return properties_->index.value();
    186 }
    187 
    188 string ChromeosWiMaxDeviceProxy::Name(Error* /*error*/) {
    189   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    190   if (!properties_->name.GetAndBlock()) {
    191     LOG(ERROR) << "Failed to get Name";
    192     return string();
    193   }
    194   return properties_->name.value();
    195 }
    196 
    197 RpcIdentifiers ChromeosWiMaxDeviceProxy::Networks(Error* /*error*/) {
    198   SLOG(&proxy_->GetObjectPath(), 2) << __func__;
    199   RpcIdentifiers rpc_networks;
    200   KeyValueStore::ConvertPathsToRpcIdentifiers(properties_->networks.value(),
    201                                               &rpc_networks);
    202   return rpc_networks;
    203 }
    204 
    205 void ChromeosWiMaxDeviceProxy::OnSignalConnected(
    206     const string& interface_name, const string& signal_name, bool success) {
    207   SLOG(&proxy_->GetObjectPath(), 2) << __func__
    208       << "interface: " << interface_name << " signal: " << signal_name
    209       << "success: " << success;
    210   if (!success) {
    211     LOG(ERROR) << "Failed to connect signal " << signal_name
    212         << " to interface " << interface_name;
    213   }
    214 }
    215 
    216 void ChromeosWiMaxDeviceProxy::OnPropertyChanged(
    217     const std::string& property_name) {
    218   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << property_name;
    219 }
    220 
    221 void ChromeosWiMaxDeviceProxy::NetworksChanged(
    222     const vector<dbus::ObjectPath>& networks) {
    223   SLOG(&proxy_->GetObjectPath(), 2) << __func__
    224       << "(" << networks.size() << ")";
    225   if (networks_changed_callback_.is_null()) {
    226     return;
    227   }
    228   RpcIdentifiers rpc_networks;
    229   KeyValueStore::ConvertPathsToRpcIdentifiers(networks, &rpc_networks);
    230   networks_changed_callback_.Run(rpc_networks);
    231 }
    232 
    233 void ChromeosWiMaxDeviceProxy::StatusChanged(int32_t status) {
    234   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << status << ")";
    235   if (status_changed_callback_.is_null()) {
    236     return;
    237   }
    238   status_changed_callback_.Run(static_cast<DeviceStatus>(status));
    239 }
    240 
    241 void ChromeosWiMaxDeviceProxy::OnSuccess(const ResultCallback& callback,
    242                                          const string& method) {
    243   SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << method;
    244   Error error;
    245   callback.Run(error);
    246 }
    247 
    248 void ChromeosWiMaxDeviceProxy::OnFailure(const ResultCallback& callback,
    249                                          const string& method,
    250                                          brillo::Error* dbus_error) {
    251   Error error;
    252   Error::PopulateAndLog(
    253       FROM_HERE, &error, Error::kOperationFailed,
    254       base::StringPrintf("%s failed: %s %s",
    255                          method.c_str(),
    256                          dbus_error->GetCode().c_str(),
    257                          dbus_error->GetMessage().c_str()));
    258   callback.Run(error);
    259 }
    260 
    261 }  // namespace shill
    262