summaryrefslogtreecommitdiffstats
path: root/chromeos/dbus/shill_client_helper.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromeos/dbus/shill_client_helper.h')
-rw-r--r--chromeos/dbus/shill_client_helper.h21
1 files changed, 20 insertions, 1 deletions
diff --git a/chromeos/dbus/shill_client_helper.h b/chromeos/dbus/shill_client_helper.h
index 12cd994..a52fc22 100644
--- a/chromeos/dbus/shill_client_helper.h
+++ b/chromeos/dbus/shill_client_helper.h
@@ -41,6 +41,8 @@ namespace chromeos {
// A class to help implement Shill clients.
class ShillClientHelper {
public:
+ class RefHolder;
+
// A callback to handle PropertyChanged signals.
typedef base::Callback<void(const std::string& name,
const base::Value& value)> PropertyChangedHandler;
@@ -68,11 +70,17 @@ class ShillClientHelper {
// A callback that handles responses for methods with boolean results.
typedef base::Callback<void(bool result)> BooleanCallback;
+ // Callback used to notify owner when this can be safely released.
+ typedef base::Callback<void(ShillClientHelper* helper)> ReleasedCallback;
- ShillClientHelper(dbus::Bus* bus, dbus::ObjectProxy* proxy);
+ explicit ShillClientHelper(dbus::ObjectProxy* proxy);
virtual ~ShillClientHelper();
+ // Sets |released_callback_|. This is optional and should only be called at
+ // most once.
+ void SetReleasedCallback(ReleasedCallback callback);
+
// Adds an |observer| of the PropertyChanged signal.
void AddPropertyChangedObserver(ShillPropertyChangedObserver* observer);
@@ -131,6 +139,8 @@ class ShillClientHelper {
const ListValueCallback& callback,
const ErrorCallback& error_callback);
+ const dbus::ObjectProxy* object_proxy() const { return proxy_; }
+
// Appends the value (basic types and string-to-string dictionary) to the
// writer as a variant.
static void AppendValueDataAsVariant(dbus::MessageWriter* writer,
@@ -141,6 +151,13 @@ class ShillClientHelper {
dbus::MessageWriter* writer,
const base::DictionaryValue& dictionary);
+ protected:
+ // Reference / Ownership management. If the number of active refs (observers
+ // + in-progress method calls) becomes 0, |released_callback_| (if set) will
+ // be called.
+ void AddRef();
+ void Release();
+
private:
// Starts monitoring PropertyChanged signal.
void MonitorPropertyChangedInternal(const std::string& interface_name);
@@ -154,6 +171,8 @@ class ShillClientHelper {
void OnPropertyChanged(dbus::Signal* signal);
dbus::ObjectProxy* proxy_;
+ ReleasedCallback released_callback_;
+ int active_refs_;
PropertyChangedHandler property_changed_handler_;
ObserverList<ShillPropertyChangedObserver, true /* check_empty */>
observer_list_;