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_proxy.h" 18 19 #include <memory> 20 21 #include <base/bind.h> 22 23 #include "shill/cellular/cellular_error.h" 24 #include "shill/error.h" 25 #include "shill/logging.h" 26 27 using std::string; 28 29 namespace shill { 30 31 namespace Logging { 32 static auto kModuleLogScope = ScopeLogger::kDBus; 33 static string ObjectID(const dbus::ObjectPath* p) { return p->value(); } 34 } // namespace Logging 35 36 ChromeosModemProxy::ChromeosModemProxy(const scoped_refptr<dbus::Bus>& bus, 37 const string& path, 38 const string& service) 39 : proxy_( 40 new org::freedesktop::ModemManager::ModemProxy( 41 bus, service, dbus::ObjectPath(path))) { 42 // Register signal handlers. 43 proxy_->RegisterStateChangedSignalHandler( 44 base::Bind(&ChromeosModemProxy::StateChanged, 45 weak_factory_.GetWeakPtr()), 46 base::Bind(&ChromeosModemProxy::OnSignalConnected, 47 weak_factory_.GetWeakPtr())); 48 } 49 50 ChromeosModemProxy::~ChromeosModemProxy() {} 51 52 void ChromeosModemProxy::Enable( 53 bool enable, Error* error, const ResultCallback& callback, int timeout) { 54 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << enable; 55 proxy_->EnableAsync(enable, 56 base::Bind(&ChromeosModemProxy::OnEnableSuccess, 57 weak_factory_.GetWeakPtr(), 58 callback), 59 base::Bind(&ChromeosModemProxy::OnEnableFailure, 60 weak_factory_.GetWeakPtr(), 61 callback)); 62 } 63 64 void ChromeosModemProxy::Disconnect( 65 Error* error, const ResultCallback& callback, int timeout) { 66 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 67 proxy_->DisconnectAsync(base::Bind(&ChromeosModemProxy::OnDisconnectSuccess, 68 weak_factory_.GetWeakPtr(), 69 callback), 70 base::Bind(&ChromeosModemProxy::OnDisconnectFailure, 71 weak_factory_.GetWeakPtr(), 72 callback)); 73 } 74 75 void ChromeosModemProxy::GetModemInfo( 76 Error* error, const ModemInfoCallback& callback, int timeout) { 77 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 78 proxy_->GetInfoAsync(base::Bind(&ChromeosModemProxy::OnGetInfoSuccess, 79 weak_factory_.GetWeakPtr(), 80 callback), 81 base::Bind(&ChromeosModemProxy::OnGetInfoFailure, 82 weak_factory_.GetWeakPtr(), 83 callback)); 84 } 85 86 void ChromeosModemProxy::StateChanged( 87 uint32_t old, uint32_t _new, uint32_t reason) { 88 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << "(" << old 89 << ", " << _new << ", " << reason << ")"; 90 if (state_changed_callback_.is_null()) { 91 return; 92 } 93 state_changed_callback_.Run(old, _new, reason); 94 } 95 96 void ChromeosModemProxy::OnEnableSuccess(const ResultCallback& callback) { 97 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 98 callback.Run(Error()); 99 } 100 101 void ChromeosModemProxy::OnEnableFailure(const ResultCallback& callback, 102 brillo::Error* dbus_error) { 103 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 104 Error error; 105 CellularError::FromChromeosDBusError(dbus_error, &error); 106 callback.Run(error); 107 } 108 109 void ChromeosModemProxy::OnGetInfoSuccess(const ModemInfoCallback& callback, 110 const ModemHardwareInfo& info) { 111 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 112 callback.Run( 113 std::get<0>(info), std::get<1>(info), std::get<2>(info), Error()); 114 } 115 116 void ChromeosModemProxy::OnGetInfoFailure(const ModemInfoCallback& callback, 117 brillo::Error* dbus_error) { 118 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 119 Error error; 120 CellularError::FromChromeosDBusError(dbus_error, &error); 121 callback.Run("", "", "", error); 122 } 123 124 void ChromeosModemProxy::OnDisconnectSuccess(const ResultCallback& callback) { 125 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 126 callback.Run(Error()); 127 } 128 129 void ChromeosModemProxy::OnDisconnectFailure(const ResultCallback& callback, 130 brillo::Error* dbus_error) { 131 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 132 Error error; 133 CellularError::FromChromeosDBusError(dbus_error, &error); 134 callback.Run(error); 135 } 136 137 void ChromeosModemProxy::OnSignalConnected( 138 const string& interface_name, const string& signal_name, bool success) { 139 SLOG(&proxy_->GetObjectPath(), 2) << __func__ 140 << "interface: " << interface_name 141 << " signal: " << signal_name << "success: " << success; 142 if (!success) { 143 LOG(ERROR) << "Failed to connect signal " << signal_name 144 << " to interface " << interface_name; 145 } 146 } 147 148 } // namespace shill 149