1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Copyright (C) 2016 Intel Corporation.
5** Contact: https://www.qt.io/licensing/
6**
7** This file is part of the QtDBus module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial License Usage
11** Licensees holding valid commercial Qt licenses may use this file in
12** accordance with the commercial license agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and The Qt Company. For licensing terms
15** and conditions see https://www.qt.io/terms-conditions. For further
16** information use the contact form at https://www.qt.io/contact-us.
17**
18** GNU Lesser General Public License Usage
19** Alternatively, this file may be used under the terms of the GNU Lesser
20** General Public License version 3 as published by the Free Software
21** Foundation and appearing in the file LICENSE.LGPL3 included in the
22** packaging of this file. Please review the following information to
23** ensure the GNU Lesser General Public License version 3 requirements
24** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25**
26** GNU General Public License Usage
27** Alternatively, this file may be used under the terms of the GNU
28** General Public License version 2.0 or (at your option) the GNU General
29** Public license version 3 or any later version approved by the KDE Free
30** Qt Foundation. The licenses are as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
32** included in the packaging of this file. Please review the following
33** information to ensure the GNU General Public License requirements will
34** be met: https://www.gnu.org/licenses/gpl-2.0.html and
35** https://www.gnu.org/licenses/gpl-3.0.html.
36**
37** $QT_END_LICENSE$
38**
39****************************************************************************/
40
41#include "qdbusserver.h"
42#include "qdbusconnection_p.h"
43#include "qdbusconnectionmanager_p.h"
44#include "qdbusutil_p.h"
45
46#include <QtCore/private/qlocking_p.h>
47
48#ifndef QT_NO_DBUS
49
50QT_BEGIN_NAMESPACE
51
52/*!
53 \class QDBusServer
54 \inmodule QtDBus
55
56 \brief The QDBusServer class provides peer-to-peer communication
57 between processes on the same computer.
58*/
59
60/*!
61 Constructs a QDBusServer with the given \a address, and the given
62 \a parent.
63*/
64QDBusServer::QDBusServer(const QString &address, QObject *parent)
65 : QObject(parent), d(nullptr)
66{
67 if (address.isEmpty())
68 return;
69
70 if (!qdbus_loadLibDBus())
71 return;
72
73 QDBusConnectionManager *instance = QDBusConnectionManager::instance();
74 if (!instance)
75 return;
76
77 emit instance->serverRequested(address, this);
78 QObject::connect(d, SIGNAL(newServerConnection(QDBusConnectionPrivate*)),
79 this, SLOT(_q_newConnection(QDBusConnectionPrivate*)), Qt::QueuedConnection);
80}
81
82/*!
83 Constructs a QDBusServer with the given \a parent. The server will listen
84 for connections in \c {/tmp} (on Unix systems) or on a TCP port bound to
85 localhost (elsewhere).
86*/
87QDBusServer::QDBusServer(QObject *parent)
88 : QObject(parent), d(nullptr)
89{
90#ifdef Q_OS_UNIX
91 // Use Unix sockets on Unix systems only
92 const QString address = QStringLiteral("unix:tmpdir=/tmp");
93#else
94 const QString address = QStringLiteral("tcp:");
95#endif
96
97 if (!qdbus_loadLibDBus())
98 return;
99
100 QDBusConnectionManager *instance = QDBusConnectionManager::instance();
101 if (!instance)
102 return;
103
104 emit instance->serverRequested(address, this);
105 QObject::connect(d, SIGNAL(newServerConnection(QDBusConnectionPrivate*)),
106 this, SLOT(_q_newConnection(QDBusConnectionPrivate*)), Qt::QueuedConnection);
107}
108
109/*!
110 Destructs a QDBusServer
111*/
112QDBusServer::~QDBusServer()
113{
114 QMutex *managerMutex = nullptr;
115 if (QDBusConnectionManager::instance())
116 managerMutex = &QDBusConnectionManager::instance()->mutex;
117 QMutexLocker locker(managerMutex);
118 QWriteLocker writeLocker(&d->lock);
119 if (QDBusConnectionManager::instance()) {
120 for (const QString &name : qAsConst(d->serverConnectionNames))
121 QDBusConnectionManager::instance()->removeConnection(name);
122 d->serverConnectionNames.clear();
123 locker.unlock();
124 }
125 d->serverObject = nullptr;
126 d->ref.storeRelaxed(0);
127 d->deleteLater();
128}
129
130/*!
131 Returns \c true if this QDBusServer object is connected.
132
133 If it isn't connected, you need to call the constructor again.
134*/
135bool QDBusServer::isConnected() const
136{
137 return d && d->server && q_dbus_server_get_is_connected(d->server);
138}
139
140/*!
141 Returns the last error that happened in this server.
142
143 This function is provided for low-level code.
144*/
145QDBusError QDBusServer::lastError() const
146{
147 return d ? d->lastError : QDBusError(QDBusError::Disconnected, QDBusUtil::disconnectedErrorMessage());
148}
149
150/*!
151 Returns the address this server is associated with.
152*/
153QString QDBusServer::address() const
154{
155 QString addr;
156 if (d && d->server) {
157 char *c = q_dbus_server_get_address(d->server);
158 addr = QString::fromUtf8(c);
159 q_dbus_free(c);
160 }
161
162 return addr;
163}
164
165/*!
166 \since 5.3
167
168 If \a value is set to true, an incoming connection can proceed even if the
169 connecting client is not authenticated as a user.
170
171 By default, this value is false.
172
173 \sa isAnonymousAuthenticationAllowed()
174*/
175void QDBusServer::setAnonymousAuthenticationAllowed(bool value)
176{
177 d->anonymousAuthenticationAllowed = value;
178}
179
180/*!
181 \since 5.3
182
183 Returns true if anonymous authentication is allowed.
184
185 \sa setAnonymousAuthenticationAllowed()
186*/
187bool QDBusServer::isAnonymousAuthenticationAllowed() const
188{
189 return d->anonymousAuthenticationAllowed;
190}
191
192/*!
193 \fn void QDBusServer::newConnection(const QDBusConnection &connection)
194
195 This signal is emitted when a new client connection \a connection is
196 established to the server.
197 */
198
199QT_END_NAMESPACE
200
201#include "moc_qdbusserver.cpp"
202
203#endif // QT_NO_DBUS
204