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_mm1_modem_proxy.h" 18 19 #include <memory> 20 #include <tuple> 21 22 #include "shill/cellular/cellular_error.h" 23 #include "shill/logging.h" 24 25 using std::string; 26 27 namespace shill { 28 29 namespace Logging { 30 static auto kModuleLogScope = ScopeLogger::kDBus; 31 static string ObjectID(const dbus::ObjectPath* p) { return p->value(); } 32 } // namespace Logging 33 34 namespace mm1 { 35 36 ChromeosModemProxy::ChromeosModemProxy(const scoped_refptr<dbus::Bus>& bus, 37 const string& path, 38 const string& service) 39 : proxy_( 40 new org::freedesktop::ModemManager1::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(bool enable, 53 Error* error, 54 const ResultCallback& callback, 55 int timeout) { 56 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << enable; 57 proxy_->EnableAsync(enable, 58 base::Bind(&ChromeosModemProxy::OnOperationSuccess, 59 weak_factory_.GetWeakPtr(), 60 callback, 61 __func__), 62 base::Bind(&ChromeosModemProxy::OnOperationFailure, 63 weak_factory_.GetWeakPtr(), 64 callback, 65 __func__)); 66 } 67 68 void ChromeosModemProxy::CreateBearer( 69 const KeyValueStore& properties, 70 Error* error, 71 const RpcIdentifierCallback& callback, 72 int timeout) { 73 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 74 brillo::VariantDictionary properties_dict; 75 KeyValueStore::ConvertToVariantDictionary(properties, &properties_dict); 76 proxy_->CreateBearerAsync( 77 properties_dict, 78 base::Bind(&ChromeosModemProxy::OnCreateBearerSuccess, 79 weak_factory_.GetWeakPtr(), 80 callback), 81 base::Bind(&ChromeosModemProxy::OnCreateBearerFailure, 82 weak_factory_.GetWeakPtr(), 83 callback)); 84 } 85 86 void ChromeosModemProxy::DeleteBearer(const string& bearer, 87 Error* error, 88 const ResultCallback& callback, 89 int timeout) { 90 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << bearer; 91 proxy_->DeleteBearerAsync(dbus::ObjectPath(bearer), 92 base::Bind(&ChromeosModemProxy::OnOperationSuccess, 93 weak_factory_.GetWeakPtr(), 94 callback, 95 __func__), 96 base::Bind(&ChromeosModemProxy::OnOperationFailure, 97 weak_factory_.GetWeakPtr(), 98 callback, 99 __func__)); 100 } 101 102 void ChromeosModemProxy::Reset(Error* error, 103 const ResultCallback& callback, 104 int timeout) { 105 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 106 proxy_->ResetAsync(base::Bind(&ChromeosModemProxy::OnOperationSuccess, 107 weak_factory_.GetWeakPtr(), 108 callback, 109 __func__), 110 base::Bind(&ChromeosModemProxy::OnOperationFailure, 111 weak_factory_.GetWeakPtr(), 112 callback, 113 __func__)); 114 } 115 116 void ChromeosModemProxy::FactoryReset(const std::string& code, 117 Error* error, 118 const ResultCallback& callback, 119 int timeout) { 120 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 121 proxy_->FactoryResetAsync(code, 122 base::Bind(&ChromeosModemProxy::OnOperationSuccess, 123 weak_factory_.GetWeakPtr(), 124 callback, 125 __func__), 126 base::Bind(&ChromeosModemProxy::OnOperationFailure, 127 weak_factory_.GetWeakPtr(), 128 callback, 129 __func__)); 130 } 131 132 void ChromeosModemProxy::SetCurrentCapabilities(uint32_t capabilities, 133 Error* error, 134 const ResultCallback& callback, 135 int timeout) { 136 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << capabilities; 137 proxy_->SetCurrentCapabilitiesAsync( 138 capabilities, 139 base::Bind(&ChromeosModemProxy::OnOperationSuccess, 140 weak_factory_.GetWeakPtr(), 141 callback, 142 __func__), 143 base::Bind(&ChromeosModemProxy::OnOperationFailure, 144 weak_factory_.GetWeakPtr(), 145 callback, 146 __func__)); 147 } 148 149 void ChromeosModemProxy::SetCurrentModes(uint32_t allowed_modes, 150 uint32_t preferred_mode, 151 Error* error, 152 const ResultCallback& callback, 153 int timeout) { 154 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << allowed_modes 155 << " " << preferred_mode; 156 std::tuple<uint32_t, uint32_t> modes { allowed_modes, preferred_mode }; 157 proxy_->SetCurrentModesAsync( 158 modes, 159 base::Bind(&ChromeosModemProxy::OnOperationSuccess, 160 weak_factory_.GetWeakPtr(), 161 callback, 162 __func__), 163 base::Bind(&ChromeosModemProxy::OnOperationFailure, 164 weak_factory_.GetWeakPtr(), 165 callback, 166 __func__)); 167 } 168 169 void ChromeosModemProxy::SetCurrentBands(const std::vector<uint32_t>& bands, 170 Error* error, 171 const ResultCallback& callback, 172 int timeout) { 173 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 174 proxy_->SetCurrentBandsAsync( 175 bands, 176 base::Bind(&ChromeosModemProxy::OnOperationSuccess, 177 weak_factory_.GetWeakPtr(), 178 callback, 179 __func__), 180 base::Bind(&ChromeosModemProxy::OnOperationFailure, 181 weak_factory_.GetWeakPtr(), 182 callback, 183 __func__)); 184 } 185 186 void ChromeosModemProxy::Command(const std::string& cmd, 187 uint32_t user_timeout, 188 Error* error, 189 const StringCallback& callback, 190 int timeout) { 191 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << cmd; 192 proxy_->CommandAsync(cmd, 193 user_timeout, 194 base::Bind(&ChromeosModemProxy::OnCommandSuccess, 195 weak_factory_.GetWeakPtr(), 196 callback), 197 base::Bind(&ChromeosModemProxy::OnCommandFailure, 198 weak_factory_.GetWeakPtr(), 199 callback)); 200 } 201 202 void ChromeosModemProxy::SetPowerState(uint32_t power_state, 203 Error* error, 204 const ResultCallback& callback, 205 int timeout) { 206 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << power_state; 207 proxy_->SetPowerStateAsync( 208 power_state, 209 base::Bind(&ChromeosModemProxy::OnOperationSuccess, 210 weak_factory_.GetWeakPtr(), 211 callback, 212 __func__), 213 base::Bind(&ChromeosModemProxy::OnOperationFailure, 214 weak_factory_.GetWeakPtr(), 215 callback, 216 __func__)); 217 } 218 219 void ChromeosModemProxy::StateChanged( 220 int32_t old, int32_t _new, uint32_t reason) { 221 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 222 if (state_changed_callback_.is_null()) { 223 return; 224 } 225 state_changed_callback_.Run(old, _new, reason); 226 } 227 228 void ChromeosModemProxy::OnCreateBearerSuccess( 229 const RpcIdentifierCallback& callback, const dbus::ObjectPath& path) { 230 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << path.value(); 231 callback.Run(path.value(), Error()); 232 } 233 234 void ChromeosModemProxy::OnCreateBearerFailure( 235 const RpcIdentifierCallback& callback, brillo::Error* dbus_error) { 236 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 237 Error error; 238 CellularError::FromMM1ChromeosDBusError(dbus_error, &error); 239 callback.Run("", error); 240 } 241 242 void ChromeosModemProxy::OnCommandSuccess(const StringCallback& callback, 243 const string& response) { 244 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << response; 245 callback.Run(response, Error()); 246 } 247 248 void ChromeosModemProxy::OnCommandFailure(const StringCallback& callback, 249 brillo::Error* dbus_error) { 250 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 251 Error error; 252 CellularError::FromMM1ChromeosDBusError(dbus_error, &error); 253 callback.Run("", error); 254 } 255 256 void ChromeosModemProxy::OnOperationSuccess(const ResultCallback& callback, 257 const string& operation) { 258 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << operation; 259 callback.Run(Error()); 260 } 261 262 void ChromeosModemProxy::OnOperationFailure(const ResultCallback& callback, 263 const string& operation, 264 brillo::Error* dbus_error) { 265 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << operation; 266 Error error; 267 CellularError::FromMM1ChromeosDBusError(dbus_error, &error); 268 callback.Run(error); 269 } 270 271 void ChromeosModemProxy::OnSignalConnected( 272 const string& interface_name, const string& signal_name, bool success) { 273 SLOG(&proxy_->GetObjectPath(), 2) << __func__ 274 << "interface: " << interface_name 275 << " signal: " << signal_name << "success: " << success; 276 if (!success) { 277 LOG(ERROR) << "Failed to connect signal " << signal_name 278 << " to interface " << interface_name; 279 } 280 } 281 282 } // namespace mm1 283 } // namespace shill 284