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_supplicant_network_proxy.h" 18 19 #include <string> 20 21 #include <base/bind.h> 22 23 #include "shill/logging.h" 24 #include "shill/supplicant/wpa_supplicant.h" 25 26 using std::string; 27 28 namespace shill { 29 30 namespace Logging { 31 static auto kModuleLogScope = ScopeLogger::kDBus; 32 static string ObjectID(const dbus::ObjectPath* p) { return p->value(); } 33 } 34 35 // static. 36 const char ChromeosSupplicantNetworkProxy::kInterfaceName[] = 37 "fi.w1.wpa_supplicant1.Network"; 38 const char ChromeosSupplicantNetworkProxy::kPropertyEnabled[] = "Enabled"; 39 const char ChromeosSupplicantNetworkProxy::kPropertyProperties[] = 40 "Properties"; 41 42 ChromeosSupplicantNetworkProxy::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(kPropertyEnabled, &enabled); 48 } 49 50 ChromeosSupplicantNetworkProxy::ChromeosSupplicantNetworkProxy( 51 const scoped_refptr<dbus::Bus>& bus, 52 const std::string& object_path) 53 : network_proxy_( 54 new fi::w1::wpa_supplicant1::NetworkProxy( 55 bus, 56 WPASupplicant::kDBusAddr, 57 dbus::ObjectPath(object_path))) { 58 // Register properties. 59 properties_.reset( 60 new PropertySet( 61 network_proxy_->GetObjectProxy(), 62 kInterfaceName, 63 base::Bind(&ChromeosSupplicantNetworkProxy::OnPropertyChanged, 64 weak_factory_.GetWeakPtr()))); 65 66 // Register signal handler. 67 network_proxy_->RegisterPropertiesChangedSignalHandler( 68 base::Bind(&ChromeosSupplicantNetworkProxy::PropertiesChanged, 69 weak_factory_.GetWeakPtr()), 70 base::Bind(&ChromeosSupplicantNetworkProxy::OnSignalConnected, 71 weak_factory_.GetWeakPtr())); 72 73 // Connect property signals and initialize cached values. Based on 74 // recommendations from src/dbus/property.h. 75 properties_->ConnectSignals(); 76 properties_->GetAll(); 77 } 78 79 ChromeosSupplicantNetworkProxy::~ChromeosSupplicantNetworkProxy() { 80 network_proxy_->ReleaseObjectProxy(base::Bind(&base::DoNothing)); 81 } 82 83 bool ChromeosSupplicantNetworkProxy::SetEnabled(bool enabled) { 84 SLOG(&network_proxy_->GetObjectPath(), 2) << __func__; 85 if(!properties_->enabled.SetAndBlock(enabled)) { 86 LOG(ERROR) << "Failed to SetEnabled: " << enabled; 87 return false; 88 } 89 return true; 90 } 91 92 void ChromeosSupplicantNetworkProxy::PropertiesChanged( 93 const brillo::VariantDictionary& /*properties*/) { 94 SLOG(&network_proxy_->GetObjectPath(), 2) << __func__; 95 } 96 97 void ChromeosSupplicantNetworkProxy::OnPropertyChanged( 98 const std::string& property_name) { 99 SLOG(&network_proxy_->GetObjectPath(), 2) << __func__ << ": " 100 << property_name; 101 } 102 103 // Called when signal is connected to the ObjectProxy. 104 void ChromeosSupplicantNetworkProxy::OnSignalConnected( 105 const std::string& interface_name, 106 const std::string& signal_name, 107 bool success) { 108 SLOG(&network_proxy_->GetObjectPath(), 2) << __func__ 109 << "interface: " << interface_name << " signal: " << signal_name 110 << "success: " << success; 111 if (!success) { 112 LOG(ERROR) << "Failed to connect signal " << signal_name 113 << " to interface " << interface_name; 114 } 115 } 116 117 } // namespace shill 118