diff options
Diffstat (limited to 'chromeos/dbus/shill_client_helper.h')
-rw-r--r-- | chromeos/dbus/shill_client_helper.h | 21 |
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_; |