Chromium Code Reviews| Index: chromeos/dbus/flimflam_device_client.cc |
| diff --git a/chromeos/dbus/flimflam_device_client.cc b/chromeos/dbus/flimflam_device_client.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..cf56c8410b165dc4f17acbbcef98a7c52a5e920b |
| --- /dev/null |
| +++ b/chromeos/dbus/flimflam_device_client.cc |
| @@ -0,0 +1,318 @@ |
| +// Copyright (c) 2012 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/flimflam_device_client.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/message_loop.h" |
| +#include "base/stl_util.h" |
| +#include "base/values.h" |
| +#include "dbus/bus.h" |
| +#include "dbus/message.h" |
| +#include "dbus/object_path.h" |
| +#include "dbus/object_proxy.h" |
| +#include "dbus/values_util.h" |
| +#include "third_party/cros_system_api/dbus/service_constants.h" |
| + |
| +namespace chromeos { |
| + |
| +namespace { |
| + |
| +// The FlimflamDeviceClient implementation. |
| +class FlimflamDeviceClientImpl : public FlimflamDeviceClient { |
| + public: |
| + explicit FlimflamDeviceClientImpl(dbus::Bus* bus) |
| + : bus_(bus), |
| + helpers_deleter_(&helpers_) { |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void SetPropertyChangedHandler( |
| + const dbus::ObjectPath& device_path, |
| + const PropertyChangedHandler& handler) OVERRIDE { |
| + GetHelper(device_path)->SetPropertyChangedHandler(handler); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void ResetPropertyChangedHandler( |
| + const dbus::ObjectPath& device_path) OVERRIDE { |
| + GetHelper(device_path)->ResetPropertyChangedHandler(); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void GetProperties(const dbus::ObjectPath& device_path, |
| + const DictionaryValueCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kGetPropertiesFunction); |
| + GetHelper(device_path)->CallDictionaryValueMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void ProposeScan(const dbus::ObjectPath& device_path, |
| + const VoidCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kProposeScanFunction); |
| + GetHelper(device_path)->CallVoidMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void SetProperty(const dbus::ObjectPath& device_path, |
| + const std::string& name, |
| + const base::Value& value, |
| + const VoidCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kSetPropertyFunction); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendString(name); |
| + FlimflamClientHelper::AppendValueDataAsVariant(&writer, value); |
| + GetHelper(device_path)->CallVoidMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void ClearProperty(const dbus::ObjectPath& device_path, |
| + const std::string& name, |
| + const VoidCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kClearPropertyFunction); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendString(name); |
| + GetHelper(device_path)->CallVoidMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void AddIPConfig(const dbus::ObjectPath& device_path, |
| + const std::string& method, |
| + const ObjectPathCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kAddIPConfigFunction); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendString(method); |
| + GetHelper(device_path)->CallObjectPathMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void RequirePin(const dbus::ObjectPath& device_path, |
| + const std::string& pin, |
| + bool require, |
| + const VoidCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kRequirePinFunction); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendString(pin); |
| + writer.AppendBool(require); |
| + GetHelper(device_path)->CallVoidMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void EnterPin(const dbus::ObjectPath& device_path, |
| + const std::string& pin, |
| + const VoidCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kEnterPinFunction); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendString(pin); |
| + GetHelper(device_path)->CallVoidMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void UnblockPin(const dbus::ObjectPath& device_path, |
| + const std::string& puk, |
| + const std::string& pin, |
| + const VoidCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kUnblockPinFunction); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendString(puk); |
| + writer.AppendString(pin); |
| + GetHelper(device_path)->CallVoidMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void ChangePin(const dbus::ObjectPath& device_path, |
| + const std::string& old_pin, |
| + const std::string& new_pin, |
| + const VoidCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kChangePinFunction); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendString(old_pin); |
| + writer.AppendString(new_pin); |
| + GetHelper(device_path)->CallVoidMethod(&method_call, callback); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void Register(const dbus::ObjectPath& device_path, |
| + const std::string& network_id, |
| + const VoidCallback& callback) OVERRIDE { |
| + dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, |
| + flimflam::kRegisterFunction); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendString(network_id); |
| + GetHelper(device_path)->CallVoidMethod(&method_call, callback); |
| + } |
| + |
| + private: |
| + typedef std::map<std::string, FlimflamClientHelper*> HelperMap; |
| + |
| + // Returns the corresponding FlimflamClientHelper for the profile. |
| + FlimflamClientHelper* GetHelper(const dbus::ObjectPath& device_path) { |
| + HelperMap::iterator it = helpers_.find(device_path.value()); |
| + if (it != helpers_.end()) |
| + return it->second; |
| + |
| + // There is no helper for the profile, create it. |
| + dbus::ObjectProxy* object_proxy = |
| + bus_->GetObjectProxy(flimflam::kFlimflamServiceName, device_path); |
| + FlimflamClientHelper* helper = new FlimflamClientHelper(object_proxy); |
| + helper->MonitorPropertyChanged(flimflam::kFlimflamDeviceInterface); |
| + helpers_.insert(HelperMap::value_type(device_path.value(), helper)); |
| + return helper; |
| + } |
| + |
| + dbus::Bus* bus_; |
| + HelperMap helpers_; |
| + STLValueDeleter<HelperMap> helpers_deleter_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(FlimflamDeviceClientImpl); |
| +}; |
| + |
| +// A stub implementation of FlimflamDeviceClient. |
| +class FlimflamDeviceClientStubImpl : public FlimflamDeviceClient { |
| + public: |
| + FlimflamDeviceClientStubImpl() : weak_ptr_factory_(this) {} |
| + |
| + virtual ~FlimflamDeviceClientStubImpl() {} |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void SetPropertyChangedHandler( |
| + const dbus::ObjectPath& device_path, |
| + const PropertyChangedHandler& handler) OVERRIDE {} |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void ResetPropertyChangedHandler( |
| + const dbus::ObjectPath& device_path) OVERRIDE {} |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void GetProperties(const dbus::ObjectPath& device_path, |
| + const DictionaryValueCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&FlimflamDeviceClientStubImpl::PassEmptyDictionaryValue, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + callback)); |
| + } |
| + |
| + // FlimflamProfileClient override. |
| + virtual void ProposeScan(const dbus::ObjectPath& device_path, |
| + const VoidCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS)); |
| + } |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void SetProperty(const dbus::ObjectPath& device_path, |
| + const std::string& name, |
| + const base::Value& value, |
| + const VoidCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS)); |
| + } |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void ClearProperty(const dbus::ObjectPath& device_path, |
| + const std::string& name, |
| + const VoidCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS)); |
| + } |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void AddIPConfig(const dbus::ObjectPath& device_path, |
| + const std::string& method, |
| + const ObjectPathCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS, |
| + dbus::ObjectPath())); |
| + } |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void RequirePin(const dbus::ObjectPath& device_path, |
| + const std::string& pin, |
| + bool require, |
| + const VoidCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS)); |
| + } |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void EnterPin(const dbus::ObjectPath& device_path, |
| + const std::string& pin, |
| + const VoidCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS)); |
| + } |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void UnblockPin(const dbus::ObjectPath& device_path, |
| + const std::string& puk, |
| + const std::string& pin, |
| + const VoidCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS)); |
| + } |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void ChangePin(const dbus::ObjectPath& device_path, |
| + const std::string& old_pin, |
| + const std::string& new_pin, |
| + const VoidCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS)); |
| + } |
| + |
| + // FlimflamDeviceClient override. |
| + virtual void Register(const dbus::ObjectPath& device_path, |
| + const std::string& network_id, |
| + const VoidCallback& callback) OVERRIDE { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + base::Bind(callback, |
| + DBUS_METHOD_CALL_SUCCESS)); |
|
stevenjb
2012/04/17 00:25:52
nit: Since these all do the exact same thing, woul
hashimoto
2012/04/17 02:26:06
Added PostSuccessVoidCallabck
|
| + } |
| + |
| + private: |
| + void PassEmptyDictionaryValue(const DictionaryValueCallback& callback) const { |
| + base::DictionaryValue dictionary; |
| + callback.Run(DBUS_METHOD_CALL_SUCCESS, dictionary); |
| + } |
| + |
| + base::WeakPtrFactory<FlimflamDeviceClientStubImpl> weak_ptr_factory_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(FlimflamDeviceClientStubImpl); |
| +}; |
| + |
| +} // namespace |
| + |
| +FlimflamDeviceClient::FlimflamDeviceClient() {} |
| + |
| +FlimflamDeviceClient::~FlimflamDeviceClient() {} |
| + |
| +// static |
| +FlimflamDeviceClient* FlimflamDeviceClient::Create( |
| + DBusClientImplementationType type, |
| + dbus::Bus* bus) { |
| + if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) |
| + return new FlimflamDeviceClientImpl(bus); |
| + DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
| + return new FlimflamDeviceClientStubImpl(); |
| +} |
| + |
| +} // namespace chromeos |