FlightGear next
dbusobject.h
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#pragma once
8
9#include "dbusconnection.h"
10#include <deque>
11#include <mutex>
12
13namespace flightgear::swift {
16{
17public:
19 CDBusObject() = default;
20
22 virtual ~CDBusObject();
23
26 void setDBusConnection(const std::shared_ptr<CDBusConnection>& dbusConnection);
27
30 void registerDBusObjectPath(const std::string& interfaceName, const std::string& objectPath);
31
32protected:
34 virtual void dbusConnectedHandler() {}
35
37 virtual DBusHandlerResult dbusMessageHandler(const CDBusMessage& message) = 0;
38
40 virtual void dbusDisconnectedHandler() {}
41
43 void sendDBusSignal(const std::string& name);
44
46 void sendDBusMessage(const CDBusMessage& message);
47
49 void maybeSendEmptyDBusReply(bool wantsReply, const std::string& destination, dbus_uint32_t serial);
50
52 template <typename T>
53 void sendDBusReply(const std::string& destination, dbus_uint32_t serial, const T& argument)
54 {
55 CDBusMessage reply = CDBusMessage::createReply(destination, serial);
56 reply.beginArgumentWrite();
57 reply.appendArgument(argument);
58 m_dbusConnection->sendMessage(reply);
59 }
60
62 template <typename T>
63 void sendDBusReply(const std::string& destination, dbus_uint32_t serial, const std::vector<T>& array)
64 {
65 CDBusMessage reply = CDBusMessage::createReply(destination, serial);
66 reply.beginArgumentWrite();
67 reply.appendArgument(array);
68 m_dbusConnection->sendMessage(reply);
69 }
70
72 void queueDBusCall(const std::function<void()>& func);
73
76
77private:
78 static void dbusObjectPathUnregisterFunction(DBusConnection* connection, void* data);
79 static DBusHandlerResult dbusObjectPathMessageFunction(DBusConnection* connection, DBusMessage* message, void* data);
80
81 std::shared_ptr<CDBusConnection> m_dbusConnection;
82 std::string m_interfaceName;
83 std::string m_objectPath;
84
85 std::mutex m_mutex;
86 std::deque<std::function<void()>> m_queuedDBusCalls;
87
88 const DBusObjectPathVTable m_dbusObjectPathVTable = {dbusObjectPathUnregisterFunction, dbusObjectPathMessageFunction, nullptr, nullptr, nullptr, nullptr};
89};
90
91} // namespace flightgear::swift
void appendArgument(bool value)
Append argument.
static CDBusMessage createReply(const std::string &destination, dbus_uint32_t serial)
Creates a DBus message containing a DBus reply.
void beginArgumentWrite()
Begin writing argument.
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 sendDBusReply(const std::string &destination, dbus_uint32_t serial, const T &argument)
Send DBus reply.
Definition dbusobject.h:53
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 DBusHandlerResult dbusMessageHandler(const CDBusMessage &message)=0
DBus message handler.
virtual ~CDBusObject()
Destructor.
void sendDBusReply(const std::string &destination, dbus_uint32_t serial, const std::vector< T > &array)
Send DBus reply.
Definition dbusobject.h:63
void queueDBusCall(const std::function< void()> &func)
Queue a DBus call to be executed in a different thread.
const char * name
naCFunction func