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