FlightGear next
dbusobject.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: (C) 2019-2022 swift Project Community / Contributors (https://swift-project.org/)
3 * SPDX-FileCopyrightText: (C) 2019-2022 Lars Toenning <dev@ltoenning.de>
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "dbusobject.h"
8
9#include <algorithm>
10#include <cassert>
11
12namespace flightgear::swift {
13
15{
16 if (m_dbusConnection) { m_dbusConnection->unregisterDisconnectedCallback(this); }
17};
18
19void CDBusObject::setDBusConnection(const std::shared_ptr<CDBusConnection>& dbusConnection)
20{
21 m_dbusConnection = dbusConnection;
24 m_dbusConnection->registerDisconnectedCallback(this, disconnectedHandler);
25}
26
27void CDBusObject::registerDBusObjectPath(const std::string& interfaceName, const std::string& objectPath)
28{
29 assert(m_dbusConnection);
30 m_interfaceName = interfaceName;
31 m_objectPath = objectPath;
32 m_dbusConnection->registerObjectPath(this, interfaceName, objectPath, m_dbusObjectPathVTable);
33}
34
35void CDBusObject::sendDBusSignal(const std::string& name)
36{
37 if (!m_dbusConnection) { return; }
38 CDBusMessage signal = CDBusMessage::createSignal(m_objectPath, m_interfaceName, name);
39 m_dbusConnection->sendMessage(signal);
40}
41
43{
44 if (!m_dbusConnection) { return; }
45 m_dbusConnection->sendMessage(message);
46}
47
48void CDBusObject::maybeSendEmptyDBusReply(bool wantsReply, const std::string& destination, dbus_uint32_t serial)
49{
50 if (wantsReply) {
51 CDBusMessage reply = CDBusMessage::createReply(destination, serial);
52 m_dbusConnection->sendMessage(reply);
53 }
54}
55
56void CDBusObject::queueDBusCall(const std::function<void()>& func)
57{
58 std::lock_guard<std::mutex> lock(m_mutex);
59 m_queuedDBusCalls.push_back(func);
60}
61
63{
64 std::lock_guard<std::mutex> lock(m_mutex);
65 std::for_each(m_queuedDBusCalls.begin(), m_queuedDBusCalls.end(),
66 [](const auto& dbusCall) { dbusCall(); });
67 m_queuedDBusCalls.clear();
68}
69
70void CDBusObject::dbusObjectPathUnregisterFunction(DBusConnection* connection, void* data)
71{
72 (void)connection; // unused
73 (void)data; // unused
74}
75
76DBusHandlerResult CDBusObject::dbusObjectPathMessageFunction(DBusConnection* connection, DBusMessage* message, void* data)
77{
78 (void)connection; // unused
79
80 auto* obj = static_cast<CDBusObject*>(data);
81
82 DBusError err;
83 dbus_error_init(&err);
84
85 CDBusMessage dbusMessage(message);
86 return obj->dbusMessageHandler(dbusMessage);
87}
88
89} // namespace flightgear::swift
std::function< void()> DisconnectedCallback
Disconnect Callback.
static CDBusMessage createSignal(const std::string &path, const std::string &interfaceName, const std::string &signalName)
Creates a DBus message containing a DBus signal.
static CDBusMessage createReply(const std::string &destination, dbus_uint32_t serial)
Creates a DBus message containing a DBus reply.
virtual void dbusDisconnectedHandler()
Handler which is called when DBusConnection disconnected.
Definition dbusobject.h:40
void registerDBusObjectPath(const std::string &interfaceName, const std::string &objectPath)
Register itself with interfaceName and objectPath.
void sendDBusMessage(const CDBusMessage &message)
Send DBus message.
void invokeQueuedDBusCalls()
Invoke all pending DBus calls. They will be executed in the calling thread.
void sendDBusSignal(const std::string &name)
Send DBus signal.
virtual void dbusConnectedHandler()
Handler which is called when DBusCconnection is established.
Definition dbusobject.h:34
CDBusObject()=default
Constructor.
void setDBusConnection(const std::shared_ptr< CDBusConnection > &dbusConnection)
Set the assigned DBus connection.
void maybeSendEmptyDBusReply(bool wantsReply, const std::string &destination, dbus_uint32_t serial)
Maybe sends an empty DBus reply (acknowledgement)
virtual ~CDBusObject()
Destructor.
void queueDBusCall(const std::function< void()> &func)
Queue a DBus call to be executed in a different thread.
const char * name
naCFunction func