FlightGear next
dbusserver.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#include "dbusserver.h"
9
10#include <cassert>
11#include <memory>
12
13namespace flightgear::swift {
14
16{
17 dbus_threads_init_default();
18}
19
24
25bool CDBusServer::listen(const std::string& address)
26{
27 DBusError error;
28 dbus_error_init(&error);
29 m_server.reset(dbus_server_listen(address.c_str(), &error));
30
31 if (!m_server) {
32 return false;
33 }
34
35 dbus_server_set_new_connection_function(m_server.get(), onNewConnection, this, nullptr);
36 return true;
37}
38
40{
41 return m_server ? dbus_server_get_is_connected(m_server.get()) : false;
42}
43
45{
46 if (m_server) { dbus_server_disconnect(m_server.get()); }
47}
48
49void CDBusServer::setDispatcher(CDBusDispatcher* dispatcher)
50{
51 assert(dispatcher);
52 assert(m_server);
53
54 m_dispatcher = dispatcher;
55
56 dbus_server_set_watch_functions(
57 m_server.get(),
58 dispatcher->m_watchCallbacks.add,
59 dispatcher->m_watchCallbacks.remove,
60 dispatcher->m_watchCallbacks.toggled,
61 &dispatcher->m_watchCallbacks, nullptr);
62
63 dbus_server_set_timeout_functions(
64 m_server.get(),
65 dispatcher->m_timeoutCallbacks.add,
66 dispatcher->m_timeoutCallbacks.remove,
67 dispatcher->m_timeoutCallbacks.toggled,
68 &dispatcher->m_timeoutCallbacks, nullptr);
69}
70
71void CDBusServer::onNewConnection(DBusServer*, DBusConnection* conn)
72{
73 auto dbusConnection = std::make_shared<CDBusConnection>(conn);
74 m_newConnectionFunc(dbusConnection);
75}
76
77void CDBusServer::onNewConnection(DBusServer* server, DBusConnection* conn, void* data)
78{
79 auto* obj = static_cast<CDBusServer*>(data);
80 obj->onNewConnection(server, conn);
81}
82
83} // namespace flightgear::swift
~CDBusServer() override
Destructor.
void setDispatcher(CDBusDispatcher *dispatcher)
Set the dispatcher.
bool isConnected() const
Is connected?
bool listen(const std::string &address)
Connect to bus.
void close()
Close connection.
static dbus_bool_t add(T *watch, void *refcon)
static void toggled(T *watch, void *refcon)
static void remove(T *watch, void *refcon)