15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROMEOS_DBUS_SHILL_CLIENT_HELPER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEOS_DBUS_SHILL_CLIENT_HELPER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_method_call_status.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_property_changed_observer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dbus { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Bus; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorResponse; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageWriter; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MethodCall; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjectPath; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjectProxy; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Response; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Signal; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace dbus 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class to help implement Shill clients. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShillClientHelper { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) class RefHolder; 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A callback to handle PropertyChanged signals. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(const std::string& name, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value)> PropertyChangedHandler; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A callback to handle responses for methods with DictionaryValue results. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& result)> DictionaryValueCallback; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A callback to handle responses for methods with DictionaryValue results. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is used by CallDictionaryValueMethodWithErrorCallback. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(const base::DictionaryValue& result)> 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValueCallbackWithoutStatus; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A callback to handle responses of methods returning a ListValue. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(const base::ListValue& result)> ListValueCallback; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A callback to handle errors for method call. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(const std::string& error_name, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& error_message)> ErrorCallback; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A callback that handles responses for methods with string results. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(const std::string& result)> StringCallback; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A callback that handles responses for methods with boolean results. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(bool result)> BooleanCallback; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Callback used to notify owner when this can be safely released. 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef base::Callback<void(ShillClientHelper* helper)> ReleasedCallback; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) explicit ShillClientHelper(dbus::ObjectProxy* proxy); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ShillClientHelper(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Sets |released_callback_|. This is optional and should only be called at 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // most once. 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void SetReleasedCallback(ReleasedCallback callback); 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds an |observer| of the PropertyChanged signal. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPropertyChangedObserver(ShillPropertyChangedObserver* observer); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes an |observer| of the PropertyChanged signal. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemovePropertyChangedObserver(ShillPropertyChangedObserver* observer); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Starts monitoring PropertyChanged signal. If there aren't observers for the 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PropertyChanged signal, the actual monitoring will be delayed until the 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // first observer is added. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MonitorPropertyChanged(const std::string& interface_name); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls a method without results. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallVoidMethod(dbus::MethodCall* method_call, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VoidDBusMethodCallback& callback); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls a method with an object path result. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallObjectPathMethod(dbus::MethodCall* method_call, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectPathDBusMethodCallback& callback); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls a method with an object path result where there is an error callback. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallObjectPathMethodWithErrorCallback( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall* method_call, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectPathCallback& callback, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls a method with a dictionary value result. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallDictionaryValueMethod(dbus::MethodCall* method_call, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValueCallback& callback); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls a method without results with error callback. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallVoidMethodWithErrorCallback(dbus::MethodCall* method_call, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calls a method with a boolean result with error callback. 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CallBooleanMethodWithErrorCallback( 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::MethodCall* method_call, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BooleanCallback& callback, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calls a method with a string result with error callback. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CallStringMethodWithErrorCallback(dbus::MethodCall* method_call, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StringCallback& callback, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls a method with a dictionary value result with error callback. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallDictionaryValueMethodWithErrorCallback( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall* method_call, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValueCallbackWithoutStatus& callback, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls a method with a boolean array result with error callback. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallListValueMethodWithErrorCallback( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall* method_call, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValueCallback& callback, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const dbus::ObjectProxy* object_proxy() const { return proxy_; } 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends the value (basic types and string-to-string dictionary) to the 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // writer as a variant. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AppendValueDataAsVariant(dbus::MessageWriter* writer, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Appends a string-to-variant dictionary to the writer. 1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static void AppendServicePropertiesDictionary( 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus::MessageWriter* writer, 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::DictionaryValue& dictionary); 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Reference / Ownership management. If the number of active refs (observers 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // + in-progress method calls) becomes 0, |released_callback_| (if set) will 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // be called. 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void AddRef(); 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void Release(); 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Starts monitoring PropertyChanged signal. 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MonitorPropertyChangedInternal(const std::string& interface_name); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the result of signal connection setup. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSignalConnected(const std::string& interface, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles PropertyChanged signal. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPropertyChanged(dbus::Signal* signal); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectProxy* proxy_; 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReleasedCallback released_callback_; 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int active_refs_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PropertyChangedHandler property_changed_handler_; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ObserverList<ShillPropertyChangedObserver, true /* check_empty */> 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_list_; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> interfaces_to_be_monitored_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This should remain the last member so it'll be destroyed and 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalidate its weak pointers before any other members are destroyed. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<ShillClientHelper> weak_ptr_factory_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShillClientHelper); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROMEOS_DBUS_SHILL_CLIENT_HELPER_H_ 191