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