swift
dbusobject.cpp
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 #include "dbusobject.h"
5 
6 #include <cassert>
7 
8 namespace XSwiftBus
9 {
10  CDBusObject::CDBusObject(CSettingsProvider *settingsProvider) : CSettingsAware(settingsProvider) {}
11 
13  {
14  if (m_dbusConnection) { m_dbusConnection->unregisterDisconnectedCallback(this); }
15  };
16 
17  void CDBusObject::setDBusConnection(const std::shared_ptr<CDBusConnection> &dbusConnection)
18  {
19  m_dbusConnection = dbusConnection;
21  CDBusConnection::DisconnectedCallback disconnectedHandler =
22  std::bind(&CDBusObject::dbusDisconnectedHandler, this);
23  m_dbusConnection->registerDisconnectedCallback(this, disconnectedHandler);
24  }
25 
26  void CDBusObject::registerDBusObjectPath(const std::string &interfaceName, const std::string &objectPath)
27  {
28  assert(m_dbusConnection);
29  m_interfaceName = interfaceName;
30  m_objectPath = objectPath;
31  m_dbusConnection->registerObjectPath(this, interfaceName, objectPath, m_dbusObjectPathVTable);
32  }
33 
34  void CDBusObject::sendDBusSignal(const std::string &name)
35  {
36  if (!m_dbusConnection) { return; }
37  CDBusMessage signal = CDBusMessage::createSignal(m_objectPath, m_interfaceName, name);
38  m_dbusConnection->sendMessage(signal);
39  }
40 
42  {
43  if (!m_dbusConnection) { return; }
44  m_dbusConnection->sendMessage(message);
45  }
46 
47  void CDBusObject::maybeSendEmptyDBusReply(bool wantsReply, const std::string &destination, dbus_uint32_t serial)
48  {
49  if (wantsReply)
50  {
51  CDBusMessage reply = CDBusMessage::createReply(destination, serial);
52  m_dbusConnection->sendMessage(reply);
53  }
54  }
55 
56  void CDBusObject::queueDBusCall(const std::function<void()> &func)
57  {
58  std::lock_guard<std::mutex> lock(m_mutex);
59  m_qeuedDBusCalls.push_back(func);
60  }
61 
63  {
64  std::lock_guard<std::mutex> lock(m_mutex);
65  while (!m_qeuedDBusCalls.empty())
66  {
67  m_qeuedDBusCalls.front()();
68  m_qeuedDBusCalls.pop_front();
69  }
70  }
71 
72  void CDBusObject::dbusObjectPathUnregisterFunction(DBusConnection *connection, void *data)
73  {
74  (void)connection; // unused
75  (void)data; // unused
76  }
77 
78  DBusHandlerResult CDBusObject::dbusObjectPathMessageFunction(DBusConnection *connection, DBusMessage *message,
79  void *data)
80  {
81  (void)connection; // unused
82 
83  auto *obj = static_cast<CDBusObject *>(data);
84 
85  DBusError err;
86  dbus_error_init(&err);
87 
88  CDBusMessage dbusMessage(message);
89  return obj->dbusMessageHandler(dbusMessage);
90  }
91 
92 } // namespace XSwiftBus
std::function< void()> DisconnectedCallback
Disconnect Callback.
static CDBusMessage createReply(const std::string &destination, dbus_uint32_t serial)
Creates a DBus message containing a DBus reply.
static CDBusMessage createSignal(const std::string &path, const std::string &interfaceName, const std::string &signalName)
Creates a DBus message containing a DBus signal.
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 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
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
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