// 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. #ifndef CHROMEOS_DBUS_FLIMFLAM_CLIENT_HELPER_H_ #define CHROMEOS_DBUS_FLIMFLAM_CLIENT_HELPER_H_ #include #include "base/basictypes.h" #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "chromeos/dbus/blocking_method_caller.h" #include "chromeos/dbus/dbus_method_call_status.h" namespace base { class Value; class DictionaryValue; } // namespace base namespace dbus { class Bus; class ErrorResponse; class MessageWriter; class MethodCall; class ObjectPath; class ObjectProxy; class Response; class Signal; } // namespace dbus namespace chromeos { // A class to help implement Flimflam clients. class FlimflamClientHelper { public: // A callback to handle PropertyChanged signals. typedef base::Callback PropertyChangedHandler; // A callback to handle responses for methods without results. typedef base::Callback VoidCallback; // A callback to handle responses for methods with ObjectPath results. typedef base::Callback ObjectPathCallback; // A callback to handle responses for methods with DictionaryValue results. typedef base::Callback DictionaryValueCallback; // A callback to handle erros for method call. typedef base::Callback ErrorCallback; FlimflamClientHelper(dbus::Bus* bus, dbus::ObjectProxy* proxy); virtual ~FlimflamClientHelper(); // Sets PropertyChanged signal handler. void SetPropertyChangedHandler(const PropertyChangedHandler& handler); // Resets PropertyChanged signal handler. void ResetPropertyChangedHandler(); // Starts monitoring PropertyChanged signal. void MonitorPropertyChanged(const std::string& interface_name); // Calls a method without results. void CallVoidMethod(dbus::MethodCall* method_call, const VoidCallback& callback); // Calls a method with an object path result. void CallObjectPathMethod(dbus::MethodCall* method_call, const ObjectPathCallback& callback); // Calls a method with a dictionary value result. void CallDictionaryValueMethod(dbus::MethodCall* method_call, const DictionaryValueCallback& callback); // Calls a method without results with error callback. void CallVoidMethodWithErrorCallback(dbus::MethodCall* method_call, const base::Closure& callback, const ErrorCallback& error_callback); // DEPRECATED DO NOT USE: Calls a method without results. bool CallVoidMethodAndBlock(dbus::MethodCall* method_call); // DEPRECATED DO NOT USE: Calls a method with an object path result. dbus::ObjectPath CallObjectPathMethodAndBlock(dbus::MethodCall* method_call); // DEPRECATED DO NOT USE: Calls a method with a dictionary value result. // The caller is responsible to delete the result. // This method returns NULL when method call fails. base::DictionaryValue* CallDictionaryValueMethodAndBlock( dbus::MethodCall* method_call); // Appends the value (basic types and string-to-string dictionary) to the // writer as a variant. static void AppendValueDataAsVariant(dbus::MessageWriter* writer, const base::Value& value); private: // Handles the result of signal connection setup. void OnSignalConnected(const std::string& interface, const std::string& signal, bool success); // Handles PropertyChanged signal. void OnPropertyChanged(dbus::Signal* signal); // Handles responses for methods without results. void OnVoidMethod(const VoidCallback& callback, dbus::Response* response); // Handles responses for methods with ObjectPath results. void OnObjectPathMethod(const ObjectPathCallback& callback, dbus::Response* response); // Handles responses for methods with DictionaryValue results. void OnDictionaryValueMethod(const DictionaryValueCallback& callback, dbus::Response* response); // Handles responses for methods without results. // Used by CallVoidMethodWithErrorCallback(). void OnVoidMethodWithErrorCallback(const base::Closure& callback, dbus::Response* response); // Handles errors for method calls. void OnError(const ErrorCallback& error_callback, dbus::ErrorResponse* response); base::WeakPtrFactory weak_ptr_factory_; // TODO(hashimoto): Remove this when we no longer need to make blocking calls. BlockingMethodCaller blocking_method_caller_; dbus::ObjectProxy* proxy_; PropertyChangedHandler property_changed_handler_; DISALLOW_COPY_AND_ASSIGN(FlimflamClientHelper); }; } // namespace chromeos #endif // CHROMEOS_DBUS_FLIMFLAM_CLIENT_HELPER_H_