summaryrefslogtreecommitdiffstats
path: root/src/portal_daemon.cpp
blob: cc8615fbf9dda8843dc0d6170b90df1f4550a128 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*******************************************************************************
  XDG desktop portal implementation for TDE
  Copyright © 2024 Mavridis Philippe <mavridisf@gmail.com>

  Partially based on code from kdbusnotification
  Copyright © 2021 Emanoil Kotsev <deloptes@gmail.com>

  This program or library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation; either version 2.1 of the License,
  or (at your option) any later version.

  This library is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
  details.

  You should have received a copy of the GNU Lesser General Public License
  along with this library; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

  Improvements and feedback are welcome!
*******************************************************************************/

// TQt
#include <tqtimer.h>

// TDE
#include <kdebug.h>

// Portal
#include "portal_daemon.h"
#include "portal_daemon.moc"

PortalDaemon::PortalDaemon()
: KUniqueApplication(),
  m_retryCount(0)
{
    connectDBus();
}

PortalDaemon::~PortalDaemon()
{
    disconnectDBus();
}

void PortalDaemon::connectDBus()
{
    if (d_desktop) disconnectDBus();

    m_connection = TQT_DBusConnection::addConnection(
        TQT_DBusConnection::SessionBus,
        DBUS_PORTAL_SERVICE
    );

    if (m_connection.isConnected())
    {
        m_connection.connect(this, TQ_SLOT(slotDBusSignal(const TQT_DBusMessage&)));
        if (m_connection.requestName(DBUS_PORTAL_SERVICE, TQT_DBusConnection::NoReplace))
        {
            m_connection.scheduleDispatch();
            kdDebug() << "TDE portal service successfully registered." << endl;
            return;
        }
    }

    ++m_retryCount;
    kdWarning() << "Failed to connect to DBus, retrying in "
                << DBUS_RETRY_TIMEOUT << " secs "
                << "(" << m_retryCount << "/" << DBUS_RETRY_COUNT << "tries)"
                << endl;

    if (m_retryCount < DBUS_RETRY_COUNT)
    {
        TQTimer::singleShot(DBUS_RETRY_TIMEOUT, this, TQ_SLOT(connectDBus()));
    }
}

void PortalDaemon::disconnectDBus()
{
    ZAP(d_root)
    ZAP(d_org)
    ZAP(d_freedesktop)
    ZAP(d_portal)
    ZAP(d_desktop)

    if (m_connection.isConnected())
    {
        m_connection.disconnect(this, TQ_SLOT(slotDBusSignal(const TQT_DBusMessage&)));
        m_connection.closeConnection(DBUS_PORTAL_SERVICE);
    }

    m_retryCount = 0;
}

void PortalDaemon::slotDBusSignal(const TQT_DBusMessage &message)
{
    TQString serviceName = message[0].toString();
    if (message.interface() == TQString("org.freedesktop.DBus") &&
        message.member() == TQString("NameAcquired") &&
        serviceName == DBUS_PORTAL_SERVICE)
    {
        kdDebug() << "Portal daemon acquired unique DBus name: "
                  << serviceName << endl;

        d_root        = new RootNodeService(m_connection);
        d_org         = new OrgNodeService(m_connection);
        d_freedesktop = new FreeDesktopNodeService(m_connection);
        d_portal      = new PortalNodeService(m_connection);
        d_desktop     = new DesktopNodeService(m_connection);
    }
}

// kate: replace-tabs true; tab-width 4; indent-width 4;