swift
dbusobject.h
1 // SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #ifndef SWIFT_SIM_XSWIFTBUS_DBUSOBJECT_H
5 #define SWIFT_SIM_XSWIFTBUS_DBUSOBJECT_H
6 // clang-format off
7 #include <deque>
8 #include <mutex>
9 
10 #include "dbusconnection.h"
11 #include "settings.h"
12 
13 #include <XPLM/XPLMDisplay.h>
14 // clang-format on
15 
16 namespace XSwiftBus
17 {
19  class CDBusObject : public CSettingsAware
20  {
21  public:
23  CDBusObject(CSettingsProvider *settingsProvider);
24 
26  virtual ~CDBusObject();
27 
30  void setDBusConnection(const std::shared_ptr<CDBusConnection> &dbusConnection);
31 
34  void registerDBusObjectPath(const std::string &interfaceName, const std::string &objectPath);
35 
36  protected:
38  virtual void dbusConnectedHandler() {}
39 
41  virtual DBusHandlerResult dbusMessageHandler(const CDBusMessage &message) = 0;
42 
44  virtual void dbusDisconnectedHandler() {}
45 
47  void sendDBusSignal(const std::string &name);
48 
50  void sendDBusMessage(const CDBusMessage &message);
51 
53  void maybeSendEmptyDBusReply(bool wantsReply, const std::string &destination, dbus_uint32_t serial);
54 
56  template <typename T>
57  void sendDBusReply(const std::string &destination, dbus_uint32_t serial, const T &argument)
58  {
59  CDBusMessage reply = CDBusMessage::createReply(destination, serial);
60  reply.beginArgumentWrite();
61  reply.appendArgument(argument);
62  m_dbusConnection->sendMessage(reply);
63  }
64 
66  template <typename T>
67  void sendDBusReply(const std::string &destination, dbus_uint32_t serial, const std::vector<T> &array)
68  {
69  CDBusMessage reply = CDBusMessage::createReply(destination, serial);
70  reply.beginArgumentWrite();
71  reply.appendArgument(array);
72  m_dbusConnection->sendMessage(reply);
73  }
74 
76  void queueDBusCall(const std::function<void()> &func);
77 
79  void invokeQueuedDBusCalls();
80 
81  private:
82  static void dbusObjectPathUnregisterFunction(DBusConnection *connection, void *data);
83  static DBusHandlerResult dbusObjectPathMessageFunction(DBusConnection *connection, DBusMessage *message,
84  void *data);
85 
86  std::shared_ptr<CDBusConnection> m_dbusConnection;
87  std::string m_interfaceName;
88  std::string m_objectPath;
89 
90  std::mutex m_mutex;
91  std::deque<std::function<void()>> m_qeuedDBusCalls;
92 
93  const DBusObjectPathVTable m_dbusObjectPathVTable = {
94  dbusObjectPathUnregisterFunction, dbusObjectPathMessageFunction, nullptr, nullptr, nullptr, nullptr
95  };
96  };
97 } // namespace XSwiftBus
98 
99 #endif // SWIFT_SIM_XSWIFTBUS_DBUSOBJECT_H
void appendArgument(bool value)
Append argument. Make sure to call.
Definition: dbusmessage.cpp:55
void beginArgumentWrite()
Begin writing argument.
Definition: dbusmessage.cpp:53
static CDBusMessage createReply(const std::string &destination, dbus_uint32_t serial)
Creates a DBus message containing a DBus reply.
DBus base object.
Definition: dbusobject.h:20
void queueDBusCall(const std::function< void()> &func)
Queue a DBus call to be executed in a different thread.
Definition: dbusobject.cpp:56
void registerDBusObjectPath(const std::string &interfaceName, const std::string &objectPath)
Register itself with interfaceName and objectPath.
Definition: dbusobject.cpp:26
void sendDBusSignal(const std::string &name)
Send DBus signal.
Definition: dbusobject.cpp:34
void maybeSendEmptyDBusReply(bool wantsReply, const std::string &destination, dbus_uint32_t serial)
Maybe sends an empty DBus reply (acknowledgement)
Definition: dbusobject.cpp:47
void sendDBusReply(const std::string &destination, dbus_uint32_t serial, const std::vector< T > &array)
Send DBus reply.
Definition: dbusobject.h:67
void sendDBusMessage(const CDBusMessage &message)
Send DBus message.
Definition: dbusobject.cpp:41
virtual void dbusConnectedHandler()
Handler which is called when DBusCconnection is established.
Definition: dbusobject.h:38
virtual void dbusDisconnectedHandler()
Handler which is called when DBusConnection disconnected.
Definition: dbusobject.h:44
void invokeQueuedDBusCalls()
Invoke all pending DBus calls. They will be executed in the calling thread.
Definition: dbusobject.cpp:62
void sendDBusReply(const std::string &destination, dbus_uint32_t serial, const T &argument)
Send DBus reply.
Definition: dbusobject.h:57
CDBusObject(CSettingsProvider *settingsProvider)
Constructor.
Definition: dbusobject.cpp:10
void setDBusConnection(const std::shared_ptr< CDBusConnection > &dbusConnection)
Set the assigned DBus connection.
Definition: dbusobject.cpp:17
virtual ~CDBusObject()
Destructor.
Definition: dbusobject.cpp:12
virtual DBusHandlerResult dbusMessageHandler(const CDBusMessage &message)=0
DBus message handler.
Something having access to the settings.
Definition: settings.h:60
Something owning the settings.
Definition: settings.h:31
Plugin loaded by X-Plane which publishes a DBus service.
Definition: command.h:14