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',
|
'dbus',
|
||||||
'Connection.cxx',
|
'Connection.cxx',
|
||||||
'Error.cxx',
|
'Error.cxx',
|
||||||
|
'FilterHelper.cxx',
|
||||||
'Message.cxx',
|
'Message.cxx',
|
||||||
'UDisks2.cxx',
|
'UDisks2.cxx',
|
||||||
'ScopeMatch.cxx',
|
'ScopeMatch.cxx',
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "lib/dbus/Connection.hxx"
|
#include "lib/dbus/Connection.hxx"
|
||||||
#include "lib/dbus/Error.hxx"
|
#include "lib/dbus/Error.hxx"
|
||||||
#include "lib/dbus/Glue.hxx"
|
#include "lib/dbus/Glue.hxx"
|
||||||
|
#include "lib/dbus/FilterHelper.hxx"
|
||||||
#include "lib/dbus/Message.hxx"
|
#include "lib/dbus/Message.hxx"
|
||||||
#include "lib/dbus/AsyncRequest.hxx"
|
#include "lib/dbus/AsyncRequest.hxx"
|
||||||
#include "lib/dbus/ReadIter.hxx"
|
#include "lib/dbus/ReadIter.hxx"
|
||||||
@ -57,6 +58,8 @@ class UdisksNeighborExplorer final
|
|||||||
|
|
||||||
Manual<SafeSingleton<ODBus::Glue>> dbus_glue;
|
Manual<SafeSingleton<ODBus::Glue>> dbus_glue;
|
||||||
|
|
||||||
|
ODBus::FilterHelper filter_helper;
|
||||||
|
|
||||||
ODBus::AsyncRequest list_request;
|
ODBus::AsyncRequest list_request;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -97,9 +100,6 @@ private:
|
|||||||
|
|
||||||
DBusHandlerResult HandleMessage(DBusConnection *dbus_connection,
|
DBusHandlerResult HandleMessage(DBusConnection *dbus_connection,
|
||||||
DBusMessage *message) noexcept;
|
DBusMessage *message) noexcept;
|
||||||
static DBusHandlerResult HandleMessage(DBusConnection *dbus_connection,
|
|
||||||
DBusMessage *message,
|
|
||||||
void *user_data) noexcept;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
@ -119,9 +119,8 @@ UdisksNeighborExplorer::DoOpen()
|
|||||||
error.CheckThrow("DBus AddMatch error");
|
error.CheckThrow("DBus AddMatch error");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
dbus_connection_add_filter(connection,
|
filter_helper.Add(connection,
|
||||||
HandleMessage, this,
|
BIND_THIS_METHOD(HandleMessage));
|
||||||
nullptr);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto msg = Message::NewMethodCall(UDISKS2_INTERFACE,
|
auto msg = Message::NewMethodCall(UDISKS2_INTERFACE,
|
||||||
@ -132,9 +131,7 @@ UdisksNeighborExplorer::DoOpen()
|
|||||||
return OnListNotify(std::move(o));
|
return OnListNotify(std::move(o));
|
||||||
});
|
});
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
dbus_connection_remove_filter(connection,
|
filter_helper.Remove();
|
||||||
HandleMessage,
|
|
||||||
this);
|
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
@ -163,7 +160,7 @@ UdisksNeighborExplorer::DoClose() noexcept
|
|||||||
|
|
||||||
auto &connection = GetConnection();
|
auto &connection = GetConnection();
|
||||||
|
|
||||||
dbus_connection_remove_filter(connection, HandleMessage, this);
|
filter_helper.Remove();
|
||||||
dbus_bus_remove_match(connection, udisks_neighbor_match, nullptr);
|
dbus_bus_remove_match(connection, udisks_neighbor_match, nullptr);
|
||||||
|
|
||||||
dbus_glue.Destruct();
|
dbus_glue.Destruct();
|
||||||
@ -263,16 +260,6 @@ UdisksNeighborExplorer::HandleMessage(DBusConnection *, DBusMessage *message) no
|
|||||||
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
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>
|
static std::unique_ptr<NeighborExplorer>
|
||||||
udisks_neighbor_create(EventLoop &event_loop,
|
udisks_neighbor_create(EventLoop &event_loop,
|
||||||
NeighborListener &listener,
|
NeighborListener &listener,
|
||||||
|
Loading…
Reference in New Issue
Block a user