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_gsm_card_proxy.h" 18 19 #include <memory> 20 21 #include <base/bind.h> 22 #if defined(__ANDROID__) 23 #include <dbus/service_constants.h> 24 #else 25 #include <chromeos/dbus/service_constants.h> 26 #endif // __ANDROID__ 27 28 #include "shill/cellular/cellular_error.h" 29 #include "shill/error.h" 30 #include "shill/logging.h" 31 32 using std::string; 33 34 namespace shill { 35 36 namespace Logging { 37 static auto kModuleLogScope = ScopeLogger::kDBus; 38 static string ObjectID(const dbus::ObjectPath* p) { return p->value(); } 39 } // namespace Logging 40 41 // static. 42 const char ChromeosModemGSMCardProxy::kPropertyEnabledFacilityLocks[] = 43 "EnabledFacilityLocks"; 44 45 ChromeosModemGSMCardProxy::PropertySet::PropertySet( 46 dbus::ObjectProxy* object_proxy, 47 const std::string& interface_name, 48 const PropertyChangedCallback& callback) 49 : dbus::PropertySet(object_proxy, interface_name, callback) { 50 RegisterProperty(kPropertyEnabledFacilityLocks, &enabled_facility_locks); 51 } 52 53 ChromeosModemGSMCardProxy::ChromeosModemGSMCardProxy( 54 const scoped_refptr<dbus::Bus>& bus, 55 const string& path, 56 const string& service) 57 : proxy_( 58 new org::freedesktop::ModemManager::Modem::Gsm::CardProxy( 59 bus, service, dbus::ObjectPath(path))) { 60 // Register properties. 61 properties_.reset( 62 new PropertySet( 63 proxy_->GetObjectProxy(), 64 cromo::kModemGsmCardInterface, 65 base::Bind(&ChromeosModemGSMCardProxy::OnPropertyChanged, 66 weak_factory_.GetWeakPtr()))); 67 68 // Connect property signals and initialize cached values. Based on 69 // recommendations from src/dbus/property.h. 70 properties_->ConnectSignals(); 71 properties_->GetAll(); 72 } 73 74 ChromeosModemGSMCardProxy::~ChromeosModemGSMCardProxy() {} 75 76 void ChromeosModemGSMCardProxy::GetIMEI( 77 Error* error, const GSMIdentifierCallback& callback, int timeout) { 78 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 79 proxy_->GetImeiAsync( 80 base::Bind(&ChromeosModemGSMCardProxy::OnGetGSMIdentifierSuccess, 81 weak_factory_.GetWeakPtr(), 82 callback, 83 "IMEI"), 84 base::Bind(&ChromeosModemGSMCardProxy::OnGetGSMIdentifierFailure, 85 weak_factory_.GetWeakPtr(), 86 callback, 87 "IMEI")); 88 } 89 90 void ChromeosModemGSMCardProxy::GetIMSI(Error* error, 91 const GSMIdentifierCallback& callback, 92 int timeout) { 93 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 94 proxy_->GetImsiAsync( 95 base::Bind(&ChromeosModemGSMCardProxy::OnGetGSMIdentifierSuccess, 96 weak_factory_.GetWeakPtr(), 97 callback, 98 "IMSI"), 99 base::Bind(&ChromeosModemGSMCardProxy::OnGetGSMIdentifierFailure, 100 weak_factory_.GetWeakPtr(), 101 callback, 102 "IMSI")); 103 } 104 105 void ChromeosModemGSMCardProxy::GetSPN(Error* error, 106 const GSMIdentifierCallback& callback, 107 int timeout) { 108 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 109 proxy_->GetSpnAsync( 110 base::Bind(&ChromeosModemGSMCardProxy::OnGetGSMIdentifierSuccess, 111 weak_factory_.GetWeakPtr(), 112 callback, 113 "SPN"), 114 base::Bind(&ChromeosModemGSMCardProxy::OnGetGSMIdentifierFailure, 115 weak_factory_.GetWeakPtr(), 116 callback, 117 "SPN")); 118 } 119 120 void ChromeosModemGSMCardProxy::GetMSISDN(Error* error, 121 const GSMIdentifierCallback& callback, 122 int timeout) { 123 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 124 proxy_->GetMsIsdnAsync( 125 base::Bind(&ChromeosModemGSMCardProxy::OnGetGSMIdentifierSuccess, 126 weak_factory_.GetWeakPtr(), 127 callback, 128 "MSIDN"), 129 base::Bind(&ChromeosModemGSMCardProxy::OnGetGSMIdentifierFailure, 130 weak_factory_.GetWeakPtr(), 131 callback, 132 "MSIDN")); 133 } 134 135 void ChromeosModemGSMCardProxy::EnablePIN(const string& pin, bool enabled, 136 Error* error, 137 const ResultCallback& callback, 138 int timeout) { 139 // pin is intentionally not logged. 140 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << enabled; 141 proxy_->EnablePinAsync( 142 pin, 143 enabled, 144 base::Bind(&ChromeosModemGSMCardProxy::OnOperationSuccess, 145 weak_factory_.GetWeakPtr(), 146 callback, 147 __func__), 148 base::Bind(&ChromeosModemGSMCardProxy::OnOperationFailure, 149 weak_factory_.GetWeakPtr(), 150 callback, 151 __func__)); 152 } 153 154 void ChromeosModemGSMCardProxy::SendPIN(const string& pin, 155 Error* error, 156 const ResultCallback& callback, 157 int timeout) { 158 // pin is intentionally not logged. 159 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 160 proxy_->SendPinAsync( 161 pin, 162 base::Bind(&ChromeosModemGSMCardProxy::OnOperationSuccess, 163 weak_factory_.GetWeakPtr(), 164 callback, 165 __func__), 166 base::Bind(&ChromeosModemGSMCardProxy::OnOperationFailure, 167 weak_factory_.GetWeakPtr(), 168 callback, 169 __func__)); 170 } 171 172 void ChromeosModemGSMCardProxy::SendPUK(const string& puk, const string& pin, 173 Error* error, 174 const ResultCallback& callback, 175 int timeout) { 176 // pin is intentionally not logged. 177 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 178 proxy_->SendPukAsync( 179 puk, 180 pin, 181 base::Bind(&ChromeosModemGSMCardProxy::OnOperationSuccess, 182 weak_factory_.GetWeakPtr(), 183 callback, 184 __func__), 185 base::Bind(&ChromeosModemGSMCardProxy::OnOperationFailure, 186 weak_factory_.GetWeakPtr(), 187 callback, 188 __func__)); 189 } 190 191 void ChromeosModemGSMCardProxy::ChangePIN(const string& old_pin, 192 const string& new_pin, 193 Error* error, 194 const ResultCallback& callback, 195 int timeout) { 196 // pin is intentionally not logged. 197 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 198 proxy_->SendPukAsync( 199 old_pin, 200 new_pin, 201 base::Bind(&ChromeosModemGSMCardProxy::OnOperationSuccess, 202 weak_factory_.GetWeakPtr(), 203 callback, 204 __func__), 205 base::Bind(&ChromeosModemGSMCardProxy::OnOperationFailure, 206 weak_factory_.GetWeakPtr(), 207 callback, 208 __func__)); 209 } 210 211 uint32_t ChromeosModemGSMCardProxy::EnabledFacilityLocks() { 212 SLOG(&proxy_->GetObjectPath(), 2) << __func__; 213 if (!properties_->enabled_facility_locks.GetAndBlock()) { 214 LOG(ERROR) << "Faild to get EnableFacilityLocks"; 215 return 0; 216 } 217 return properties_->enabled_facility_locks.value(); 218 } 219 220 void ChromeosModemGSMCardProxy::OnGetGSMIdentifierSuccess( 221 const GSMIdentifierCallback& callback, 222 const string& identifier_name, 223 const string& identifier_value) { 224 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << identifier_name 225 << " " << identifier_value; 226 callback.Run(identifier_value, Error()); 227 } 228 229 void ChromeosModemGSMCardProxy::OnGetGSMIdentifierFailure( 230 const GSMIdentifierCallback& callback, 231 const string& identifier_name, 232 brillo::Error* dbus_error) { 233 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << identifier_name; 234 Error error; 235 CellularError::FromChromeosDBusError(dbus_error, &error); 236 callback.Run("", error); 237 } 238 239 void ChromeosModemGSMCardProxy::OnOperationSuccess( 240 const ResultCallback& callback, 241 const string& operation_name) { 242 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << operation_name; 243 callback.Run(Error()); 244 } 245 246 void ChromeosModemGSMCardProxy::OnOperationFailure( 247 const ResultCallback& callback, 248 const string& operation_name, 249 brillo::Error* dbus_error) { 250 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << operation_name; 251 Error error; 252 CellularError::FromChromeosDBusError(dbus_error, &error); 253 callback.Run(error); 254 } 255 256 void ChromeosModemGSMCardProxy::OnPropertyChanged( 257 const string& property_name) { 258 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << property_name; 259 } 260 261 } // namespace shill 262