lib/dbus/FilterHelper: new class
This commit is contained in:
parent
178d115ccb
commit
65473b5113
50
src/lib/dbus/FilterHelper.cxx
Normal file
50
src/lib/dbus/FilterHelper.cxx
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright 2020 Max Kellermann <max.kellermann@gmail.com>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "FilterHelper.hxx"
|
||||
|
||||
namespace ODBus {
|
||||
|
||||
inline DBusHandlerResult
|
||||
FilterHelper::HandleMessage(DBusConnection *dbus_connection,
|
||||
DBusMessage *message) noexcept
|
||||
{
|
||||
return callback(dbus_connection, message);
|
||||
}
|
||||
|
||||
DBusHandlerResult
|
||||
FilterHelper::HandleMessage(DBusConnection *dbus_connection,
|
||||
DBusMessage *message,
|
||||
void *user_data) noexcept
|
||||
{
|
||||
auto &fh = *(FilterHelper *)user_data;
|
||||
return fh.HandleMessage(dbus_connection, message);
|
||||
}
|
||||
|
||||
} // namespace ODBus
|
102
src/lib/dbus/FilterHelper.hxx
Normal file
102
src/lib/dbus/FilterHelper.hxx
Normal file
@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright 2020 Max Kellermann <max.kellermann@gmail.com>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ODBUS_FILTER_HELPER_HXX
|
||||
#define ODBUS_FILTER_HELPER_HXX
|
||||
|
||||
#include "util/BindMethod.hxx"
|
||||
|
||||
#include <dbus/dbus.h>
|
||||
|
||||
#include <cassert>
|
||||
|
||||
namespace ODBus {
|
||||
|
||||
/**
|
||||
* A helper for dbus_connection_add_filter() and
|
||||
* dbus_connection_remove_filter().
|
||||
*/
|
||||
class FilterHelper final {
|
||||
DBusConnection *connection = nullptr;
|
||||
|
||||
using Callback = BoundMethod<DBusHandlerResult(DBusConnection *dbus_connection,
|
||||
DBusMessage *message) noexcept>;
|
||||
Callback callback;
|
||||
|
||||
public:
|
||||
FilterHelper() = default;
|
||||
|
||||
FilterHelper(DBusConnection *_connection, Callback _callback) noexcept {
|
||||
Add(_connection, _callback);
|
||||
}
|
||||
|
||||
~FilterHelper() noexcept {
|
||||
Remove();
|
||||
}
|
||||
|
||||
operator bool() const noexcept {
|
||||
return connection != nullptr;
|
||||
}
|
||||
|
||||
DBusConnection *GetConnection() noexcept {
|
||||
assert(connection != nullptr);
|
||||
|
||||
return connection;
|
||||
}
|
||||
|
||||
void Add(DBusConnection *_connection, Callback _callback) noexcept {
|
||||
assert(connection == nullptr);
|
||||
|
||||
connection = _connection;
|
||||
callback = _callback;
|
||||
|
||||
dbus_connection_add_filter(connection, HandleMessage, this,
|
||||
nullptr);
|
||||
}
|
||||
|
||||
void Remove() noexcept {
|
||||
if (!*this)
|
||||
return;
|
||||
|
||||
dbus_connection_remove_filter(connection, HandleMessage, this);
|
||||
connection = nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
DBusHandlerResult HandleMessage(DBusConnection *dbus_connection,
|
||||
DBusMessage *message) noexcept;
|
||||
|
||||
static DBusHandlerResult HandleMessage(DBusConnection *,
|
||||
DBusMessage *message,
|
||||
void *user_data) noexcept;
|
||||
};
|
||||
|
||||
} // namespace ODBus
|
||||
|
||||
#endif
|
@ -17,6 +17,7 @@ dbus = static_library(
|
||||
'dbus',
|
||||
'Connection.cxx',
|
||||
'Error.cxx',
|
||||
'FilterHelper.cxx',
|
||||
'Message.cxx',
|
||||
'UDisks2.cxx',
|
||||
'ScopeMatch.cxx',
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "lib/dbus/Connection.hxx"
|
||||
#include "lib/dbus/Error.hxx"
|
||||
#include "lib/dbus/Glue.hxx"
|
||||
#include "lib/dbus/FilterHelper.hxx"
|
||||
#include "lib/dbus/Message.hxx"
|
||||
#include "lib/dbus/AsyncRequest.hxx"
|
||||
#include "lib/dbus/ReadIter.hxx"
|
||||
@ -57,6 +58,8 @@ class UdisksNeighborExplorer final
|
||||
|
||||
Manual<SafeSingleton<ODBus::Glue>> dbus_glue;
|
||||
|
||||
ODBus::FilterHelper filter_helper;
|
||||
|
||||
ODBus::AsyncRequest list_request;
|
||||
|
||||
/**
|
||||
@ -97,9 +100,6 @@ private:
|
||||
|
||||
DBusHandlerResult HandleMessage(DBusConnection *dbus_connection,
|
||||
DBusMessage *message) noexcept;
|
||||
static DBusHandlerResult HandleMessage(DBusConnection *dbus_connection,
|
||||
DBusMessage *message,
|
||||
void *user_data) noexcept;
|
||||
};
|
||||
|
||||
inline void
|
||||
@ -119,9 +119,8 @@ UdisksNeighborExplorer::DoOpen()
|
||||
error.CheckThrow("DBus AddMatch error");
|
||||
|
||||
try {
|
||||
dbus_connection_add_filter(connection,
|
||||
HandleMessage, this,
|
||||
nullptr);
|
||||
filter_helper.Add(connection,
|
||||
BIND_THIS_METHOD(HandleMessage));
|
||||
|
||||
try {
|
||||
auto msg = Message::NewMethodCall(UDISKS2_INTERFACE,
|
||||
@ -132,9 +131,7 @@ UdisksNeighborExplorer::DoOpen()
|
||||
return OnListNotify(std::move(o));
|
||||
});
|
||||
} catch (...) {
|
||||
dbus_connection_remove_filter(connection,
|
||||
HandleMessage,
|
||||
this);
|
||||
filter_helper.Remove();
|
||||
throw;
|
||||
}
|
||||
} catch (...) {
|
||||
@ -163,7 +160,7 @@ UdisksNeighborExplorer::DoClose() noexcept
|
||||
|
||||
auto &connection = GetConnection();
|
||||
|
||||
dbus_connection_remove_filter(connection, HandleMessage, this);
|
||||
filter_helper.Remove();
|
||||
dbus_bus_remove_match(connection, udisks_neighbor_match, nullptr);
|
||||
|
||||
dbus_glue.Destruct();
|
||||
@ -263,16 +260,6 @@ UdisksNeighborExplorer::HandleMessage(DBusConnection *, DBusMessage *message) no
|
||||
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
||||
}
|
||||
|
||||
DBusHandlerResult
|
||||
UdisksNeighborExplorer::HandleMessage(DBusConnection *connection,
|
||||
DBusMessage *message,
|
||||
void *user_data) noexcept
|
||||
{
|
||||
auto &agent = *(UdisksNeighborExplorer *)user_data;
|
||||
|
||||
return agent.HandleMessage(connection, message);
|
||||
}
|
||||
|
||||
static std::unique_ptr<NeighborExplorer>
|
||||
udisks_neighbor_create(EventLoop &event_loop,
|
||||
NeighborListener &listener,
|
||||
|
Loading…
Reference in New Issue
Block a user