Index: chromeos/dbus/shill_service_client_stub.cc |
diff --git a/chromeos/dbus/shill_service_client_stub.cc b/chromeos/dbus/shill_service_client_stub.cc |
deleted file mode 100644 |
index c03fc486dbcdaabd5a0bf6223ee480f224704ab4..0000000000000000000000000000000000000000 |
--- a/chromeos/dbus/shill_service_client_stub.cc |
+++ /dev/null |
@@ -1,569 +0,0 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chromeos/dbus/shill_service_client_stub.h" |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/command_line.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/stl_util.h" |
-#include "base/strings/string_util.h" |
-#include "base/values.h" |
-#include "chromeos/chromeos_switches.h" |
-#include "chromeos/dbus/dbus_thread_manager.h" |
-#include "chromeos/dbus/shill_manager_client.h" |
-#include "chromeos/dbus/shill_property_changed_observer.h" |
-#include "chromeos/dbus/shill_stub_helper.h" |
-#include "chromeos/network/shill_property_util.h" |
-#include "dbus/bus.h" |
-#include "dbus/message.h" |
-#include "dbus/object_path.h" |
-#include "third_party/cros_system_api/dbus/service_constants.h" |
- |
-namespace chromeos { |
- |
-namespace { |
- |
-void ErrorFunction(const std::string& error_name, |
- const std::string& error_message) { |
- LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; |
-} |
- |
-void PassStubListValue(const ShillServiceClient::ListValueCallback& callback, |
- base::ListValue* value) { |
- callback.Run(*value); |
-} |
- |
-void PassStubServiceProperties( |
- const ShillServiceClient::DictionaryValueCallback& callback, |
- DBusMethodCallStatus call_status, |
- const base::DictionaryValue* properties) { |
- callback.Run(call_status, *properties); |
-} |
- |
-} // namespace |
- |
-ShillServiceClientStub::ShillServiceClientStub() : weak_ptr_factory_(this) { |
-} |
- |
-ShillServiceClientStub::~ShillServiceClientStub() { |
- STLDeleteContainerPairSecondPointers( |
- observer_list_.begin(), observer_list_.end()); |
-} |
- |
- |
-// ShillServiceClient overrides. |
- |
-void ShillServiceClientStub::Init(dbus::Bus* bus) { |
-} |
- |
-void ShillServiceClientStub::AddPropertyChangedObserver( |
- const dbus::ObjectPath& service_path, |
- ShillPropertyChangedObserver* observer) { |
- GetObserverList(service_path).AddObserver(observer); |
-} |
- |
-void ShillServiceClientStub::RemovePropertyChangedObserver( |
- const dbus::ObjectPath& service_path, |
- ShillPropertyChangedObserver* observer) { |
- GetObserverList(service_path).RemoveObserver(observer); |
-} |
- |
-void ShillServiceClientStub::GetProperties( |
- const dbus::ObjectPath& service_path, |
- const DictionaryValueCallback& callback) { |
- base::DictionaryValue* nested_dict = NULL; |
- scoped_ptr<base::DictionaryValue> result_properties; |
- DBusMethodCallStatus call_status; |
- stub_services_.GetDictionaryWithoutPathExpansion(service_path.value(), |
- &nested_dict); |
- if (nested_dict) { |
- result_properties.reset(nested_dict->DeepCopy()); |
- // Remove credentials that Shill wouldn't send. |
- result_properties->RemoveWithoutPathExpansion(shill::kPassphraseProperty, |
- NULL); |
- call_status = DBUS_METHOD_CALL_SUCCESS; |
- } else { |
- LOG(ERROR) << "Properties not found for: " << service_path.value(); |
- result_properties.reset(new base::DictionaryValue); |
- call_status = DBUS_METHOD_CALL_FAILURE; |
- } |
- |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&PassStubServiceProperties, |
- callback, |
- call_status, |
- base::Owned(result_properties.release()))); |
-} |
- |
-void ShillServiceClientStub::SetProperty(const dbus::ObjectPath& service_path, |
- const std::string& name, |
- const base::Value& value, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- if (!SetServiceProperty(service_path.value(), name, value)) { |
- LOG(ERROR) << "Service not found: " << service_path.value(); |
- error_callback.Run("Error.InvalidService", "Invalid Service"); |
- return; |
- } |
- base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
-} |
- |
-void ShillServiceClientStub::SetProperties( |
- const dbus::ObjectPath& service_path, |
- const base::DictionaryValue& properties, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- for (base::DictionaryValue::Iterator iter(properties); |
- !iter.IsAtEnd(); iter.Advance()) { |
- if (!SetServiceProperty(service_path.value(), iter.key(), iter.value())) { |
- LOG(ERROR) << "Service not found: " << service_path.value(); |
- error_callback.Run("Error.InvalidService", "Invalid Service"); |
- return; |
- } |
- } |
- base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
-} |
- |
-void ShillServiceClientStub::ClearProperty( |
- const dbus::ObjectPath& service_path, |
- const std::string& name, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- base::DictionaryValue* dict = NULL; |
- if (!stub_services_.GetDictionaryWithoutPathExpansion( |
- service_path.value(), &dict)) { |
- error_callback.Run("Error.InvalidService", "Invalid Service"); |
- return; |
- } |
- dict->RemoveWithoutPathExpansion(name, NULL); |
- // Note: Shill does not send notifications when properties are cleared. |
- base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
-} |
- |
-void ShillServiceClientStub::ClearProperties( |
- const dbus::ObjectPath& service_path, |
- const std::vector<std::string>& names, |
- const ListValueCallback& callback, |
- const ErrorCallback& error_callback) { |
- base::DictionaryValue* dict = NULL; |
- if (!stub_services_.GetDictionaryWithoutPathExpansion( |
- service_path.value(), &dict)) { |
- error_callback.Run("Error.InvalidService", "Invalid Service"); |
- return; |
- } |
- scoped_ptr<base::ListValue> results(new base::ListValue); |
- for (std::vector<std::string>::const_iterator iter = names.begin(); |
- iter != names.end(); ++iter) { |
- dict->RemoveWithoutPathExpansion(*iter, NULL); |
- // Note: Shill does not send notifications when properties are cleared. |
- results->AppendBoolean(true); |
- } |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&PassStubListValue, |
- callback, base::Owned(results.release()))); |
-} |
- |
-void ShillServiceClientStub::Connect(const dbus::ObjectPath& service_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "ShillServiceClientStub::Connect: " << service_path.value(); |
- base::DictionaryValue* service_properties = NULL; |
- if (!stub_services_.GetDictionary( |
- service_path.value(), &service_properties)) { |
- LOG(ERROR) << "Service not found: " << service_path.value(); |
- error_callback.Run("Error.InvalidService", "Invalid Service"); |
- return; |
- } |
- |
- // Set any other services of the same Type to 'offline' first, before setting |
- // State to Association which will trigger sorting Manager.Services and |
- // sending an update. |
- SetOtherServicesOffline(service_path.value()); |
- |
- // Set Associating. |
- base::StringValue associating_value(shill::kStateAssociation); |
- SetServiceProperty(service_path.value(), |
- shill::kStateProperty, |
- associating_value); |
- |
- // Stay Associating until the state is changed again after a delay. |
- base::TimeDelta delay; |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- chromeos::switches::kEnableStubInteractive)) { |
- const int kConnectDelaySeconds = 5; |
- delay = base::TimeDelta::FromSeconds(kConnectDelaySeconds); |
- } |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&ShillServiceClientStub::ContinueConnect, |
- weak_ptr_factory_.GetWeakPtr(), |
- service_path.value()), |
- delay); |
- |
- callback.Run(); |
-} |
- |
-void ShillServiceClientStub::Disconnect(const dbus::ObjectPath& service_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- base::Value* service; |
- if (!stub_services_.Get(service_path.value(), &service)) { |
- error_callback.Run("Error.InvalidService", "Invalid Service"); |
- return; |
- } |
- base::TimeDelta delay; |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- chromeos::switches::kEnableStubInteractive)) { |
- const int kConnectDelaySeconds = 2; |
- delay = base::TimeDelta::FromSeconds(kConnectDelaySeconds); |
- } |
- // Set Idle after a delay |
- base::StringValue idle_value(shill::kStateIdle); |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&ShillServiceClientStub::SetProperty, |
- weak_ptr_factory_.GetWeakPtr(), |
- service_path, |
- shill::kStateProperty, |
- idle_value, |
- base::Bind(&base::DoNothing), |
- error_callback), |
- delay); |
- callback.Run(); |
-} |
- |
-void ShillServiceClientStub::Remove(const dbus::ObjectPath& service_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
-} |
- |
-void ShillServiceClientStub::ActivateCellularModem( |
- const dbus::ObjectPath& service_path, |
- const std::string& carrier, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- base::DictionaryValue* service_properties = |
- GetModifiableServiceProperties(service_path.value(), false); |
- if (!service_properties) { |
- LOG(ERROR) << "Service not found: " << service_path.value(); |
- error_callback.Run("Error.InvalidService", "Invalid Service"); |
- } |
- SetServiceProperty(service_path.value(), |
- shill::kActivationStateProperty, |
- base::StringValue(shill::kActivationStateActivating)); |
- base::TimeDelta delay; |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- chromeos::switches::kEnableStubInteractive)) { |
- const int kConnectDelaySeconds = 2; |
- delay = base::TimeDelta::FromSeconds(kConnectDelaySeconds); |
- } |
- // Set Activated after a delay |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&ShillServiceClientStub::SetCellularActivated, |
- weak_ptr_factory_.GetWeakPtr(), |
- service_path, |
- error_callback), |
- delay); |
- |
- base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
-} |
- |
-void ShillServiceClientStub::CompleteCellularActivation( |
- const dbus::ObjectPath& service_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
-} |
- |
-void ShillServiceClientStub::GetLoadableProfileEntries( |
- const dbus::ObjectPath& service_path, |
- const DictionaryValueCallback& callback) { |
- // Provide a dictionary with a single { profile_path, service_path } entry |
- // if the Profile property is set, or an empty dictionary. |
- scoped_ptr<base::DictionaryValue> result_properties( |
- new base::DictionaryValue); |
- base::DictionaryValue* service_properties = |
- GetModifiableServiceProperties(service_path.value(), false); |
- if (service_properties) { |
- std::string profile_path; |
- if (service_properties->GetStringWithoutPathExpansion( |
- shill::kProfileProperty, &profile_path)) { |
- result_properties->SetStringWithoutPathExpansion( |
- profile_path, service_path.value()); |
- } |
- } else { |
- LOG(WARNING) << "Service not in profile: " << service_path.value(); |
- } |
- |
- DBusMethodCallStatus call_status = DBUS_METHOD_CALL_SUCCESS; |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&PassStubServiceProperties, |
- callback, |
- call_status, |
- base::Owned(result_properties.release()))); |
-} |
- |
-ShillServiceClient::TestInterface* ShillServiceClientStub::GetTestInterface() { |
- return this; |
-} |
- |
-// ShillServiceClient::TestInterface overrides. |
- |
-void ShillServiceClientStub::AddService(const std::string& service_path, |
- const std::string& name, |
- const std::string& type, |
- const std::string& state, |
- bool add_to_visible_list, |
- bool add_to_watch_list) { |
- std::string nstate = state; |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- chromeos::switches::kDefaultStubNetworkStateIdle)) { |
- nstate = shill::kStateIdle; |
- } |
- AddServiceWithIPConfig(service_path, name, type, nstate, "", |
- add_to_visible_list, add_to_watch_list); |
-} |
- |
-void ShillServiceClientStub::AddServiceWithIPConfig( |
- const std::string& service_path, |
- const std::string& name, |
- const std::string& type, |
- const std::string& state, |
- const std::string& ipconfig_path, |
- bool add_to_visible_list, |
- bool add_to_watch_list) { |
- DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> |
- AddManagerService(service_path, add_to_visible_list, add_to_watch_list); |
- |
- base::DictionaryValue* properties = |
- GetModifiableServiceProperties(service_path, true); |
- connect_behavior_.erase(service_path); |
- shill_property_util::SetSSID(name, properties); |
- properties->SetWithoutPathExpansion( |
- shill::kNameProperty, |
- base::Value::CreateStringValue(name)); |
- properties->SetWithoutPathExpansion( |
- shill::kDeviceProperty, |
- base::Value::CreateStringValue( |
- shill_stub_helper::DevicePathForType(type))); |
- properties->SetWithoutPathExpansion( |
- shill::kTypeProperty, |
- base::Value::CreateStringValue(type)); |
- properties->SetWithoutPathExpansion( |
- shill::kStateProperty, |
- base::Value::CreateStringValue(state)); |
- if (!ipconfig_path.empty()) |
- properties->SetWithoutPathExpansion( |
- shill::kIPConfigProperty, |
- base::Value::CreateStringValue(ipconfig_path)); |
-} |
- |
-void ShillServiceClientStub::RemoveService(const std::string& service_path) { |
- DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> |
- RemoveManagerService(service_path); |
- |
- stub_services_.RemoveWithoutPathExpansion(service_path, NULL); |
- connect_behavior_.erase(service_path); |
-} |
- |
-bool ShillServiceClientStub::SetServiceProperty(const std::string& service_path, |
- const std::string& property, |
- const base::Value& value) { |
- base::DictionaryValue* dict = NULL; |
- if (!stub_services_.GetDictionaryWithoutPathExpansion(service_path, &dict)) |
- return false; |
- |
- VLOG(1) << "Service.SetProperty: " << property << " = " << value |
- << " For: " << service_path; |
- |
- base::DictionaryValue new_properties; |
- std::string changed_property; |
- bool case_sensitive = true; |
- if (StartsWithASCII(property, "Provider.", case_sensitive) || |
- StartsWithASCII(property, "OpenVPN.", case_sensitive) || |
- StartsWithASCII(property, "L2TPIPsec.", case_sensitive)) { |
- // These properties are only nested within the Provider dictionary if read |
- // from Shill. |
- base::DictionaryValue* provider = new base::DictionaryValue; |
- provider->SetWithoutPathExpansion(property, value.DeepCopy()); |
- new_properties.SetWithoutPathExpansion(shill::kProviderProperty, provider); |
- changed_property = shill::kProviderProperty; |
- } else { |
- new_properties.SetWithoutPathExpansion(property, value.DeepCopy()); |
- changed_property = property; |
- } |
- |
- dict->MergeDictionary(&new_properties); |
- |
- if (property == shill::kStateProperty) { |
- // When State changes the sort order of Services may change. |
- DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> |
- SortManagerServices(); |
- } |
- |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&ShillServiceClientStub::NotifyObserversPropertyChanged, |
- weak_ptr_factory_.GetWeakPtr(), |
- dbus::ObjectPath(service_path), changed_property)); |
- return true; |
-} |
- |
-const base::DictionaryValue* ShillServiceClientStub::GetServiceProperties( |
- const std::string& service_path) const { |
- const base::DictionaryValue* properties = NULL; |
- stub_services_.GetDictionaryWithoutPathExpansion(service_path, &properties); |
- return properties; |
-} |
- |
-void ShillServiceClientStub::ClearServices() { |
- DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> |
- ClearManagerServices(); |
- |
- stub_services_.Clear(); |
- connect_behavior_.clear(); |
-} |
- |
-void ShillServiceClientStub::SetConnectBehavior(const std::string& service_path, |
- const base::Closure& behavior) { |
- connect_behavior_[service_path] = behavior; |
-} |
- |
-void ShillServiceClientStub::NotifyObserversPropertyChanged( |
- const dbus::ObjectPath& service_path, |
- const std::string& property) { |
- base::DictionaryValue* dict = NULL; |
- std::string path = service_path.value(); |
- if (!stub_services_.GetDictionaryWithoutPathExpansion(path, &dict)) { |
- LOG(ERROR) << "Notify for unknown service: " << path; |
- return; |
- } |
- base::Value* value = NULL; |
- if (!dict->GetWithoutPathExpansion(property, &value)) { |
- LOG(ERROR) << "Notify for unknown property: " |
- << path << " : " << property; |
- return; |
- } |
- FOR_EACH_OBSERVER(ShillPropertyChangedObserver, |
- GetObserverList(service_path), |
- OnPropertyChanged(property, *value)); |
-} |
- |
-base::DictionaryValue* ShillServiceClientStub::GetModifiableServiceProperties( |
- const std::string& service_path, bool create_if_missing) { |
- base::DictionaryValue* properties = NULL; |
- if (!stub_services_.GetDictionaryWithoutPathExpansion(service_path, |
- &properties) && |
- create_if_missing) { |
- properties = new base::DictionaryValue; |
- stub_services_.Set(service_path, properties); |
- } |
- return properties; |
-} |
- |
-ShillServiceClientStub::PropertyObserverList& |
-ShillServiceClientStub::GetObserverList(const dbus::ObjectPath& device_path) { |
- std::map<dbus::ObjectPath, PropertyObserverList*>::iterator iter = |
- observer_list_.find(device_path); |
- if (iter != observer_list_.end()) |
- return *(iter->second); |
- PropertyObserverList* observer_list = new PropertyObserverList(); |
- observer_list_[device_path] = observer_list; |
- return *observer_list; |
-} |
- |
-void ShillServiceClientStub::SetOtherServicesOffline( |
- const std::string& service_path) { |
- const base::DictionaryValue* service_properties = GetServiceProperties( |
- service_path); |
- if (!service_properties) { |
- LOG(ERROR) << "Missing service: " << service_path; |
- return; |
- } |
- std::string service_type; |
- service_properties->GetString(shill::kTypeProperty, &service_type); |
- // Set all other services of the same type to offline (Idle). |
- for (base::DictionaryValue::Iterator iter(stub_services_); |
- !iter.IsAtEnd(); iter.Advance()) { |
- std::string path = iter.key(); |
- if (path == service_path) |
- continue; |
- base::DictionaryValue* properties; |
- if (!stub_services_.GetDictionaryWithoutPathExpansion(path, &properties)) |
- NOTREACHED(); |
- |
- std::string type; |
- properties->GetString(shill::kTypeProperty, &type); |
- if (type != service_type) |
- continue; |
- properties->SetWithoutPathExpansion( |
- shill::kStateProperty, |
- base::Value::CreateStringValue(shill::kStateIdle)); |
- } |
-} |
- |
-void ShillServiceClientStub::SetCellularActivated( |
- const dbus::ObjectPath& service_path, |
- const ErrorCallback& error_callback) { |
- SetProperty(service_path, |
- shill::kActivationStateProperty, |
- base::StringValue(shill::kActivationStateActivated), |
- base::Bind(&base::DoNothing), |
- error_callback); |
- SetProperty(service_path, |
- shill::kConnectableProperty, |
- base::FundamentalValue(true), |
- base::Bind(&base::DoNothing), |
- error_callback); |
-} |
- |
-void ShillServiceClientStub::ContinueConnect( |
- const std::string& service_path) { |
- VLOG(1) << "ShillServiceClientStub::ContinueConnect: " << service_path; |
- base::DictionaryValue* service_properties = NULL; |
- if (!stub_services_.GetDictionary(service_path, &service_properties)) { |
- LOG(ERROR) << "Service not found: " << service_path; |
- return; |
- } |
- |
- if (ContainsKey(connect_behavior_, service_path)) { |
- const base::Closure& custom_connect_behavior = |
- connect_behavior_[service_path]; |
- custom_connect_behavior.Run(); |
- return; |
- } |
- |
- // No custom connect behavior set, continue with the default connect behavior. |
- std::string passphrase; |
- service_properties->GetStringWithoutPathExpansion( |
- shill::kPassphraseProperty, &passphrase); |
- if (passphrase == "failure") { |
- // Simulate a password failure. |
- SetServiceProperty(service_path, |
- shill::kStateProperty, |
- base::StringValue(shill::kStateFailure)); |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind( |
- base::IgnoreResult(&ShillServiceClientStub::SetServiceProperty), |
- weak_ptr_factory_.GetWeakPtr(), |
- service_path, |
- shill::kErrorProperty, |
- base::StringValue(shill::kErrorBadPassphrase))); |
- } else { |
- // Set Online. |
- SetServiceProperty(service_path, |
- shill::kStateProperty, |
- base::StringValue(shill::kStateOnline)); |
- } |
-} |
- |
-} // namespace chromeos |