summaryrefslogtreecommitdiffstats
path: root/qt/src
diff options
context:
space:
mode:
Diffstat (limited to 'qt/src')
-rw-r--r--qt/src/.cvsignore11
-rw-r--r--qt/src/Makefile.am71
-rw-r--r--qt/src/qdbus.h52
-rw-r--r--qt/src/qdbusabstractadaptor.cpp335
-rw-r--r--qt/src/qdbusabstractadaptor.h50
-rw-r--r--qt/src/qdbusabstractadaptor_p.h127
-rw-r--r--qt/src/qdbusabstractinterface.cpp392
-rw-r--r--qt/src/qdbusabstractinterface.h257
-rw-r--r--qt/src/qdbusabstractinterface_p.h72
-rw-r--r--qt/src/qdbusbus.cpp302
-rw-r--r--qt/src/qdbusbus.h159
-rw-r--r--qt/src/qdbusconnection.cpp768
-rw-r--r--qt/src/qdbusconnection.h124
-rw-r--r--qt/src/qdbusconnection_p.h245
-rw-r--r--qt/src/qdbuserror.cpp244
-rw-r--r--qt/src/qdbuserror.h93
-rw-r--r--qt/src/qdbusintegrator.cpp1554
-rw-r--r--qt/src/qdbusinterface.cpp203
-rw-r--r--qt/src/qdbusinterface.h63
-rw-r--r--qt/src/qdbusinterface_p.h65
-rw-r--r--qt/src/qdbusinternalfilters.cpp235
-rw-r--r--qt/src/qdbusintrospection.cpp403
-rw-r--r--qt/src/qdbusintrospection_p.h147
-rw-r--r--qt/src/qdbusmacros.h60
-rw-r--r--qt/src/qdbusmarshall.cpp582
-rw-r--r--qt/src/qdbusmarshall_p.h57
-rw-r--r--qt/src/qdbusmessage.cpp704
-rw-r--r--qt/src/qdbusmessage.h99
-rw-r--r--qt/src/qdbusmessage_p.h50
-rw-r--r--qt/src/qdbusmetaobject.cpp689
-rw-r--r--qt/src/qdbusmetaobject_p.h96
-rw-r--r--qt/src/qdbusmisc.cpp156
-rw-r--r--qt/src/qdbusreply.h132
-rw-r--r--qt/src/qdbusserver.cpp61
-rw-r--r--qt/src/qdbusserver.h48
-rw-r--r--qt/src/qdbusthread.cpp116
-rw-r--r--qt/src/qdbustype.cpp847
-rw-r--r--qt/src/qdbustype_p.h109
-rw-r--r--qt/src/qdbustypehelper_p.h231
-rw-r--r--qt/src/qdbusutil.cpp229
-rw-r--r--qt/src/qdbusutil.h55
-rw-r--r--qt/src/qdbusxmlgenerator.cpp200
-rw-r--r--qt/src/qdbusxmlparser.cpp349
-rw-r--r--qt/src/qdbusxmlparser_p.h53
44 files changed, 0 insertions, 10895 deletions
diff --git a/qt/src/.cvsignore b/qt/src/.cvsignore
deleted file mode 100644
index f6454f28..00000000
--- a/qt/src/.cvsignore
+++ /dev/null
@@ -1,11 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.lo
-*.la
-*.bb
-*.bbg
-*.da
-*.gcov
-*.moc
diff --git a/qt/src/Makefile.am b/qt/src/Makefile.am
deleted file mode 100644
index 90c0f8e6..00000000
--- a/qt/src/Makefile.am
+++ /dev/null
@@ -1,71 +0,0 @@
-INCLUDES=-I$(top_srcdir) $(DBUS_CLIENT_CFLAGS) $(DBUS_QT_CFLAGS) -DDBUS_COMPILATION
-
-lib_LTLIBRARIES=libdbus-qt4-1.la
-
-dbusincludedir=$(includedir)/dbus-1.0/dbus
-dbusinclude_HEADERS= \
- qdbusbus.h \
- qdbusmacros.h \
- qdbuserror.h \
- qdbusmessage.h \
- qdbusserver.h \
- qdbusconnection.h \
- qdbusabstractinterface.h \
- qdbusinterface.h \
- qdbusutil.h \
- qdbusabstractadaptor.h \
- qdbusreply.h \
- qdbustypehelper_p.h \
- qdbus.h
-
-noinst_HEADERS= \
- qdbusabstractadaptor_p.h \
- qdbusabstractinterface_p.h \
- qdbusconnection_p.h \
- qdbusinterface_p.h \
- qdbusintrospection_p.h \
- qdbusmarshall_p.h \
- qdbusmessage_p.h \
- qdbusmetaobject_p.h \
- qdbustype_p.h \
- qdbusxmlparser_p.h
-
-MOCS = qdbusabstractadaptor.moc qdbusserver.moc qdbusconnection_p.moc qdbusconnection_p.moc qdbusabstractadaptor_p.moc qdbusbus.moc qdbusabstractinterface.moc
-CLEANFILES = $(MOCS)
-BUILT_SOURCES = $(MOCS)
-
-libdbus_qt4_1_la_SOURCES = \
- qdbusbus.cpp \
- qdbusconnection.cpp \
- qdbuserror.cpp \
- qdbusintegrator.cpp \
- qdbusmarshall.cpp \
- qdbusmessage.cpp \
- qdbusserver.cpp \
- qdbustype.cpp \
- qdbusabstractinterface.cpp \
- qdbusinterface.cpp \
- qdbusxmlparser.cpp \
- qdbusutil.cpp \
- qdbusintrospection.cpp \
- qdbusabstractadaptor.cpp \
- qdbusthread.cpp \
- qdbusinternalfilters.cpp \
- qdbusmetaobject.cpp \
- qdbusmisc.cpp \
- qdbusxmlgenerator.cpp
-
-qdbusabstractadaptor.lo: qdbusabstractadaptor.moc qdbusabstractadaptor_p.moc
-qdbusabstractinterface.lo: qdbusabstractinterface.moc
-qdbusbus.lo: qdbusbus.moc
-qdbusserver.lo: qdbusserver.moc
-qdbusintegrator.lo: qdbusconnection_p.moc
-
-libdbus_qt4_1_la_LIBADD= $(DBUS_QT_LIBS) $(top_builddir)/dbus/libdbus-1.la
-libdbus_qt4_1_la_LDFLAGS= -version-info 1:0 -no-undefined
-libdbus_qt4_1_la_CPPFLAGS= -DQDBUS_MAKEDLL
-
-EXTRA_DIST = qdbus.h
-
-%.moc: %.h
- $(QT_MOC) $< > $@
diff --git a/qt/src/qdbus.h b/qt/src/qdbus.h
deleted file mode 100644
index 60c35825..00000000
--- a/qt/src/qdbus.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* qdbus.h precompiled header
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifndef QDBUS_H
-#define QDBUS_H
-
-#include <QtCore/qglobal.h>
-
-#if !defined(DBUS_COMPILATION)
-# include <dbus/qdbusabstractadaptor.h>
-# include <dbus/qdbusabstractinterface.h>
-# include <dbus/qdbusbus.h>
-# include <dbus/qdbusconnection.h>
-# include <dbus/qdbuserror.h>
-# include <dbus/qdbusinterface.h>
-# include <dbus/qdbusmessage.h>
-# include <dbus/qdbusreply.h>
-# include <dbus/qdbusserver.h>
-# include <dbus/qdbusutil.h>
-#else
-# include "qdbusabstractadaptor.h"
-# include "qdbusabstractinterface.h"
-# include "qdbusbus.h"
-# include "qdbusconnection.h"
-# include "qdbuserror.h"
-# include "qdbusinterface.h"
-# include "qdbusmessage.h"
-# include "qdbusreply.h"
-# include "qdbusserver.h"
-# include "qdbusutil.h"
-#endif
-
-#endif
diff --git a/qt/src/qdbusabstractadaptor.cpp b/qt/src/qdbusabstractadaptor.cpp
deleted file mode 100644
index 4592b29a..00000000
--- a/qt/src/qdbusabstractadaptor.cpp
+++ /dev/null
@@ -1,335 +0,0 @@
-/* -*- mode: C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusabstractadaptor.h"
-
-#include <QtCore/qmetaobject.h>
-#include <QtCore/qtimer.h>
-
-#include "qdbusconnection.h"
-
-#include "qdbusconnection_p.h" // for qDBusParametersForMethod
-#include "qdbusabstractadaptor_p.h"
-
-struct QDBusAdaptorInit
-{
- QSignalSpyCallbackSet callbacks;
- QDBusAdaptorInit()
- {
- extern void qt_register_signal_spy_callbacks(const QSignalSpyCallbackSet &callback_set);
- callbacks.signal_begin_callback = QDBusAdaptorConnector::signalBeginCallback;
- callbacks.signal_end_callback = QDBusAdaptorConnector::signalEndCallback;
- callbacks.slot_begin_callback = 0;
- callbacks.slot_end_callback = 0;
- qt_register_signal_spy_callbacks(callbacks);
-
- //QDBusAdaptorConnector::id = QObject::registerUserData();
- }
-};
-
-Q_GLOBAL_STATIC(QDBusAdaptorInit, qAdaptorInit)
-
-QDBusAdaptorConnector *qDBusFindAdaptorConnector(QObject *obj)
-{
- (void)qAdaptorInit();
-
- if (!obj)
- return 0;
- QDBusAdaptorConnector *connector = qFindChild<QDBusAdaptorConnector *>(obj);
- if (connector)
- connector->polish();
- return connector;
-}
-
-QDBusAdaptorConnector *qDBusFindAdaptorConnector(QDBusAbstractAdaptor *adaptor)
-{
- return qDBusFindAdaptorConnector(adaptor->parent());
-}
-
-QDBusAdaptorConnector *qDBusCreateAdaptorConnector(QObject *obj)
-{
- (void)qAdaptorInit();
-
- QDBusAdaptorConnector *connector = qDBusFindAdaptorConnector(obj);
- if (connector)
- return connector;
- return new QDBusAdaptorConnector(obj);
-}
-
-QString QDBusAbstractAdaptorPrivate::retrieveIntrospectionXml(QDBusAbstractAdaptor *adaptor)
-{
- return adaptor->d->xml;
-}
-
-void QDBusAbstractAdaptorPrivate::saveIntrospectionXml(QDBusAbstractAdaptor *adaptor,
- const QString &xml)
-{
- adaptor->d->xml = xml;
-}
-
-/*!
- \page usingannotations.html Using annotations in adaptors
-
- It is currently not possible to specify arbitrary annotations in adaptors.
-*/
-
-/*!
- \class QDBusAbstractAdaptor
- \brief Abstract adaptor for D-Bus adaptor classes.
-
- The QDBusAbstractAdaptor class is the starting point for all objects intending to provide
- interfaces to the external world using D-Bus. This is accomplished by attaching a one or more
- classes derived from QDBusAbstractAdaptor to a normal QObject and then registering that QObject
- with QDBusConnection::registerObject. QDBusAbstractAdaptor objects are intended to be
- light-weight wrappers, mostly just relaying calls into the real object (see object()) and the
- signals from it.
-
- Each QDBusAbstractAdaptor-derived class should define the D-Bus interface it is implementing
- using the Q_CLASSINFO macro in the class definition.
-
- QDBusAbstractAdaptor uses the standard QObject mechanism of signals, slots and properties to
- determine what signals, methods and properties to export to the bus. Any signal emitted by
- QDBusAbstractAdaptor-derived classes will be automatically be relayed through any D-Bus
- connections the object is registered on.
-
- Classes derived from QDBusAbstractAdaptor must be created on the heap using the \a new operator
- and must not be deleted by the user (they will be deleted automatically when the object they are
- connected to is also deleted).
-
- \sa {usingadaptors.html}{Using adaptors}, QDBusConnection
-*/
-
-/*!
- Constructs a QDBusAbstractAdaptor with \a obj as the parent object.
-*/
-QDBusAbstractAdaptor::QDBusAbstractAdaptor(QObject* obj)
- : QObject(obj), d(new QDBusAbstractAdaptorPrivate)
-{
- QDBusAdaptorConnector *connector = qDBusCreateAdaptorConnector(obj);
-
- connector->waitingForPolish = true;
- QTimer::singleShot(0, connector, SLOT(polish()));
-}
-
-/*!
- Destroys the adaptor.
-
- \warning Adaptors are destroyed automatically when the real object they refer to is
- destroyed. Do not delete the adaptors yourself.
-*/
-QDBusAbstractAdaptor::~QDBusAbstractAdaptor()
-{
- delete d;
-}
-
-/*!
- Returns the QObject that we're the adaptor for. This is the same object that was passed as an
- argument to the QDBusAbstractAdaptor constructor.
-*/
-QObject* QDBusAbstractAdaptor::object() const
-{
- return parent();
-}
-
-/*!
- Toggles automatic signal relaying from the real object (see object()).
-
- Automatic signal relaying consists of signal-to-signal connection of the signals on the parent
- that have the exact same method signatue in both classes.
-
- If \a enable is set to true, connect the signals; if set to false, disconnect all signals.
-*/
-void QDBusAbstractAdaptor::setAutoRelaySignals(bool enable)
-{
- const QMetaObject *us = metaObject();
- const QMetaObject *them = parent()->metaObject();
- for (int idx = staticMetaObject.methodCount(); idx < us->methodCount(); ++idx) {
- QMetaMethod mm = us->method(idx);
-
- if (mm.methodType() != QMetaMethod::Signal)
- continue;
-
- // try to connect/disconnect to a signal on the parent that has the same method signature
- QByteArray sig = QMetaObject::normalizedSignature(mm.signature());
- if (them->indexOfSignal(sig) == -1)
- continue;
- sig.prepend(QSIGNAL_CODE + '0');
- parent()->disconnect(sig, this, sig);
- if (enable)
- connect(parent(), sig, sig);
- }
-}
-
-QDBusAdaptorConnector::QDBusAdaptorConnector(QObject *obj)
- : QObject(obj), waitingForPolish(false), lastSignalIdx(0), argv(0)
-{
-}
-
-QDBusAdaptorConnector::~QDBusAdaptorConnector()
-{
-}
-
-void QDBusAdaptorConnector::addAdaptor(QDBusAbstractAdaptor *adaptor)
-{
- // find the interface name
- const QMetaObject *mo = adaptor->metaObject();
- while (mo != &QDBusAbstractAdaptor::staticMetaObject) {
- int ciend = mo->classInfoCount();
- for (int i = mo->classInfoOffset(); i < ciend; ++i) {
- QMetaClassInfo mci = mo->classInfo(i);
- if (strcmp(mci.name(), QCLASSINFO_DBUS_INTERFACE) == 0 && *mci.value()) {
- // find out if this interface exists first
- QString interface = QString::fromUtf8(mci.value());
- AdaptorMap::Iterator it = qLowerBound(adaptors.begin(), adaptors.end(), interface);
- if (it != adaptors.end() && it->interface == interface) {
- // exists. Replace it (though it's probably the same)
- it->adaptor = adaptor;
- it->metaObject = mo;
- } else {
- // create a new one
- AdaptorData entry;
- entry.interface = interface;
- entry.adaptor = adaptor;
- entry.metaObject = mo;
- adaptors << entry;
- }
- }
- }
-
- mo = mo->superClass();
- }
-
- // connect the adaptor's signals to our relaySlot slot
- mo = adaptor->metaObject();
- for (int i = QDBusAbstractAdaptor::staticMetaObject.methodCount();
- i < mo->methodCount(); ++i) {
- QMetaMethod mm = mo->method(i);
-
- if (mm.methodType() != QMetaMethod::Signal)
- continue;
-
- QByteArray sig = mm.signature();
- sig.prepend(QSIGNAL_CODE + '0');
- disconnect(adaptor, sig, this, SLOT(relaySlot()));
- connect(adaptor, sig, this, SLOT(relaySlot()));
- }
-}
-
-void QDBusAdaptorConnector::polish()
-{
- if (!waitingForPolish)
- return; // avoid working multiple times if multiple adaptors were added
-
- waitingForPolish = false;
- const QObjectList &objs = parent()->children();
- foreach (QObject *obj, objs) {
- QDBusAbstractAdaptor *adaptor = qobject_cast<QDBusAbstractAdaptor *>(obj);
- if (adaptor)
- addAdaptor(adaptor);
- }
-
- // sort the adaptor list
- qSort(adaptors);
-}
-
-void QDBusAdaptorConnector::relaySlot()
-{
- relay(sender());
-}
-
-void QDBusAdaptorConnector::relay(QObject *senderObj)
-{
- // we're being called because there is a signal being emitted that we must relay
- Q_ASSERT(lastSignalIdx);
- Q_ASSERT(argv);
- Q_ASSERT(senderMetaObject);
-
- if (senderMetaObject != senderObj->metaObject()) {
- qWarning("Inconsistency detected: QDBusAdaptorConnector::relay got called with unexpected sender object!");
- } else {
- QMetaMethod mm = senderMetaObject->method(lastSignalIdx);
- QObject *object = static_cast<QDBusAbstractAdaptor *>(senderObj)->parent();
-
- // break down the parameter list
- QList<int> types;
- int inputCount = qDBusParametersForMethod(mm, types);
- if (inputCount == -1)
- // invalid signal signature
- // qDBusParametersForMethod has already complained
- return;
- if (inputCount + 1 != types.count() ||
- types.at(inputCount) == QDBusConnectionPrivate::messageMetaType) {
- // invalid signal signature
- // qDBusParametersForMethod has not yet complained about this one
- qWarning("Cannot relay signal %s::%s", senderMetaObject->className(), mm.signature());
- return;
- }
-
- QByteArray signature = QMetaObject::normalizedSignature(mm.signature());
- signature.truncate(signature.indexOf('(')); // remove parameter decoration
-
- QVariantList args;
- for (int i = 1; i < types.count(); ++i)
- args << QVariant(types.at(i), argv[i]);
-
- // find all the interfaces this signal belongs to
- for (const QMetaObject *mo = senderMetaObject; mo != &QDBusAbstractAdaptor::staticMetaObject;
- mo = mo->superClass()) {
- if (lastSignalIdx < mo->methodOffset())
- break;
-
- for (int i = mo->classInfoOffset(); i < mo->classInfoCount(); ++i) {
- QMetaClassInfo mci = mo->classInfo(i);
- if (qstrcmp(mci.name(), QCLASSINFO_DBUS_INTERFACE) == 0 && *mci.value())
- // now emit the signal with all the information
- emit relaySignal(object, mci.value(), signature.constData(), args);
- }
- }
- }
-}
-
-void QDBusAdaptorConnector::signalBeginCallback(QObject *caller, int method_index, void **argv)
-{
- QDBusAbstractAdaptor *adaptor = qobject_cast<QDBusAbstractAdaptor *>(caller);
- if (adaptor) {
- QDBusAdaptorConnector *data = qDBusFindAdaptorConnector(adaptor);
- data->lastSignalIdx = method_index;
- data->argv = argv;
- data->senderMetaObject = caller->metaObject();
- data->polish(); // make sure it's polished
- }
-}
-
-void QDBusAdaptorConnector::signalEndCallback(QObject *caller, int)
-{
- QDBusAbstractAdaptor *adaptor = qobject_cast<QDBusAbstractAdaptor *>(caller);
- if (adaptor) {
- QDBusAdaptorConnector *data = qDBusFindAdaptorConnector(adaptor);
- data->lastSignalIdx = 0;
- data->argv = 0;
- data->senderMetaObject = 0;
- }
-}
-
-#include "qdbusabstractadaptor.moc"
-#include "qdbusabstractadaptor_p.moc"
diff --git a/qt/src/qdbusabstractadaptor.h b/qt/src/qdbusabstractadaptor.h
deleted file mode 100644
index 16fbf5d9..00000000
--- a/qt/src/qdbusabstractadaptor.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- mode: C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSABSTRACTADAPTOR_H
-#define QDBUSABSTRACTADAPTOR_H
-
-#include <QtCore/qobject.h>
-#include "qdbusmacros.h"
-
-class QDBusAbstractAdaptorPrivate;
-class QDBUS_EXPORT QDBusAbstractAdaptor: public QObject
-{
- Q_OBJECT
-protected:
- QDBusAbstractAdaptor(QObject *parent);
-
-public:
- ~QDBusAbstractAdaptor();
-
- Q_DECL_DEPRECATED QObject *object() const;
-
-protected:
- void setAutoRelaySignals(bool enable);
-
-private:
- friend class QDBusAbstractAdaptorPrivate;
- QDBusAbstractAdaptorPrivate *d;
-};
-
-#endif
diff --git a/qt/src/qdbusabstractadaptor_p.h b/qt/src/qdbusabstractadaptor_p.h
deleted file mode 100644
index 71bfb582..00000000
--- a/qt/src/qdbusabstractadaptor_p.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* -*- mode: C++; set-fill-width: 100 -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the public API. This header file may
-// change from version to version without notice, or even be
-// removed.
-//
-// We mean it.
-//
-//
-
-#ifndef QDBUSABSTRACTADAPTORPRIVATE_H
-#define QDBUSABSTRACTADAPTORPRIVATE_H
-
-#include <QtCore/qobject.h>
-#include <QtCore/qmap.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qreadwritelock.h>
-#include <QtCore/qvariant.h>
-#include <QtCore/qvector.h>
-
-#define QCLASSINFO_DBUS_INTERFACE "D-Bus Interface"
-#define QCLASSINFO_DBUS_INTROSPECTION "D-Bus Introspection"
-
-class QDBusAbstractAdaptor;
-class QDBusAdaptorConnector;
-class QDBusAdaptorManager;
-class QDBusConnectionPrivate;
-
-#if QT_VERSION < 0x040200
-/* mirrored in qobject_p.h, DON'T CHANGE without prior warning */
-struct QSignalSpyCallbackSet
-{
- typedef void (*BeginCallback)(QObject *caller, int method_index, void **argv);
- typedef void (*EndCallback)(QObject *caller, int method_index);
- BeginCallback signal_begin_callback,
- slot_begin_callback;
- EndCallback signal_end_callback,
- slot_end_callback;
-};
-#else
-# error Qt 4.2.0 is supposed to have a better solution!
- CHOKE!
-#endif // Qt 4.2.0
-
-class QDBusAbstractAdaptorPrivate
-{
-public:
- QString xml;
-
- static QString retrieveIntrospectionXml(QDBusAbstractAdaptor *adaptor);
- static void saveIntrospectionXml(QDBusAbstractAdaptor *adaptor, const QString &xml);
-};
-
-class QDBusAdaptorConnector: public QObject
-{
- Q_OBJECT
-public: // typedefs
- struct AdaptorData
- {
- QString interface;
- QDBusAbstractAdaptor *adaptor;
- const QMetaObject *metaObject;
-
- inline bool operator<(const AdaptorData &other) const
- { return interface < other.interface; }
- inline bool operator<(const QString &other) const
- { return interface < other; }
- };
- typedef QVector<AdaptorData> AdaptorMap;
-
-public: // methods
- explicit QDBusAdaptorConnector(QObject *parent);
- ~QDBusAdaptorConnector();
-
- void addAdaptor(QDBusAbstractAdaptor *adaptor);
- void relay(QObject *sender);
-
-public slots:
- void relaySlot();
- void polish();
-
-signals:
- void relaySignal(QObject *obj, const char *interface, const char *name, const QVariantList &args);
-
-public: // member variables
- AdaptorMap adaptors;
- bool waitingForPolish : 1;
-
- int lastSignalIdx;
- void **argv;
- const QMetaObject *senderMetaObject;
-
-public: // static members
- static void signalBeginCallback(QObject *caller, int method_index, void **argv);
- static void signalEndCallback(QObject *caller, int method_index);
- //static int id;
-};
-
-extern QDBusAdaptorConnector *qDBusFindAdaptorConnector(QObject *object);
-extern QDBusAdaptorConnector *qDBusCreateAdaptorConnector(QObject *object);
-
-#endif // QDBUSABSTRACTADAPTORPRIVATE_H
diff --git a/qt/src/qdbusabstractinterface.cpp b/qt/src/qdbusabstractinterface.cpp
deleted file mode 100644
index 1b038141..00000000
--- a/qt/src/qdbusabstractinterface.cpp
+++ /dev/null
@@ -1,392 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2005 Thiago Macieira <thiago@kde.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusabstractinterface.h"
-
-#include "qdbusabstractinterface_p.h"
-#include "qdbusmetaobject_p.h"
-#include "qdbusconnection_p.h"
-
-QVariant QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp) const
-{
- // try to read this property
- QDBusMessage msg = QDBusMessage::methodCall(service, path,
- QLatin1String(DBUS_INTERFACE_PROPERTIES),
- QLatin1String("Get"));
- msg << interface << QString::fromUtf8(mp.name());
- QDBusMessage reply = connp->sendWithReply(msg, QDBusConnection::NoUseEventLoop);
-
- if (reply.type() == QDBusMessage::ReplyMessage && reply.count() == 1 &&
- reply.signature() == QLatin1String("v")) {
- QVariant value = QDBusTypeHelper<QVariant>::fromVariant(reply.at(0));
-
- // make sure the type is right
- if (qstrcmp(mp.typeName(), value.typeName()) == 0) {
- if (mp.type() == QVariant::LastType)
- // QVariant is special in this context
- return QDBusTypeHelper<QVariant>::fromVariant(value);
-
- return value;
- }
- }
-
- // there was an error...
- if (reply.type() == QDBusMessage::ErrorMessage)
- lastError = reply;
- else if (reply.signature() != QLatin1String("v")) {
- QString errmsg = QLatin1String("Invalid signature `%1' in return from call to "
- DBUS_INTERFACE_PROPERTIES);
- lastError = QDBusError(QDBusError::InvalidSignature, errmsg.arg(reply.signature()));
- } else {
- QString errmsg = QLatin1String("Unexpected type `%1' when retrieving property "
- "`%2 %3.%4'");
- lastError = QDBusError(QDBusError::InvalidSignature,
- errmsg.arg(QLatin1String(reply.at(0).typeName()),
- QLatin1String(mp.typeName()),
- interface, QString::fromUtf8(mp.name())));
- }
-
- return QVariant();
-}
-
-void QDBusAbstractInterfacePrivate::setProperty(const QMetaProperty &mp, const QVariant &value)
-{
- // send the value
- QDBusMessage msg = QDBusMessage::methodCall(service, path,
- QLatin1String(DBUS_INTERFACE_PROPERTIES),
- QLatin1String("Set"));
- msg.setSignature(QLatin1String("ssv"));
- msg << interface << QString::fromUtf8(mp.name()) << value;
- QDBusMessage reply = connp->sendWithReply(msg, QDBusConnection::NoUseEventLoop);
-
- if (reply.type() != QDBusMessage::ReplyMessage)
- lastError = reply;
-}
-
-/*!
- \class QDBusAbstractInterface
- \brief Base class for all D-Bus interfaces in the QtDBus binding, allowing access to remote interfaces.
-
- Generated-code classes also derive from QDBusAbstractInterface, all methods described here are also
- valid for generated-code classes. In addition to those described here, generated-code classes
- provide member functions for the remote methods, which allow for compile-time checking of the
- correct parameters and return values, as well as property type-matching and signal
- parameter-matching.
-
- \sa {dbusidl2cpp.html}{The dbusidl2cpp compiler}, QDBusInterface
-*/
-
-/*!
- \enum QDBusAbstractInterface::CallMode
-
- Specifies how a call should be placed. The valid options are:
- \value NoWaitForReply place the call but don't wait for the reply (the reply's contents
- will be discarded)
- \value NoUseEventLoop don't use an event loop to wait for a reply, but instead block on
- network operations while waiting. This option means the
- user-interface may not be updated for the duration of the call.
- \value UseEventLoop use the Qt event loop to wait for a reply. This option means the
- user-interface will update, but it also means other events may
- happen, like signal delivery and other D-Bus method calls.
-
- When using UseEventLoop, applications must be prepared for reentrancy in any function.
-*/
-
-/*!
- \internal
-*/
-QDBusAbstractInterface::QDBusAbstractInterface(QDBusAbstractInterfacePrivate* d)
-#if QT_VERSION < 0x040200
- : d_ptr(d)
-{
- d_ptr->q_ptr = this;
-}
-#endif
-
-/*!
- Releases this object's resources.
-*/
-QDBusAbstractInterface::~QDBusAbstractInterface()
-{
- delete d_ptr;
-}
-
-/*!
- Returns true if this is a valid reference to a remote object. It returns false if
- there was an error during the creation of this interface (for instance, if the remote
- application does not exist).
-
- Note: when dealing with remote objects, it is not always possible to determine if it
- exists when creating a QDBusInterface or QDBusInterfacePtr object.
-*/
-bool QDBusAbstractInterface::isValid() const
-{
- return d_func()->isValid;
-}
-
-/*!
- Returns the connection this interface is assocated with.
-*/
-QDBusConnection QDBusAbstractInterface::connection() const
-{
- return d_func()->conn;
-}
-
-/*!
- Returns the name of the service this interface is associated with.
-*/
-QString QDBusAbstractInterface::service() const
-{
- return d_func()->service;
-}
-
-/*!
- Returns the object path that this interface is associated with.
-*/
-QString QDBusAbstractInterface::path() const
-{
- return d_func()->path;
-}
-
-/*!
- Returns the name of this interface.
-*/
-QString QDBusAbstractInterface::interface() const
-{
- return d_func()->interface;
-}
-
-/*!
- Returns the error the last operation produced, or an invalid error if the last operation did not
- produce an error.
-*/
-QDBusError QDBusAbstractInterface::lastError() const
-{
- return d_func()->lastError;
-}
-
-/*!
- Places a call to the remote method specified by \a method on this interface, using \a args as
- arguments. This function returns the message that was received as a reply, which can be a normal
- QDBusMessage::ReplyMessage (indicating success) or QDBusMessage::ErrorMessage (if the call
- failed). The \a mode parameter specifies how this call should be placed.
-
- If the call succeeds, lastError() will be cleared; otherwise, it will contain the error this
- call produced.
-
- Normally, you should place calls using call().
-
- \warning If you use \c UseEventLoop, your code must be prepared to deal with any reentrancy:
- other method calls and signals may be delivered before this function returns, as well
- as other Qt queued signals and events.
-
- \threadsafe
-*/
-QDBusMessage QDBusAbstractInterface::callWithArgs(const QString& method, const QList<QVariant>& args,
- CallMode mode)
-{
- Q_D(QDBusAbstractInterface);
-
- QString m = method, sig;
- // split out the signature from the method
- int pos = method.indexOf(QLatin1Char('.'));
- if (pos != -1) {
- m.truncate(pos);
- sig = method.mid(pos + 1);
- }
-
- if (mode == AutoDetect) {
- // determine if this a sync or async call
- mode = NoUseEventLoop;
- const QMetaObject *mo = metaObject();
- QByteArray match = m.toLatin1() + '(';
-
- for (int i = staticMetaObject.methodCount(); i < mo->methodCount(); ++i) {
- QMetaMethod mm = mo->method(i);
- if (QByteArray(mm.signature()).startsWith(match)) {
- // found a method with the same name as what we're looking for
- // hopefully, nobody is overloading asynchronous and synchronous methods with
- // the same name
-
- QList<QByteArray> tags = QByteArray(mm.tag()).split(' ');
- if (tags.contains("async") || tags.contains("Q_ASYNC"))
- mode = NoWaitForReply;
-
- break;
- }
- }
- }
-
- QDBusMessage msg = QDBusMessage::methodCall(service(), path(), interface(), m);
- msg.setSignature(sig);
- msg.QList<QVariant>::operator=(args);
-
- QDBusMessage reply;
- if (mode != NoWaitForReply)
- reply = d->conn.sendWithReply(msg, mode == UseEventLoop ?
- QDBusConnection::UseEventLoop : QDBusConnection::NoUseEventLoop);
- else
- d->conn.send(msg);
-
- d->lastError = reply; // will clear if reply isn't an error
-
- // ensure that there is at least one element
- if (reply.isEmpty())
- reply << QVariant();
-
- return reply;
-}
-
-/*!
- \overload
- Places a call to the remote method specified by \a method on this interface, using \a args as
- arguments. This function will return immediately after queueing the call. The reply from the
- remote function or any errors emitted by it will be delivered to the \a slot slot on object \a
- receiver.
-
- This function returns true if the queueing succeeded: it does not indicate that the call
- succeeded. If it failed, the slot will be called with an error message. lastError() will not be
- set under those circumstances.
-
- \sa QDBusError, QDBusMessage
-*/
-bool QDBusAbstractInterface::callWithArgs(const QString &method, QObject *receiver, const char *slot,
- const QList<QVariant> &args)
-{
- Q_D(QDBusAbstractInterface);
-
- QString m = method, sig;
- // split out the signature from the method
- int pos = method.indexOf(QLatin1Char('.'));
- if (pos != -1) {
- m.truncate(pos);
- sig = method.mid(pos + 1);
- }
-
- QDBusMessage msg = QDBusMessage::methodCall(service(), path(), interface(), m);
- msg.setSignature(sig);
- msg.QList<QVariant>::operator=(args);
-
- d->lastError = 0; // clear
- return d->conn.sendWithReplyAsync(msg, receiver, slot);
-}
-
-/*!
- \internal
- Catch signal connections.
-*/
-void QDBusAbstractInterface::connectNotify(const char *signal)
-{
- // someone connecting to one of our signals
- Q_D(QDBusAbstractInterface);
-
- d->connp->connectRelay(d->service, d->path, d->interface, this, signal);
-}
-
-/*!
- \internal
- Catch signal disconnections.
-*/
-void QDBusAbstractInterface::disconnectNotify(const char *signal)
-{
- // someone disconnecting from one of our signals
- Q_D(QDBusAbstractInterface);
-
- d->connp->disconnectRelay(d->service, d->path, d->interface, this, signal);
-}
-
-/*!
- \internal
- Get the value of the property \a propname.
-*/
-QVariant QDBusAbstractInterface::internalPropGet(const char *propname) const
-{
- // assume this property exists and is readable
- // we're only called from generated code anyways
-
- int idx = metaObject()->indexOfProperty(propname);
- if (idx != -1)
- return d_func()->property(metaObject()->property(idx));
- qWarning("QDBusAbstractInterface::internalPropGet called with unknown property '%s'", propname);
- return QVariant(); // error
-}
-
-/*!
- \internal
- Set the value of the property \a propname to \a value.
-*/
-void QDBusAbstractInterface::internalPropSet(const char *propname, const QVariant &value)
-{
- Q_D(QDBusAbstractInterface);
-
- // assume this property exists and is writeable
- // we're only called from generated code anyways
-
- int idx = metaObject()->indexOfProperty(propname);
- if (idx != -1)
- d->setProperty(metaObject()->property(idx), value);
- else
- qWarning("QDBusAbstractInterface::internalPropGet called with unknown property '%s'", propname);
-}
-
-/*!
- \overload
- \fn QDBusMessage QDBusAbstractInterface::call(const QString &method)
-
- Calls the method \a method on this interface and passes the parameters to this function to the
- method.
-
- The parameters to \c call are passed on to the remote function via D-Bus as input
- arguments. Output arguments are returned in the QDBusMessage reply. If the reply is an error
- reply, lastError() will also be set to the contents of the error message.
-
- This function is implemented by actually 9 different function overloads called \c call, so you
- can pass up to 8 parameters to your function call, which can be of any type accepted by QtDBus
- (see the \l {allowedparameters.html}{allowed parameters} page for information on what types are
- accepted).
-
- It can be used the following way:
-
- \code
- QString value = retrieveValue();
- QDBusMessage reply;
-
- QDBusReply<int> api = interface->call(QLatin1String("GetAPIVersion"));
- if (api >= 14)
- reply = interface->call(QLatin1String("ProcessWorkUnicode"), value);
- else
- reply = interface->call(QLatin1String("ProcessWork"), QLatin1String("UTF-8"), value.toUtf8());
- \endcode
-
- This example illustrates function calling with 0, 1 and 2 parameters and illustrates different
- parameter types passed in each (the first call to \c "ProcessWorkUnicode" will contain one
- Unicode string, the second call to \c "ProcessWork" will contain one string and one byte array).
-
- \warning This function reenters the Qt event loop in order to wait for the reply, excluding user
- input. During the wait, it may deliver signals and other method calls to your
- application. Therefore, it must be prepared to handle a reentrancy whenever a call is
- placed with call().
-*/
-
-#include "qdbusabstractinterface.moc"
diff --git a/qt/src/qdbusabstractinterface.h b/qt/src/qdbusabstractinterface.h
deleted file mode 100644
index aa6d00d7..00000000
--- a/qt/src/qdbusabstractinterface.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2005 Thiago Macieira <thiago@kde.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSABSTRACTINTERFACE_H
-#define QDBUSABSTRACTINTERFACE_H
-
-#include <QtCore/qstring.h>
-#include <QtCore/qvariant.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qobject.h>
-
-#include "qdbusmessage.h"
-#include "qdbustypehelper_p.h"
-
-class QDBusConnection;
-class QDBusError;
-
-class QDBusAbstractInterfacePrivate;
-class QDBUS_EXPORT QDBusAbstractInterface: public QObject
-{
- Q_OBJECT
-
-public:
- enum CallMode {
- NoWaitForReply,
- UseEventLoop,
- NoUseEventLoop,
- AutoDetect
- };
-
-public:
- virtual ~QDBusAbstractInterface();
- bool isValid() const;
-
- QDBusConnection connection() const;
-
- QString service() const;
- QString path() const;
- QString interface() const;
-
- QDBusError lastError() const;
-
- QDBusMessage callWithArgs(const QString &method, const QList<QVariant> &args = QList<QVariant>(),
- CallMode mode = AutoDetect);
- bool callWithArgs(const QString &method, QObject *receiver, const char *slot,
- const QList<QVariant> &args = QList<QVariant>());
-
- inline QDBusMessage call(const QString &m)
- {
- return callWithArgs(m);
- }
-
- inline QDBusMessage call(CallMode mode, const QString &m)
- {
- return callWithArgs(m, QList<QVariant>(), mode);
- }
-
-#ifndef Q_QDOC
-private:
- template<typename T> inline QVariant qvfv(const T &t)
- { return QDBusTypeHelper<T>::toVariant(t); }
-
-public:
- template<typename T1>
- inline QDBusMessage call(const QString &m, const T1 &t1)
- {
- QList<QVariant> args;
- args << qvfv(t1);
- return callWithArgs(m, args);
- }
-
- template<typename T1, typename T2>
- inline QDBusMessage call(const QString &m, const T1 &t1, const T2 &t2)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2);
- return callWithArgs(m, args);
- }
-
- template<typename T1, typename T2, typename T3>
- inline QDBusMessage call(const QString &m, const T1 &t1, const T2 &t2, const T3 &t3)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3);
- return callWithArgs(m, args);
- }
-
- template<typename T1, typename T2, typename T3, typename T4>
- inline QDBusMessage call(const QString &m, const T1 &t1, const T2 &t2, const T3 &t3,
- const T4 &t4)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4);
- return callWithArgs(m, args);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5>
- inline QDBusMessage call(const QString &m, const T1 &t1, const T2 &t2, const T3 &t3,
- const T4 &t4, const T5 &t5)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4) << qvfv(t5);
- return callWithArgs(m, args);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
- inline QDBusMessage call(const QString &m, const T1 &t1, const T2 &t2, const T3 &t3,
- const T4 &t4, const T5 &t5, const T6 &t6)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4) << qvfv(t5) << qvfv(t6);
- return callWithArgs(m, args);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
- inline QDBusMessage call(const QString &m, const T1 &t1, const T2 &t2, const T3 &t3,
- const T4 &t4, const T5 &t5, const T6 &t6, const T7 &t7)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4) << qvfv(t5) << qvfv(t6)
- << qvfv(t7);
- return callWithArgs(m, args);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
- inline QDBusMessage call(const QString &m, const T1 &t1, const T2 &t2, const T3 &t3,
- const T4 &t4, const T5 &t5, const T6 &t6, const T7 &t7, const T8 &t8)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4) << qvfv(t5) << qvfv(t6)
- << qvfv(t7) << qvfv(t8);
- return callWithArgs(m, args);
- }
-
- template<typename T1>
- inline QDBusMessage call(CallMode mode, const QString &m, const T1 &t1)
- {
- QList<QVariant> args;
- args << qvfv(t1);
- return callWithArgs(m, args, mode);
- }
-
- template<typename T1, typename T2>
- inline QDBusMessage call(CallMode mode, const QString &m, const T1 &t1, const T2 &t2)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2);
- return callWithArgs(m, args, mode);
- }
-
- template<typename T1, typename T2, typename T3>
- inline QDBusMessage call(CallMode mode, const QString &m, const T1 &t1, const T2 &t2,
- const T3 &t3)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3);
- return callWithArgs(m, args, mode);
- }
-
- template<typename T1, typename T2, typename T3, typename T4>
- inline QDBusMessage call(CallMode mode, const QString &m, const T1 &t1, const T2 &t2,
- const T3 &t3, const T4 &t4)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4);
- return callWithArgs(m, args, mode);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5>
- inline QDBusMessage call(CallMode mode, const QString &m, const T1 &t1, const T2 &t2,
- const T3 &t3, const T4 &t4, const T5 &t5)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4) << qvfv(t5);
- return callWithArgs(m, args, mode);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
- inline QDBusMessage call(CallMode mode, const QString &m, const T1 &t1, const T2 &t2,
- const T3 &t3, const T4 &t4, const T5 &t5, const T6 &t6)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4) << qvfv(t5) << qvfv(t6);
- return callWithArgs(m, args, mode);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
- inline QDBusMessage call(CallMode mode, const QString &m, const T1 &t1, const T2 &t2,
- const T3 &t3, const T4 &t4, const T5 &t5, const T6 &t6, const T7 &t7)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4) << qvfv(t5) << qvfv(t6)
- << qvfv(t7);
- return callWithArgs(m, args, mode);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
- inline QDBusMessage call(CallMode mode, const QString &m, const T1 &t1, const T2 &t2,
- const T3 &t3, const T4 &t4, const T5 &t5, const T6 &t6, const T7 &t7,
- const T8 &t8)
- {
- QList<QVariant> args;
- args << qvfv(t1) << qvfv(t2) << qvfv(t3)
- << qvfv(t4) << qvfv(t5) << qvfv(t6)
- << qvfv(t7) << qvfv(t8);
- return callWithArgs(m, args, mode);
- }
-#endif
-
-protected:
- QDBusAbstractInterface(QDBusAbstractInterfacePrivate *);
- void connectNotify(const char *signal);
- void disconnectNotify(const char *signal);
- QVariant internalPropGet(const char *propname) const;
- void internalPropSet(const char *propname, const QVariant &value);
-
-private:
- friend class QDBusInterface;
- QDBusAbstractInterfacePrivate *d_ptr; // remove for Qt 4.2.0
-
- Q_DECLARE_PRIVATE(QDBusAbstractInterface)
- Q_DISABLE_COPY(QDBusAbstractInterface)
-};
-
-#endif
diff --git a/qt/src/qdbusabstractinterface_p.h b/qt/src/qdbusabstractinterface_p.h
deleted file mode 100644
index 43807071..00000000
--- a/qt/src/qdbusabstractinterface_p.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *
- * Copyright (C) 2006 Thiago José Macieira <thiago@kde.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the public API. This header file may
-// change from version to version without notice, or even be
-// removed.
-//
-// We mean it.
-//
-//
-
-#ifndef QDBUSABSTRACTINTERFACEPRIVATE_H
-#define QDBUSABSTRACTINTERFACEPRIVATE_H
-
-#include "qdbusabstractinterface.h"
-#include "qdbusconnection.h"
-#include "qdbuserror.h"
-
-#define ANNOTATION_NO_WAIT "org.freedesktop.DBus.Method.NoReply"
-
-class QDBusAbstractInterfacePrivate//: public QObjectPrivate
-{
-public:
- Q_DECLARE_PUBLIC(QDBusAbstractInterface)
-
- QDBusAbstractInterface *q_ptr; // remove in Qt 4.2
- QDBusConnection conn;
- QDBusConnectionPrivate *connp;
- QString service;
- QString path;
- QString interface;
- mutable QDBusError lastError;
- bool isValid;
-
- inline QDBusAbstractInterfacePrivate(const QDBusConnection& con, QDBusConnectionPrivate *conp,
- const QString &serv, const QString &p, const QString &iface)
- : conn(con), connp(conp), service(serv), path(p), interface(iface), isValid(true)
- { }
- virtual ~QDBusAbstractInterfacePrivate() { }
-
- // these functions do not check if the property is valid
- QVariant property(const QMetaProperty &mp) const;
- void setProperty(const QMetaProperty &mp, const QVariant &value);
-};
-
-
-#endif
diff --git a/qt/src/qdbusbus.cpp b/qt/src/qdbusbus.cpp
deleted file mode 100644
index f46966b4..00000000
--- a/qt/src/qdbusbus.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-/*
- * This file was generated by dbusidl2cpp version 0.3
- * when processing input file -
- *
- * dbusidl2cpp is Copyright (C) 2006 Trolltech AS. All rights reserved.
- *
- * This file has been hand-edited! Be careful when re-generating it!
- *
- */
-
-#include "qdbusbus.h"
-
-#include <QtCore/QByteArray>
-#include <QtCore/QList>
-#include <QtCore/QMap>
-#include <QtCore/QString>
-#include <QtCore/QStringList>
-#include <QtCore/QVariant>
-
-/*
- * Implementation of interface class QDBusBusService
- */
-
-/*!
- \class QDBusBusService
- \brief Provides access to the D-Bus bus daemon service.
-
-*/
-
-/*!
- \enum QDBusBusService::RequestNameOption
-
- Flags for requesting a name on the bus.
-
- \value AllowReplacingName Allow another application requesting the same name to take the name
- from this application.
- \value ReplaceExistingName If another application already has the name and allows replacing,
- take the name and assign it to us.
- \value DoNotQueueName Without this flag, if an application requests a name that is already
- owned and does not allow replacing, it will be queued until the
- name is given up. If this flag is given, no queueing will be
- performed and the requestName() call will simply fail.
-*/
-
-/*!
- \enum QDBusBusService::RequestNameReply
-
- The possible return values from requestName():
-
- \value PrimaryOwnerReply The caller is now the primary owner of the name.
- \value InQueueReply The caller is in queue for the name, but does not own it.
- \value NameExistsReply The name exists and could not be replaced, or the caller did
- specify DoNotQueueName.
- \value AlreadyOwnerReply The caller tried to request a name that it already owns.
-*/
-
-/*!
- \enum QDBusBusService::ReleaseNameReply
-
- The possible return values from releaseName():
-
- \value NameReleasedReply The caller released his claim on the name.
- \value NameNonExistentReply The caller tried to release a name that did not exist.
- \value NotOwnerReply The caller tried to release a name that it did not own or was not in
- queue for.
-*/
-
-/*!
- \enum QDBusBusService::StartServiceReply
-
- The possible return values from startServiceByName():
-
- \value Success The service was successfully started.
- \value AlreadyRunning The service was already running.
-*/
-
-/*!
- \internal
-*/
-const char *QDBusBusService::staticInterfaceName()
-{ return "org.freedesktop.DBus"; }
-
-
-/*!
- \internal
-*/
-QDBusBusService::QDBusBusService(QDBusAbstractInterfacePrivate *p)
- : QDBusAbstractInterface(p)
-{
- connect(this, SIGNAL(NameAcquired(QString)), this, SIGNAL(nameAcquired(QString)));
- connect(this, SIGNAL(NameLost(QString)), this, SIGNAL(nameLost(QString)));
- connect(this, SIGNAL(NameOwnerChanged(QString,QString,QString)),
- this, SIGNAL(nameOwnerChanged(QString,QString,QString)));
-}
-
-/*!
- \internal
-*/
-QDBusBusService::~QDBusBusService()
-{
-}
-
-/*!
- \fn QDBusBusService::hello()
- \internal
- Sends a "Hello" request to the bus service. You do not want to call this.
-*/
-QDBusReply<QString> QDBusBusService::Hello()
-{
- return call(QLatin1String("Hello"));
-}
-
-/*!
- \fn QDBusBusService::nameOwner(const QString &name)
- Returns the unique connection name of the primary owner of the name \a name. If the requested
- name doesn't have an owner, returns a org.freedesktop.DBus.Error.NameHasNoOwner error.
-*/
-QDBusReply<QString> QDBusBusService::GetNameOwner(const QString &name)
-{
- return call(QLatin1String("GetNameOwner.s"), name);
-}
-
-/*!
- \fn QDBusBusService::listNames()
- Lists all names currently existing on the bus.
-*/
-QDBusReply<QStringList> QDBusBusService::ListNames()
-{
- return call(QLatin1String("ListNames"));
-}
-
-/*!
- \fn QDBusBusService::listQueuedOwners(const QString &serviceName)
- Returns a list of all unique connection names in queue for the service name \a service.
-*/
-QDBusReply<QStringList> QDBusBusService::ListQueuedOwners(const QString &serviceName)
-{
- return call(QLatin1String("ListQueuedOwners.s"), serviceName);
-}
-
-/*!
- \fn QDBusBusService::nameHasOwner(const QString &serviceName)
- Returns true if the service name \a service has an owner.
-*/
-QDBusReply<bool> QDBusBusService::NameHasOwner(const QString &serviceName)
-{
- return call(QLatin1String("NameHasOwner.s"), serviceName);
-}
-
-/*!
- \fn QDBusBusService::addMatch(const QString &rule)
- Adds the rule \a rule for requesting messages from the bus.
-
- \sa removeMatch()
-*/
-QDBusReply<void> QDBusBusService::AddMatch(const QString &rule)
-{
- return call(QLatin1String("AddMatch.s"), rule);
-}
-
-/*!
- \fn QDBusBusService::removeMatch(const QString &rule)
- Removes the rule \a rule, that had previously been added with addMatch().
-*/
-QDBusReply<void> QDBusBusService::RemoveMatch(const QString &rule)
-{
- return call(QLatin1String("RemoveMatch.s"), rule);
-}
-
-/*!
- \fn QDBusBusService::connectionSELinuxSecurityContext(const QString &serviceName)
- Returns the SELinux security context of the process currently holding the bus service \a
- service.
-*/
-QDBusReply<QByteArray> QDBusBusService::GetConnectionSELinuxSecurityContext(const QString &serviceName)
-{
- return call(QLatin1String("GetConnectionSELinuxSecurityContext.s"), serviceName);
-}
-
-/*!
- \fn QDBusBusService::connectionUnixProcessID(const QString &serviceName)
- Returns the Unix Process ID (PID) for the process currently holding the bus service \a service.
-*/
-QDBusReply<uint> QDBusBusService::GetConnectionUnixProcessID(const QString &serviceName)
-{
- return call(QLatin1String("GetConnectionUnixProcessID.s"), serviceName);
-}
-
-/*!
- \fn QDBusBusService::connectionUnixUser(const QString &serviceName)
- Returns the Unix User ID (UID) for the process currently holding the bus service \a service.
-*/
-QDBusReply<uint> QDBusBusService::GetConnectionUnixUser(const QString &serviceName)
-{
- return call(QLatin1String("GetConnectionUnixUser.s"), serviceName);
-}
-
-/*!
- \fn QDBusBusService::reloadConfig()
- Asks the D-Bus server daemon to reload its configuration.
-*/
-QDBusReply<void> QDBusBusService::ReloadConfig()
-{
- return call(QLatin1String("ReloadConfig"));
-}
-
-inline QDBUS_EXPORT int qDBusMetaTypeId(QDBusBusService::StartServiceReply *)
-{ return QVariant::Int; }
-
-/*!
- \fn QDBusBusService::startServiceByName(const QString &name, uint flags)
- Requests that the bus start the service given by the name \a name.
-
- The \a flags parameter is currently not used.
-*/
-QDBusReply<QDBusBusService::StartServiceReply>
-QDBusBusService::StartServiceByName(const QString &name, uint flags)
-{
- return call(QLatin1String("StartServiceByName.su"), name, flags);
-}
-
-inline QDBUS_EXPORT int qDBusMetaTypeId(QDBusBusService::RequestNameReply *)
-{ return QVariant::Int; }
-
-/*!
- \fn QDBusBusService::requestName(const QString &serviceName, RequestNameOptions flags)
- Requests the bus service name \a service from the bus. The \a flags parameter specifies how the
- bus server daemon should act when the same name is requested by two different applications.
-
- \sa releaseName()
-*/
-QDBusReply<QDBusBusService::RequestNameReply>
-QDBusBusService::RequestName(const QString &serviceName, RequestNameOptions flags)
-{
- return call(QLatin1String("RequestName.su"), serviceName, uint(int(flags)));
-}
-
-inline QDBUS_EXPORT int qDBusMetaTypeId(QDBusBusService::ReleaseNameReply *)
-{ return QVariant::Int; }
-
-/*!
- \fn QDBusBusService::releaseName(const QString &serviceName)
- Releases the claim on the bus service name \a service, that had been previously requested with
- requestName(). If this application had ownership of the name, it will be released for other
- applications to claim. If it only had the name queued, it gives up its position in the queue.
-*/
-QDBusReply<QDBusBusService::ReleaseNameReply>
-QDBusBusService::ReleaseName(const QString &serviceName)
-{
- return call(QLatin1String("ReleaseName.s"), serviceName);
-}
-
-// signals
-/*!
- \fn QDBusBusService::nameAcquired(const QString &serviceName)
-
- This signal is emitted by the D-Bus bus server when the bus service name (unique connection name
- or well-known service name) given by \a service is acquired by this application.
-
- Name acquisition happens after the application requested a name using requestName().
-*/
-
-/*!
- \fn QDBusBusService::nameLost(const QString &serviceName)
-
- This signal is emitted by the D-Bus bus server when the application loses ownership of the bus
- service name given by \a service.
-*/
-
-/*!
- \fn QDBusBusService::nameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner)
-
- This signal is emitted by the D-Bus bus server whenever a name ownership change happens in the
- bus, including apparition and disparition of names.
-
- This signal means the application \a oldOwner lost ownership of bus name \a name to application
- \a newOwner. If \a oldOwner is an empty string, it means the name \a name has just been created;
- if \a newOwner is empty, the name \a name has no current owner.
-*/
-
-#include "qdbusbus.moc"
diff --git a/qt/src/qdbusbus.h b/qt/src/qdbusbus.h
deleted file mode 100644
index 0240e65f..00000000
--- a/qt/src/qdbusbus.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-/*
- * This file was generated by dbusidl2cpp version 0.3
- * when processing input file -
- *
- * dbusidl2cpp is Copyright (C) 2006 Trolltech AS. All rights reserved.
- *
- * This file has been hand-edited! Be careful when re-generating it!
- *
- */
-
-#ifndef QDBUSBUS_H
-#define QDBUSBUS_H
-
-#include <QtCore/qstringlist.h>
-
-#include "qdbusabstractinterface.h"
-#include "qdbusreply.h"
-
-class QDBusConnection;
-class QString;
-class QByteArray;
-
-/*
- * Proxy class for interface org.freedesktop.DBus
- */
-class QDBUS_EXPORT QDBusBusService: public QDBusAbstractInterface
-{
- Q_OBJECT
- friend class QDBusConnection;
- static inline const char *staticInterfaceName();
-
- explicit QDBusBusService(QDBusAbstractInterfacePrivate *p);
-
- ~QDBusBusService();
-
-public:
- // taken out of http://dbus.freedesktop.org/doc/dbus-specification.html
- // update if the standard updates
- enum RequestNameOption {
- QueueName = 0x0,
- AllowReplacingName = 0x1,
- ReplaceExistingName = 0x2,
- DoNotQueueName = 0x4
- };
- Q_DECLARE_FLAGS(RequestNameOptions, RequestNameOption)
-
- enum RequestNameReply {
- PrimaryOwnerReply = 1,
- InQueueReply = 2,
- NameExistsReply = 3,
- AlreadyOwnerReply = 4
- };
-
- enum ReleaseNameReply {
- NameReleasedReply = 1,
- NameNonExistentReply = 2,
- NotOwnerReply = 3
- };
-
- enum StartServiceReply {
- Success = 1,
- AlreadyRunning = 2
- };
-
-#ifndef Q_QDOC
- // D-Bus names
-public: // METHODS
- QDBusReply<QString> Hello();
- QDBusReply<void> ReloadConfig();
-
- QDBusReply<QStringList> ListNames();
-
- QDBusReply<bool> NameHasOwner(const QString &service);
- QDBusReply<QString> GetNameOwner(const QString &name);
- QDBusReply<ReleaseNameReply> ReleaseName(const QString &service);
- QDBusReply<RequestNameReply> RequestName(const QString &service, RequestNameOptions flags);
- QDBusReply<QStringList> ListQueuedOwners(const QString &service);
-
- QDBusReply<void> AddMatch(const QString &rule);
- QDBusReply<void> RemoveMatch(const QString &rule);
-
- QDBusReply<QByteArray> GetConnectionSELinuxSecurityContext(const QString &service);
- QDBusReply<uint> GetConnectionUnixProcessID(const QString &service);
- QDBusReply<uint> GetConnectionUnixUser(const QString &service);
-
- QDBusReply<StartServiceReply> StartServiceByName(const QString &name, uint flags);
-
-Q_SIGNALS: // SIGNALS
- void NameAcquired(const QString &service);
- void NameLost(const QString &service);
- void NameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner);
-#endif
-
- // Qt-style naming
-public Q_SLOTS:
- QDBusReply<QString> hello()
- { return Hello(); }
- QDBusReply<void> reloadConfig()
- { return ReloadConfig(); }
-
- QDBusReply<QStringList> listNames()
- { return ListNames(); }
-
- QDBusReply<bool> nameHasOwner(const QString &serviceName)
- { return NameHasOwner(serviceName); }
- QDBusReply<QString> nameOwner(const QString &name)
- { return GetNameOwner(name); }
- QDBusReply<ReleaseNameReply> releaseName(const QString &serviceName)
- { return ReleaseName(serviceName); }
- QDBusReply<RequestNameReply> requestName(const QString &serviceName, RequestNameOptions flags = QueueName)
- { return RequestName(serviceName, flags); }
- QDBusReply<QStringList> listQueuedOwners(const QString &serviceName)
- { return ListQueuedOwners(serviceName); }
-
- QDBusReply<void> addMatch(const QString &rule)
- { return AddMatch(rule); }
- QDBusReply<void> removeMatch(const QString &rule)
- { return RemoveMatch(rule); }
-
- QDBusReply<QByteArray> connectionSELinuxSecurityContext(const QString &serviceName)
- { return GetConnectionSELinuxSecurityContext(serviceName); }
- QDBusReply<uint> connectionUnixProcessID(const QString &serviceName)
- { return GetConnectionUnixProcessID(serviceName); }
- QDBusReply<uint> connectionUnixUser(const QString &serviceName)
- { return GetConnectionUnixUser(serviceName); }
-
- QDBusReply<StartServiceReply> startServiceByName(const QString &name, uint flags)
- { return StartServiceByName(name, flags); }
-
-Q_SIGNALS:
- void nameAcquired(const QString &service);
- void nameLost(const QString &service);
- void nameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner);
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QDBusBusService::RequestNameOptions)
-
-#endif
diff --git a/qt/src/qdbusconnection.cpp b/qt/src/qdbusconnection.cpp
deleted file mode 100644
index 7049857d..00000000
--- a/qt/src/qdbusconnection.cpp
+++ /dev/null
@@ -1,768 +0,0 @@
-/* qdbusconnection.cpp
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include <qdebug.h>
-#include <qcoreapplication.h>
-#include <qstringlist.h>
-
-#include "qdbusbus.h"
-#include "qdbusconnection.h"
-#include "qdbuserror.h"
-#include "qdbusmessage.h"
-#include "qdbusconnection_p.h"
-#include "qdbusinterface_p.h"
-#include "qdbusutil.h"
-
-class QDBusConnectionManager
-{
-public:
- QDBusConnectionManager() {}
- ~QDBusConnectionManager();
- void bindToApplication();
- QDBusConnectionPrivate *connection(const QString &name) const;
- void removeConnection(const QString &name);
- void setConnection(const QString &name, QDBusConnectionPrivate *c);
-
-private:
- mutable QMutex mutex;
- QHash<QString, QDBusConnectionPrivate *> connectionHash;
-};
-
-Q_GLOBAL_STATIC(QDBusConnectionManager, manager)
-
-QDBusConnectionPrivate *QDBusConnectionManager::connection(const QString &name) const
-{
- QMutexLocker locker(&mutex);
- return connectionHash.value(name, 0);
-}
-
-void QDBusConnectionManager::removeConnection(const QString &name)
-{
- QMutexLocker locker(&mutex);
-
- QDBusConnectionPrivate *d = 0;
- d = connectionHash.take(name);
- if (d && !d->ref.deref())
- delete d;
-}
-
-QDBusConnectionManager::~QDBusConnectionManager()
-{
- for (QHash<QString, QDBusConnectionPrivate *>::const_iterator it = connectionHash.constBegin();
- it != connectionHash.constEnd(); ++it) {
- delete it.value();
- }
- connectionHash.clear();
-}
-
-void QDBusConnectionManager::bindToApplication()
-{
- QMutexLocker locker(&mutex);
- for (QHash<QString, QDBusConnectionPrivate *>::const_iterator it = connectionHash.constBegin();
- it != connectionHash.constEnd(); ++it) {
- (*it)->bindToApplication();
- }
-}
-
-QDBUS_EXPORT void qDBusBindToApplication();
-void qDBusBindToApplication()
-{
- manager()->bindToApplication();
-}
-
-void QDBusConnectionManager::setConnection(const QString &name, QDBusConnectionPrivate *c)
-{
- connectionHash[name] = c;
- c->name = name;
-}
-
-/*!
- \fn QDBusConnection QDBus::sessionBus()
- \relates QDBusConnection
-
- Returns a QDBusConnection object opened with the session bus. The object reference returned
- by this function is valid until the QCoreApplication's destructor is run, when the
- connection will be closed and the object, deleted.
-*/
-/*!
- \fn QDBusConnection QDBus::systemBus()
- \relates QDBusConnection
-
- Returns a QDBusConnection object opened with the system bus. The object reference returned
- by this function is valid until the QCoreApplication's destructor is run, when the
- connection will be closed and the object, deleted.
-*/
-
-/*!
- \class QDBusConnection
- \brief A connection to the D-Bus bus daemon.
-
- This class is the initial point in a D-Bus session. Using it, you can get access to remote
- objects, interfaces; connect remote signals to your object's slots; register objects, etc.
-
- D-Bus connections are created using the QDBusConnection::addConnection() function, which opens a
- connection to the server daemon and does the initial handshaking, associating that connection
- with a name. Further attempts to connect using the same name will return the same
- connection.
-
- The connection is then torn down using the QDBusConnection::closeConnection() function.
-
- As a convenience for the two most common connection types, the QDBus::sessionBus() and
- QDBus::systemBus() functions return open connections to the session server daemon and the system
- server daemon, respectively. Those connections are opened when first used and are closed when
- the QCoreApplication destructor is run.
-
- D-Bus also supports peer-to-peer connections, without the need for a bus server daemon. Using
- this facility, two applications can talk to each other and exchange messages. This can be
- achieved by passing an address to QDBusConnection::addConnection()
- function, which was opened by another D-Bus application using QDBusServer.
-*/
-
-/*!
- \enum QDBusConnection::BusType
- Specifies the type of the bus connection. The valid bus types are:
-
- \value SessionBus the session bus, associated with the running desktop session
- \value SystemBus the system bus, used to communicate with system-wide processes
- \value ActivationBus the activation bus, whose purpose I have no idea...
-
- On the Session Bus, one can find other applications by the same user that are sharing the same
- desktop session (hence the name). On the System Bus, however, processes shared for the whole
- system are usually found.
-*/
-
-/*!
- \enum QDBusConnection::WaitMode
- Specifies the call waiting mode.
-
- \value UseEventLoop use the Qt Event Loop to wait for the reply
- \value NoUseEventLoop don't use the event loop
-
- The \c UseEventLoop option allows for the application to continue to update its UI while the
- call is performed, but it also opens up the possibility for reentrancy: socket notifiers may
- fire, signals may be delivered and other D-Bus calls may be processed. The \c NoUseEventLoop
- does not use the event loop, thus being safe from those problems, but it may block the
- application for a noticeable period of time, in case the remote application fails to respond.
-
- Also note that calls that go back to the local application can only be placed in \c UseEventLoop
- mode.
-*/
-
-/*!
- \enum QDBusConnection::RegisterOption
- Specifies the options for registering objects with the connection. The possible values are:
-
- \value ExportAdaptors export the contents of adaptors found in this object
-
- \value ExportSlots export this object's scriptable slots
- \value ExportSignals export this object's scriptable signals
- \value ExportProperties export this object's scriptable properties
- \value ExportContents shorthand form for ExportSlots | ExportSignals |
- ExportProperties
-
- \value ExportAllSlots export all of this object's slots, including
- non-scriptable ones
- \value ExportAllSignals export all of this object's signals, including
- non-scriptable ones
- \value ExportAllProperties export all of this object's properties, including
- non-scriptable ones
- \value ExportAllContents export all of this object's slots, signals and
- properties, including non-scriptable ones
-
- \value ExportChildObjects export this object's child objects
-
- \warning It is currently not possible to export signals from objects. If you pass the flag
- ExportSignals or ExportAllSignals, the registerObject() function will print a warning.
-
- \sa registerObject(), QDBusAbstractAdaptor, {usingadaptors.html}{Using adaptors}
-*/
-
-/*!
- \enum QDBusConnection::UnregisterMode
- The mode for unregistering an object path:
-
- \value UnregisterNode unregister this node only: do not unregister child objects
- \value UnregisterTree unregister this node and all its sub-tree
-
- Note, however, if this object was registered with the ExportChildObjects option, UnregisterNode
- will unregister the child objects too.
-*/
-
-/*!
- Creates a QDBusConnection object attached to the connection with name \a name.
-
- This does not open the connection. You have to call QDBusConnection::addConnection to open it.
-*/
-QDBusConnection::QDBusConnection(const QString &name)
-{
- d = manager()->connection(name);
- if (d)
- d->ref.ref();
-}
-
-/*!
- Creates a copy of the \a other connection.
-*/
-QDBusConnection::QDBusConnection(const QDBusConnection &other)
-{
- d = other.d;
- if (d)
- d->ref.ref();
-}
-
-/*!
- Disposes of this object. This does not close the connection: you have to call
- QDBusConnection::closeConnection to do that.
-*/
-QDBusConnection::~QDBusConnection()
-{
- if (d && !d->ref.deref())
- delete d;
-}
-
-/*!
- Creates a copy of the connection \a other in this object. The connection this object referenced
- before the copy is not spontaneously disconnected. See QDBusConnection::closeConnection for more
- information.
-*/
-QDBusConnection &QDBusConnection::operator=(const QDBusConnection &other)
-{
- if (other.d)
- other.d->ref.ref();
- QDBusConnectionPrivate *old = static_cast<QDBusConnectionPrivate *>(
- q_atomic_set_ptr(&d, other.d));
- if (old && !old->ref.deref())
- delete old;
-
- return *this;
-}
-
-/*!
- Opens a connection of type \a type to one of the known busses and associate with it the
- connection name \a name. Returns a QDBusConnection object associated with that connection.
-*/
-QDBusConnection QDBusConnection::addConnection(BusType type, const QString &name)
-{
-// Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection",
-// "Cannot create connection without a Q[Core]Application instance");
-
- QDBusConnectionPrivate *d = manager()->connection(name);
- if (d || name.isEmpty())
- return QDBusConnection(name);
-
- d = new QDBusConnectionPrivate;
- DBusConnection *c = 0;
- switch (type) {
- case SystemBus:
- c = dbus_bus_get_private(DBUS_BUS_SYSTEM, &d->error);
- break;
- case SessionBus:
- c = dbus_bus_get_private(DBUS_BUS_SESSION, &d->error);
- break;
- case ActivationBus:
- c = dbus_bus_get_private(DBUS_BUS_STARTER, &d->error);
- break;
- }
- d->setConnection(c); //setConnection does the error handling for us
-
- manager()->setConnection(name, d);
-
- QDBusConnection retval(name);
-
- // create the bus service
- QDBusAbstractInterfacePrivate *p;
- p = retval.findInterface_helper(QLatin1String(DBUS_SERVICE_DBUS),
- QLatin1String(DBUS_PATH_DBUS),
- DBUS_INTERFACE_DBUS);
- if (p) {
- d->busService = new QDBusBusService(p);
- d->busService->setParent(d); // auto-deletion
- d->ref.deref(); // busService has a increased the refcounting to us
- }
-
- return retval;
-}
-
-/*!
- Opens a peer-to-peer connection on address \a address and associate with it the
- connection name \a name. Returns a QDBusConnection object associated with that connection.
-*/
-QDBusConnection QDBusConnection::addConnection(const QString &address,
- const QString &name)
-{
-// Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection",
-// "Cannot create connection without a Q[Core]Application instance");
-
- QDBusConnectionPrivate *d = manager()->connection(name);
- if (d || name.isEmpty())
- return QDBusConnection(name);
-
- d = new QDBusConnectionPrivate;
- // setConnection does the error handling for us
- d->setConnection(dbus_connection_open(address.toUtf8().constData(), &d->error));
-
- manager()->setConnection(name, d);
-
- QDBusConnection retval(name);
-
- // create the bus service
- QDBusAbstractInterfacePrivate *p;
- p = retval.findInterface_helper(QLatin1String(DBUS_SERVICE_DBUS),
- QLatin1String(DBUS_PATH_DBUS),
- DBUS_INTERFACE_DBUS);
- if (p) {
- d->busService = new QDBusBusService(p);
- d->busService->setParent(d); // auto-deletion
- d->ref.deref(); // busService has a increased the refcounting to us
- }
-
- return retval;
-}
-
-/*!
- Closes the connection of name \a name.
-
- Note that if there are still QDBusConnection objects associated with the same connection, the
- connection will not be closed until all references are dropped. However, no further references
- can be created using the QDBusConnection::QDBusConnection constructor.
-*/
-void QDBusConnection::closeConnection(const QString &name)
-{
- manager()->removeConnection(name);
-}
-
-/*!
- Sends the \a message over this connection, without waiting for a reply. This is suitable for
- errors, signals, and return values as well as calls whose return values are not necessary.
-
- Returns true if the message was queued successfully, false otherwise.
-*/
-bool QDBusConnection::send(const QDBusMessage &message) const
-{
- if (!d || !d->connection)
- return false;
- return d->send(message) != 0;
-}
-
-/*!
- Sends the \a message over this connection and returns immediately after queueing it. When the
- reply is received, the slot \a method is called in the object \a receiver. This function is
- suitable for method calls only.
-
- This function guarantees that the slot will be called exactly once with the reply, as long as
- the parameter types match. If they don't, the reply cannot be delivered.
-
- Returns the identification of the message that was sent or 0 if nothing was sent.
-*/
-int QDBusConnection::sendWithReplyAsync(const QDBusMessage &message, QObject *receiver,
- const char *method) const
-{
- if (!d || !d->connection)
- return 0;
-
- return d->sendWithReplyAsync(message, receiver, method);
-}
-
-/*!
- Sends the \a message over this connection and blocks, waiting for a reply. This function is
- suitable for method calls only. It returns the reply message as its return value, which will be
- either of type QDBusMessage::ReplyMessage or QDBusMessage::ErrorMessage.
-
- See the QDBusInterface::call function for a more friendly way of placing calls.
-
- \warning If \a mode is \c UseEventLoop, this function will reenter the Qt event loop in order to
- wait for the reply. During the wait, it may deliver signals and other method calls to
- your application. Therefore, it must be prepared to handle a reentrancy whenever a call
- is placed with sendWithReply.
-*/
-QDBusMessage QDBusConnection::sendWithReply(const QDBusMessage &message, WaitMode mode) const
-{
- if (!d || !d->connection)
- return QDBusMessage();
- return d->sendWithReply(message, mode);
-}
-
-/*!
- Connects the signal specified by the \a service, \a path, \a interface and \a name parameters to
- the slot \a slot in object \a receiver. The arguments \a service and \a path can be empty,
- denoting a connection to any signal of the \a interface - \a name pair, from any remote
- application.
-
- Returns true if the connection was successful.
-
- \warning The signal will only be delivered to the slot if the parameters match. This verification
- can be done only when the signal is received, not at connection time.
-*/
-bool QDBusConnection::connect(const QString &service, const QString &path, const QString& interface,
- const QString &name, QObject *receiver, const char *slot)
-{
- return connect(service, path, interface, name, QString(), receiver, slot);
-}
-
-/*!
- \overload
- Connects the signal to the slot \a slot in object \a receiver. Unlike the other
- QDBusConnection::connect overload, this function allows one to specify the parameter signature
- to be connected using the \a signature variable. The function will then verify that this
- signature can be delivered to the slot specified by \a slot and return false otherwise.
-*/
-bool QDBusConnection::connect(const QString &service, const QString &path, const QString& interface,
- const QString &name, const QString &signature,
- QObject *receiver, const char *slot)
-{
- if (!receiver || !slot || !d || !d->connection || !QDBusUtil::isValidInterfaceName(interface))
- return false;
-
- QString source;
- if (!service.isEmpty()) {
- source = d->getNameOwner(service);
- if (source.isEmpty())
- return false;
- }
-
- // check the slot
- QDBusConnectionPrivate::SignalHook hook;
- QString key;
- hook.signature = signature;
- if (!d->prepareHook(hook, key, source, path, interface, name, receiver, slot, 0, false))
- return false; // don't connect
-
- // avoid duplicating:
- QWriteLocker locker(&d->lock);
- QDBusConnectionPrivate::SignalHookHash::ConstIterator it = d->signalHooks.find(key);
- for ( ; it != d->signalHooks.constEnd() && it.key() == key; ++it) {
- const QDBusConnectionPrivate::SignalHook &entry = it.value();
- if (entry.sender == hook.sender &&
- entry.path == hook.path &&
- entry.signature == hook.signature &&
- entry.obj == hook.obj &&
- entry.midx == hook.midx) {
- // no need to compare the parameters if it's the same slot
- return true; // already there
- }
- }
-
-
- d->connectSignal(key, hook);
- return true;
-}
-
-/*!
- Registers the object \a object at path \a path and returns true if the registration was
- successful. The \a options parameter specifies how much of the object \a object will be exposed
- through D-Bus.
-
- This function does not replace existing objects: if there is already an object registered at
- path \a path, this function will return false. Use unregisterObject() to unregister it first.
-
- You cannot register an object as a child object of an object that was registered with
- QDBusConnection::ExportChildObjects.
-*/
-bool QDBusConnection::registerObject(const QString &path, QObject *object, RegisterOptions options)
-{
- Q_ASSERT_X(QDBusUtil::isValidObjectPath(path), "QDBusConnection::registerObject",
- "Invalid object path given");
- if (!d || !d->connection || !object || !options || !QDBusUtil::isValidObjectPath(path))
- return false;
-
- if (options & ExportSignals) {
- qWarning("Cannot export signals from objects. Use an adaptor for that purpose.");
- return false;
- }
-
- QStringList pathComponents = path.split(QLatin1Char('/'));
- if (pathComponents.last().isEmpty())
- pathComponents.removeLast();
- QWriteLocker locker(&d->lock);
-
- // lower-bound search for where this object should enter in the tree
- QDBusConnectionPrivate::ObjectTreeNode *node = &d->rootNode;
- int i = 1;
- while (node) {
- if (pathComponents.count() == i) {
- // this node exists
- // consider it free if there's no object here and the user is not trying to
- // replace the object sub-tree
- if ((options & ExportChildObjects && !node->children.isEmpty()) || node->obj)
- return false;
-
- // we can add the object here
- node->obj = object;
- node->flags = options;
-
- d->registerObject(node);
- qDebug("REGISTERED FOR %s", path.toLocal8Bit().constData());
- return true;
- }
-
- // find the position where we'd insert the node
- QVector<QDBusConnectionPrivate::ObjectTreeNode::Data>::Iterator it =
- qLowerBound(node->children.begin(), node->children.end(), pathComponents.at(i));
- if (it != node->children.constEnd() && it->name == pathComponents.at(i)) {
- // match: this node exists
- node = it->node;
-
- // are we allowed to go deeper?
- if (node->flags & ExportChildObjects) {
- // we're not
- qDebug("Cannot register object at %s because %s exports its own child objects",
- qPrintable(path), qPrintable(pathComponents.at(i)));
- return false;
- }
- } else {
- // add entry
- QDBusConnectionPrivate::ObjectTreeNode::Data entry;
- entry.name = pathComponents.at(i);
- entry.node = new QDBusConnectionPrivate::ObjectTreeNode;
- node->children.insert(it, entry);
-
- node = entry.node;
- }
-
- // iterate
- ++i;
- }
-
- Q_ASSERT_X(false, "QDBusConnection::registerObject", "The impossible happened");
- return false;
-}
-
-/*!
- Unregisters an object that was registered with the registerObject() at the object path given by
- \a path and, if \a mode is QDBusConnection::UnregisterTree, all of its sub-objects too.
-
- Note that you cannot unregister objects that were not registered with registerObject().
-*/
-void QDBusConnection::unregisterObject(const QString &path, UnregisterMode mode)
-{
- if (!d || !d->connection || !QDBusUtil::isValidObjectPath(path))
- return;
-
- QStringList pathComponents = path.split(QLatin1Char('/'));
- QWriteLocker locker(&d->lock);
- QDBusConnectionPrivate::ObjectTreeNode *node = &d->rootNode;
- int i = 1;
-
- // find the object
- while (node) {
- if (pathComponents.count() == i) {
- // found it
- node->obj = 0;
- node->flags = 0;
-
- if (mode == UnregisterTree) {
- // clear the sub-tree as well
- node->clear(); // can't disconnect the objects because we really don't know if they can
- // be found somewhere else in the path too
- }
-
- return;
- }
-
- QVector<QDBusConnectionPrivate::ObjectTreeNode::Data>::ConstIterator it =
- qLowerBound(node->children.constBegin(), node->children.constEnd(), pathComponents.at(i));
- if (it == node->children.constEnd() || it->name != pathComponents.at(i))
- break; // node not found
-
- node = it->node;
- ++i;
- }
-}
-
-/*!
- Returns a dynamic QDBusInterface associated with the interface \a interface on object at path \a
- path on service \a service.
-
- This function creates a new object. It is your resposibility to ensure it is properly deleted
- (you can use all normal QObject deletion mechanisms, including the QObject::deleteLater() slot
- and QObject::setParent()).
-
- If the searching for this interface on the remote object failed, this function returns 0.
-*/
-QDBusInterface *QDBusConnection::findInterface(const QString& service, const QString& path,
- const QString& interface)
-{
- Q_ASSERT_X(QDBusUtil::isValidBusName(service),
- "QDBusConnection::findInterface", "Invalid service name");
- Q_ASSERT_X(QDBusUtil::isValidObjectPath(path),
- "QDBusConnection::findInterface", "Invalid object path given");
- Q_ASSERT_X(interface.isEmpty() || QDBusUtil::isValidInterfaceName(interface),
- "QDBusConnection::findInterface", "Invalid interface name");
- if (!d)
- return 0;
-
- QDBusInterfacePrivate *p = d->findInterface(service, path, interface);
- QDBusInterface *retval = new QDBusInterface(p);
- retval->setParent(d);
- return retval;
-}
-
-/*!
- \fn QDBusConnection::findInterface(const QString &service, const QString &path)
- Returns an interface of type \c Interface associated with the object on path \a path at service
- \a service.
-
- \c Interface must be a class generated by \l {dbusidl2cpp.html}.
-
- This function creates a new object. It is your resposibility to ensure it is properly deleted
- (you can use all normal QObject deletion mechanisms, including the QObject::deleteLater() slot
- and QObject::setParent()).
-*/
-
-/*!
- Returns a QDBusBusService object that represents the D-Bus bus service on this connection.
-
- This function returns 0 for peer-to-peer connections.
-*/
-QDBusBusService *QDBusConnection::busService() const
-{
- if (!d)
- return 0;
- return d->busService;
-}
-
-QDBusAbstractInterfacePrivate *
-QDBusConnection::findInterface_helper(const QString &service, const QString &path,
- const char *iface)
-{
- QString interface = QLatin1String(iface);
- // service and path can be empty here, but interface can't
- Q_ASSERT_X(service.isEmpty() || QDBusUtil::isValidBusName(service),
- "QDBusConnection::findInterface", "Invalid service name");
- Q_ASSERT_X(path.isEmpty() || QDBusUtil::isValidObjectPath(path),
- "QDBusConnection::findInterface", "Invalid object path given");
- Q_ASSERT_X(QDBusUtil::isValidInterfaceName(interface),
- "QDBusConnection::findInterface", "Invalid interface class!");
- if (!d)
- return 0;
-
- QString owner;
- if (!service.isEmpty()) {
- // check if it's there first -- FIXME: add binding mode
- owner = d->getNameOwner(service);
- if (owner.isEmpty()) {
- QDBusAbstractInterfacePrivate *p;
- p = new QDBusAbstractInterfacePrivate(*this, d, service, path, interface);
- p->isValid = false;
- p->lastError = d->lastError;
- return p;
- }
- }
-
- return new QDBusAbstractInterfacePrivate(*this, d, owner, path, interface);
-}
-
-/*!
- Returns true if this QDBusConnection object is connected.
-
- If it isn't connected, calling QDBusConnection::addConnection on the same connection name
- will not make be connected. You need to call the QDBusConnection constructor again.
-*/
-bool QDBusConnection::isConnected( ) const
-{
- return d && d->connection && dbus_connection_get_is_connected(d->connection);
-}
-
-/*!
- Returns the last error that happened in this connection.
-
- This function is provided for low-level code. If you're using QDBusInterface::call, error codes are
- reported by its return value.
-
- \sa QDBusInterface, QDBusMessage
-*/
-QDBusError QDBusConnection::lastError() const
-{
- return d ? d->lastError : QDBusError();
-}
-
-/*!
- Returns the unique connection name for this connection, if this QDBusConnection object is
- connected, or an empty QString otherwise.
-
- A Unique Connection Name is a string in the form ":x.xxx" (where x are decimal digits) that is
- assigned by the D-Bus server daemon upon connection. It uniquely identifies this client in the
- bus.
-
- This function returns an empty QString for peer-to-peer connections.
-*/
-QString QDBusConnection::baseService() const
-{
- return d && d->connection ?
- QString::fromUtf8(dbus_bus_get_unique_name(d->connection))
- : QString();
-}
-
-Q_GLOBAL_STATIC(QMutex, defaultBussesMutex)
-static const char sessionBusName[] = "qt_default_session_bus";
-static const char systemBusName[] = "qt_default_system_bus";
-static QDBusConnection *sessionBus = 0;
-static QDBusConnection *systemBus = 0;
-
-static void closeConnections()
-{
- QMutexLocker locker(defaultBussesMutex());
- delete sessionBus;
- delete systemBus;
- QDBusConnection::closeConnection(QLatin1String(sessionBusName));
- QDBusConnection::closeConnection(QLatin1String(systemBusName));
- sessionBus = systemBus = 0;
-}
-
-static QDBusConnection *openConnection(QDBusConnection::BusType type)
-{
- QMutexLocker locker(defaultBussesMutex());
- qAddPostRoutine(closeConnections);
-
- if (type == QDBusConnection::SystemBus) {
- if (systemBus)
- // maybe it got created before we locked the mutex
- return systemBus;
- systemBus = new QDBusConnection(QDBusConnection::addConnection(QDBusConnection::SystemBus,
- QLatin1String(systemBusName)));
- return systemBus;
- } else {
- if (sessionBus)
- // maybe it got created before we locked the mutex
- return sessionBus;
- sessionBus = new QDBusConnection(QDBusConnection::addConnection(QDBusConnection::SessionBus,
- QLatin1String(sessionBusName)));
- return sessionBus;
- }
-}
-
-namespace QDBus {
- QDBusConnection &sessionBus()
- {
- if (::sessionBus) return *::sessionBus;
- return *openConnection(QDBusConnection::SessionBus);
- }
-
- QDBusConnection &systemBus()
- {
- if (::systemBus) return *::systemBus;
- return *openConnection(QDBusConnection::SystemBus);
- }
-}
-
diff --git a/qt/src/qdbusconnection.h b/qt/src/qdbusconnection.h
deleted file mode 100644
index 61a3439e..00000000
--- a/qt/src/qdbusconnection.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* qdbusconnection.h QDBusConnection object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSCONNECTION_H
-#define QDBUSCONNECTION_H
-
-#include "qdbusmacros.h"
-#include <QtCore/qstring.h>
-
-class QDBusAbstractInterfacePrivate;
-class QDBusInterface;
-class QDBusError;
-class QDBusMessage;
-class QDBusBusService;
-class QObject;
-
-class QDBusConnectionPrivate;
-class QDBUS_EXPORT QDBusConnection
-{
-public:
- enum BusType { SessionBus, SystemBus, ActivationBus };
- enum WaitMode { UseEventLoop, NoUseEventLoop };
- enum RegisterOption {
- ExportAdaptors = 0x01,
-
- ExportSlots = 0x10,
- ExportSignals = 0x20,
- ExportProperties = 0x40,
- ExportContents = 0xf0,
-
- ExportAllSlots = 0x110,
- ExportAllSignals = 0x220,
- ExportAllProperties = 0x440,
- ExportAllContents = 0xff0,
-
- ExportChildObjects = 0x1000
- };
- enum UnregisterMode {
- UnregisterNode,
- UnregisterTree
- };
-
- Q_DECLARE_FLAGS(RegisterOptions, RegisterOption)
-
- QDBusConnection(const QString &name);
- QDBusConnection(const QDBusConnection &other);
- ~QDBusConnection();
-
- QDBusConnection &operator=(const QDBusConnection &other);
-
- bool isConnected() const;
- QString baseService() const;
- QDBusError lastError() const;
-
- bool send(const QDBusMessage &message) const;
- QDBusMessage sendWithReply(const QDBusMessage &message, WaitMode mode = NoUseEventLoop) const;
- int sendWithReplyAsync(const QDBusMessage &message, QObject *receiver,
- const char *slot) const;
-
- bool connect(const QString &service, const QString &path, const QString &interface,
- const QString &name, QObject *receiver, const char *slot);
- bool connect(const QString &service, const QString &path, const QString &interface,
- const QString &name, const QString& signature,
- QObject *receiver, const char *slot);
-
- bool registerObject(const QString &path, QObject *object,
- RegisterOptions options = ExportAdaptors);
- void unregisterObject(const QString &path, UnregisterMode mode = UnregisterNode);
-
- template<class Interface>
- inline Interface *findInterface(const QString &service, const QString &path);
- QDBusInterface *findInterface(const QString& service, const QString& path,
- const QString& interface = QString());
-
- QDBusBusService *busService() const;
-
- static QDBusConnection addConnection(BusType type, const QString &name);
- static QDBusConnection addConnection(const QString &address, const QString &name);
- static void closeConnection(const QString &name);
-
-private:
- QDBusAbstractInterfacePrivate *findInterface_helper(const QString &, const QString &,
- const char*);
- QDBusConnectionPrivate *d;
-};
-
-template<class Interface>
-inline Interface *QDBusConnection::findInterface(const QString &service, const QString &path)
-{
- register QDBusAbstractInterfacePrivate *d_ptr;
- d_ptr = findInterface_helper(service, path, Interface::staticInterfaceName());
- if (d_ptr)
- return new Interface(d_ptr);
- return 0;
-}
-
-namespace QDBus {
- QDBUS_EXPORT QDBusConnection &sessionBus();
- QDBUS_EXPORT QDBusConnection &systemBus();
-}
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QDBusConnection::RegisterOptions)
-#endif
diff --git a/qt/src/qdbusconnection_p.h b/qt/src/qdbusconnection_p.h
deleted file mode 100644
index bab0b65d..00000000
--- a/qt/src/qdbusconnection_p.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/* qdbusconnection_p.h QDBusConnection private object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the public API. This header file may
-// change from version to version without notice, or even be
-// removed.
-//
-// We mean it.
-//
-//
-
-#ifndef QDBUSCONNECTION_P_H
-#define QDBUSCONNECTION_P_H
-
-#include "qdbuserror.h"
-
-#include <QtCore/qatomic.h>
-#include <QtCore/qeventloop.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qobject.h>
-#include <QtCore/qpointer.h>
-#include <QtCore/qreadwritelock.h>
-#include <QtCore/qvarlengtharray.h>
-#include <QtCore/qvector.h>
-
-#include <dbus/dbus.h>
-
-#include "qdbusmessage.h"
-
-class QDBusMessage;
-class QSocketNotifier;
-class QTimerEvent;
-class QDBusObjectPrivate;
-class CallDeliveryEvent;
-class QMetaMethod;
-class QDBusInterfacePrivate;
-struct QDBusMetaObject;
-class QDBusAbstractInterface;
-class QDBusBusService;
-
-class QDBusConnectionPrivate: public QObject
-{
- Q_OBJECT
-public:
- // structs and enums
- enum ConnectionMode { InvalidMode, ServerMode, ClientMode };
-
- struct Watcher
- {
- Watcher(): watch(0), read(0), write(0) {}
- DBusWatch *watch;
- QSocketNotifier *read;
- QSocketNotifier *write;
- };
-
- struct SignalHook
- {
- inline SignalHook() : obj(0), midx(-1) { }
- QString sender, path, signature;
- QObject* obj;
- int midx;
- QList<int> params;
- };
-
- struct ObjectTreeNode
- {
- struct Data
- {
- QString name;
- ObjectTreeNode *node;
-
- inline bool operator<(const QString &other) const
- { return name < other; }
- };
-
- inline ObjectTreeNode() : obj(0), flags(0) { }
- inline ~ObjectTreeNode() { clear(); }
- inline void clear()
- {
- foreach (const Data &entry, children) {
- entry.node->clear();
- delete entry.node;
- }
- children.clear();
- }
-
- QObject* obj;
- int flags;
- QVector<Data> children;
- };
-
-public:
- // typedefs
- typedef QMultiHash<int, Watcher> WatcherHash;
- typedef QHash<int, DBusTimeout *> TimeoutHash;
- typedef QMultiHash<QString, SignalHook> SignalHookHash;
- typedef QHash<QString, QDBusMetaObject* > MetaObjectHash;
-
-public:
- // public methods
- QDBusConnectionPrivate(QObject *parent = 0);
- ~QDBusConnectionPrivate();
-
- void bindToApplication();
-
- void setConnection(DBusConnection *connection);
- void setServer(DBusServer *server);
- void closeConnection();
- void timerEvent(QTimerEvent *e);
-
- QString getNameOwner(const QString &service);
-
- int send(const QDBusMessage &message) const;
- QDBusMessage sendWithReply(const QDBusMessage &message, int mode);
- int sendWithReplyAsync(const QDBusMessage &message, QObject *receiver,
- const char *method);
- void connectSignal(const QString &key, const SignalHook &hook);
- void registerObject(const ObjectTreeNode *node);
- void connectRelay(const QString &service, const QString &path, const QString &interface,
- QDBusAbstractInterface *receiver, const char *signal);
- void disconnectRelay(const QString &service, const QString &path, const QString &interface,
- QDBusAbstractInterface *receiver, const char *signal);
-
- bool handleSignal(const QString &key, const QDBusMessage &msg);
- bool handleSignal(const QDBusMessage &msg);
- bool handleObjectCall(const QDBusMessage &message);
- bool handleError();
-
- bool activateSignal(const SignalHook& hook, const QDBusMessage &msg);
- bool activateCall(QObject* object, int flags, const QDBusMessage &msg);
- bool activateObject(const ObjectTreeNode *node, const QDBusMessage &msg);
- bool activateInternalFilters(const ObjectTreeNode *node, const QDBusMessage &msg);
-
- void postCallDeliveryEvent(CallDeliveryEvent *data);
- CallDeliveryEvent *postedCallDeliveryEvent();
- void deliverCall(const CallDeliveryEvent &data) const;
-
- QDBusInterfacePrivate *findInterface(const QString &service, const QString &path,
- const QString &interface);
-
-protected:
- virtual void customEvent(QEvent *event);
-
-private:
- QDBusMetaObject *findMetaObject(const QString &service, const QString &path,
- const QString &interface);
-
-public slots:
- // public slots
- void doDispatch();
- void socketRead(int);
- void socketWrite(int);
- void objectDestroyed(QObject *o);
- void relaySignal(QObject *obj, const char *interface, const char *name, const QVariantList &args);
-
-public:
- // public member variables
- QString name; // this connection's name
-
- DBusError error;
- QDBusError lastError;
-
- QAtomic ref;
- QReadWriteLock lock;
- ConnectionMode mode;
- DBusConnection *connection;
- DBusServer *server;
- QDBusBusService *busService;
-
- WatcherHash watchers;
- TimeoutHash timeouts;
- SignalHookHash signalHooks;
- QList<DBusTimeout *> pendingTimeouts;
-
- ObjectTreeNode rootNode;
- MetaObjectHash cachedMetaObjects;
-
- QMutex callDeliveryMutex;
- CallDeliveryEvent *callDeliveryState; // protected by the callDeliveryMutex mutex
-
-public:
- // static methods
- static int messageMetaType;
- static int registerMessageMetaType();
- static int findSlot(QObject *obj, const QByteArray &normalizedName, QList<int>& params);
- static bool prepareHook(QDBusConnectionPrivate::SignalHook &hook, QString &key,
- const QString &service, const QString &path,
- const QString &interface, const QString &name,
- QObject *receiver, const char *signal, int minMIdx,
- bool buildSignature);
- static DBusHandlerResult messageFilter(DBusConnection *, DBusMessage *, void *);
- static void messageResultReceived(DBusPendingCall *, void *);
-};
-
-class QDBusReplyWaiter: public QEventLoop
-{
- Q_OBJECT
-public:
- QDBusMessage replyMsg;
-
-public slots:
- void reply(const QDBusMessage &msg);
-};
-
-// in qdbusmisc.cpp
-extern int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes);
-extern int qDBusNameToTypeId(const char *name);
-extern bool qDBusCheckAsyncTag(const char *tag);
-
-// in qdbusinternalfilters.cpp
-extern QString qDBusIntrospectObject(const QDBusConnectionPrivate::ObjectTreeNode *node);
-extern void qDBusIntrospectObject(const QDBusConnectionPrivate::ObjectTreeNode *node,
- const QDBusMessage &msg);
-extern void qDBusPropertyGet(const QDBusConnectionPrivate::ObjectTreeNode *node,
- const QDBusMessage &msg);
-extern void qDBusPropertySet(const QDBusConnectionPrivate::ObjectTreeNode *node,
- const QDBusMessage &msg);
-
-#endif
diff --git a/qt/src/qdbuserror.cpp b/qt/src/qdbuserror.cpp
deleted file mode 100644
index ee6ce12c..00000000
--- a/qt/src/qdbuserror.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/* qdbuserror.h QDBusError object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbuserror.h"
-
-#include <qdebug.h>
-#include <qvarlengtharray.h>
-
-#include <dbus/dbus.h>
-#include "qdbusmessage.h"
-
-struct ErrorMessageMapping
-{
- ErrorMessageMapping();
- QVarLengthArray<const char*, QDBusError::qKnownErrorsMax> messages;
-
- inline const char *get(QDBusError::KnownErrors code) const
- {
- if (code <= QDBusError::Other || code > QDBusError::qKnownErrorsMax)
- return messages[int(QDBusError::Other) - 1];
- return messages[int(code) - 1];
- }
-
- inline QDBusError::KnownErrors get(const char *name) const
- {
- if (!name || !*name)
- return QDBusError::NoError;
- for (int i = QDBusError::Other; i <= QDBusError::qKnownErrorsMax; ++i)
- if (strcmp(name, messages[i - 1]) == 0)
- return QDBusError::KnownErrors(i);
- return QDBusError::Other;
- }
-};
-
-static const char errorMessages_string[] =
- // in the same order as KnownErrors!
- "other\0" // Other -- shouldn't happen
- DBUS_ERROR_FAILED "\0" // Failed
- DBUS_ERROR_NO_MEMORY "\0" // NoMemory
- DBUS_ERROR_SERVICE_UNKNOWN "\0" // ServiceUnknown
- DBUS_ERROR_NO_REPLY "\0" // NoReply
- DBUS_ERROR_BAD_ADDRESS "\0" // BadAddress
- DBUS_ERROR_NOT_SUPPORTED "\0" // NotSupported
- DBUS_ERROR_LIMITS_EXCEEDED "\0" // LimitsExceeded
- DBUS_ERROR_ACCESS_DENIED "\0" // AccessDenied
- DBUS_ERROR_NO_SERVER "\0" // NoServer
- DBUS_ERROR_TIMEOUT "\0" // Timeout
- DBUS_ERROR_NO_NETWORK "\0" // NoNetwork
- DBUS_ERROR_ADDRESS_IN_USE "\0" // AddressInUse
- DBUS_ERROR_DISCONNECTED "\0" // Disconnected
- DBUS_ERROR_INVALID_ARGS "\0" // InvalidArgs
- DBUS_ERROR_UNKNOWN_METHOD "\0" // UnknownMethod
- DBUS_ERROR_TIMED_OUT "\0" // TimedOut
- DBUS_ERROR_INVALID_SIGNATURE "\0" // InvalidSignature
- "com.trolltech.QtDBus.Error.UnknownInterface\0" // UnknownInterface
- "com.trolltech.QtDBus.Error.InternalError\0" // InternalError
- "\0";
-
-ErrorMessageMapping::ErrorMessageMapping()
- : messages(int(QDBusError::qKnownErrorsMax))
-{
- // create the list:
- const char *p = errorMessages_string;
- int i = 0;
- while (*p) {
- messages[i] = p;
- p += strlen(p) + 1;
- ++i;
- }
-}
-
-Q_GLOBAL_STATIC(ErrorMessageMapping, errorMessages)
-
-/*!
- \class QDBusError
- \brief Represents an error received from the D-Bus bus or from remote applications found in the bus.
-
- When dealing with the D-Bus bus service or with remote applications over D-Bus, a number of
- error conditions can happen. This error conditions are sometimes signalled by a returned error
- value or by a QDBusError.
-
- C++ and Java exceptions are a valid analogy for D-Bus errors: instead of returning normally with
- a return value, remote applications and the bus may decide to throw an error condition. However,
- the QtDBus implementation does not use the C++ exception-throwing mechanism, so you will receive
- QDBusErrors in the return reply (see QDBusReply::error()).
-
- QDBusError objects are used to inspect the error name and message as received from the bus and
- remote applications. You should not create such objects yourself to signal error conditions when
- called from D-Bus: instead, use QDBusMessage::error and QDBusConnection::send.
-
- \sa QDBusConnection::send(), QDBusMessage, QDBusReply
-*/
-
-/*!
- \enum QDBusError::KnownErrors
-
- In order to facilitate verification of the most common D-Bus errors generated by the D-Bus
- implementation and by the bus daemon itself, QDBusError can be compared to a set of pre-defined
- values:
-
- \value NoError QDBusError is invalid (i.e., the call succeeded)
- \value Other QDBusError contains an error that is one of the well-known ones
- \value Failed The call failed (\c org.freedesktop.DBus.Error.Failed)
- \value NoMemory Out of memory (\c org.freedesktop.DBus.Error.NoMemory)
- \value ServiceUnknown The called service is not known
- (\c org.freedesktop.DBus.Error.ServiceUnknown)
- \value NoReply The called method did not reply within the specified timeout
- (\c org.freedesktop.DBus.Error.NoReply)
- \value BadAddress The address given is not valid
- (\c org.freedesktop.DBus.Error.BadAddress)
- \value NotSupported The call/operation is not supported
- (\c org.freedesktop.DBus.Error.NotSupported)
- \value LimitsExceeded The limits allocated to this process/call/connection exceeded the
- pre-defined values (\c org.freedesktop.DBus.Error.LimitsExceeded)
- \value AccessDenied The call/operation tried to access a resource it isn't allowed to
- (\c org.freedesktop.DBus.Error.AccessDenied)
- \value NoServer \e {Documentation doesn't say what this is for}
- (\c org.freedesktop.DBus.Error.NoServer)
- \value Timeout \e {Documentation doesn't say what this is for or how it's used}
- (\c org.freedesktop.DBus.Error.Timeout)
- \value NoNetwork \e {Documentation doesn't say what this is for}
- (\c org.freedesktop.DBus.Error.NoNetwork)
- \value AddressInUse QDBusServer tried to bind to an address that is already in use
- (\c org.freedesktop.DBus.Error.AddressInUse)
- \value Disconnected The call/process/message was sent after QDBusConnection disconnected
- (\c org.freedesktop.DBus.Error.Disconnected)
- \value InvalidArgs The arguments passed to this call/operation are not valid
- (\c org.freedesktop.DBus.Error.InvalidArgs)
- \value UnknownMethod The method called was not found in this object/interface with the
- given parameters (\c org.freedesktop.DBus.Error.UnknownMethod)
- \value TimedOut \e {Documentation doesn't say...}
- (\c org.freedesktop.DBus.Error.TimedOut)
- \value InvalidSignature The type signature is not valid or compatible
- (\c org.freedesktop.DBus.Error.InvalidSignature)
- \value UnknownInterface The interface is not known
- \value InternalError An internal error occurred
- (\c com.trolltech.QtDBus.Error.InternalError)
-
-*/
-
-/*!
- \internal
- Constructs a QDBusError from a DBusError structure.
-*/
-QDBusError::QDBusError(const DBusError *error)
- : code(NoError)
-{
- if (!error || !dbus_error_is_set(error))
- return;
-
- code = errorMessages()->get(error->name);
- nm = QString::fromUtf8(error->name);
- msg = QString::fromUtf8(error->message);
-}
-
-/*!
- \internal
- Constructs a QDBusError from a QDBusMessage.
-*/
-QDBusError::QDBusError(const QDBusMessage &qdmsg)
- : code(Other)
-{
- if (qdmsg.type() != QDBusMessage::ErrorMessage)
- return;
-
- nm = qdmsg.name();
- if (qdmsg.count())
- msg = qdmsg[0].toString();
- code = errorMessages()->get(nm.toUtf8().constData());
-}
-
-/*!
- \internal
- Constructs a QDBusError from a well-known error code
-*/
-QDBusError::QDBusError(KnownErrors error, const QString &mess)
- : code(error)
-{
- nm = QLatin1String(errorMessages()->get(error));
- msg = mess;
-}
-
-/*!
- \fn QDBusError::name() const
- Returns this error's name. Error names are similar to D-Bus Interface names, like
- "org.freedesktop.DBus.InvalidArgs".
-*/
-
-/*!
- \fn QDBusError::message() const
- Returns the message that the callee associated with this error. Error messages are
- implementation defined and usually contain a human-readable error code, though this does not
- mean it is suitable for your end-users.
-*/
-
-/*!
- \fn QDBusError::isValid() const
- Returns true if this is a valid error condition (i.e., if there was an error), false otherwise.
-*/
-
-/*!
- \fn QDBusError::operator==(KnownErrors error) const
- Compares this QDBusError against the well-known error code \a error and returns true if they
- match.
-*/
-
-/*!
- \fn operator==(QDBusError::KnownErrors p1, const QDBusError &p2)
- \relates QDBusError
-
- Compares the QDBusError \a p2 against the well-known error code \a p1 and returns true if they
- match.
-*/
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, const QDBusError &msg)
-{
- dbg.nospace() << "QDBusError(" << msg.name() << ", " << msg.message() << ")";
- return dbg.space();
-}
-#endif
-
-
diff --git a/qt/src/qdbuserror.h b/qt/src/qdbuserror.h
deleted file mode 100644
index e7aacdb0..00000000
--- a/qt/src/qdbuserror.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* qdbuserror.h QDBusError object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSERROR_H
-#define QDBUSERROR_H
-
-#include "qdbusmacros.h"
-#include <QtCore/qstring.h>
-
-struct DBusError;
-class QDBusMessage;
-
-class QDBUS_EXPORT QDBusError
-{
-public:
- enum KnownErrors {
- NoError = 0,
- Other = 1,
- Failed,
- NoMemory,
- ServiceUnknown,
- NoReply,
- BadAddress,
- NotSupported,
- LimitsExceeded,
- AccessDenied,
- NoServer,
- Timeout,
- NoNetwork,
- AddressInUse,
- Disconnected,
- InvalidArgs,
- UnknownMethod,
- TimedOut,
- InvalidSignature,
- UnknownInterface,
- InternalError,
-
-#ifndef Q_QDOC
- // don't use this one!
- qKnownErrorsMax = InternalError
-#endif
- };
-
- QDBusError(const DBusError *error = 0);
- QDBusError(const QDBusMessage& msg);
- QDBusError(KnownErrors error, const QString &message);
-
- inline QString name() const { return nm; }
- inline QString message() const { return msg; }
- inline bool isValid() const { return !nm.isNull() && !msg.isNull(); }
-
- inline bool operator==(KnownErrors error) const
- { return code == error; }
-
-private:
- KnownErrors code;
- QString nm, msg;
-};
-
-inline bool operator==(QDBusError::KnownErrors p1, const QDBusError &p2)
-{ return p2 == p1; }
-inline bool operator!=(QDBusError::KnownErrors p1, const QDBusError &p2)
-{ return !(p2 == p1); }
-inline bool operator!=(const QDBusError &p1, QDBusError::KnownErrors p2)
-{ return !(p1 == p2); }
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug, const QDBusError &);
-#endif
-
-#endif
diff --git a/qt/src/qdbusintegrator.cpp b/qt/src/qdbusintegrator.cpp
deleted file mode 100644
index 509e110f..00000000
--- a/qt/src/qdbusintegrator.cpp
+++ /dev/null
@@ -1,1554 +0,0 @@
-/* qdbusintegrator.cpp QDBusConnection private implementation
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include <qcoreapplication.h>
-#include <qcoreevent.h>
-#include <qdebug.h>
-#include <qmetaobject.h>
-#include <qobject.h>
-#include <qsocketnotifier.h>
-#include <qstringlist.h>
-#include <qtimer.h>
-
-#include "qdbusconnection_p.h"
-#include "qdbusinterface_p.h"
-#include "qdbusmessage.h"
-#include "qdbusabstractadaptor.h"
-#include "qdbusabstractadaptor_p.h"
-#include "qdbustypehelper_p.h"
-#include "qdbusutil.h"
-#include "qdbustype_p.h"
-
-#ifndef USE_OUTSIDE_DISPATCH
-# define USE_OUTSIDE_DISPATCH 0
-#endif
-
-int QDBusConnectionPrivate::messageMetaType = 0;
-
-typedef void (*QDBusSpyHook)(const QDBusMessage&);
-typedef QVarLengthArray<QDBusSpyHook, 4> QDBusSpyHookList;
-Q_GLOBAL_STATIC(QDBusSpyHookList, qDBusSpyHookList)
-
-struct QDBusPendingCall
-{
- QPointer<QObject> receiver;
- QList<int> metaTypes;
- int methodIdx;
- DBusPendingCall *pending;
- const QDBusConnectionPrivate *connection;
-};
-
-class CallDeliveryEvent: public QEvent
-{
-public:
- CallDeliveryEvent()
- : QEvent(QEvent::User), object(0), flags(0), slotIdx(-1)
- { }
-
- const QDBusConnectionPrivate *conn;
- QPointer<QObject> object;
- QDBusMessage message;
- QList<int> metaTypes;
-
- int flags;
- int slotIdx;
-};
-
-static dbus_bool_t qDBusAddTimeout(DBusTimeout *timeout, void *data)
-{
- Q_ASSERT(timeout);
- Q_ASSERT(data);
-
- // qDebug("addTimeout %d", dbus_timeout_get_interval(timeout));
-
- QDBusConnectionPrivate *d = static_cast<QDBusConnectionPrivate *>(data);
-
- if (!dbus_timeout_get_enabled(timeout))
- return true;
-
- if (!QCoreApplication::instance()) {
- d->pendingTimeouts.append(timeout);
- return true;
- }
- int timerId = d->startTimer(dbus_timeout_get_interval(timeout));
- if (!timerId)
- return false;
-
- d->timeouts[timerId] = timeout;
- return true;
-}
-
-static void qDBusRemoveTimeout(DBusTimeout *timeout, void *data)
-{
- Q_ASSERT(timeout);
- Q_ASSERT(data);
-
- // qDebug("removeTimeout");
-
- QDBusConnectionPrivate *d = static_cast<QDBusConnectionPrivate *>(data);
- d->pendingTimeouts.removeAll(timeout);
-
- QDBusConnectionPrivate::TimeoutHash::iterator it = d->timeouts.begin();
- while (it != d->timeouts.end()) {
- if (it.value() == timeout) {
- d->killTimer(it.key());
- it = d->timeouts.erase(it);
- } else {
- ++it;
- }
- }
-}
-
-static void qDBusToggleTimeout(DBusTimeout *timeout, void *data)
-{
- Q_ASSERT(timeout);
- Q_ASSERT(data);
-
- //qDebug("ToggleTimeout");
-
- qDBusRemoveTimeout(timeout, data);
- qDBusAddTimeout(timeout, data);
-}
-
-static dbus_bool_t qDBusAddWatch(DBusWatch *watch, void *data)
-{
- Q_ASSERT(watch);
- Q_ASSERT(data);
-
- QDBusConnectionPrivate *d = static_cast<QDBusConnectionPrivate *>(data);
-
- int flags = dbus_watch_get_flags(watch);
- int fd = dbus_watch_get_fd(watch);
-
- QDBusConnectionPrivate::Watcher watcher;
- if (flags & DBUS_WATCH_READABLE) {
- //qDebug("addReadWatch %d", fd);
- watcher.watch = watch;
- if (QCoreApplication::instance()) {
- watcher.read = new QSocketNotifier(fd, QSocketNotifier::Read, d);
- watcher.read->setEnabled(dbus_watch_get_enabled(watch));
- d->connect(watcher.read, SIGNAL(activated(int)), SLOT(socketRead(int)));
- }
- }
- if (flags & DBUS_WATCH_WRITABLE) {
- //qDebug("addWriteWatch %d", fd);
- watcher.watch = watch;
- if (QCoreApplication::instance()) {
- watcher.write = new QSocketNotifier(fd, QSocketNotifier::Write, d);
- watcher.write->setEnabled(dbus_watch_get_enabled(watch));
- d->connect(watcher.write, SIGNAL(activated(int)), SLOT(socketWrite(int)));
- }
- }
- d->watchers.insertMulti(fd, watcher);
-
- return true;
-}
-
-static void qDBusRemoveWatch(DBusWatch *watch, void *data)
-{
- Q_ASSERT(watch);
- Q_ASSERT(data);
-
- //qDebug("remove watch");
-
- QDBusConnectionPrivate *d = static_cast<QDBusConnectionPrivate *>(data);
- int fd = dbus_watch_get_fd(watch);
-
- QDBusConnectionPrivate::WatcherHash::iterator i = d->watchers.find(fd);
- while (i != d->watchers.end() && i.key() == fd) {
- if (i.value().watch == watch) {
- delete i.value().read;
- delete i.value().write;
- d->watchers.erase(i);
- return;
- }
- ++i;
- }
-}
-
-static void qDBusToggleWatch(DBusWatch *watch, void *data)
-{
- Q_ASSERT(watch);
- Q_ASSERT(data);
-
- QDBusConnectionPrivate *d = static_cast<QDBusConnectionPrivate *>(data);
- int fd = dbus_watch_get_fd(watch);
-
- QDBusConnectionPrivate::WatcherHash::iterator i = d->watchers.find(fd);
- while (i != d->watchers.end() && i.key() == fd) {
- if (i.value().watch == watch) {
- bool enabled = dbus_watch_get_enabled(watch);
- int flags = dbus_watch_get_flags(watch);
-
- //qDebug("toggle watch %d to %d (write: %d, read: %d)", dbus_watch_get_fd(watch), enabled, flags & DBUS_WATCH_WRITABLE, flags & DBUS_WATCH_READABLE);
-
- if (flags & DBUS_WATCH_READABLE && i.value().read)
- i.value().read->setEnabled(enabled);
- if (flags & DBUS_WATCH_WRITABLE && i.value().write)
- i.value().write->setEnabled(enabled);
- return;
- }
- ++i;
- }
-}
-
-static void qDBusNewConnection(DBusServer *server, DBusConnection *c, void *data)
-{
- Q_ASSERT(data); Q_ASSERT(server); Q_ASSERT(c);
- Q_UNUSED(data); Q_UNUSED(server); Q_UNUSED(c);
-
- qDebug("SERVER: GOT A NEW CONNECTION"); // TODO
-}
-
-extern QDBUS_EXPORT void qDBusAddSpyHook(QDBusSpyHook);
-void qDBusAddSpyHook(QDBusSpyHook hook)
-{
- qDBusSpyHookList()->append(hook);
-}
-
-#if USE_OUTSIDE_DISPATCH
-# define HANDLED DBUS_HANDLER_RESULT_HANDLED_OUTSIDE_DISPATCH
-static DBusHandlerResult qDBusSignalFilterOutside(DBusConnection *connection,
- DBusMessage *message, void *data)
-{
- Q_ASSERT(data);
- Q_UNUSED(connection);
- Q_UNUSED(message);
-
- QDBusConnectionPrivate *d = static_cast<QDBusConnectionPrivate *>(data);
- if (d->mode == QDBusConnectionPrivate::InvalidMode)
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; // internal error, actually
-
- CallDeliveryEvent *e = d->postedCallDeliveryEvent();
-
- d->deliverCall(*e);
- delete e;
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-#else
-# define HANDLED DBUS_HANDLER_RESULT_HANDLED
-#endif
-
-extern "C" {
-static DBusHandlerResult
-qDBusSignalFilter(DBusConnection *connection, DBusMessage *message, void *data)
-{
- return QDBusConnectionPrivate::messageFilter(connection, message, data);
-}
-}
-
-DBusHandlerResult QDBusConnectionPrivate::messageFilter(DBusConnection *connection,
- DBusMessage *message, void *data)
-{
- Q_ASSERT(data);
- Q_UNUSED(connection);
-
- QDBusConnectionPrivate *d = static_cast<QDBusConnectionPrivate *>(data);
- if (d->mode == QDBusConnectionPrivate::InvalidMode)
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
- QDBusMessage amsg = QDBusMessage::fromDBusMessage(message, QDBusConnection(d->name));
- qDebug() << "got message:" << amsg;
-
- const QDBusSpyHookList *list = qDBusSpyHookList();
- for (int i = 0; i < list->size(); ++i) {
- qDebug() << "calling the message spy hook";
- (*(*list)[i])(amsg);
- }
-
- bool handled = false;
- int msgType = dbus_message_get_type(message);
- if (msgType == DBUS_MESSAGE_TYPE_SIGNAL) {
- handled = d->handleSignal(amsg);
- } else if (msgType == DBUS_MESSAGE_TYPE_METHOD_CALL) {
- handled = d->handleObjectCall(amsg);
- }
-
- return handled ? HANDLED :
- DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static void huntAndDestroy(QObject *needle, QDBusConnectionPrivate::ObjectTreeNode *haystack)
-{
- foreach (const QDBusConnectionPrivate::ObjectTreeNode::Data &entry, haystack->children)
- huntAndDestroy(needle, entry.node);
-
- if (needle == haystack->obj) {
- haystack->obj = 0;
- haystack->flags = 0;
- }
-}
-
-static void huntAndEmit(DBusConnection *connection, DBusMessage *msg,
- QObject *needle, QDBusConnectionPrivate::ObjectTreeNode *haystack,
- const QString &path = QString())
-{
- foreach (const QDBusConnectionPrivate::ObjectTreeNode::Data &entry, haystack->children)
- huntAndEmit(connection, msg, needle, entry.node, path + QLatin1String("/") + entry.name);
-
- if (needle == haystack->obj && haystack->flags & QDBusConnection::ExportAdaptors) {
- QByteArray p = path.toLatin1();
- if (p.isEmpty())
- p = "/";
- //qDebug() << p;
- DBusMessage *msg2 = dbus_message_copy(msg);
- dbus_message_set_path(msg2, p);
- dbus_connection_send(connection, msg2, 0);
- dbus_message_unref(msg2);
- }
-}
-
-static bool typesMatch(int metaId, int variantType)
-{
- if (metaId == int(variantType))
- return true;
-
- if (variantType == QVariant::Int && metaId == QMetaType::Short)
- return true;
-
- if (variantType == QVariant::UInt && (metaId == QMetaType::UShort ||
- metaId == QMetaType::UChar))
- return true;
-
- if (variantType == QVariant::List) {
- if (metaId == QDBusTypeHelper<bool>::listId() ||
- metaId == QDBusTypeHelper<short>::listId() ||
- metaId == QDBusTypeHelper<ushort>::listId() ||
- metaId == QDBusTypeHelper<int>::listId() ||
- metaId == QDBusTypeHelper<uint>::listId() ||
- metaId == QDBusTypeHelper<qlonglong>::listId() ||
- metaId == QDBusTypeHelper<qulonglong>::listId() ||
- metaId == QDBusTypeHelper<double>::listId())
- return true;
- }
-
- return false; // no match
-}
-
-static int findSlot(const QMetaObject *mo, const QByteArray &name, int flags,
- const QDBusTypeList &types, QList<int>& metaTypes)
-{
- // find the first slot
- const QMetaObject *super = mo;
- while (super != &QObject::staticMetaObject &&
- super != &QDBusAbstractAdaptor::staticMetaObject)
- super = super->superClass();
-
- int attributeMask = (flags & QDBusConnection::ExportAllSlots) ?
- 0 : QMetaMethod::Scriptable;
-
- for (int idx = super->methodCount() ; idx <= mo->methodCount(); ++idx) {
- QMetaMethod mm = mo->method(idx);
-
- // check access:
- if (mm.access() != QMetaMethod::Public)
- continue;
-
- // check type:
- // unnecessary, since slots are never public:
- //if (mm.methodType() != QMetaMethod::Slot)
- // continue;
-
- // check name:
- QByteArray sig = QMetaObject::normalizedSignature(mm.signature());
- int paren = sig.indexOf('(');
- if (paren != name.length() || !sig.startsWith( name ))
- continue;
-
- int returnType = qDBusNameToTypeId(mm.typeName());
- bool isAsync = qDBusCheckAsyncTag(mm.tag());
-
- // consistency check:
- if (isAsync && returnType != QMetaType::Void)
- continue;
-
- int inputCount = qDBusParametersForMethod(mm, metaTypes);
- if (inputCount == -1)
- continue; // problem parsing
-
- metaTypes[0] = returnType;
- bool hasMessage = false;
- if (inputCount > 0 &&
- metaTypes.at(inputCount) == QDBusConnectionPrivate::messageMetaType) {
- // "no input parameters" is allowed as long as the message meta type is there
- hasMessage = true;
- --inputCount;
- }
-
- // try to match the parameters
- if (inputCount != types.count())
- continue; // not enough parameters
-
- bool matches = true;
- int i;
- for (i = 0; i < types.count(); ++i)
- if ( !typesMatch(metaTypes.at(i + 1), types.at(i).qvariantType()) ) {
- matches = false;
- break;
- }
-
- if (!matches)
- continue; // we didn't match them all
-
- // consistency check:
- if (isAsync && metaTypes.count() > i + 1 + (hasMessage ? 1 : 0))
- continue;
-
- if (hasMessage && (mm.attributes() & attributeMask) != attributeMask)
- continue; // not exported
-
- // if we got here, this slot matched
- return idx;
- }
-
- // no slot matched
- return -1;
-}
-
-static CallDeliveryEvent* prepareReply(QObject *object, int idx, const QList<int> &metaTypes,
- const QDBusMessage &msg)
-{
- Q_ASSERT(object);
-
- int n = metaTypes.count() - 1;
- if (metaTypes[n] == QDBusConnectionPrivate::messageMetaType)
- --n;
-
- // check that types match
- for (int i = 0; i < n; ++i)
- if (!typesMatch(metaTypes.at(i + 1), msg.at(i).type()))
- return 0; // no match
-
- // we can deliver
- // prepare for the call
- CallDeliveryEvent *data = new CallDeliveryEvent;
- data->object = object;
- data->flags = 0;
- data->message = msg;
- data->metaTypes = metaTypes;
- data->slotIdx = idx;
-
- return data;
-}
-
-bool QDBusConnectionPrivate::activateSignal(const QDBusConnectionPrivate::SignalHook& hook,
- const QDBusMessage &msg)
-{
- // This is called by QDBusConnectionPrivate::handleSignal to deliver a signal
- // that was received from D-Bus
- //
- // Signals are delivered to slots if the parameters match
- // Slots can have less parameters than there are on the message
- // Slots can optionally have one final parameter that is a QDBusMessage
- // Slots receive read-only copies of the message (i.e., pass by value or by const-ref)
- CallDeliveryEvent *call = prepareReply(hook.obj, hook.midx, hook.params, msg);
- if (call) {
- postCallDeliveryEvent(call);
- return true;
- }
- return false;
-}
-
-bool QDBusConnectionPrivate::activateCall(QObject* object, int flags,
- const QDBusMessage &msg)
-{
- // This is called by QDBusConnectionPrivate::handleObjectCall to place a call
- // to a slot on the object.
- //
- // The call is delivered to the first slot that matches the following conditions:
- // - has the same name as the message's target name
- // - ALL of the message's types are found in slot's parameter list
- // - optionally has one more parameter of type QDBusMessage
- // If none match, then the slot of the same name as the message target and with
- // the first type of QDBusMessage is delivered.
- //
- // Because the marshalling of D-Bus data into QVariant loses the information on
- // the original types, the message signature is used to determine the original type.
- // Aside from that, the "int" and "unsigned" types will be tried as well.
- //
- // The D-Bus specification requires that all MethodCall messages be replied to, unless the
- // caller specifically waived this requirement. This means that we inspect if the user slot
- // generated a reply and, if it didn't, we will. Obviously, if the user slot doesn't take a
- // QDBusMessage parameter, it cannot generate a reply.
- //
- // When a return message is generated, the slot's return type, if any, will be placed
- // in the message's first position. If there are non-const reference parameters to the
- // slot, they must appear at the end and will be placed in the subsequent message
- // positions.
-
- if (!object)
- return false;
-
- QList<int> metaTypes;
- int idx;
-
- {
- const QMetaObject *mo = object->metaObject();
- QDBusTypeList typeList(msg.signature().toUtf8());
- QByteArray memberName = msg.name().toUtf8();
-
- // find a slot that matches according to the rules above
- idx = ::findSlot(mo, memberName, flags, typeList, metaTypes);
- if (idx == -1) {
- // try with no parameters, but with a QDBusMessage
- idx = ::findSlot(mo, memberName, flags, QDBusTypeList(), metaTypes);
- if (metaTypes.count() != 2 || metaTypes.at(1) != messageMetaType)
- return false;
- }
- }
-
- // found the slot to be called
- // prepare for the call:
- CallDeliveryEvent *call = new CallDeliveryEvent;
-
- // parameters:
- call->object = object;
- call->flags = flags;
- call->message = msg;
-
- // save our state:
- call->metaTypes = metaTypes;
- call->slotIdx = idx;
-
- postCallDeliveryEvent(call);
-
- // ready
- return true;
-}
-
-void QDBusConnectionPrivate::postCallDeliveryEvent(CallDeliveryEvent *data)
-{
- Q_ASSERT(data);
- data->conn = this;
-#if USE_OUTSIDE_DISPATCH
- callDeliveryMutex.lock();
- callDeliveryState = data;
-#else
- QCoreApplication::postEvent( this, data );
-#endif
-}
-
-CallDeliveryEvent *QDBusConnectionPrivate::postedCallDeliveryEvent()
-{
- CallDeliveryEvent *e = callDeliveryState;
- Q_ASSERT(e && e->conn == this);
-
- // release it:
- callDeliveryState = 0;
- callDeliveryMutex.unlock();
-
- return e;
-}
-
-void QDBusConnectionPrivate::deliverCall(const CallDeliveryEvent& data) const
-{
- // resume state:
- const QList<int>& metaTypes = data.metaTypes;
- const QDBusMessage& msg = data.message;
-
- QVarLengthArray<void *, 10> params;
- params.reserve(metaTypes.count());
-
- QVariantList auxParameters;
- // let's create the parameter list
-
- // first one is the return type -- add it below
- params.append(0);
-
- // add the input parameters
- int i;
- for (i = 1; i <= msg.count(); ++i) {
- int id = metaTypes[i];
- if (id == QDBusConnectionPrivate::messageMetaType)
- break;
-
- if (id == int(msg.at(i - 1).userType()))
- // no conversion needed
- params.append(const_cast<void *>( msg.at(i - 1).constData() ));
- else {
- // convert to what the function expects
- auxParameters.append(QVariant());
-
- const QVariant &in = msg.at(i - 1);
- QVariant &out = auxParameters[auxParameters.count() - 1];
-
- bool isOk = true;
- if (id == QVariant::List) {
- int mid = in.userType();
- // the only conversion possible here is from a specialised QList<T> to QVariantList
- if (mid == QDBusTypeHelper<bool>::listId())
- out = qVariantFromValue(QDBusTypeHelper<bool>::toVariantList(in));
- else if (mid == QDBusTypeHelper<short>::listId())
- out = qVariantFromValue(QDBusTypeHelper<short>::toVariantList(in));
- else if (mid == QDBusTypeHelper<ushort>::listId())
- out = qVariantFromValue(QDBusTypeHelper<ushort>::toVariantList(in));
- else if (mid == QDBusTypeHelper<int>::listId())
- out = qVariantFromValue(QDBusTypeHelper<int>::toVariantList(in));
- else if (mid == QDBusTypeHelper<uint>::listId())
- out = qVariantFromValue(QDBusTypeHelper<uint>::toVariantList(in));
- else if (mid == QDBusTypeHelper<qlonglong>::listId())
- out = qVariantFromValue(QDBusTypeHelper<qlonglong>::toVariantList(in));
- else if (mid == QDBusTypeHelper<qulonglong>::listId())
- out = qVariantFromValue(QDBusTypeHelper<qulonglong>::toVariantList(in));
- else if (mid == QDBusTypeHelper<double>::listId())
- out = qVariantFromValue(QDBusTypeHelper<double>::toVariantList(in));
- else
- isOk = false;
- } else if (in.type() == QVariant::UInt) {
- if (id == QMetaType::UChar) {
- uchar uc = in.toUInt();
- out = qVariantFromValue(uc);
- } else if (id == QMetaType::UShort) {
- ushort us = in.toUInt();
- out = qVariantFromValue(us);
- } else {
- isOk = false;
- }
- } else if (in.type() == QVariant::Int) {
- if (id == QMetaType::Short) {
- short s = in.toInt();
- out = qVariantFromValue(s);
- } else {
- isOk = false;
- }
- } else {
- isOk = false;
- }
-
- if (!isOk)
- qFatal("Internal error: got invalid meta type %d when trying to convert to meta type %d",
- in.userType(), id);
-
- params.append( const_cast<void *>(out.constData()) );
- }
- }
-
- bool takesMessage = false;
- if (metaTypes.count() > i && metaTypes[i] == QDBusConnectionPrivate::messageMetaType) {
- params.append(const_cast<void*>(static_cast<const void*>(&msg)));
- takesMessage = true;
- ++i;
- }
-
- // output arguments
- QVariantList outputArgs;
- void *null = 0;
- if (metaTypes[0] != QMetaType::Void) {
- QVariant arg(metaTypes[0], null);
- outputArgs.append( arg );
- params[0] = const_cast<void*>(outputArgs.at( outputArgs.count() - 1 ).constData());
- }
- for ( ; i < metaTypes.count(); ++i) {
- QVariant arg(metaTypes[i], null);
- outputArgs.append( arg );
- params.append( const_cast<void*>(outputArgs.at( outputArgs.count() - 1 ).constData()) );
- }
-
- // make call:
- bool fail;
- if (data.object.isNull())
- fail = true;
- else
- fail = data.object->qt_metacall(QMetaObject::InvokeMetaMethod,
- data.slotIdx, params.data()) >= 0;
-
- // do we create a reply? Only if the caller is waiting for a reply and one hasn't been sent
- // yet.
- if (!msg.noReply() && !msg.wasRepliedTo()) {
- if (!fail) {
- // normal reply
- QDBusMessage reply = QDBusMessage::methodReply(msg);
- reply += outputArgs;
-
- qDebug() << "Automatically sending reply:" << reply;
- send(reply);
- }
- else {
- // generate internal error
- QDBusMessage reply = QDBusMessage::error(msg, QDBusError(QDBusError::InternalError,
- QLatin1String("Failed to deliver message")));
- qWarning("Internal error: Failed to deliver message");
- send(reply);
- }
- }
-
- return;
-}
-
-void QDBusConnectionPrivate::customEvent(QEvent *e)
-{
- // nothing else should be sending custom events at us
- CallDeliveryEvent* call = static_cast<CallDeliveryEvent *>(e);
-
- // self check:
- Q_ASSERT(call->conn == this);
-
- deliverCall(*call);
-}
-
-QDBusConnectionPrivate::QDBusConnectionPrivate(QObject *p)
- : QObject(p), ref(1), mode(InvalidMode), connection(0), server(0), busService(0)
-{
- extern bool qDBusInitThreads();
- static const int msgType = registerMessageMetaType();
- static const bool threads = qDBusInitThreads();
- static const bool metatypes = QDBusMetaTypeId::innerInitialize();
-
- Q_UNUSED(msgType);
- Q_UNUSED(threads);
- Q_UNUSED(metatypes);
-
- dbus_error_init(&error);
-
- rootNode.flags = 0;
-}
-
-QDBusConnectionPrivate::~QDBusConnectionPrivate()
-{
- if (dbus_error_is_set(&error))
- dbus_error_free(&error);
-
- closeConnection();
- rootNode.clear(); // free resources
- qDeleteAll(cachedMetaObjects);
-}
-
-void QDBusConnectionPrivate::closeConnection()
-{
- QWriteLocker locker(&lock);
- ConnectionMode oldMode = mode;
- mode = InvalidMode; // prevent reentrancy
- if (oldMode == ServerMode) {
- if (server) {
- dbus_server_disconnect(server);
- dbus_server_unref(server);
- server = 0;
- }
- } else if (oldMode == ClientMode) {
- if (connection) {
- dbus_connection_close(connection);
- // send the "close" message
- while (dbus_connection_dispatch(connection) == DBUS_DISPATCH_DATA_REMAINS)
- ;
- dbus_connection_unref(connection);
- connection = 0;
- }
- }
-}
-
-bool QDBusConnectionPrivate::handleError()
-{
- lastError = QDBusError(&error);
- if (dbus_error_is_set(&error))
- dbus_error_free(&error);
- return lastError.isValid();
-}
-
-void QDBusConnectionPrivate::bindToApplication()
-{
- // Yay, now that we have an application we are in business
- Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection",
- "qDBusBindToApplication called without an application");
- moveToThread(QCoreApplication::instance()->thread());
-
- // Re-add all watchers
- WatcherHash oldWatchers = watchers;
- watchers.clear();
- QHashIterator<int, QDBusConnectionPrivate::Watcher> it(oldWatchers);
- while (it.hasNext()) {
- it.next();
- if (!it.value().read && !it.value().write) {
- qDBusAddWatch(it.value().watch, this);
- } else {
- watchers.insertMulti(it.key(), it.value());
- }
- }
-
- // Re-add all timeouts
- while (!pendingTimeouts.isEmpty())
- qDBusAddTimeout(pendingTimeouts.takeFirst(), this);
-}
-
-void QDBusConnectionPrivate::timerEvent(QTimerEvent *e)
-{
- DBusTimeout *timeout = timeouts.value(e->timerId(), 0);
- dbus_timeout_handle(timeout);
-}
-
-void QDBusConnectionPrivate::doDispatch()
-{
- if (mode == ClientMode)
- while (dbus_connection_dispatch(connection) == DBUS_DISPATCH_DATA_REMAINS);
-}
-
-void QDBusConnectionPrivate::socketRead(int fd)
-{
- QHashIterator<int, QDBusConnectionPrivate::Watcher> it(watchers);
- while (it.hasNext()) {
- it.next();
- if (it.key() == fd && it.value().read && it.value().read->isEnabled()) {
- if (!dbus_watch_handle(it.value().watch, DBUS_WATCH_READABLE))
- qDebug("OUT OF MEM");
- }
- }
-
- doDispatch();
-}
-
-void QDBusConnectionPrivate::socketWrite(int fd)
-{
- QHashIterator<int, QDBusConnectionPrivate::Watcher> it(watchers);
- while (it.hasNext()) {
- it.next();
- if (it.key() == fd && it.value().write && it.value().write->isEnabled()) {
- if (!dbus_watch_handle(it.value().watch, DBUS_WATCH_WRITABLE))
- qDebug("OUT OF MEM");
- }
- }
-}
-
-void QDBusConnectionPrivate::objectDestroyed(QObject *obj)
-{
- QWriteLocker locker(&lock);
- huntAndDestroy(obj, &rootNode);
-
- SignalHookHash::iterator sit = signalHooks.begin();
- while (sit != signalHooks.end()) {
- if (static_cast<QObject *>(sit.value().obj) == obj)
- sit = signalHooks.erase(sit);
- else
- ++sit;
- }
-
- obj->disconnect(this);
-}
-
-void QDBusConnectionPrivate::relaySignal(QObject *obj, const char *interface, const char *memberName,
- const QVariantList &args)
-{
- QReadLocker locker(&lock);
- QDBusMessage message = QDBusMessage::signal(QLatin1String("/"), QLatin1String(interface),
- QLatin1String(memberName));
- message += args;
- DBusMessage *msg = message.toDBusMessage();
- if (!msg) {
- qWarning("Could not emit signal %s.%s", interface, memberName);
- return;
- }
-
- //qDebug() << "Emitting signal" << message;
- //qDebug() << "for paths:";
- dbus_message_set_no_reply(msg, true); // the reply would not be delivered to anything
- huntAndEmit(connection, msg, obj, &rootNode);
- dbus_message_unref(msg);
-}
-
-int QDBusConnectionPrivate::registerMessageMetaType()
-{
- int tp = messageMetaType = qRegisterMetaType<QDBusMessage>("QDBusMessage");
- return tp;
-}
-
-int QDBusConnectionPrivate::findSlot(QObject* obj, const QByteArray &normalizedName,
- QList<int> &params)
-{
- int midx = obj->metaObject()->indexOfMethod(normalizedName);
- if (midx == -1) {
- qWarning("No such slot '%s' while connecting D-Bus", normalizedName.constData());
- return -1;
- }
-
- int inputCount = qDBusParametersForMethod(obj->metaObject()->method(midx), params);
- if ( inputCount == -1 || inputCount + 1 != params.count() )
- return -1; // failed to parse or invalid arguments or output arguments
-
- return midx;
-}
-
-bool QDBusConnectionPrivate::prepareHook(QDBusConnectionPrivate::SignalHook &hook, QString &key,
- const QString &service, const QString &path,
- const QString &interface, const QString &name,
- QObject *receiver, const char *signal, int minMIdx,
- bool buildSignature)
-{
- QByteArray normalizedName = QMetaObject::normalizedSignature(signal + 1);
- hook.midx = findSlot(receiver, normalizedName, hook.params);
- if (hook.midx < minMIdx)
- return false;
-
- hook.sender = service;
- hook.path = path;
- hook.obj = receiver;
-
- // build the D-Bus signal name and signature
- QString mname = name;
- if (mname.isEmpty()) {
- normalizedName.truncate(normalizedName.indexOf('('));
- mname = QString::fromUtf8(normalizedName);
- }
- key = mname;
- key.reserve(interface.length() + 1 + mname.length());
- key += QLatin1Char(':');
- key += interface;
-
- if (buildSignature) {
- hook.signature.clear();
- for (int i = 1; i < hook.params.count(); ++i)
- if (hook.params.at(i) != messageMetaType)
- hook.signature += QLatin1String( QDBusType::dbusSignature( QVariant::Type(hook.params.at(i)) ) );
- }
-
- return true; // connect to this signal
-}
-
-bool QDBusConnectionPrivate::activateInternalFilters(const ObjectTreeNode *node, const QDBusMessage &msg)
-{
- // object may be null
-
- if (msg.interface().isEmpty() || msg.interface() == QLatin1String(DBUS_INTERFACE_INTROSPECTABLE)) {
- if (msg.method() == QLatin1String("Introspect") && msg.signature().isEmpty())
- qDBusIntrospectObject(node, msg);
- if (msg.interface() == QLatin1String(DBUS_INTERFACE_INTROSPECTABLE))
- return true;
- }
-
- if (node->obj && (msg.interface().isEmpty() ||
- msg.interface() == QLatin1String(DBUS_INTERFACE_PROPERTIES))) {
- if (msg.method() == QLatin1String("Get") && msg.signature() == QLatin1String("ss"))
- qDBusPropertyGet(node, msg);
- else if (msg.method() == QLatin1String("Set") && msg.signature() == QLatin1String("ssv"))
- qDBusPropertySet(node, msg);
-
- if (msg.interface() == QLatin1String(DBUS_INTERFACE_PROPERTIES))
- return true;
- }
-
- return false;
-}
-
-bool QDBusConnectionPrivate::activateObject(const ObjectTreeNode *node, const QDBusMessage &msg)
-{
- // This is called by QDBusConnectionPrivate::handleObjectCall to place a call to a slot
- // on the object.
- //
- // The call is routed through the adaptor sub-objects if we have any
-
- // object may be null
-
- QDBusAdaptorConnector *connector;
- if (node->flags & QDBusConnection::ExportAdaptors &&
- (connector = qDBusFindAdaptorConnector(node->obj))) {
- int newflags = node->flags | QDBusConnection::ExportAllSlots;
-
- if (msg.interface().isEmpty()) {
- // place the call in all interfaces
- // let the first one that handles it to work
- foreach (const QDBusAdaptorConnector::AdaptorData &entry, connector->adaptors)
- if (activateCall(entry.adaptor, newflags, msg))
- return true;
- } else {
- // check if we have an interface matching the name that was asked:
- QDBusAdaptorConnector::AdaptorMap::ConstIterator it;
- it = qLowerBound(connector->adaptors.constBegin(), connector->adaptors.constEnd(),
- msg.interface());
- if (it != connector->adaptors.constEnd() && it->interface == msg.interface())
- if (activateCall(it->adaptor, newflags, msg))
- return true;
- }
- }
-
- // no adaptors matched
- // try our standard filters
- if (activateInternalFilters(node, msg))
- return true;
-
- // try the object itself:
- if (node->flags & QDBusConnection::ExportSlots && activateCall(node->obj, node->flags, msg))
- return true;
-#if 0
- // nothing matched
- qDebug("Call failed: no match for %s%s%s at %s",
- qPrintable(msg.interface()), msg.interface().isEmpty() ? "" : ".",
- qPrintable(msg.name()),
- qPrintable(msg.path()));
-#endif
- return false;
-}
-
-template<typename Func>
-static bool applyForObject(QDBusConnectionPrivate::ObjectTreeNode *root, const QString &fullpath,
- Func& functor)
-{
- // walk the object tree
- QStringList path = fullpath.split(QLatin1Char('/'));
- if (path.last().isEmpty())
- path.removeLast(); // happens if path is "/"
- int i = 1;
- QDBusConnectionPrivate::ObjectTreeNode *node = root;
-
- // try our own tree first
- while (node && !(node->flags & QDBusConnection::ExportChildObjects) ) {
- if (i == path.count()) {
- // found our object
- functor(node);
- return true;
- }
-
- QVector<QDBusConnectionPrivate::ObjectTreeNode::Data>::ConstIterator it =
- qLowerBound(node->children.constBegin(), node->children.constEnd(), path.at(i));
- if (it != node->children.constEnd() && it->name == path.at(i))
- // match
- node = it->node;
- else
- node = 0;
-
- ++i;
- }
-
- // any object in the tree can tell us to switch to its own object tree:
- if (node && node->flags & QDBusConnection::ExportChildObjects) {
- QObject *obj = node->obj;
-
- while (obj) {
- if (i == path.count()) {
- // we're at the correct level
- QDBusConnectionPrivate::ObjectTreeNode fakenode(*node);
- fakenode.obj = obj;
- functor(&fakenode);
- return true;
- }
-
- const QObjectList children = obj->children();
-
- // find a child with the proper name
- QObject *next = 0;
- foreach (QObject *child, children)
- if (child->objectName() == path.at(i)) {
- next = child;
- break;
- }
-
- if (!next)
- break;
-
- ++i;
- obj = next;
- }
- }
-
- // object not found
- return false;
-}
-
-struct qdbus_activateObject
-{
- QDBusConnectionPrivate *self;
- const QDBusMessage &msg;
- bool returnVal;
- inline qdbus_activateObject(QDBusConnectionPrivate *s, const QDBusMessage &m)
- : self(s), msg(m)
- { }
-
- inline void operator()(QDBusConnectionPrivate::ObjectTreeNode *node)
- { returnVal = self->activateObject(node, msg); }
-};
-
-bool QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg)
-{
- QReadLocker locker(&lock);
-
- qdbus_activateObject apply(this, msg);
- if (applyForObject(&rootNode, msg.path(), apply))
- return apply.returnVal;
-
- qDebug("Call failed: no object found at %s", qPrintable(msg.path()));
- return false;
-}
-
-bool QDBusConnectionPrivate::handleSignal(const QString &key, const QDBusMessage& msg)
-{
- bool result = false;
- SignalHookHash::const_iterator it = signalHooks.find(key);
- //qDebug("looking for: %s", path.toLocal8Bit().constData());
- //qDebug() << signalHooks.keys();
- for ( ; it != signalHooks.constEnd() && it.key() == key; ++it) {
- const SignalHook &hook = it.value();
- if ( !hook.sender.isEmpty() && hook.sender != msg.sender() )
- continue;
- if ( !hook.path.isEmpty() && hook.path != msg.path() )
- continue;
- if ( !hook.signature.isEmpty() && hook.signature != msg.signature() )
- continue;
- if ( hook.signature.isEmpty() && !hook.signature.isNull() && !msg.signature().isEmpty())
- continue;
-
- // yes, |=
- result |= activateSignal(hook, msg);
- }
- return result;
-}
-
-bool QDBusConnectionPrivate::handleSignal(const QDBusMessage& msg)
-{
- QString key = msg.member();
- key.reserve(key.length() + 1 + msg.interface().length());
- key += QLatin1Char(':');
- key += msg.interface();
-
- QReadLocker locker(&lock);
- bool result = handleSignal(key, msg); // one try
-
- key.truncate(msg.member().length() + 1); // keep the ':'
- result |= handleSignal(key, msg); // second try
- return result;
-}
-
-static dbus_int32_t server_slot = -1;
-
-void QDBusConnectionPrivate::setServer(DBusServer *s)
-{
- if (!server) {
- handleError();
- return;
- }
-
- server = s;
- mode = ServerMode;
-
- dbus_server_allocate_data_slot(&server_slot);
- if (server_slot < 0)
- return;
-
- dbus_server_set_watch_functions(server, qDBusAddWatch, qDBusRemoveWatch,
- qDBusToggleWatch, this, 0); // ### check return type?
- dbus_server_set_timeout_functions(server, qDBusAddTimeout, qDBusRemoveTimeout,
- qDBusToggleTimeout, this, 0);
- dbus_server_set_new_connection_function(server, qDBusNewConnection, this, 0);
-
- dbus_server_set_data(server, server_slot, this, 0);
-}
-
-void QDBusConnectionPrivate::setConnection(DBusConnection *dbc)
-{
- if (!dbc) {
- handleError();
- return;
- }
-
- connection = dbc;
- mode = ClientMode;
-
- dbus_connection_set_exit_on_disconnect(connection, false);
- dbus_connection_set_watch_functions(connection, qDBusAddWatch, qDBusRemoveWatch,
- qDBusToggleWatch, this, 0);
- dbus_connection_set_timeout_functions(connection, qDBusAddTimeout, qDBusRemoveTimeout,
- qDBusToggleTimeout, this, 0);
-// dbus_bus_add_match(connection, "type='signal',interface='com.trolltech.dbus.Signal'", &error);
-// dbus_bus_add_match(connection, "type='signal'", &error);
-
- dbus_bus_add_match(connection, "type='signal'", &error);
- if (handleError()) {
- closeConnection();
- return;
- }
-
- const char *service = dbus_bus_get_unique_name(connection);
- if (service) {
- QVarLengthArray<char, 56> filter;
- filter.append("destination='", 13);
- filter.append(service, qstrlen(service));
- filter.append("\'\0", 2);
-
- dbus_bus_add_match(connection, filter.constData(), &error);
- if (handleError()) {
- closeConnection();
- return;
- }
- } else {
- qWarning("QDBusConnectionPrivate::SetConnection: Unable to get base service");
- }
-
-#if USE_OUTSIDE_DISPATCH
- dbus_connection_add_filter_outside(connection, qDBusSignalFilter, qDBusSignalFilterOutside, this, 0);
-#else
- dbus_connection_add_filter(connection, qDBusSignalFilter, this, 0);
-#endif
-
- //qDebug("base service: %s", service);
-
- // schedule a dispatch:
- QMetaObject::invokeMethod(this, "doDispatch", Qt::QueuedConnection);
-}
-
-extern "C"{
-static void qDBusResultReceived(DBusPendingCall *pending, void *user_data)
-{
- QDBusConnectionPrivate::messageResultReceived(pending, user_data);
-}
-}
-
-void QDBusConnectionPrivate::messageResultReceived(DBusPendingCall *pending, void *user_data)
-{
- QDBusPendingCall *call = reinterpret_cast<QDBusPendingCall *>(user_data);
- QDBusConnectionPrivate *connection = const_cast<QDBusConnectionPrivate *>(call->connection);
- Q_ASSERT(call->pending == pending);
-
- if (!call->receiver.isNull() && call->methodIdx != -1) {
- DBusMessage *reply = dbus_pending_call_steal_reply(pending);
-
- // Deliver the return values of a remote function call.
- //
- // There is only one connection and it is specified by idx
- // The slot must have the same parameter types that the message does
- // The slot may have less parameters than the message
- // The slot may optionally have one final parameter that is QDBusMessage
- // The slot receives read-only copies of the message (i.e., pass by value or by const-ref)
-
- QDBusMessage msg = QDBusMessage::fromDBusMessage(reply, QDBusConnection(connection->name));
- qDebug() << "got message: " << msg;
- CallDeliveryEvent *e = prepareReply(call->receiver, call->methodIdx, call->metaTypes, msg);
- if (e)
- connection->postCallDeliveryEvent(e);
- else
- qDebug() << "Deliver failed!";
- }
- dbus_pending_call_unref(pending);
- delete call;
-}
-
-int QDBusConnectionPrivate::send(const QDBusMessage& message) const
-{
- DBusMessage *msg = message.toDBusMessage();
- if (!msg)
- return 0;
-
- dbus_message_set_no_reply(msg, true); // the reply would not be delivered to anything
-
- qDebug() << "sending message:" << message;
- bool isOk = dbus_connection_send(connection, msg, 0);
- int serial = 0;
- if (isOk)
- serial = dbus_message_get_serial(msg);
-
- dbus_message_unref(msg);
- return serial;
-}
-
-QDBusMessage QDBusConnectionPrivate::sendWithReply(const QDBusMessage &message,
- int sendMode)
-{
- if (!QCoreApplication::instance() || sendMode == QDBusConnection::NoUseEventLoop) {
- DBusMessage *msg = message.toDBusMessage();
- if (!msg)
- return QDBusMessage();
-
- qDebug() << "sending message:" << message;
- DBusMessage *reply = dbus_connection_send_with_reply_and_block(connection, msg,
- -1, &error);
- handleError();
- dbus_message_unref(msg);
-
- if (lastError.isValid())
- return QDBusMessage::fromError(lastError);
-
- QDBusMessage amsg = QDBusMessage::fromDBusMessage(reply, QDBusConnection(name));
- qDebug() << "got message:" << amsg;
-
- if (dbus_connection_get_dispatch_status(connection) == DBUS_DISPATCH_DATA_REMAINS)
- QMetaObject::invokeMethod(this, "doDispatch", Qt::QueuedConnection);
- return amsg;
- } else { // use the event loop
- QDBusReplyWaiter waiter;
- if (sendWithReplyAsync(message, &waiter, SLOT(reply(const QDBusMessage&))) > 0) {
- // enter the event loop and wait for a reply
- waiter.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents);
-
- lastError = waiter.replyMsg; // set or clear error
- return waiter.replyMsg;
- }
-
- return QDBusMessage();
- }
-}
-
-int QDBusConnectionPrivate::sendWithReplyAsync(const QDBusMessage &message, QObject *receiver,
- const char *method)
-{
- if (!receiver || !method || !*method)
- // would not be able to deliver a reply
- return send(message);
-
- int slotIdx = -1;
- QList<int> metaTypes;
- QByteArray normalizedName = QMetaObject::normalizedSignature(method + 1);
- slotIdx = findSlot(receiver, normalizedName, metaTypes);
- if (slotIdx == -1)
- // would not be able to deliver a reply
- return send(message);
-
- DBusMessage *msg = message.toDBusMessage();
- if (!msg)
- return 0;
-
- qDebug() << "sending message:" << message;
- DBusPendingCall *pending = 0;
- if (dbus_connection_send_with_reply(connection, msg, &pending, message.timeout())) {
- if (slotIdx != -1) {
- QDBusPendingCall *pcall = new QDBusPendingCall;
- pcall->receiver = receiver;
- pcall->metaTypes = metaTypes;
- pcall->methodIdx = slotIdx;
- pcall->connection = this;
- pcall->pending = dbus_pending_call_ref(pending);
- dbus_pending_call_set_notify(pending, qDBusResultReceived, pcall, 0);
- }
- dbus_pending_call_unref(pending);
- return dbus_message_get_serial(msg);
- }
-
- return 0;
-}
-
-void QDBusConnectionPrivate::connectSignal(const QString &key, const SignalHook &hook)
-{
- signalHooks.insertMulti(key, hook);
- connect(hook.obj, SIGNAL(destroyed(QObject*)), SLOT(objectDestroyed(QObject*)));
-}
-
-void QDBusConnectionPrivate::registerObject(const ObjectTreeNode *node)
-{
- connect(node->obj, SIGNAL(destroyed(QObject*)), SLOT(objectDestroyed(QObject*)));
-
- if (node->flags & QDBusConnection::ExportAdaptors) {
- QDBusAdaptorConnector *connector = qDBusCreateAdaptorConnector(node->obj);
-
- // disconnect and reconnect to avoid duplicates
- connector->disconnect(SIGNAL(relaySignal(QObject*,const char*,const char*,QVariantList)),
- this, SLOT(relaySignal(QObject*,const char*,const char*,QVariantList)));
- connect(connector, SIGNAL(relaySignal(QObject*,const char*,const char*,QVariantList)),
- SLOT(relaySignal(QObject*,const char*,const char*,QVariantList)));
- }
-}
-
-void QDBusConnectionPrivate::connectRelay(const QString &service, const QString &path,
- const QString &interface,
- QDBusAbstractInterface *receiver,
- const char *signal)
-{
- // this function is called by QDBusAbstractInterface when one of its signals is connected
- // we set up a relay from D-Bus into it
- SignalHook hook;
- QString key;
- if (!prepareHook(hook, key, service, path, interface, QString(), receiver, signal,
- QDBusAbstractInterface::staticMetaObject.methodCount(), true))
- return; // don't connect
-
- // add it to our list:
- QWriteLocker locker(&lock);
- SignalHookHash::ConstIterator it = signalHooks.find(key);
- SignalHookHash::ConstIterator end = signalHooks.constEnd();
- for ( ; it != end && it.key() == key; ++it) {
- const SignalHook &entry = it.value();
- if (entry.sender == hook.sender &&
- entry.path == hook.path &&
- entry.signature == hook.signature &&
- entry.obj == hook.obj &&
- entry.midx == hook.midx)
- return; // already there, no need to re-add
- }
-
- connectSignal(key, hook);
-}
-
-void QDBusConnectionPrivate::disconnectRelay(const QString &service, const QString &path,
- const QString &interface,
- QDBusAbstractInterface *receiver,
- const char *signal)
-{
- // this function is called by QDBusAbstractInterface when one of its signals is disconnected
- // we remove relay from D-Bus into it
- SignalHook hook;
- QString key;
- if (!prepareHook(hook, key, service, path, interface, QString(), receiver, signal,
- QDBusAbstractInterface::staticMetaObject.methodCount(), true))
- return; // don't connect
-
- // remove it from our list:
- QWriteLocker locker(&lock);
- SignalHookHash::Iterator it = signalHooks.find(key);
- SignalHookHash::Iterator end = signalHooks.end();
- for ( ; it != end && it.key() == key; ++it) {
- const SignalHook &entry = it.value();
- if (entry.sender == hook.sender &&
- entry.path == hook.path &&
- entry.signature == hook.signature &&
- entry.obj == hook.obj &&
- entry.midx == hook.midx) {
- // found it
- signalHooks.erase(it);
- return;
- }
- }
-
- qWarning("QDBusConnectionPrivate::disconnectRelay called for a signal that was not found");
-}
-
-QString QDBusConnectionPrivate::getNameOwner(const QString& serviceName)
-{
- if (QDBusUtil::isValidUniqueConnectionName(serviceName))
- return serviceName;
- if (!connection || !QDBusUtil::isValidBusName(serviceName))
- return QString();
-
- QDBusMessage msg = QDBusMessage::methodCall(QLatin1String(DBUS_SERVICE_DBUS),
- QLatin1String(DBUS_PATH_DBUS), QLatin1String(DBUS_INTERFACE_DBUS),
- QLatin1String("GetNameOwner"));
- msg << serviceName;
- QDBusMessage reply = sendWithReply(msg, QDBusConnection::NoUseEventLoop);
- if (!lastError.isValid() && reply.type() == QDBusMessage::ReplyMessage)
- return reply.first().toString();
- return QString();
-}
-
-QDBusInterfacePrivate *
-QDBusConnectionPrivate::findInterface(const QString &service,
- const QString &path,
- const QString &interface)
-{
- // check if it's there first -- FIXME: add binding mode
- QDBusMetaObject *mo = 0;
- QString owner = getNameOwner(service);
- if (connection && !owner.isEmpty() && QDBusUtil::isValidObjectPath(path) &&
- (interface.isEmpty() || QDBusUtil::isValidInterfaceName(interface)))
- // always call here with the unique connection name
- mo = findMetaObject(owner, path, interface);
-
- QDBusInterfacePrivate *p = new QDBusInterfacePrivate(QDBusConnection(name), this, owner, path, interface, mo);
-
- if (!mo) {
- // invalid object
- p->isValid = false;
- p->lastError = lastError;
- if (!lastError.isValid()) {
- // try to determine why we couldn't get the data
- if (!connection)
- p->lastError = QDBusError(QDBusError::Disconnected,
- QLatin1String("Not connected to D-Bus server"));
- else if (owner.isEmpty())
- p->lastError = QDBusError(QDBusError::ServiceUnknown,
- QString(QLatin1String("Service %1 is unknown")).arg(service));
-#if 0 // caught by Q_ASSERT in QDBusConnection::findInterface
- else if (!QDBusUtil::isValidObjectPath(path))
- p->lastError = QDBusError(QDBusError::InvalidArgs,
- QString(QLatin1String("Object path %1 is invalid")).arg(path));
- else if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface))
- p->lastError = QDBusError(QDBusError::InvalidArgs,
- QString(QLatin1String("Interface %1 is invalid")).arg(interface));
-#endif
- else
- p->lastError = QDBusError(QDBusError::Other, QLatin1String("Unknown error"));
- }
- }
-
- return p;
-}
-
-struct qdbus_Introspect
-{
- QString xml;
- inline void operator()(QDBusConnectionPrivate::ObjectTreeNode *node)
- { xml = qDBusIntrospectObject(node); }
-};
-
-QDBusMetaObject *
-QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &path,
- const QString &interface)
-{
- // service must be a unique connection name
- if (!interface.isEmpty()) {
- QReadLocker locker(&lock);
- QDBusMetaObject *mo = cachedMetaObjects.value(interface, 0);
- if (mo)
- return mo;
- }
- if (service == QString::fromUtf8(dbus_bus_get_unique_name(connection))) {
- // it's one of our own
- QWriteLocker locker(&lock);
- QDBusMetaObject *mo = 0;
- if (!interface.isEmpty())
- mo = cachedMetaObjects.value(interface, 0);
- if (mo)
- // maybe it got created when we switched from read to write lock
- return mo;
-
- qdbus_Introspect apply;
- if (!applyForObject(&rootNode, path, apply)) {
- lastError = QDBusError(QDBusError::InvalidArgs,
- QString(QLatin1String("No object at %1")).arg(path));
- return 0; // no object at path
- }
-
- // release the lock and return
- return QDBusMetaObject::createMetaObject(interface, apply.xml, cachedMetaObjects, lastError);
- }
-
- // not local: introspect the target object:
- QDBusMessage msg = QDBusMessage::methodCall(service, path,
- QLatin1String(DBUS_INTERFACE_INTROSPECTABLE),
- QLatin1String("Introspect"));
-
-
- QDBusMessage reply = sendWithReply(msg, QDBusConnection::NoUseEventLoop);
-
- // it doesn't exist yet, we have to create it
- QWriteLocker locker(&lock);
- QDBusMetaObject *mo = 0;
- if (!interface.isEmpty())
- mo = cachedMetaObjects.value(interface, 0);
- if (mo)
- // maybe it got created when we switched from read to write lock
- return mo;
-
- QString xml;
- if (reply.type() == QDBusMessage::ReplyMessage)
- // fetch the XML description
- xml = reply.first().toString();
- else {
- lastError = reply;
- if (reply.type() != QDBusMessage::ErrorMessage || lastError != QDBusError::UnknownMethod)
- return 0; // error
- }
-
- // release the lock and return
- return QDBusMetaObject::createMetaObject(interface, xml, cachedMetaObjects, lastError);
-}
-
-void QDBusReplyWaiter::reply(const QDBusMessage &msg)
-{
- replyMsg = msg;
- QTimer::singleShot(0, this, SLOT(quit()));
-}
-
-#include "qdbusconnection_p.moc"
diff --git a/qt/src/qdbusinterface.cpp b/qt/src/qdbusinterface.cpp
deleted file mode 100644
index 72097077..00000000
--- a/qt/src/qdbusinterface.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusinterface.h"
-
-#include <dbus/dbus.h>
-#include <QtCore/qpointer.h>
-
-#include "qdbusinterface_p.h"
-#include "qdbusconnection_p.h"
-
-/*!
- \class QDBusInterface
- \brief Proxy class for interfaces on remote objects.
-
- QDBusInterface is a generic accessor class that is used to place calls to remote objects,
- connect to signals exported by remote objects and get/set the value of remote properties. This
- class is useful for dynamic access to remote objects: that is, when you do not have a generated
- code that represents the remote interface.
-
- Calls are usually placed by using the call() function, which constructs the message, sends it
- over the bus, waits for the reply and decodes the reply. Signals are connected to by using the
- normal QObject::connect() function. Finally, properties are accessed using the
- QObject::property() and QObject::setProperty() functions.
-*/
-
-QDBusInterface::QDBusInterface(QDBusInterfacePrivate *p)
- : QDBusAbstractInterface(p)
-{
-}
-
-/*!
- Destroy the object interface and frees up any resource used.
-*/
-QDBusInterface::~QDBusInterface()
-{
- // resources are freed in QDBusInterfacePrivate::~QDBusInterfacePrivate()
-}
-
-/*!
- \internal
- Overrides QObject::metaObject to return our own copy.
-*/
-const QMetaObject *QDBusInterface::metaObject() const
-{
- return d_func()->isValid ? d_func()->metaObject : &QDBusAbstractInterface::staticMetaObject;
-}
-
-/*!
- \internal
- Override QObject::qt_metacast to catch the interface name too.
-*/
-void *QDBusInterface::qt_metacast(const char *_clname)
-{
- if (!_clname) return 0;
- if (!strcmp(_clname, "QDBusInterface"))
- return static_cast<void*>(const_cast<QDBusInterface*>(this));
- if (d_func()->interface.toLatin1() == _clname)
- return static_cast<void*>(const_cast<QDBusInterface*>(this));
- return QDBusAbstractInterface::qt_metacast(_clname);
-}
-
-/*!
- \internal
- Dispatch the call through the private.
-*/
-int QDBusInterface::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
-{
- _id = QDBusAbstractInterface::qt_metacall(_c, _id, _a);
- if (_id < 0 || !d_func()->isValid)
- return _id;
- return d_func()->metacall(_c, _id, _a);
-}
-
-int QDBusInterfacePrivate::metacall(QMetaObject::Call c, int id, void **argv)
-{
- Q_Q(QDBusInterface);
-
- if (c == QMetaObject::InvokeMetaMethod) {
- int offset = metaObject->methodOffset();
- QMetaMethod mm = metaObject->method(id + offset);
-
- if (mm.methodType() == QMetaMethod::Signal) {
- // signal relay from D-Bus world to Qt world
- QMetaObject::activate(q, metaObject, id, argv);
-
- } else if (mm.methodType() == QMetaMethod::Slot) {
- // method call relay from Qt world to D-Bus world
- // get D-Bus equivalent signature
- QString methodName = QLatin1String(metaObject->dbusNameForMethod(id));
- const int *inputTypes = metaObject->inputTypesForMethod(id);
- const int *outputTypes = metaObject->outputTypesForMethod(id);
-
- int inputTypesCount = *inputTypes;
- int outputTypesCount = *outputTypes++;
-
- // we will assume that the input arguments were passed correctly
- QVariantList args;
- for (int i = 1; i <= inputTypesCount; ++i)
- args << QVariant(inputTypes[i], argv[i]);
-
- // make the call
- QPointer<QDBusInterface> qq = q;
- QDBusMessage reply = q->callWithArgs(methodName, args);
- args.clear();
-
- // access to "this" or to "q" below this point must check for "qq"
- // we may have been deleted!
-
- // check if we got the right number of parameters back:
- bool success = false;
- if (reply.count() == outputTypesCount) {
- // copy the values out
- for (int i = 0; i < outputTypesCount; ++i) {
- // treat the return value specially, since it may be null:
- if (i == 0 && argv[0] == 0)
- continue;
-
- // ensure that the types are correct:
- const QVariant &item = reply.at(i);
- if (outputTypes[i] != item.userType()) {
- success = false;
- break;
- }
-
- if (i == 0)
- QDBusMetaObject::assign(argv[0], item);
- else
- QDBusMetaObject::assign(argv[inputTypesCount + i], item);
- }
- }
-
- // bail out, something weird happened
- if (!success && !qq.isNull()) {
- QString errmsg = QLatin1String("Invalid signature `%1' in return from call to %2.%3");
- lastError = QDBusError(QDBusError::InvalidSignature,
- errmsg.arg(reply.signature(), interface, methodName));
- }
-
- // done
- return -1;
- }
- } else if (c == QMetaObject::ReadProperty) {
- // Qt doesn't support non-readable properties
- // we have to re-check
- QMetaProperty mp = metaObject->property(id + metaObject->propertyOffset());
- if (!mp.isReadable())
- return -1; // don't read
-
- QVariant value = property(mp);
- if (value.type() == QVariant::Invalid)
- // an error occurred -- property already set lastError
- return -1;
- else if (mp.type() == QVariant::LastType)
- // QVariant is special in this context
- *reinterpret_cast<QVariant *>(argv[0]) = value;
- else
- QDBusMetaObject::assign(argv[0], value);
-
- return -1; // handled
- } else if (c == QMetaObject::WriteProperty) {
- // QMetaProperty::write has already checked that we're writable
- // it has also checked that the type is right
- QVariant value(metaObject->propertyMetaType(id), argv[0]);
- QMetaProperty mp = metaObject->property(id + metaObject->propertyOffset());
-
- setProperty(mp, value);
- return -1;
- }
- return id;
-}
-
-QDBusInterfacePtr::QDBusInterfacePtr(QDBusConnection &conn, const QString &service, const QString &path,
- const QString &iface)
- : d(conn.findInterface(service, path, iface))
-{
-}
-
-QDBusInterfacePtr::QDBusInterfacePtr(const QString &service, const QString &path, const QString &iface)
- : d(QDBus::sessionBus().findInterface(service, path, iface))
-{
-}
-
diff --git a/qt/src/qdbusinterface.h b/qt/src/qdbusinterface.h
deleted file mode 100644
index 0b4d1874..00000000
--- a/qt/src/qdbusinterface.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSINTERFACE_H
-#define QDBUSINTERFACE_H
-
-#include "qdbusabstractinterface.h"
-
-class QDBusInterfacePrivate;
-class QDBUS_EXPORT QDBusInterface: public QDBusAbstractInterface
-{
- friend class QDBusConnection;
-private:
- QDBusInterface(QDBusInterfacePrivate *p);
-
-public:
- ~QDBusInterface();
-
- virtual const QMetaObject *metaObject() const;
- virtual void *qt_metacast(const char *);
- virtual int qt_metacall(QMetaObject::Call, int, void **);
-
-private:
- Q_DECLARE_PRIVATE(QDBusInterface)
- Q_DISABLE_COPY(QDBusInterface)
-};
-
-struct QDBUS_EXPORT QDBusInterfacePtr
-{
- QDBusInterfacePtr(QDBusInterface *iface) : d(iface) { }
- QDBusInterfacePtr(QDBusConnection &conn, const QString &service, const QString &path,
- const QString &interface = QString());
- QDBusInterfacePtr(const QString &service, const QString &path, const QString &interface = QString());
- ~QDBusInterfacePtr() { delete d; }
-
- QDBusInterface *interface() { return d; }
- QDBusInterface *operator->() { return d; }
-private:
- QDBusInterface *const d;
- Q_DISABLE_COPY(QDBusInterfacePtr)
-};
-
-#endif
diff --git a/qt/src/qdbusinterface_p.h b/qt/src/qdbusinterface_p.h
deleted file mode 100644
index 25cb9ffa..00000000
--- a/qt/src/qdbusinterface_p.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the public API. This header file may
-// change from version to version without notice, or even be
-// removed.
-//
-// We mean it.
-//
-//
-
-#ifndef QDBUSINTERFACEPRIVATE_H
-#define QDBUSINTERFACEPRIVATE_H
-
-#include "qdbusabstractinterface_p.h"
-#include "qdbusmetaobject_p.h"
-#include "qdbusinterface.h"
-
-class QDBusInterfacePrivate: public QDBusAbstractInterfacePrivate
-{
-public:
- Q_DECLARE_PUBLIC(QDBusInterface)
-
- QDBusMetaObject *metaObject;
-
- inline QDBusInterfacePrivate(const QDBusConnection &con, QDBusConnectionPrivate *conp,
- const QString &serv, const QString &p, const QString &iface,
- QDBusMetaObject *mo = 0)
- : QDBusAbstractInterfacePrivate(con, conp, serv, p, iface), metaObject(mo)
- {
- }
- ~QDBusInterfacePrivate()
- {
- if (metaObject && !metaObject->cached)
- delete metaObject;
- }
-
- int metacall(QMetaObject::Call c, int id, void **argv);
-};
-
-#endif
diff --git a/qt/src/qdbusinternalfilters.cpp b/qt/src/qdbusinternalfilters.cpp
deleted file mode 100644
index ed210744..00000000
--- a/qt/src/qdbusinternalfilters.cpp
+++ /dev/null
@@ -1,235 +0,0 @@
-/* -*- mode: C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusconnection_p.h"
-
-#include <dbus/dbus.h>
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qmetaobject.h>
-#include <QtCore/qstringlist.h>
-
-#include "qdbusabstractadaptor.h"
-#include "qdbusabstractadaptor_p.h"
-#include "qdbusconnection.h"
-#include "qdbusmessage.h"
-#include "qdbustypehelper_p.h"
-#include "qdbusutil.h"
-
-// defined in qdbusxmlgenerator.cpp
-extern QString qDBusGenerateMetaObjectXml(QString interface, const QMetaObject *mo,
- const QMetaObject *base, int flags);
-
-static const char introspectableInterfaceXml[] =
- " <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
- " <method name=\"Introspect\">\n"
- " <arg name=\"xml_data\" type=\"s\" direction=\"out\"/>\n"
- " </method>\n"
- " </interface>\n";
-
-static const char propertiesInterfaceXml[] =
- " <interface name=\"org.freedesktop.DBus.Properties\">\n"
- " <method name=\"Get\">\n"
- " <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
- " <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
- " <arg name=\"value\" type=\"v\" direction=\"out\"/>\n"
- " </method>\n"
- " <method name=\"Set\">\n"
- " <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
- " <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
- " <arg name=\"value\" type=\"v\" direction=\"in\"/>\n"
- " </method>\n"
- " </interface>\n";
-
-static QString generateSubObjectXml(QObject *object)
-{
- QString retval;
- foreach (QObject *child, object->children()) {
- QString name = child->objectName();
- if (!name.isEmpty())
- retval += QString(QLatin1String(" <node name=\"%1\"/>\n"))
- .arg(name);
- }
- return retval;
-}
-
-QString qDBusIntrospectObject(const QDBusConnectionPrivate::ObjectTreeNode *node)
-{
- // object may be null
-
- QString xml_data(QLatin1String(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE));
- xml_data += QLatin1String("<node>\n");
-
- if (node->obj) {
- if (node->flags & QDBusConnection::ExportContents) {
- const QMetaObject *mo = node->obj->metaObject();
- for ( ; mo != &QObject::staticMetaObject; mo = mo->superClass())
- xml_data += qDBusGenerateMetaObjectXml(QString(), mo, mo->superClass(),
- node->flags);
- }
-
- // does this object have adaptors?
- QDBusAdaptorConnector *connector;
- if (node->flags & QDBusConnection::ExportAdaptors &&
- (connector = qDBusFindAdaptorConnector(node->obj))) {
-
- // trasverse every adaptor in this object
- QDBusAdaptorConnector::AdaptorMap::ConstIterator it = connector->adaptors.constBegin();
- QDBusAdaptorConnector::AdaptorMap::ConstIterator end = connector->adaptors.constEnd();
- for ( ; it != end; ++it) {
- // add the interface:
- QString ifaceXml = QDBusAbstractAdaptorPrivate::retrieveIntrospectionXml(it->adaptor);
- if (ifaceXml.isEmpty()) {
- // add the interface's contents:
- ifaceXml += qDBusGenerateMetaObjectXml(it->interface, it->metaObject,
- &QDBusAbstractAdaptor::staticMetaObject,
- QDBusConnection::ExportAllContents);
-
- QDBusAbstractAdaptorPrivate::saveIntrospectionXml(it->adaptor, ifaceXml);
- }
-
- xml_data += ifaceXml;
- }
- }
-
- xml_data += QLatin1String( introspectableInterfaceXml );
- xml_data += QLatin1String( propertiesInterfaceXml );
- }
-
- if (node->flags & QDBusConnection::ExportChildObjects) {
- xml_data += generateSubObjectXml(node->obj);
- } else {
- // generate from the object tree
- foreach (const QDBusConnectionPrivate::ObjectTreeNode::Data &entry, node->children) {
- if (entry.node && (entry.node->obj || !entry.node->children.isEmpty()))
- xml_data += QString(QLatin1String(" <node name=\"%1\"/>\n"))
- .arg(entry.name);
- }
- }
-
- xml_data += QLatin1String("</node>\n");
- return xml_data;
-}
-
-void qDBusIntrospectObject(const QDBusConnectionPrivate::ObjectTreeNode *node,
- const QDBusMessage &msg)
-{
- // now send it
- QDBusMessage reply = QDBusMessage::methodReply(msg);
- reply << qDBusIntrospectObject(node);
- msg.connection().send(reply);
-}
-
-// implement the D-Bus interface org.freedesktop.DBus.Properties
-
-static void sendPropertyError(const QDBusMessage &msg, const QString &interface_name)
-{
- QDBusMessage error = QDBusMessage::error(msg, QLatin1String(DBUS_ERROR_INVALID_ARGS),
- QString::fromLatin1("Interface %1 was not found in object %2")
- .arg(interface_name)
- .arg(msg.path()));
- msg.connection().send(error);
-}
-
-void qDBusPropertyGet(const QDBusConnectionPrivate::ObjectTreeNode *node, const QDBusMessage &msg)
-{
- Q_ASSERT(msg.count() == 2);
- QString interface_name = msg.at(0).toString();
- QByteArray property_name = msg.at(1).toString().toUtf8();
-
- QDBusAdaptorConnector *connector;
- QVariant value;
- if (node->flags & QDBusConnection::ExportAdaptors &&
- (connector = qDBusFindAdaptorConnector(node->obj))) {
-
- // find the class that implements interface_name
- QDBusAdaptorConnector::AdaptorMap::ConstIterator it;
- it = qLowerBound(connector->adaptors.constBegin(), connector->adaptors.constEnd(),
- interface_name);
- if (it != connector->adaptors.constEnd() && it->interface == interface_name)
- value = it->adaptor->property(property_name);
- }
-
- if (!value.isValid() && node->flags & QDBusConnection::ExportProperties) {
- // try the object itself
- int pidx = node->obj->metaObject()->indexOfProperty(property_name);
- if (pidx != -1) {
- QMetaProperty mp = node->obj->metaObject()->property(pidx);
- if (mp.isScriptable() || (node->flags & QDBusConnection::ExportAllProperties) ==
- QDBusConnection::ExportAllProperties)
- value = mp.read(node->obj);
- }
- }
-
- if (!value.isValid()) {
- // the property was not found
- sendPropertyError(msg, interface_name);
- return;
- }
-
- QDBusMessage reply = QDBusMessage::methodReply(msg);
- reply.setSignature(QLatin1String("v"));
- reply << value;
- msg.connection().send(reply);
-}
-
-void qDBusPropertySet(const QDBusConnectionPrivate::ObjectTreeNode *node, const QDBusMessage &msg)
-{
- Q_ASSERT(msg.count() == 3);
- QString interface_name = msg.at(0).toString();
- QByteArray property_name = msg.at(1).toString().toUtf8();
- QVariant value = QDBusTypeHelper<QVariant>::fromVariant(msg.at(2));
-
- QDBusAdaptorConnector *connector;
- if (node->flags & QDBusConnection::ExportAdaptors &&
- (connector = qDBusFindAdaptorConnector(node->obj))) {
-
- // find the class that implements interface_name
- QDBusAdaptorConnector::AdaptorMap::ConstIterator it;
- it = qLowerBound(connector->adaptors.constBegin(), connector->adaptors.constEnd(),
- interface_name);
- if (it != connector->adaptors.end() && it->interface == interface_name)
- if (it->adaptor->setProperty(property_name, value)) {
- msg.connection().send(QDBusMessage::methodReply(msg));
- return;
- }
- }
-
- if (node->flags & QDBusConnection::ExportProperties) {
- // try the object itself
- int pidx = node->obj->metaObject()->indexOfProperty(property_name);
- if (pidx != -1) {
- QMetaProperty mp = node->obj->metaObject()->property(pidx);
- if (mp.isScriptable() || (node->flags & QDBusConnection::ExportAllProperties) ==
- QDBusConnection::ExportAllProperties) {
-
- if (mp.write(node->obj, value)) {
- msg.connection().send(QDBusMessage::methodReply(msg));
- return;
- }
- }
- }
- }
-
- // the property was not found or not written to
- sendPropertyError(msg, interface_name);
-}
diff --git a/qt/src/qdbusintrospection.cpp b/qt/src/qdbusintrospection.cpp
deleted file mode 100644
index 20acbd21..00000000
--- a/qt/src/qdbusintrospection.cpp
+++ /dev/null
@@ -1,403 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusintrospection_p.h"
-#include "qdbusxmlparser_p.h"
-
-/*!
- \class QDBusIntrospection
- \brief Information about introspected objects and interfaces on D-Bus.
- \internal
-
- This class provides structures and methods for parsing the XML introspection data for D-Bus.
- Normally, you don't have to use the methods provided here: QDBusInterface and QDBusObject will
- do that for you.
-
- But they may prove useful if the XML data was obtained through other means (like parsing a file).
-*/
-
-/*!
- \class QDBusIntrospection::Argument
- \brief One argument to a D-Bus method or signal.
-
- This struct represents one argument passed to a method or received from a method or signal in
- D-Bus. The struct does not contain information on the direction (input or output).
-*/
-
-/*!
- \var QDBusIntrospection::Argument::type
- The argument type.
-*/
-
-/*!
- \var QDBusIntrospection::Argument::name
- The argument name. The argument name is optional, so this may be a null QString.
-*/
-
-/*!
- \fn QDBusIntrospection::Argument::operator==(const Argument &other) const
- Compares this object against \a other and return true if they are the same.
-*/
-
-/*!
- \class QDBusIntrospection::Method
- \brief Information about one method.
-
- This struct represents one method discovered through introspection. A method is composed of
- its \a name, its input arguments, its output arguments, and, optionally, annotations. There are no
- "in-out" arguments.
-*/
-
-/*!
- \var QDBusIntrospection::Method::name
- The method's name.
-*/
-
-/*!
- \var QDBusIntrospection::Method::inputArgs
- A list of the method's input arguments.
-*/
-
-/*!
- \var QDBusIntrospection::Method::outputArgs
- A list of the method's output arguments (i.e., return values).
-*/
-
-/*!
- \var QDBusIntrospection::Method::annotations
- The annotations associated with the method. Each annotation is a pair of strings, where the key
- is of the same format as a D-Bus interface name. The value is arbitrary.
-*/
-
-/*!
- \fn QDBusIntrospection::Method::operator==(const Method &other) const
- Compares this object against \a other and return true if they are the same.
-*/
-
-/*!
- \class QDBusIntrospection::Signal
- \brief Information about one signal.
-
- This struct represents one signal discovered through introspection. A signal is composed of
- its \a name, its output arguments, and, optionally, annotations.
-*/
-
-/*!
- \var QDBusIntrospection::Signal::name
- The signal's name.
-*/
-
-/*!
- \var QDBusIntrospection::Signal::outputArgs
- A list of the signal's arguments.
-*/
-
-/*!
- \var QDBusIntrospection::Signal::annotations
- The annotations associated with the signal. Each annotation is a pair of strings, where the key
- is of the same format as a D-Bus interface name. The value is arbitrary.
-*/
-
-/*!
- \fn QDBusIntrospection::Signal::operator==(const Signal& other) const
- Compares this object against \a other and return true if they are the same.
-*/
-
-/*!
- \class QDBusIntrospection::Property
- \brief Information about one property.
-
- This struct represents one property discovered through introspection. A property is composed of
- its \a name, its \a type, its \a access rights, and, optionally, annotations.
-*/
-
-/*!
- \var QDBusIntrospection::Property::name
- The property's name.
-*/
-
-/*!
- \var QDBusIntrospection::Property::type
- The property's type.
-*/
-
-/*!
- \enum QDBusIntrospection::Property::Access
- The possible access rights for a property:
- \value Read
- \value Write
- \value ReadWrite
-*/
-
-/*!
- \var QDBusIntrospection::Property::access
- The property's access rights.
-*/
-
-/*!
- \var QDBusIntrospection::Property::annotations
- The annotations associated with the property. Each annotation is a pair of strings, where the key
- is of the same format as a D-Bus interface name. The value is arbitrary.
-*/
-
-/*!
- \fn QDBusIntrospection::Property::operator==(const Property &other) const
- Compares this object against \a other and return true if they are the same.
-*/
-
-/*!
- \class QDBusIntrospection::Interface
- \brief Information about one interface on the bus.
-
- Each interface on D-Bus has an unique \a name, identifying where that interface was defined.
- Interfaces may have annotations, methods, signals and properties, but none are mandatory.
-*/
-
-/*!
- \var QDBusIntrospection::Interface::name
- The interface's name.
-*/
-
-/*!
- \var QDBusIntrospection::Interface::introspection
- The XML document fragment describing this interface.
-
- If parsed again through parseInterface, the object returned should have the same contents as
- this object.
-*/
-
-/*!
- \var QDBusIntrospection::Interface::annotations
- The annotations associated with the interface. Each annotation is a pair of strings, where the key
- is of the same format as a D-Bus interface name. The value is arbitrary.
-*/
-
-/*!
- \var QDBusIntrospection::Interface::methods
- The methods available in this interface. Note that method names are not unique (i.e., methods
- can be overloaded with multiple arguments types).
-*/
-
-/*!
- \var QDBusIntrospection::Interface::signals_
- The signals available in this interface. Note that signal names are not unique (i.e., signals
- can be overloaded with multiple argument types).
-
- This member is called "signals_" because "signals" is a reserved keyword in Qt.
-*/
-
-/*!
- \var QDBusIntrospection::Interface::properties
- The properties available in this interface. Property names are unique.
-*/
-
-/*!
- \fn QDBusIntrospection::Interface::operator==(const Interface &other) const
- Compares this object against \a other and return true if they are the same.
-
- Note that two interfaces are considered to be the same if they have the same name. The internal
- structures in the objects are not compared.
-*/
-
-/*!
- \class QDBusIntrospection::Object
- \brief Information about one object on the bus.
-
- An object on the D-Bus bus is represented by its service and path on the service but, unlike
- interfaces, objects are mutable. That is, their contents can change with time. Therefore,
- while the (service, path) pair uniquely identifies an object, the information contained in
- this struct may no longer represent the object.
-
- An object can contain interfaces and child (sub) objects.
-*/
-
-/*!
- \var QDBusIntrospection::Object::service
- The object's service name.
-
- \sa parseObject(), parseObjectTree()
-*/
-
-/*!
- \var QDBusIntrospection::Object::path
- The object's path on the service. This is an absolute path.
-
- \sa parseObject(), parseObjectTree()
-*/
-
-/*!
- \var QDBusIntrospection::Object::introspection
- The XML document fragment describing this object, its interfaces and sub-objects at the time
- of the parsing.
-
- The result of parseObject with this XML data should be the same as the Object struct.
-*/
-
-/*!
- \var QDBusIntrospection::Object::interfaces
- The list of interface names in this object.
-*/
-
-/*!
- \var QDBusIntrospection::Object::childObjects
- The list of child object names in this object. Note that this is a relative name, not an
- absolute path. To obtain the absolute path, concatenate with \l
- {QDBusIntrospection::Object::path}{path}.
-*/
-
-/*!
- \class QDBusIntrospection::ObjectTree
- \brief Complete information about one object node and its descendency.
-
- This struct contains the same data as QDBusIntrospection::Object, plus the actual data for the
- interfaces and child (sub) objects that was available in the XML document.
-*/
-
-/*!
- \var QDBusIntrospection::ObjectTree::interfaceData
- A map of interfaces and their names.
-*/
-
-/*!
- \var QDBusIntrospection::ObjectTree::childObjectData
- A map of object paths and their data. The map key contains the relative path to the object.
-
- Note this map contains only the child notes that do have information about the sub-object's
- contents. If the XML data did not contain the information, only the object name will be listed
- in childObjects, but not in childObjectData.
-*/
-
-/*!
- \typedef QDBusIntrospection::Annotations
- Contains a QMap of an annotation pair. The annotation's name is stored in the QMap key and
- must be unique. The annotation's value is stored in the QMap's value and is arbitrary.
-*/
-
-/*!
- \typedef QDBusIntrospection::Arguments
- Contains a list of arguments to either a Method or a Signal. The arguments' order is important.
-*/
-
-/*!
- \typedef QDBusIntrospection::Methods
- Contains a QMap of methods and their names. The method's name is stored in the map's key and
- is not necessarily unique. The order in which multiple methods with the same name are stored
- in this map is undefined.
-*/
-
-/*!
- \typedef QDBusIntrospection::Signals
- Contains a QMap of signals and their names. The signal's name is stored in the map's key and
- is not necessarily unique. The order in which multiple signals with the same name are stored
- in this map is undefined.
-*/
-
-/*!
- \typedef QDBusIntrospection::Properties
- Contains a QMap of properties and their names. Each property must have a unique name.
-*/
-
-/*!
- \typedef QDBusIntrospection::Interfaces
- Contains a QMap of interfaces and their names. Each interface has a unique name.
-*/
-
-/*!
- \typedef QDBusIntrospection::Objects
- Contains a QMap of objects and their paths relative to their immediate parent.
-
- \sa parseObjectTree()
-*/
-
-/*!
- Parses the XML document fragment (given by \a xml) containing one interface.
-
- The first element tag in this XML data must be either \<node\> or \<interface\>. If it is
- \<node\>, then the \<interface\> tag must be a child tag of the \<node\> one.
-
- If there are multiple interfaces in this XML data, it is undefined which one will be
- returned.
-*/
-QDBusIntrospection::Interface
-QDBusIntrospection::parseInterface(const QString &xml)
-{
- // be lazy
- Interfaces ifs = parseInterfaces(xml);
- if (ifs.isEmpty())
- return Interface();
-
- // return the first in map order (probably alphabetical order)
- return *ifs.constBegin().value();
-}
-
-/*!
- Parses the XML document fragment (given by \a xml) containing several interfaces.
-
- If the first element tag in this document fragment is \<node\>, the interfaces parsed will
- be those found as child elements of the \<node\> tag.
-*/
-QDBusIntrospection::Interfaces
-QDBusIntrospection::parseInterfaces(const QString &xml)
-{
- QString null;
- QDBusXmlParser parser(null, null, xml);
- return parser.interfaces();
-}
-
-/*!
- Parses the XML document fragment (given by \a xml) containing one object, found at the service
- \a service and path \a path.
-
- The first element tag in this document must be \<node\>. If that tag does not contain
- a name attribute, the \a path argument will be used to determine the path of this
- object node.
-
- This function does not parse the interfaces contained in the node, nor sub-object's contents.
- It will only list their names. If you need to know their contents, use parseObjectTree.
-*/
-QDBusIntrospection::Object
-QDBusIntrospection::parseObject(const QString &xml, const QString &service, const QString &path)
-{
- QDBusXmlParser parser(service, path, xml);
- QSharedDataPointer<QDBusIntrospection::Object> retval = parser.object();
- if (!retval)
- return QDBusIntrospection::Object();
- return *retval;
-}
-
-/*!
- Parses the XML document fragment (given by \a xml) containing one object node and returns all
- the information about the interfaces and sub-objects, found at the service \a service and path
- \a path.
-
- The Objects map returned will contain the absolute path names in the key.
-*/
-QDBusIntrospection::ObjectTree
-QDBusIntrospection::parseObjectTree(const QString &xml, const QString &service, const QString &path)
-{
- QDBusXmlParser parser(service, path, xml);
- QSharedDataPointer<QDBusIntrospection::ObjectTree> retval = parser.objectTree();
- if (!retval)
- return QDBusIntrospection::ObjectTree();
- return *retval;
-}
diff --git a/qt/src/qdbusintrospection_p.h b/qt/src/qdbusintrospection_p.h
deleted file mode 100644
index 0e4e9015..00000000
--- a/qt/src/qdbusintrospection_p.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSINTROSPECTION_H
-#define QDBUSINTROSPECTION_H
-
-#include <QtCore/qstring.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qmap.h>
-#include <QtCore/qpair.h>
-#include <QtCore/qshareddata.h>
-#include "qdbusmacros.h"
-
-class QDBUS_EXPORT QDBusIntrospection
-{
-public:
- // forward declarations
- struct Argument;
- struct Method;
- struct Signal;
- struct Property;
- struct Interface;
- struct Object;
- struct ObjectTree;
-
- // typedefs
- typedef QMap<QString, QString> Annotations;
- typedef QList<Argument> Arguments;
- typedef QMultiMap<QString, Method> Methods;
- typedef QMultiMap<QString, Signal> Signals;
- typedef QMap<QString, Property> Properties;
- typedef QMap<QString, QSharedDataPointer<Interface> > Interfaces;
- typedef QMap<QString, QSharedDataPointer<ObjectTree> > Objects;
-
-public:
- // the structs
-
- struct Argument
- {
- QString type;
- QString name;
-
- inline bool operator==(const Argument& other) const
- { return name == other.name && type == other.type; }
- };
-
- struct Method
- {
- QString name;
- Arguments inputArgs;
- Arguments outputArgs;
- Annotations annotations;
-
- inline bool operator==(const Method& other) const
- { return name == other.name && annotations == other.annotations &&
- inputArgs == other.inputArgs && outputArgs == other.outputArgs; }
- };
-
- struct Signal
- {
- QString name;
- Arguments outputArgs;
- Annotations annotations;
-
- inline bool operator==(const Signal& other) const
- { return name == other.name && annotations == other.annotations &&
- outputArgs == other.outputArgs; }
- };
-
- struct Property
- {
- enum Access { Read, Write, ReadWrite };
- QString name;
- QString type;
- Access access;
- Annotations annotations;
-
- inline bool operator==(const Property& other) const
- { return access == other.access && name == other.name &&
- annotations == other.annotations && type == other.type; }
- };
-
- struct Interface: public QSharedData
- {
- QString name;
- QString introspection;
-
- Annotations annotations;
- Methods methods;
- Signals signals_;
- Properties properties;
-
- inline bool operator==(const Interface &other) const
- { return !name.isEmpty() && name == other.name; }
- };
-
- struct Object: public QSharedData
- {
- QString service;
- QString path;
- QString introspection;
-
- QStringList interfaces;
- QStringList childObjects;
- };
-
- struct ObjectTree: public Object
- {
- Interfaces interfaceData;
- Objects childObjectData;
- };
-
-public:
- static Interface parseInterface(const QString &xml);
- static Interfaces parseInterfaces(const QString &xml);
- static Object parseObject(const QString &xml, const QString &service = QString(),
- const QString &path = QString());
- static ObjectTree parseObjectTree(const QString &xml,
- const QString &service,
- const QString &path);
-
-private:
- QDBusIntrospection();
-};
-
-#endif
diff --git a/qt/src/qdbusmacros.h b/qt/src/qdbusmacros.h
deleted file mode 100644
index 0af5b5b3..00000000
--- a/qt/src/qdbusmacros.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* qdbusmessage.h QDBusMessage object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-/*!
- \file qdbusmacros.h
-*/
-
-#ifndef QDBUSMACROS_H
-#define QDBUSMACROS_H
-
-#include <QtCore/qglobal.h>
-#include <QtCore/qmetatype.h>
-#include <QtCore/qvariant.h>
-
-#ifdef QT_NO_MEMBER_TEMPLATES
-# error Sorry, you need a compiler with support for template member functions to compile QtDBus.
-#endif
-
-#if defined(QDBUS_MAKEDLL)
-# define QDBUS_EXPORT Q_DECL_EXPORT
-#else
-# define QDBUS_EXPORT Q_DECL_IMPORT
-#endif
-
-#ifndef Q_MOC_RUN
-# define Q_ASYNC
-#endif
-
-#ifdef Q_CC_MSVC
-#include <QtCore/qlist.h>
-#include <QtCore/qset.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qvector.h>
-class QDBusType;
-inline uint qHash(const QVariant&) { Q_ASSERT(0); return 0; }
-inline uint qHash(const QDBusType&) { Q_ASSERT(0); return 0; }
-#endif
-
-#endif
diff --git a/qt/src/qdbusmarshall.cpp b/qt/src/qdbusmarshall.cpp
deleted file mode 100644
index 0d90fcd5..00000000
--- a/qt/src/qdbusmarshall.cpp
+++ /dev/null
@@ -1,582 +0,0 @@
-/* qdbusmarshall.cpp
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusmarshall_p.h"
-#include "qdbustype_p.h"
-#include "qdbustypehelper_p.h"
-
-#include <qdebug.h>
-#include <qvariant.h>
-#include <qlist.h>
-#include <qmap.h>
-#include <qstringlist.h>
-#include <qvarlengtharray.h>
-#include <qvector.h>
-
-#include <dbus/dbus.h>
-
-static QVariant qFetchParameter(DBusMessageIter *it);
-
-template <typename T>
-inline T qIterGet(DBusMessageIter *it)
-{
- T t;
- dbus_message_iter_get_basic(it, &t);
- return t;
-}
-
-template<>
-inline QVariant qIterGet(DBusMessageIter *it)
-{
- DBusMessageIter sub;
- dbus_message_iter_recurse(it, &sub);
- return QDBusTypeHelper<QVariant>::toVariant(qFetchParameter(&sub));
-}
-
-template <typename DBusType, typename QtType>
-inline QVariant qFetchList(DBusMessageIter *arrayIt)
-{
- QList<QtType> list;
-
- DBusMessageIter it;
- dbus_message_iter_recurse(arrayIt, &it);
- if (dbus_message_iter_get_array_len(&it) == 0)
- return QDBusTypeHelper<QList<QtType> >::toVariant(list);
-
- do {
- list.append( static_cast<QtType>( qIterGet<DBusType>(&it) ) );
- } while (dbus_message_iter_next(&it));
-
- return QDBusTypeHelper<QList<QtType> >::toVariant(list);
-}
-
-static QStringList qFetchStringList(DBusMessageIter *arrayIt)
-{
- QStringList list;
-
- DBusMessageIter it;
- dbus_message_iter_recurse(arrayIt, &it);
- if (dbus_message_iter_get_array_len(&it) == 0)
- return list;
-
- do {
- list.append(QString::fromUtf8(qIterGet<char *>(&it)));
- } while (dbus_message_iter_next(&it));
-
- return list;
-}
-
-static QVariant qFetchParameter(DBusMessageIter *it)
-{
- switch (dbus_message_iter_get_arg_type(it)) {
- case DBUS_TYPE_BYTE:
- return qVariantFromValue(qIterGet<unsigned char>(it));
- case DBUS_TYPE_INT16:
- return qVariantFromValue(qIterGet<dbus_int16_t>(it));
- case DBUS_TYPE_UINT16:
- return qVariantFromValue(qIterGet<dbus_uint16_t>(it));
- case DBUS_TYPE_INT32:
- return qIterGet<dbus_int32_t>(it);
- case DBUS_TYPE_UINT32:
- return qIterGet<dbus_uint32_t>(it);
- case DBUS_TYPE_DOUBLE:
- return qIterGet<double>(it);
- case DBUS_TYPE_BOOLEAN:
- return bool(qIterGet<dbus_bool_t>(it));
- case DBUS_TYPE_INT64:
- return static_cast<qlonglong>(qIterGet<dbus_int64_t>(it));
- case DBUS_TYPE_UINT64:
- return static_cast<qulonglong>(qIterGet<dbus_uint64_t>(it));
- case DBUS_TYPE_STRING:
- case DBUS_TYPE_OBJECT_PATH:
- case DBUS_TYPE_SIGNATURE:
- return QString::fromUtf8(qIterGet<char *>(it));
- case DBUS_TYPE_VARIANT:
- return qIterGet<QVariant>(it);
- case DBUS_TYPE_ARRAY: {
- int arrayType = dbus_message_iter_get_element_type(it);
- switch (arrayType)
- {
- case DBUS_TYPE_BYTE: {
- // QByteArray
- DBusMessageIter sub;
- dbus_message_iter_recurse(it, &sub);
- int len = dbus_message_iter_get_array_len(&sub);
- char* data;
- dbus_message_iter_get_fixed_array(&sub,&data,&len);
- return QByteArray(data,len);
- }
- case DBUS_TYPE_INT16:
- return qFetchList<dbus_int16_t, short>(it);
- case DBUS_TYPE_UINT16:
- return qFetchList<dbus_uint16_t, ushort>(it);
- case DBUS_TYPE_INT32:
- return qFetchList<dbus_int32_t, int>(it);
- case DBUS_TYPE_UINT32:
- return qFetchList<dbus_uint32_t, uint>(it);
- case DBUS_TYPE_BOOLEAN:
- return qFetchList<dbus_bool_t, bool>(it);
- case DBUS_TYPE_DOUBLE:
- return qFetchList<double, double>(it);
- case DBUS_TYPE_INT64:
- return qFetchList<dbus_int64_t, qlonglong>(it);
- case DBUS_TYPE_UINT64:
- return qFetchList<dbus_uint64_t, qulonglong>(it);
- case DBUS_TYPE_STRING:
- case DBUS_TYPE_OBJECT_PATH:
- case DBUS_TYPE_SIGNATURE:
- return qFetchStringList(it);
- case DBUS_TYPE_VARIANT:
- return qFetchList<QVariant, QVariant>(it);
- case DBUS_TYPE_DICT_ENTRY: {
- // ### support other types of maps?
- QMap<QString, QVariant> map;
- DBusMessageIter sub;
-
- dbus_message_iter_recurse(it, &sub);
- if (dbus_message_iter_get_array_len(&sub) == 0)
- // empty map
- return map;
-
- do {
- DBusMessageIter itemIter;
- dbus_message_iter_recurse(&sub, &itemIter);
- Q_ASSERT(dbus_message_iter_has_next(&itemIter));
- QString key = qFetchParameter(&itemIter).toString();
- dbus_message_iter_next(&itemIter);
- map.insertMulti(key, qFetchParameter(&itemIter));
- } while (dbus_message_iter_next(&sub));
- return map;
- }
- }
- }
- // fall through
- // common handling for structs and lists of lists (for now)
- case DBUS_TYPE_STRUCT: {
- QList<QVariant> list;
- DBusMessageIter sub;
- dbus_message_iter_recurse(it, &sub);
- if (dbus_message_iter_get_array_len(&sub) == 0)
- return list;
- do {
- list.append(qFetchParameter(&sub));
- } while (dbus_message_iter_next(&sub));
- return list;
- }
-
- default:
- qWarning("Don't know how to handle type %d '%c'", dbus_message_iter_get_arg_type(it), dbus_message_iter_get_arg_type(it));
- return QVariant();
- break;
- }
-}
-
-void QDBusMarshall::messageToList(QList<QVariant> &list, DBusMessage *message)
-{
- Q_ASSERT(message);
-
- DBusMessageIter it;
- if (!dbus_message_iter_init(message, &it))
- return;
-
- do {
- list.append(qFetchParameter(&it));
- } while (dbus_message_iter_next(&it));
-}
-
-// convert the variant to the given type and return true if it worked.
-// if the type is not known, guess it from the variant and set.
-// return false if conversion failed.
-static bool checkType(QVariant &var, QDBusType &type)
-{
- if (!type.isValid()) {
- // guess it from the variant
- type = QDBusType::guessFromVariant(var);
- return type.isValid();
- }
-
- int id = var.userType();
-
- if (type.dbusType() == DBUS_TYPE_VARIANT) {
- // this is a non symmetrical operation:
- // nest a QVariant if we want variant and it isn't so
- if (id != QDBusTypeHelper<QVariant>::id()) {
- QVariant tmp = var;
- var = QDBusTypeHelper<QVariant>::toVariant(tmp);
- }
- return true;
- }
-
- switch (id) {
- case QVariant::Bool:
- case QMetaType::Short:
- case QMetaType::UShort:
- case QMetaType::UChar:
- case QVariant::Int:
- case QVariant::UInt:
- case QVariant::LongLong:
- case QVariant::ULongLong:
- case QVariant::Double:
- case QVariant::String:
- if (type.isBasic())
- // QVariant can handle this on its own
- return true;
-
- // cannot handle this
- qWarning("Invalid conversion from %s to '%s'", var.typeName(),
- type.dbusSignature().constData());
- var.clear();
- return false;
-
- case QVariant::ByteArray:
- // make sure it's an "ARRAY of BYTE"
- if (type.qvariantType() != QVariant::ByteArray) {
- qWarning("Invalid conversion from %s to '%s'", var.typeName(),
- type.dbusSignature().constData());
- var.clear();
- return false;
- }
- return true;
-
- case QVariant::StringList:
- // make sure it's "ARRAY of STRING"
- if (type.qvariantType() != QVariant::StringList) {
- qWarning("Invalid conversion from %s to '%s'", var.typeName(),
- type.dbusSignature().constData());
- var.clear();
- return false;
- }
- return true;
-
- case QVariant::List:
- // could be either struct or array
- if (type.dbusType() != DBUS_TYPE_ARRAY && type.dbusType() != DBUS_TYPE_STRUCT) {
- qWarning("Invalid conversion from %s to '%s'", var.typeName(),
- type.dbusSignature().constData());
- var.clear();
- return false;
- }
-
- return true;
-
- case QVariant::Map:
- if (!type.isMap()) {
- qWarning("Invalid conversion from %s to '%s'", var.typeName(),
- type.dbusSignature().constData());
- var.clear();
- return false;
- }
-
- return true;
-
- case QVariant::Invalid: {
- // create an empty variant
- void *null = 0;
- var = QVariant(type.qvariantType(), null);
- break;
- }
-
- default:
- if (id == QDBusTypeHelper<QVariant>::id()) {
- // if we got here, it means the match above for DBUS_TYPE_VARIANT didn't work
- qWarning("Invalid conversion from nested variant to '%s'",
- type.dbusSignature().constData());
- return false;
- } else if (type.dbusType() == DBUS_TYPE_ARRAY) {
- int subType = type.arrayElement().dbusType();
- if ((id == QDBusTypeHelper<bool>::listId() && subType == DBUS_TYPE_BOOLEAN) ||
- (id == QDBusTypeHelper<short>::listId() && subType == DBUS_TYPE_INT16) ||
- (id == QDBusTypeHelper<ushort>::listId() && subType == DBUS_TYPE_UINT16) ||
- (id == QDBusTypeHelper<int>::listId() && subType == DBUS_TYPE_INT32) ||
- (id == QDBusTypeHelper<uint>::listId() && subType == DBUS_TYPE_UINT32) ||
- (id == QDBusTypeHelper<qlonglong>::listId() && subType == DBUS_TYPE_INT64) ||
- (id == QDBusTypeHelper<qulonglong>::listId() && subType == DBUS_TYPE_UINT64) ||
- (id == QDBusTypeHelper<double>::listId() && subType == DBUS_TYPE_DOUBLE))
- return true;
- }
-
- qWarning("Invalid conversion from %s to '%s'", var.typeName(),
- type.dbusSignature().constData());
- return false;
- }
-
- qWarning("Found unknown QVariant type %d (%s) when converting to DBus", (int)var.type(),
- var.typeName());
- var.clear();
- return false;
-}
-
-static bool qVariantToIteratorInternal(DBusMessageIter *it, const QVariant &var,
- const QDBusType &type);
-
-static bool qListToIterator(DBusMessageIter *it, const QList<QVariant> &list,
- const QDBusTypeList &typelist);
-
-template<typename T>
-static void qIterAppend(DBusMessageIter *it, const QDBusType &type, T arg)
-{
- dbus_message_iter_append_basic(it, type.dbusType(), &arg);
-}
-
-template<typename DBusType, typename QtType>
-static void qAppendListToMessage(DBusMessageIter *it, const QDBusType &subType,
- const QVariant &var)
-{
- QList<QtType> list = QDBusTypeHelper<QList<QtType> >::fromVariant(var);
- foreach (const QtType &item, list)
- qIterAppend(it, subType, static_cast<DBusType>(item));
-}
-
-static bool qAppendArrayToMessage(DBusMessageIter *it, const QDBusType &subType,
- const QVariant &var)
-{
- bool ok = false;
- DBusMessageIter sub;
- dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, subType.dbusSignature(), &sub);
-
- switch (var.type())
- {
- case QVariant::StringList: {
- const QStringList list = var.toStringList();
- foreach (QString str, list)
- qIterAppend(&sub, subType, str.toUtf8().constData());
- ok = true;
- break;
- }
-
- case QVariant::ByteArray: {
- const QByteArray array = var.toByteArray();
- const char* cdata = array.constData();
- dbus_message_iter_append_fixed_array(&sub, DBUS_TYPE_BYTE, &cdata, array.length());
- ok = true;
- break;
- }
-
- case QVariant::Map: {
- const QVariantMap map = var.toMap();
- const QDBusTypeList& subTypes = subType.subTypes();
-
- ok = true;
- for (QMap<QString, QVariant>::const_iterator mit = map.constBegin();
- ok && mit != map.constEnd(); ++mit) {
- DBusMessageIter itemIterator;
- dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY, 0, &itemIterator);
-
- // let the string be converted to QVariant
- if (!qVariantToIteratorInternal(&itemIterator, mit.key(), subTypes[0]))
- ok = false;
- else if (!qVariantToIteratorInternal(&itemIterator, mit.value(), subTypes[1]))
- ok = false;
-
- dbus_message_iter_close_container(&sub, &itemIterator);
- }
- break;
- }
-
- case QVariant::List: {
- const QVariantList list = var.toList();
- ok = true;
- foreach (QVariant v, list)
- if (!qVariantToIteratorInternal(&sub, v, subType)) {
- ok = false;
- break;
- }
- break;
- }
-
- default: {
- int id = var.userType();
- ok = true;
- if (id == QDBusTypeHelper<bool>::listId())
- qAppendListToMessage<dbus_bool_t,bool>(&sub, subType, var);
- else if (id == QDBusTypeHelper<short>::listId())
- qAppendListToMessage<dbus_int16_t,short>(&sub, subType, var);
- else if (id == QDBusTypeHelper<ushort>::listId())
- qAppendListToMessage<dbus_uint16_t,ushort>(&sub, subType, var);
- else if (id == QDBusTypeHelper<int>::listId())
- qAppendListToMessage<dbus_int32_t,int>(&sub, subType, var);
- else if (id == QDBusTypeHelper<uint>::listId())
- qAppendListToMessage<dbus_uint32_t,uint>(&sub, subType, var);
- else if (id == QDBusTypeHelper<qlonglong>::listId())
- qAppendListToMessage<dbus_int64_t,qlonglong>(&sub, subType, var);
- else if (id == QDBusTypeHelper<qulonglong>::listId())
- qAppendListToMessage<dbus_uint64_t,qulonglong>(&sub, subType, var);
- else if (id == QDBusTypeHelper<double>::listId())
- qAppendListToMessage<double,double>(&sub, subType, var);
-#if 0 // never reached, since QVariant::List mached
- else if (id == QDBusTypeHelper<QVariant>::listId())
- qAppendListToMessage<QVariant,QVariant>(&sub, subType, var);
-#endif
- else {
- qFatal("qAppendArrayToMessage got unknown type!");
- ok = false;
- }
- break;
- }
- }
-
- dbus_message_iter_close_container(it, &sub);
- return ok;
-}
-
-static bool qAppendStructToMessage(DBusMessageIter *it, const QDBusTypeList &typeList,
- const QVariantList &list)
-{
- DBusMessageIter sub;
- dbus_message_iter_open_container(it, DBUS_TYPE_STRUCT, NULL, &sub);
- bool ok = qListToIterator(&sub, list, typeList);
- dbus_message_iter_close_container(it, &sub);
- return ok;
-}
-
-static bool qAppendVariantToMessage(DBusMessageIter *it, const QDBusType &type,
- const QVariant &var)
-{
- Q_UNUSED(type); // type is 'v'
-
- QVariant arg = var;
- if (var.userType() == QDBusTypeHelper<QVariant>::id())
- arg = QDBusTypeHelper<QVariant>::fromVariant(var); // extract the inner variant
-
- QDBusType t = QDBusType::guessFromVariant(arg);
- if (!t.isValid())
- return false;
-
- // now add this variant
- DBusMessageIter sub;
- dbus_message_iter_open_container(it, DBUS_TYPE_VARIANT, t.dbusSignature(), &sub);
- qVariantToIteratorInternal(&sub, arg, t);
- dbus_message_iter_close_container(it, &sub);
-
- return true; // success
-}
-
-static bool qVariantToIterator(DBusMessageIter *it, QVariant var, QDBusType type)
-{
- if (!var.isValid()) {
- qWarning("QDBusMarshall: invalid QVariant entry found");
- return false;
- }
- if (!checkType(var, type))
- // warning has been printed
- return false; // type checking failed
-
- return qVariantToIteratorInternal(it, var, type);
-}
-
-static bool qVariantToIteratorInternal(DBusMessageIter *it, const QVariant &var,
- const QDBusType &type)
-{
- switch (type.dbusType()) {
- case DBUS_TYPE_BYTE:
- qIterAppend( it, type, QDBusTypeHelper<uchar>::fromVariant(var) );
- break;
- case DBUS_TYPE_BOOLEAN:
- qIterAppend( it, type, static_cast<dbus_bool_t>(var.toBool()) );
- break;
- case DBUS_TYPE_INT16:
- qIterAppend( it, type, QDBusTypeHelper<short>::fromVariant(var) );
- break;
- case DBUS_TYPE_UINT16:
- qIterAppend( it, type, QDBusTypeHelper<ushort>::fromVariant(var) );
- break;
- case DBUS_TYPE_INT32:
- qIterAppend( it, type, static_cast<dbus_int32_t>(var.toInt()) );
- break;
- case DBUS_TYPE_UINT32:
- qIterAppend( it, type, static_cast<dbus_uint32_t>(var.toUInt()) );
- break;
- case DBUS_TYPE_INT64:
- qIterAppend( it, type, static_cast<dbus_int64_t>(var.toLongLong()) );
- break;
- case DBUS_TYPE_UINT64:
- qIterAppend( it, type, static_cast<dbus_uint64_t>(var.toULongLong()) );
- break;
- case DBUS_TYPE_DOUBLE:
- qIterAppend( it, type, var.toDouble() );
- break;
- case DBUS_TYPE_STRING:
- case DBUS_TYPE_OBJECT_PATH:
- case DBUS_TYPE_SIGNATURE:
- qIterAppend( it, type, var.toString().toUtf8().constData() );
- break;
-
- // compound types:
- case DBUS_TYPE_ARRAY:
- // could be many things
- return qAppendArrayToMessage( it, type.arrayElement(), var );
-
- case DBUS_TYPE_VARIANT:
- return qAppendVariantToMessage( it, type, var );
-
- case DBUS_TYPE_STRUCT:
- return qAppendStructToMessage( it, type.subTypes(), var.toList() );
-
- case DBUS_TYPE_DICT_ENTRY:
- qFatal("qVariantToIterator got a DICT_ENTRY!");
- return false;
-
- default:
- qWarning("Found unknown DBus type '%s'", type.dbusSignature().constData());
- return false;
- }
-
- return true;
-}
-
-bool qListToIterator(DBusMessageIter *it, const QList<QVariant> &list)
-{
- for (int i = 0; i < list.count(); ++i)
- if (!qVariantToIterator(it, list.at(i), QDBusType()))
- return false;
-
- return true;
-}
-
-bool qListToIterator(DBusMessageIter *it, const QList<QVariant> &list, const QDBusTypeList &types)
-{
- if (list.count() < types.count()) {
- qWarning("QDBusMarshall: too few parameters");
- return false;
- }
-
- for (int i = 0; i < types.count(); ++i)
- if (!qVariantToIterator(it, list.at(i), types.at(i)))
- return false;
-
- return true;
-}
-
-void QDBusMarshall::listToMessage(const QList<QVariant> &list, DBusMessage *msg,
- const QString &signature)
-{
- Q_ASSERT(msg);
- DBusMessageIter it;
- dbus_message_iter_init_append(msg, &it);
-
- if (signature.isEmpty())
- (void) qListToIterator(&it, list);
- else
- (void) qListToIterator(&it, list, QDBusTypeList(signature.toUtf8()));
-}
diff --git a/qt/src/qdbusmarshall_p.h b/qt/src/qdbusmarshall_p.h
deleted file mode 100644
index 7a2d46f5..00000000
--- a/qt/src/qdbusmarshall_p.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* qdbusmarshall_p.h QDBusMarshall object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the public API. This header file may
-// change from version to version without notice, or even be
-// removed.
-//
-// We mean it.
-//
-//
-
-#ifndef QDBUSMARSHALLPRIVATE_H
-#define QDBUSMARSHALLPRIVATE_H
-
-struct DBusMessage;
-
-template <typename T> class QList;
-class QVariant;
-class QString;
-
-/*!
- \internal
-*/
-class QDBusMarshall
-{
-public:
- static void listToMessage(const QList<QVariant> &list, DBusMessage *message,
- const QString& signature);
- static void messageToList(QList<QVariant> &list, DBusMessage *message);
-};
-
-#endif
diff --git a/qt/src/qdbusmessage.cpp b/qt/src/qdbusmessage.cpp
deleted file mode 100644
index ec24100e..00000000
--- a/qt/src/qdbusmessage.cpp
+++ /dev/null
@@ -1,704 +0,0 @@
-/* qdbusmessage.cpp
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusmessage.h"
-
-#include <qdebug.h>
-#include <qstringlist.h>
-
-#include <dbus/dbus.h>
-
-#include "qdbuserror.h"
-#include "qdbusmarshall_p.h"
-#include "qdbusmessage_p.h"
-#include "qdbustypehelper_p.h"
-
-QDBusMessagePrivate::QDBusMessagePrivate()
- : connection(QString()), msg(0), reply(0), type(DBUS_MESSAGE_TYPE_INVALID),
- timeout(-1), ref(1), repliedTo(false)
-{
-}
-
-QDBusMessagePrivate::~QDBusMessagePrivate()
-{
- if (msg)
- dbus_message_unref(msg);
- if (reply)
- dbus_message_unref(reply);
-}
-
-///////////////
-/*!
- \class QDBusMessage
- \brief Represents one message sent or received over the DBus bus.
-
- This object can represent any of four different types of messages possible on the bus
- (see MessageType)
- - Method calls
- - Method return values
- - Signal emissions
- - Error codes
-
- Objects of this type are created with the four static functions signal, methodCall,
- methodReply and error.
-*/
-
-/*!
- \enum QDBusMessage::MessageType
- The possible message types:
-
- \value MethodCallMessage a message representing an outgoing or incoming method call
- \value SignalMessage a message representing an outgoing or incoming signal emission
- \value ReplyMessage a message representing the return values of a method call
- \value ErrorMessage a message representing an error condition in response to a method call
- \value InvalidMessage an invalid message: this is never set on messages received from D-Bus
-*/
-
-/*!
- Constructs a new DBus message representing a signal emission. A DBus signal is emitted
- from one application and is received by all applications that are listening for that signal
- from that interface.
-
- The signal will be constructed to represent a signal coming from the path \a path, interface \a
- interface and signal name \a name.
-
- The QDBusMessage object that is returned can be sent with QDBusConnection::send().
-*/
-QDBusMessage QDBusMessage::signal(const QString &path, const QString &interface,
- const QString &name)
-{
- QDBusMessage message;
- message.d_ptr->type = DBUS_MESSAGE_TYPE_SIGNAL;
- message.d_ptr->path = path;
- message.d_ptr->interface = interface;
- message.d_ptr->name = name;
-
- return message;
-}
-
-/*!
- Constructs a new DBus message representing a method call. A method call always informs
- its destination address (\a service, \a path, \a interface and \a method).
-
- The DBus bus allows calling a method on a given remote object without specifying the
- destination interface, if the method name is unique. However, if two interfaces on the
- remote object export the same method name, the result is undefined (one of the two may be
- called or an error may be returned).
-
- When using DBus in a peer-to-peer context (i.e., not on a bus), the \a service parameter is
- optional.
-
- The QDBusObject and QDBusInterface classes provide a simpler abstraction to synchronous
- method calling.
-
- This function returns a QDBusMessage object that can be sent with QDBusConnection::send(),
- QDBusConnection::sendWithReply(), or QDBusConnection::sendWithReplyAsync().
-*/
-QDBusMessage QDBusMessage::methodCall(const QString &service, const QString &path,
- const QString &interface, const QString &method)
-{
- QDBusMessage message;
- message.d_ptr->type = DBUS_MESSAGE_TYPE_METHOD_CALL;
- message.d_ptr->service = service;
- message.d_ptr->path = path;
- message.d_ptr->interface = interface;
- message.d_ptr->name = method;
-
- return message;
-}
-
-/*!
- Constructs a new DBus message representing the return values from a called method. The \a other
- variable represents the method call that the reply will be for.
-
- This function returns a QDBusMessage object that can be sent with QDBusConnection::send().
-*/
-QDBusMessage QDBusMessage::methodReply(const QDBusMessage &other)
-{
- Q_ASSERT(other.d_ptr->msg);
-
- QDBusMessage message;
- message.d_ptr->connection = other.d_ptr->connection;
- message.d_ptr->type = DBUS_MESSAGE_TYPE_METHOD_RETURN;
- message.d_ptr->reply = dbus_message_ref(other.d_ptr->msg);
- other.d_ptr->repliedTo = true;
-
- return message;
-}
-
-/*!
- Constructs a DBus message representing an error condition described by the \a name
- parameter. The \a msg parameter is optional and may contain a human-readable description of the
- error. The \a other variable represents the method call that this error relates to.
-
- This function returns a QDBusMessage object that can be sent with QDBusMessage::send().
-*/
-QDBusMessage QDBusMessage::error(const QDBusMessage &other, const QString &name,
- const QString &msg)
-{
- Q_ASSERT(other.d_ptr->msg);
-
- QDBusMessage message;
- message.d_ptr->connection = other.d_ptr->connection;
- message.d_ptr->type = DBUS_MESSAGE_TYPE_ERROR;
- message.d_ptr->name = name;
- message.d_ptr->message = msg;
- message.d_ptr->reply = dbus_message_ref(other.d_ptr->msg);
- other.d_ptr->repliedTo = true;
-
- return message;
-}
-
-/*!
- \overload
- Constructs a DBus message representing an error, where \a other is the method call that
- generated this error and \a error is the error code.
-*/
-QDBusMessage QDBusMessage::error(const QDBusMessage &other, const QDBusError &error)
-{
- Q_ASSERT(other.d_ptr->msg);
-
- QDBusMessage message;
- message.d_ptr->connection = other.d_ptr->connection;
- message.d_ptr->type = DBUS_MESSAGE_TYPE_ERROR;
- message.d_ptr->name = error.name();
- message.d_ptr->message = error.message();
- message.d_ptr->reply = dbus_message_ref(other.d_ptr->msg);
- other.d_ptr->repliedTo = true;
-
- return message;
-}
-
-/*!
- Constructs an empty, invalid QDBusMessage object.
-
- \sa methodCall(), methodReply(), signal(), error()
-*/
-QDBusMessage::QDBusMessage()
-{
- d_ptr = new QDBusMessagePrivate;
-}
-
-/*!
- Constructs a copy of the object given by \a other.
-*/
-QDBusMessage::QDBusMessage(const QDBusMessage &other)
- : QList<QVariant>(other)
-{
- d_ptr = other.d_ptr;
- d_ptr->ref.ref();
-}
-
-/*!
- Disposes of the object and frees any resources that were being held.
-*/
-QDBusMessage::~QDBusMessage()
-{
- if (!d_ptr->ref.deref())
- delete d_ptr;
-}
-
-/*!
- Copies the contents of the object given by \a other.
-*/
-QDBusMessage &QDBusMessage::operator=(const QDBusMessage &other)
-{
- QList<QVariant>::operator=(other);
- qAtomicAssign(d_ptr, other.d_ptr);
- return *this;
-}
-
-static inline const char *data(const QByteArray &arr)
-{
- return arr.isEmpty() ? 0 : arr.constData();
-}
-
-/*!
- \internal
- Constructs a DBusMessage object from this object. The returned value must be de-referenced
- with dbus_message_unref.
-*/
-DBusMessage *QDBusMessage::toDBusMessage() const
-{
- DBusMessage *msg = 0;
-
- switch (d_ptr->type) {
- case DBUS_MESSAGE_TYPE_METHOD_CALL:
- msg = dbus_message_new_method_call(data(d_ptr->service.toUtf8()), data(d_ptr->path.toUtf8()),
- data(d_ptr->interface.toUtf8()), data(d_ptr->name.toUtf8()));
- break;
- case DBUS_MESSAGE_TYPE_SIGNAL:
- msg = dbus_message_new_signal(data(d_ptr->path.toUtf8()), data(d_ptr->interface.toUtf8()),
- data(d_ptr->name.toUtf8()));
- break;
- case DBUS_MESSAGE_TYPE_METHOD_RETURN:
- msg = dbus_message_new_method_return(d_ptr->reply);
- break;
- case DBUS_MESSAGE_TYPE_ERROR:
- msg = dbus_message_new_error(d_ptr->reply, data(d_ptr->name.toUtf8()), data(d_ptr->message.toUtf8()));
- break;
- }
- if (!msg)
- return 0;
-
- QDBusMarshall::listToMessage(*this, msg, d_ptr->signature);
- return msg;
-}
-
-/*!
- \internal
- Constructs a QDBusMessage by parsing the given DBusMessage object.
-*/
-QDBusMessage QDBusMessage::fromDBusMessage(DBusMessage *dmsg, const QDBusConnection &connection)
-{
- QDBusMessage message;
- if (!dmsg)
- return message;
-
- message.d_ptr->connection = connection;
- message.d_ptr->type = dbus_message_get_type(dmsg);
- message.d_ptr->path = QString::fromUtf8(dbus_message_get_path(dmsg));
- message.d_ptr->interface = QString::fromUtf8(dbus_message_get_interface(dmsg));
- message.d_ptr->name = message.d_ptr->type == DBUS_MESSAGE_TYPE_ERROR ?
- QString::fromUtf8(dbus_message_get_error_name(dmsg)) :
- QString::fromUtf8(dbus_message_get_member(dmsg));
- message.d_ptr->service = QString::fromUtf8(dbus_message_get_sender(dmsg));
- message.d_ptr->signature = QString::fromUtf8(dbus_message_get_signature(dmsg));
- message.d_ptr->msg = dbus_message_ref(dmsg);
-
- QDBusMarshall::messageToList(message, dmsg);
- return message;
-}
-
-/*!
- Creates a QDBusMessage that represents the same error as the QDBusError object.
-*/
-QDBusMessage QDBusMessage::fromError(const QDBusError &error)
-{
- QDBusMessage message;
- message.d_ptr->type = DBUS_MESSAGE_TYPE_ERROR;
- message.d_ptr->name = error.name();
- message << error.message();
- return message;
-}
-
-/*!
- Returns the path of the object that this message is being sent to (in the case of a
- method call) or being received from (for a signal).
-*/
-QString QDBusMessage::path() const
-{
- return d_ptr->path;
-}
-
-/*!
- Returns the interface of the method being called (in the case of a method call) or of
- the signal being received from.
-*/
-QString QDBusMessage::interface() const
-{
- return d_ptr->interface;
-}
-
-/*!
- Returns the name of the signal that was emitted or the name of the error that was
- received.
- \sa member()
-*/
-QString QDBusMessage::name() const
-{
- return d_ptr->name;
-}
-
-/*!
- \fn QDBusMessage::member() const
- Returns the name of the method being called.
-*/
-
-/*!
- \fn QDBusMessage::method() const
- \overload
- Returns the name of the method being called.
-*/
-
-/*!
- Returns the name of the service or the bus address of the remote method call.
-*/
-QString QDBusMessage::service() const
-{
- return d_ptr->service;
-}
-
-/*!
- \fn QDBusMessage::sender() const
- Returns the unique name of the remote sender.
-*/
-
-/*!
- Returns the timeout (in milliseconds) for this message to be processed.
-*/
-int QDBusMessage::timeout() const
-{
- return d_ptr->timeout;
-}
-
-/*!
- Sets the timeout for this message to be processed, given by \a ms, in milliseconds.
-*/
-void QDBusMessage::setTimeout(int ms)
-{
- qAtomicDetach(d_ptr);
- d_ptr->timeout = ms;
-}
-
-/*!
- Returns the flag that indicates if this message should see a reply or not. This is only
- meaningful for MethodCall messages: any other kind of message cannot have replies and this
- function will always return false for them.
-*/
-bool QDBusMessage::noReply() const
-{
- if (!d_ptr->msg)
- return false;
- return dbus_message_get_no_reply(d_ptr->msg);
-}
-
-/*!
- Returns the unique serial number assigned to this message
- or 0 if the message was not sent yet.
- */
-int QDBusMessage::serialNumber() const
-{
- if (!d_ptr->msg)
- return 0;
- return dbus_message_get_serial(d_ptr->msg);
-}
-
-/*!
- Returns the unique serial number assigned to the message
- that triggered this reply message.
-
- If this message is not a reply to another message, 0
- is returned.
-
- */
-int QDBusMessage::replySerialNumber() const
-{
- if (!d_ptr->msg)
- return 0;
- return dbus_message_get_reply_serial(d_ptr->msg);
-}
-
-/*!
- Returns true if this is a MethodCall message and a reply for it has been generated using
- QDBusMessage::methodReply or QDBusMessage::error.
-*/
-bool QDBusMessage::wasRepliedTo() const
-{
- return d_ptr->repliedTo;
-}
-
-/*!
- Returns the signature of the signal that was received or for the output arguments
- of a method call.
-*/
-QString QDBusMessage::signature() const
-{
- return d_ptr->signature;
-}
-
-/*!
- Sets the signature for the output arguments of this method call to be the value of \a
- sig. This function has no meaning in other types of messages or when dealing with received
- method calls.
-
- A message's signature indicate the type of the parameters to
- be marshalled over the bus. If there are more arguments than entries in the signature, the
- tailing arguments will be silently dropped and not sent. If there are less arguments,
- default values will be inserted (default values are those created by QVariant::convert
- when a variant of type QVariant::Invalid is converted to the type).
-
-*/
-void QDBusMessage::setSignature(const QString &sig)
-{
- qAtomicDetach(d_ptr);
- d_ptr->signature = sig;
-}
-
-/*!
- Returns the connection this message was received on or an unconnected QDBusConnection object if
- this isn't a message that has been received.
-*/
-QDBusConnection QDBusMessage::connection() const
-{
- return d_ptr->connection;
-}
-
-/*!
- Returns the message type.
-*/
-QDBusMessage::MessageType QDBusMessage::type() const
-{
- switch (d_ptr->type) {
- case DBUS_MESSAGE_TYPE_METHOD_CALL:
- return MethodCallMessage;
- case DBUS_MESSAGE_TYPE_METHOD_RETURN:
- return ReplyMessage;
- case DBUS_MESSAGE_TYPE_ERROR:
- return ErrorMessage;
- case DBUS_MESSAGE_TYPE_SIGNAL:
- return SignalMessage;
- default:
- return InvalidMessage;
- }
-}
-
-// Document QDBusReply here
-/*!
- \class QDBusReply
- \brief The reply for a method call to a remote object.
-
- A QDBusReply object is a subset of the QDBusMessage object that represents a method call's
- reply. It contains only the first output argument or the error code and is used by
- QDBusInterface-derived classes to allow returning the error code as the function's return
- argument.
-
- It can be used in the following manner:
- \code
- QDBusReply<QString> reply = interface->call("RemoteMethod");
- if (reply.isSuccess())
- // use the returned value
- useValue(reply.value());
- else
- // call failed. Show an error condition.
- showError(reply.error());
- \endcode
-
- If the remote method call cannot fail, you can skip the error checking:
- \code
- QString reply = interface->call("RemoteMethod");
- \endcode
-
- However, if it does fail under those conditions, the value returned by QDBusReply::value() is
- undefined. It may be undistinguishable from a valid return value.
-
- QDBusReply objects are used for remote calls that have no output arguments or return values
- (i.e., they have a "void" return type). In this case, you can only test if the reply succeeded
- or not, by calling isError() and isSuccess(), and inspecting the error condition by calling
- error(). You cannot call value().
-
- \sa QDBusMessage, QDBusInterface
-*/
-
-/*!
- \fn QDBusReply::QDBusReply(const QDBusMessage &reply)
- Automatically construct a QDBusReply object from the reply message \a reply, extracting the
- first return value from it if it is a success reply.
-*/
-
-/*!
- \fn QDBusReply::QDBusReply(const QDBusError &error)
- Constructs an error reply from the D-Bus error code given by \a error.
-*/
-
-/*!
- \fn QDBusReply::isError() const
- Returns true if this reply is an error reply. You can extract the error contents using the
- error() function.
-*/
-
-/*!
- \fn QDBusReply::isSuccess() const
- Returns true if this reply is a normal error reply (not an error). You can extract the returned
- value with value()
-*/
-
-/*!
- \fn QDBusReply::error()
- Returns the error code that was returned from the remote function call. If the remote call did
- not return an error (i.e., if it succeeded), then the QDBusError object that is returned will
- not be a valid error code (QDBusError::isValid() will return false).
-*/
-
-/*!
- \fn QDBusReply::value()
- Returns the remote function's calls return value. If the remote call returned with an error,
- the return value of this function is undefined and may be undistinguishable from a valid return
- value.
-
- This function is not available if the remote call returns \c void.
-*/
-
-/*!
- \fn QDBusReply::operator Type()
- Returns the same as value().
-
- This function is not available if the remote call returns \c void.
-*/
-
-/*!
- \internal
- \fn QDBusReply::fromVariant(const QDBusReply<QVariant> &variantReply)
- Converts the QDBusReply<QVariant> object to this type by converting the variant contained in
- \a variantReply to the template's type and copying the error condition.
-
- If the QVariant in variantReply is not convertible to this type, it will assume an undefined
- value.
-*/
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, QDBusMessage::MessageType t)
-{
- switch (t)
- {
- case QDBusMessage::MethodCallMessage:
- return dbg << "MethodCall";
- case QDBusMessage::ReplyMessage:
- return dbg << "MethodReturn";
- case QDBusMessage::SignalMessage:
- return dbg << "Signal";
- case QDBusMessage::ErrorMessage:
- return dbg << "Error";
- default:
- return dbg << "Invalid";
- }
-}
-
-static void debugVariantList(QDebug dbg, const QVariantList &list);
-static void debugVariantMap(QDebug dbg, const QVariantMap &map);
-
-static void debugVariant(QDebug dbg, const QVariant &v)
-{
- dbg.nospace() << v.typeName() << "(";
- switch (v.userType())
- {
- case QVariant::Bool:
- dbg.nospace() << v.toBool();
- break;
- case QMetaType::UChar:
- dbg.nospace() << qvariant_cast<uchar>(v);
- break;
- case QMetaType::Short:
- dbg.nospace() << qvariant_cast<short>(v);
- break;
- case QMetaType::UShort:
- dbg.nospace() << qvariant_cast<ushort>(v);
- break;
- case QVariant::Int:
- dbg.nospace() << v.toInt();
- break;
- case QVariant::UInt:
- dbg.nospace() << v.toUInt();
- break;
- case QVariant::LongLong:
- dbg.nospace() << v.toLongLong();
- break;
- case QVariant::ULongLong:
- dbg.nospace() << v.toULongLong();
- break;
- case QVariant::Double:
- dbg.nospace() << v.toDouble();
- break;
- case QVariant::String:
- dbg.nospace() << v.toString();
- break;
- case QVariant::ByteArray:
- dbg.nospace() << v.toByteArray();
- break;
- case QVariant::StringList:
- dbg.nospace() << v.toStringList();
- break;
- case QVariant::List:
- debugVariantList(dbg, v.toList());
- break;
- case QVariant::Map:
- debugVariantMap(dbg, v.toMap());
- break;
-
- default: {
- int id = v.userType();
- if (id == QDBusTypeHelper<QVariant>::id())
- debugVariant(dbg, QDBusTypeHelper<QVariant>::fromVariant(v));
- else if (id == QDBusTypeHelper<bool>::listId())
- dbg.nospace() << QDBusTypeHelper<QList<bool> >::fromVariant(v);
- else if (id == QDBusTypeHelper<short>::listId())
- dbg.nospace() << QDBusTypeHelper<QList<short> >::fromVariant(v);
- else if (id == QDBusTypeHelper<ushort>::listId())
- dbg.nospace() << QDBusTypeHelper<QList<ushort> >::fromVariant(v);
- else if (id == QDBusTypeHelper<int>::listId())
- dbg.nospace() << QDBusTypeHelper<QList<int> >::fromVariant(v);
- else if (id == QDBusTypeHelper<uint>::listId())
- dbg.nospace() << QDBusTypeHelper<QList<uint> >::fromVariant(v);
- else if (id == QDBusTypeHelper<qlonglong>::listId())
- dbg.nospace() << QDBusTypeHelper<QList<qlonglong> >::fromVariant(v);
- else if (id == QDBusTypeHelper<qulonglong>::listId())
- dbg.nospace() << QDBusTypeHelper<QList<qulonglong> >::fromVariant(v);
- else if (id == QDBusTypeHelper<double>::listId())
- dbg.nospace() << QDBusTypeHelper<QList<double> >::fromVariant(v);
- else
- dbg.nospace() << "unknown";
- }
- }
- dbg.nospace() << ")";
-}
-
-static void debugVariantList(QDebug dbg, const QVariantList &list)
-{
- bool first = true;
- QVariantList::ConstIterator it = list.constBegin();
- QVariantList::ConstIterator end = list.constEnd();
- for ( ; it != end; ++it) {
- if (!first)
- dbg.nospace() << ", ";
- debugVariant(dbg, *it);
- first = false;
- }
-}
-
-static void debugVariantMap(QDebug dbg, const QVariantMap &map)
-{
- QVariantMap::ConstIterator it = map.constBegin();
- QVariantMap::ConstIterator end = map.constEnd();
- for ( ; it != end; ++it) {
- dbg << "(" << it.key() << ", ";
- debugVariant(dbg, it.value());
- dbg << ") ";
- }
-}
-
-QDebug operator<<(QDebug dbg, const QDBusMessage &msg)
-{
- dbg.nospace() << "QDBusMessage(type=" << msg.type()
- << ", service=" << msg.service()
- << ", path=" << msg.path()
- << ", interface=" << msg.interface()
- << ", name=" << msg.name()
- << ", signature=" << msg.signature()
- << ", contents=(";
- debugVariantList(dbg, msg);
- dbg.nospace() << " ) )";
- return dbg.space();
-}
-#endif
-
diff --git a/qt/src/qdbusmessage.h b/qt/src/qdbusmessage.h
deleted file mode 100644
index a36d3983..00000000
--- a/qt/src/qdbusmessage.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* qdbusmessage.h QDBusMessage object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSMESSAGE_H
-#define QDBUSMESSAGE_H
-
-#include "qdbusmacros.h"
-#include "qdbuserror.h"
-#include <QtCore/qlist.h>
-#include <QtCore/qvariant.h>
-
-#include <limits.h>
-
-class QDBusMessagePrivate;
-class QDBusConnection;
-class QDBusConnectionPrivate;
-struct DBusMessage;
-
-class QDBUS_EXPORT QDBusMessage: public QList<QVariant>
-{
- //friend class QDBusConnection;
- friend class QDBusConnectionPrivate;
-public:
- enum { DefaultTimeout = -1, NoTimeout = INT_MAX};
- enum MessageType { InvalidMessage, MethodCallMessage, ReplyMessage,
- ErrorMessage, SignalMessage };
-
- QDBusMessage();
- QDBusMessage(const QDBusMessage &other);
- ~QDBusMessage();
-
- QDBusMessage &operator=(const QDBusMessage &other);
-
- static QDBusMessage signal(const QString &path, const QString &interface,
- const QString &name);
- static QDBusMessage methodCall(const QString &destination, const QString &path,
- const QString &interface, const QString &method);
- static QDBusMessage methodReply(const QDBusMessage &other);
- static QDBusMessage error(const QDBusMessage &other, const QString &name,
- const QString &message = QString());
- static QDBusMessage error(const QDBusMessage &other, const QDBusError &error);
-
- QString path() const;
- QString interface() const;
- QString name() const;
- inline QString member() const { return name(); }
- inline QString method() const { return name(); }
- QString service() const;
- inline QString sender() const { return service(); }
- MessageType type() const;
-
- int timeout() const;
- void setTimeout(int ms);
-
- bool noReply() const;
-
- QString signature() const;
- void setSignature(const QString &signature);
-
- QDBusConnection connection() const;
-
- int serialNumber() const;
- int replySerialNumber() const;
- bool wasRepliedTo() const;
-
-private:
- DBusMessage *toDBusMessage() const;
- static QDBusMessage fromDBusMessage(DBusMessage *dmsg, const QDBusConnection &connection);
- static QDBusMessage fromError(const QDBusError& error);
- QDBusMessagePrivate *d_ptr;
-};
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug, const QDBusMessage &);
-#endif
-
-#endif
-
diff --git a/qt/src/qdbusmessage_p.h b/qt/src/qdbusmessage_p.h
deleted file mode 100644
index ea958b24..00000000
--- a/qt/src/qdbusmessage_p.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* qdbusmessage.h QDBusMessage private object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSMESSAGE_P_H
-#define QDBUSMESSAGE_P_H
-
-#include <qatomic.h>
-#include <qstring.h>
-#include "qdbusconnection.h"
-struct DBusMessage;
-
-class QDBusMessagePrivate
-{
-public:
- QDBusMessagePrivate();
- ~QDBusMessagePrivate();
-
- QString service, path, interface, name, message, signature;
- QDBusConnection connection;
- DBusMessage *msg;
- DBusMessage *reply;
- int type;
- int timeout;
- QAtomic ref;
-
- mutable bool repliedTo : 1;
-};
-
-#endif
diff --git a/qt/src/qdbusmetaobject.cpp b/qt/src/qdbusmetaobject.cpp
deleted file mode 100644
index 60675d5d..00000000
--- a/qt/src/qdbusmetaobject.cpp
+++ /dev/null
@@ -1,689 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusmetaobject_p.h"
-
-#include <QtCore/qbytearray.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qvarlengtharray.h>
-
-#include "qdbusutil.h"
-#include "qdbuserror.h"
-#include "qdbusintrospection_p.h"
-#include "qdbusabstractinterface_p.h"
-
-class QDBusMetaObjectGenerator
-{
-public:
- QDBusMetaObjectGenerator(const QString &interface,
- const QDBusIntrospection::Interface *parsedData);
- void write(QDBusMetaObject *obj);
- void writeWithoutXml(QDBusMetaObject *obj);
-
-private:
- struct Method {
- QByteArray parameters;
- QByteArray typeName;
- QByteArray tag;
- QByteArray inputSignature;
- QByteArray outputSignature;
- QVarLengthArray<int, 4> inputTypes;
- QVarLengthArray<int, 4> outputTypes;
- int flags;
- };
-
- struct Property {
- QByteArray typeName;
- QByteArray signature;
- int type;
- int flags;
- };
-
- enum PropertyFlags {
- Invalid = 0x00000000,
- Readable = 0x00000001,
- Writable = 0x00000002,
- Resettable = 0x00000004,
- EnumOrFlag = 0x00000008,
- StdCppSet = 0x00000100,
- // Override = 0x00000200,
- Designable = 0x00001000,
- ResolveDesignable = 0x00002000,
- Scriptable = 0x00004000,
- ResolveScriptable = 0x00008000,
- Stored = 0x00010000,
- ResolveStored = 0x00020000,
- Editable = 0x00040000,
- ResolveEditable = 0x00080000,
- User = 0x00100000,
- ResolveUser = 0x00200000
- };
-
- enum MethodFlags {
- AccessPrivate = 0x00,
- AccessProtected = 0x01,
- AccessPublic = 0x02,
- AccessMask = 0x03, //mask
-
- MethodMethod = 0x00,
- MethodSignal = 0x04,
- MethodSlot = 0x08,
- MethodTypeMask = 0x0c,
-
- MethodCompatibility = 0x10,
- MethodCloned = 0x20,
- MethodScriptable = 0x40
- };
-
- QMap<QByteArray, Method> methods;
- QMap<QByteArray, Property> properties;
-
- const QDBusIntrospection::Interface *data;
- QString interface;
-
- void parseMethods();
- void parseSignals();
- void parseProperties();
-};
-
-static const int intsPerProperty = 2;
-static const int intsPerMethod = 4;
-
-// ### from kernel/qmetaobject.cpp (Qt 4.1.2):
-struct QDBusMetaObjectPrivate
-{
- int revision;
- int className;
- int classInfoCount, classInfoData;
- int methodCount, methodData;
- int propertyCount, propertyData;
- int enumeratorCount, enumeratorData;
-
- // this is specific for QDBusMetaObject:
- int propertyDBusData;
- int methodDBusData;
-};
-
-QDBusMetaObjectGenerator::QDBusMetaObjectGenerator(const QString &interfaceName,
- const QDBusIntrospection::Interface *parsedData)
- : data(parsedData), interface(interfaceName)
-{
- if (data) {
- parseProperties();
- parseSignals(); // call parseSignals first so that slots override signals
- parseMethods();
- }
-}
-
-void QDBusMetaObjectGenerator::parseMethods()
-{
- foreach (const QDBusIntrospection::Method &m, data->methods) {
- Method mm;
-
- QByteArray prototype = m.name.toLatin1();
- prototype += '(';
-
- bool ok = true;
-
- // build the input argument list
- foreach (const QDBusIntrospection::Argument &arg, m.inputArgs) {
- int typeId = QDBusUtil::signatureToType(arg.type);
- if (typeId == QVariant::Invalid) {
- ok = false;
- break;
- }
-
- mm.inputSignature += arg.type.toLatin1();
- mm.inputTypes.append(typeId);
-
- mm.parameters.append(arg.name.toLatin1());
- mm.parameters.append(',');
-
- prototype.append( QVariant::typeToName( QVariant::Type(typeId) ) );
- prototype.append(',');
- }
- if (!ok) continue;
-
- // build the output argument list:
- for (int i = 0; i < m.outputArgs.count(); ++i) {
- const QDBusIntrospection::Argument &arg = m.outputArgs.at(i);
-
- int typeId = QDBusUtil::signatureToType(arg.type);
- if (typeId == QVariant::Invalid) {
- ok = false;
- break;
- }
-
- mm.outputSignature += arg.type.toLatin1();
- mm.outputTypes.append(typeId);
-
- if (i == 0) {
- // return value
- mm.typeName = QVariant::typeToName( QVariant::Type(typeId) );
- } else {
- // non-const ref parameter
- mm.parameters.append(arg.name.toLatin1());
- mm.parameters.append(',');
-
- prototype.append( QVariant::typeToName( QVariant::Type(typeId) ) );
- prototype.append("&,");
- }
- }
- if (!ok) continue;
-
- // convert the last commas:
- if (!mm.parameters.isEmpty()) {
- mm.parameters.truncate(mm.parameters.length() - 1);
- prototype[prototype.length() - 1] = ')';
- } else {
- prototype.append(')');
- }
-
- // check the async tag
- if (m.annotations.value(QLatin1String(ANNOTATION_NO_WAIT)) == QLatin1String("true"))
- mm.tag = "Q_ASYNC";
-
- // meta method flags
- mm.flags = AccessPublic | MethodSlot | MethodScriptable;
-
- // add
- methods.insert(QMetaObject::normalizedSignature(prototype), mm);
- }
-}
-
-void QDBusMetaObjectGenerator::parseSignals()
-{
- foreach (const QDBusIntrospection::Signal &s, data->signals_) {
- Method mm;
-
- QByteArray prototype = s.name.toLatin1();
- prototype += '(';
-
- bool ok = true;
-
- // build the output argument list
- foreach (const QDBusIntrospection::Argument &arg, s.outputArgs) {
- int typeId = QDBusUtil::signatureToType(arg.type);
- if (typeId == QVariant::Invalid) {
- ok = false;
- break;
- }
-
- mm.inputSignature += arg.type.toLatin1();
- mm.inputTypes.append(typeId);
-
- mm.parameters.append(arg.name.toLatin1());
- mm.parameters.append(',');
-
- prototype.append( QVariant::typeToName( QVariant::Type(typeId) ) );
- prototype.append(',');
- }
- if (!ok) continue;
-
- // convert the last commas:
- if (!mm.parameters.isEmpty()) {
- mm.parameters.truncate(mm.parameters.length() - 1);
- prototype[prototype.length() - 1] = ')';
- } else {
- prototype.append(')');
- }
-
- // meta method flags
- mm.flags = AccessProtected | MethodSignal | MethodScriptable;
-
- // add
- methods.insert(QMetaObject::normalizedSignature(prototype), mm);
- }
-}
-
-void QDBusMetaObjectGenerator::parseProperties()
-{
- foreach (const QDBusIntrospection::Property &p, data->properties) {
- Property mp;
- mp.type = QDBusUtil::signatureToType(p.type);
- if (mp.type == QVariant::Invalid)
- continue;
-
- QByteArray name = p.name.toLatin1();
- mp.signature = p.type.toLatin1();
- mp.typeName = QVariant::typeToName( QVariant::Type(mp.type) );
-
- // build the flags:
- mp.flags = StdCppSet | Scriptable | Stored;
- if (p.access != QDBusIntrospection::Property::Write)
- mp.flags |= Readable;
- if (p.access != QDBusIntrospection::Property::Read)
- mp.flags |= Writable;
-
- if (mp.typeName == "QVariant")
- mp.flags |= 0xff << 24;
- else if (mp.type < 0xff)
- // encode the type in the flags
- mp.flags |= mp.type << 24;
-
- // add the property:
- properties.insert(name, mp);
- }
-}
-
-void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
-{
- // this code here is mostly copied from qaxbase.cpp
- // with a few modifications to make it cleaner
-
- QString className = interface;
- className.replace(QLatin1Char('.'), QLatin1String("::"));
- if (className.isEmpty())
- className = QLatin1String("QDBusInterface");
-
- QVarLengthArray<int> idata;
- idata.resize(sizeof(QDBusMetaObjectPrivate) / sizeof(int));
-
- QDBusMetaObjectPrivate *header = reinterpret_cast<QDBusMetaObjectPrivate *>(idata.data());
- header->revision = 1;
- header->className = 0;
- header->classInfoCount = 0;
- header->classInfoData = 0;
- header->methodCount = methods.count();
- header->methodData = idata.size();
- header->propertyCount = properties.count();
- header->propertyData = header->methodData + header->methodCount * 5;
- header->enumeratorCount = 0;
- header->enumeratorData = 0;
- header->propertyDBusData = header->propertyData + header->propertyCount * 3;
- header->methodDBusData = header->propertyDBusData + header->propertyCount * intsPerProperty;
-
- int data_size = idata.size() +
- (header->methodCount * (5+intsPerMethod)) +
- (header->propertyCount * (3+intsPerProperty));
- foreach (const Method &mm, methods)
- data_size += 2 + mm.inputTypes.count() + mm.outputTypes.count();
- idata.resize(data_size + 1);
-
- char null('\0');
- QByteArray stringdata = className.toLatin1();
- stringdata += null;
- stringdata.reserve(8192);
-
- int offset = header->methodData;
- int signatureOffset = header->methodDBusData;
- int typeidOffset = header->methodDBusData + header->methodCount * intsPerMethod;
- idata[typeidOffset++] = 0; // eod
-
- // add each method:
- for (QMap<QByteArray, Method>::ConstIterator it = methods.constBegin();
- it != methods.constEnd(); ++it) {
- // form "prototype\0parameters\0typeName\0tag\0inputSignature\0outputSignature"
- const Method &mm = it.value();
-
- idata[offset++] = stringdata.length();
- stringdata += it.key(); // prototype
- stringdata += null;
- idata[offset++] = stringdata.length();
- stringdata += mm.parameters;
- stringdata += null;
- idata[offset++] = stringdata.length();
- stringdata += mm.typeName;
- stringdata += null;
- idata[offset++] = stringdata.length();
- stringdata += mm.tag;
- stringdata += null;
- idata[offset++] = mm.flags;
-
- idata[signatureOffset++] = stringdata.length();
- stringdata += mm.inputSignature;
- stringdata += null;
- idata[signatureOffset++] = stringdata.length();
- stringdata += mm.outputSignature;
- stringdata += null;
-
- idata[signatureOffset++] = typeidOffset;
- idata[typeidOffset++] = mm.inputTypes.count();
- memcpy(idata.data() + typeidOffset, mm.inputTypes.data(), mm.inputTypes.count() * sizeof(int));
- typeidOffset += mm.inputTypes.count();
-
- idata[signatureOffset++] = typeidOffset;
- idata[typeidOffset++] = mm.outputTypes.count();
- memcpy(idata.data() + typeidOffset, mm.outputTypes.data(), mm.outputTypes.count() * sizeof(int));
- typeidOffset += mm.outputTypes.count();
- }
-
- Q_ASSERT(offset == header->propertyData);
- Q_ASSERT(signatureOffset == header->methodDBusData + header->methodCount * intsPerMethod);
- Q_ASSERT(typeidOffset == idata.size());
-
- // add each property
- signatureOffset = header->propertyDBusData;
- for (QMap<QByteArray, Property>::ConstIterator it = properties.constBegin();
- it != properties.constEnd(); ++it) {
- const Property &mp = it.value();
-
- // form is "name\0typeName\0signature\0"
- idata[offset++] = stringdata.length();
- stringdata += it.key(); // name
- stringdata += null;
- idata[offset++] = stringdata.length();
- stringdata += mp.typeName;
- stringdata += null;
- idata[offset++] = mp.flags;
-
- idata[signatureOffset++] = stringdata.length();
- stringdata += mp.signature;
- stringdata += null;
- idata[signatureOffset++] = mp.type;
- }
-
- Q_ASSERT(offset == header->propertyDBusData);
- Q_ASSERT(signatureOffset == header->methodDBusData);
-
- char *string_data = new char[stringdata.length()];
- memcpy(string_data, stringdata, stringdata.length());
-
- uint *uint_data = new uint[idata.size()];
- memcpy(uint_data, idata.data(), idata.size() * sizeof(int));
-
- // put the metaobject together
- obj->d.data = uint_data;
- obj->d.extradata = 0;
- obj->d.stringdata = string_data;
- obj->d.superdata = &QDBusAbstractInterface::staticMetaObject;
-}
-
-#if 0
-void QDBusMetaObjectGenerator::writeWithoutXml(const QString &interface)
-{
- // no XML definition
- QString tmp(interface);
- tmp.replace(QLatin1Char('.'), QLatin1String("::"));
- QByteArray name(tmp.toLatin1());
-
- QDBusMetaObjectPrivate *header = new QDBusMetaObjectPrivate;
- memset(header, 0, sizeof *header);
- header->revision = 1;
- // leave the rest with 0
-
- char *stringdata = new char[name.length() + 1];
- stringdata[name.length()] = '\0';
-
- d.data = reinterpret_cast<uint*>(header);
- d.extradata = 0;
- d.stringdata = stringdata;
- d.superdata = &QDBusAbstractInterface::staticMetaObject;
- cached = false;
-}
-#endif
-
-/////////
-// class QDBusMetaObject
-
-QDBusMetaObject *QDBusMetaObject::createMetaObject(const QString &interface, const QString &xml,
- QHash<QString, QDBusMetaObject *> &cache,
- QDBusError &error)
-{
- error = QDBusError();
- QDBusIntrospection::Interfaces parsed = QDBusIntrospection::parseInterfaces(xml);
-
- QDBusMetaObject *we = 0;
- QDBusIntrospection::Interfaces::ConstIterator it = parsed.constBegin();
- QDBusIntrospection::Interfaces::ConstIterator end = parsed.constEnd();
- for ( ; it != end; ++it) {
- // check if it's in the cache
- QDBusMetaObject *obj = cache.value(it.key(), 0);
- if (!obj) {
- // not in cache; create
- obj = new QDBusMetaObject;
- QDBusMetaObjectGenerator generator(it.key(), it.value().constData());
- generator.write(obj);
-
- if ( (obj->cached = !it.key().startsWith( QLatin1String("local.") )) )
- // cache it
- cache.insert(it.key(), obj);
-
- }
-
- if (it.key() == interface)
- // it's us
- we = obj;
- }
-
- if (we)
- return we;
- // still nothing?
-
- if (parsed.isEmpty()) {
- // object didn't return introspection
- we = new QDBusMetaObject;
- QDBusMetaObjectGenerator generator(interface, 0);
- generator.write(we);
- we->cached = false;
- return we;
- } else if (interface.isEmpty()) {
- // merge all interfaces
- it = parsed.constBegin();
- QDBusIntrospection::Interface merged = *it.value().constData();
-
- for (++it; it != end; ++it) {
- merged.annotations.unite(it.value()->annotations);
- merged.methods.unite(it.value()->methods);
- merged.signals_.unite(it.value()->signals_);
- merged.properties.unite(it.value()->properties);
- }
-
- merged.name = QLatin1String("local.Merged");
- merged.introspection.clear();
-
- we = new QDBusMetaObject;
- QDBusMetaObjectGenerator generator(merged.name, &merged);
- generator.write(we);
- we->cached = false;
- return we;
- }
-
- // mark as an error
- error = QDBusError(QDBusError::UnknownInterface,
- QString( QLatin1String("Interface '%1' was not found") )
- .arg(interface));
- return 0;
-}
-
-QDBusMetaObject::QDBusMetaObject()
-{
-}
-
-inline const QDBusMetaObjectPrivate *priv(const uint* data)
-{
- return reinterpret_cast<const QDBusMetaObjectPrivate *>(data);
-}
-
-const char *QDBusMetaObject::dbusNameForMethod(int id) const
-{
- //id -= methodOffset();
- if (id >= 0 && id < priv(d.data)->methodCount) {
- int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return d.stringdata + d.data[handle];
- }
- return 0;
-}
-
-const char *QDBusMetaObject::inputSignatureForMethod(int id) const
-{
- //id -= methodOffset();
- if (id >= 0 && id < priv(d.data)->methodCount) {
- int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return d.stringdata + d.data[handle + 1];
- }
- return 0;
-}
-
-const char *QDBusMetaObject::outputSignatureForMethod(int id) const
-{
- //id -= methodOffset();
- if (id >= 0 && id < priv(d.data)->methodCount) {
- int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return d.stringdata + d.data[handle + 2];
- }
- return 0;
-}
-
-const int *QDBusMetaObject::inputTypesForMethod(int id) const
-{
- //id -= methodOffset();
- if (id >= 0 && id < priv(d.data)->methodCount) {
- int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return reinterpret_cast<const int*>(d.data + d.data[handle + 3]);
- }
- return 0;
-}
-
-const int *QDBusMetaObject::outputTypesForMethod(int id) const
-{
- //id -= methodOffset();
- if (id >= 0 && id < priv(d.data)->methodCount) {
- int handle = priv(d.data)->methodDBusData + id*intsPerMethod;
- return reinterpret_cast<const int*>(d.data + d.data[handle + 4]);
- }
- return 0;
-}
-
-int QDBusMetaObject::propertyMetaType(int id) const
-{
- //id -= propertyOffset();
- if (id >= 0 && id < priv(d.data)->propertyCount) {
- int handle = priv(d.data)->propertyDBusData + id*intsPerProperty;
- return d.data[handle + 1];
- }
- return 0;
-}
-
-template<typename T>
-static inline void assign_helper(void *ptr, const QVariant &value)
-{
- *reinterpret_cast<T *>(ptr) = qvariant_cast<T>(value);
-}
-
-void QDBusMetaObject::assign(void *ptr, const QVariant &value)
-{
- switch (value.userType())
- {
- case QVariant::Bool:
- assign_helper<bool>(ptr, value);
- return;
-
- case QMetaType::UChar:
- assign_helper<uchar>(ptr, value);
- return;
-
- case QMetaType::Short:
- assign_helper<short>(ptr, value);
- return;
-
- case QMetaType::UShort:
- assign_helper<ushort>(ptr, value);
- return;
-
- case QVariant::Int:
- assign_helper<int>(ptr, value);
- return;
-
- case QVariant::UInt:
- assign_helper<uint>(ptr, value);
- return;
-
- case QVariant::LongLong:
- assign_helper<qlonglong>(ptr, value);
- return;
-
- case QVariant::ULongLong:
- assign_helper<qulonglong>(ptr, value);
- return;
-
- case QVariant::Double:
- assign_helper<double>(ptr, value);
- return;
-
- case QVariant::String:
- assign_helper<QString>(ptr, value);
- return;
-
- case QVariant::ByteArray:
- assign_helper<QByteArray>(ptr, value);
- return;
-
- case QVariant::List:
- assign_helper<QVariantList>(ptr, value);
- return;
-
- case QVariant::Map:
- assign_helper<QVariantMap>(ptr, value);
- return;
-
- default:
- ;
- }
-}
-
-bool QDBusMetaTypeId::initialized = false;
-int QDBusMetaTypeId::variant = 0;
-int QDBusMetaTypeId::boollist = 0;
-int QDBusMetaTypeId::shortlist = 0;
-int QDBusMetaTypeId::ushortlist = 0;
-int QDBusMetaTypeId::intlist = 0;
-int QDBusMetaTypeId::uintlist = 0;
-int QDBusMetaTypeId::longlonglist = 0;
-int QDBusMetaTypeId::ulonglonglist = 0;
-int QDBusMetaTypeId::doublelist = 0;
-
-bool QDBusMetaTypeId::innerInitialize()
-{
- variant = qRegisterMetaType<QVariant>("QVariant");
- boollist = qRegisterMetaType<QList<bool> >("QList<bool>");
- shortlist = qRegisterMetaType<QList<short> >("QList<short>");
- ushortlist = qRegisterMetaType<QList<ushort> >("QList<ushort>");
- intlist = qRegisterMetaType<QList<int> >("QList<int>");
- uintlist = qRegisterMetaType<QList<uint> >("QList<uint>");
- longlonglist = qRegisterMetaType<QList<qlonglong> >("QList<qlonglong>");
- ulonglonglist = qRegisterMetaType<QList<qulonglong> >("QList<qulonglong>");
- doublelist = qRegisterMetaType<QList<double> >("QList<double>");
- initialized = true;
- return true;
-}
-
-int qDBusMetaTypeId(QVariant *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::variant; }
-int qDBusMetaTypeId(QList<bool> *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::boollist; }
-int qDBusMetaTypeId(QList<short> *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::shortlist; }
-int qDBusMetaTypeId(QList<ushort> *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::ushortlist; }
-int qDBusMetaTypeId(QList<int> *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::intlist; }
-int qDBusMetaTypeId(QList<uint> *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::uintlist; }
-int qDBusMetaTypeId(QList<qlonglong> *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::longlonglist; }
-int qDBusMetaTypeId(QList<qulonglong> *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::ulonglonglist; }
-int qDBusMetaTypeId(QList<double> *)
-{ QDBusMetaTypeId::initialize(); return QDBusMetaTypeId::doublelist; }
diff --git a/qt/src/qdbusmetaobject_p.h b/qt/src/qdbusmetaobject_p.h
deleted file mode 100644
index 746240d1..00000000
--- a/qt/src/qdbusmetaobject_p.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the public API. This header file may
-// change from version to version without notice, or even be
-// removed.
-//
-// We mean it.
-//
-//
-
-#ifndef QDBUSMETAOBJECTPRIVATE_H
-#define QDBUSMETAOBJECTPRIVATE_H
-
-#include <QtCore/qmetaobject.h>
-#include "qdbusmacros.h"
-
-class QDBusError;
-
-struct QDBusMetaObjectPrivate;
-struct QDBUS_EXPORT QDBusMetaObject: public QMetaObject
-{
- bool cached;
-
- static QDBusMetaObject *createMetaObject(const QString &interface, const QString &xml,
- QHash<QString, QDBusMetaObject *> &map,
- QDBusError &error);
- ~QDBusMetaObject()
- {
- delete [] d.stringdata;
- delete [] d.data;
- }
-
- // methods (slots & signals):
- const char *dbusNameForMethod(int id) const;
- const char *inputSignatureForMethod(int id) const;
- const char *outputSignatureForMethod(int id) const;
- const int *inputTypesForMethod(int id) const;
- const int *outputTypesForMethod(int id) const;
-
- // properties:
- int propertyMetaType(int id) const;
-
- // helper function:
- static void assign(void *, const QVariant &value);
-
-private:
- QDBusMetaObject();
-};
-
-struct QDBusMetaTypeId
-{
- static bool innerInitialize();
- static bool initialized;
- static inline void initialize()
- {
- if (initialized) return;
- innerInitialize();
- }
-
- static int variant;
- static int boollist;
- static int shortlist;
- static int ushortlist;
- static int intlist;
- static int uintlist;
- static int longlonglist;
- static int ulonglonglist;
- static int doublelist;
-};
-
-#endif
diff --git a/qt/src/qdbusmisc.cpp b/qt/src/qdbusmisc.cpp
deleted file mode 100644
index 9aaf9f24..00000000
--- a/qt/src/qdbusmisc.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/* qdbusmisc.cpp Miscellaneous routines that didn't fit anywhere else
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include <string.h>
-
-#include <QtCore/qvariant.h>
-#include <QtCore/qmetaobject.h>
-
-#include "qdbusconnection_p.h"
-#include "qdbustypehelper_p.h"
-
-bool qDBusCheckAsyncTag(const char *tag)
-{
- if (!tag || !*tag)
- return false;
-
- const char *p = strstr(tag, "async");
- if (p != NULL &&
- (p == tag || *(p-1) == ' ') &&
- (p[5] == '\0' || p[5] == ' '))
- return true;
-
- p = strstr(tag, "Q_ASYNC");
- if (p != NULL &&
- (p == tag || *(p-1) == ' ') &&
- (p[7] == '\0' || p[7] == ' '))
- return true;
-
- return false;
-}
-
-int qDBusNameToTypeId(const char *name)
-{
- int id = static_cast<int>( QVariant::nameToType(name) );
- if (id == QVariant::UserType)
- id = QMetaType::type(name);
-
- switch (id) {
- case QVariant::Bool:
- case QVariant::Int:
- case QVariant::UInt:
- case QVariant::Char:
- case QMetaType::Short:
- case QMetaType::UShort:
- case QMetaType::UChar:
- case QVariant::LongLong:
- case QVariant::ULongLong:
- case QVariant::Double:
- case QVariant::String:
- case QVariant::Date:
- case QVariant::Time:
- case QVariant::DateTime:
- case QVariant::Map:
- case QVariant::StringList:
- case QVariant::ByteArray:
- case QVariant::List:
- return id;
-
- default:
- if (id == QDBusConnectionPrivate::registerMessageMetaType() ||
- id == QDBusTypeHelper<QVariant>::id() ||
- id == QDBusTypeHelper<bool>::listId() ||
- id == QDBusTypeHelper<short>::listId() ||
- id == QDBusTypeHelper<ushort>::listId() ||
- id == QDBusTypeHelper<int>::listId() ||
- id == QDBusTypeHelper<qlonglong>::listId() ||
- id == QDBusTypeHelper<qulonglong>::listId() ||
- id == QDBusTypeHelper<double>::listId())
- return id;
-
- return 0; // invalid
- }
-}
-
-// calculates the metatypes for the method
-// the slot must have the parameters in the following form:
-// - zero or more value or const-ref parameters of any kind
-// - zero or one const ref of QDBusMessage
-// - zero or more non-const ref parameters
-// No parameter may be a template.
-// this function returns -1 if the parameters don't match the above form
-// this function returns the number of *input* parameters, including the QDBusMessage one if any
-// this function does not check the return type, so metaTypes[0] is always 0 and always present
-// metaTypes.count() >= retval + 1 in all cases
-//
-// sig must be the normalised signature for the method
-int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes)
-{
- QList<QByteArray> parameterTypes = mm.parameterTypes();
- metaTypes.clear();
-
- metaTypes.append(0); // return type
- int inputCount = 0;
- bool seenMessage = false;
- foreach (QByteArray type, parameterTypes) {
- if (type.endsWith('*')) {
- //qWarning("Could not parse the method '%s'", mm.signature());
- // pointer?
- return -1;
- }
-
- if (type.endsWith('&')) {
- type.truncate(type.length() - 1);
- int id = qDBusNameToTypeId(type);
- if (id == 0) {
- //qWarning("Could not parse the method '%s'", mm.signature());
- // invalid type in method parameter list
- return -1;
- }
-
- metaTypes.append( id );
- seenMessage = true; // it cannot appear anymore anyways
- continue;
- }
-
- if (seenMessage) { // && !type.endsWith('&')
- //qWarning("Could not parse the method '%s'", mm.signature());
- // non-output parameters after message or after output params
- return -1; // not allowed
- }
-
- int id = qDBusNameToTypeId(type);
- if (id == 0) {
- //qWarning("Could not parse the method '%s'", mm.signature());
- // invalid type in method parameter list
- return -1;
- }
- metaTypes.append(id);
- ++inputCount;
-
- if (id == QDBusConnectionPrivate::registerMessageMetaType())
- seenMessage = true;
- }
-
- return inputCount;
-}
diff --git a/qt/src/qdbusreply.h b/qt/src/qdbusreply.h
deleted file mode 100644
index d7e83122..00000000
--- a/qt/src/qdbusreply.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* qdbusreply.h QDBusReply object - a reply from D-Bus
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSREPLY_H
-#define QDBUSREPLY_H
-
-#include <QtCore/qglobal.h>
-#include <QtCore/qvariant.h>
-
-#include "qdbusmacros.h"
-#include "qdbusmessage.h"
-#include "qdbuserror.h"
-
-#include "qdbustypehelper_p.h"
-
-template<typename T>
-class QDBusReply
-{
- typedef T Type;
-public:
- inline QDBusReply(const QDBusMessage &reply)
- : m_data(Type())
- {
- *this = reply;
- }
- inline QDBusReply& operator=(const QDBusMessage& reply)
- {
- m_error = reply;
- if (isSuccess())
- m_data = QDBusTypeHelper<Type>::fromVariant(reply.at(0));
- else
- m_data = Type();
- return *this;
- }
-
- inline QDBusReply(const QDBusError &dbusError = QDBusError())
- : m_error(dbusError), m_data(Type())
- {
- }
- inline QDBusReply& operator=(const QDBusError& dbusError)
- {
- m_error = dbusError;
- m_data = Type();
- return *this;
- }
-
- inline QDBusReply& operator=(const QDBusReply& other)
- {
- m_error = other.m_error;
- m_data = other.m_data;
- return *this;
- }
-
- inline bool isError() const { return m_error.isValid(); }
- inline bool isSuccess() const { return !m_error.isValid(); }
-
- inline const QDBusError& error() { return m_error; }
-
- inline Type value() const
- {
- return m_data;
- }
-
- inline operator Type () const
- {
- return m_data;
- }
-
- static QDBusReply<T> fromVariant(const QDBusReply<QVariant> &variantReply)
- {
- QDBusReply<T> retval;
- retval.m_error = variantReply.m_error;
- if (retval.isSuccess()) {
- retval.m_data = qvariant_cast<Type>(variantReply.m_data);
- if (!qVariantCanConvert<Type>(variantReply.m_data))
- retval.m_error = QDBusError(QDBusError::InvalidSignature,
- QLatin1String("Unexpected reply signature"));
- }
- return retval;
- }
-
-private:
- QDBusError m_error;
- Type m_data;
-};
-
-# ifndef Q_QDOC
-// specialize for void:
-template<>
-class QDBUS_EXPORT QDBusReply<void>
-{
-public:
- inline QDBusReply(const QDBusMessage &reply)
- : m_error(reply)
- {
- }
- inline QDBusReply(const QDBusError &dbusError)
- : m_error(dbusError)
- {
- }
-
- inline bool isError() const { return m_error.isValid(); }
- inline bool isSuccess() const { return !m_error.isValid(); }
-
- inline const QDBusError& error() { return m_error; }
-
-private:
- QDBusError m_error;
-};
-# endif
-
-#endif
diff --git a/qt/src/qdbusserver.cpp b/qt/src/qdbusserver.cpp
deleted file mode 100644
index 4f5b5105..00000000
--- a/qt/src/qdbusserver.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/* qdbusserver.cpp
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusserver.h"
-#include "qdbusconnection_p.h"
-
-QDBusServer::QDBusServer(const QString &addr, QObject *p)
- : QObject(p)
-{
- d = new QDBusConnectionPrivate(this);
-
- if (addr.isEmpty())
- return;
-
- d->setServer(dbus_server_listen(addr.toUtf8().constData(), &d->error));
-}
-
-bool QDBusServer::isConnected() const
-{
- return d->server && dbus_server_get_is_connected(d->server);
-}
-
-QDBusError QDBusServer::lastError() const
-{
- return d->lastError;
-}
-
-QString QDBusServer::address() const
-{
- QString addr;
- if (d->server) {
- char *c = dbus_server_get_address(d->server);
- addr = QString::fromUtf8(c);
- dbus_free(c);
- }
-
- return addr;
-}
-
-#include "qdbusserver.moc"
diff --git a/qt/src/qdbusserver.h b/qt/src/qdbusserver.h
deleted file mode 100644
index 55607860..00000000
--- a/qt/src/qdbusserver.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* qdbusserver.h QDBusServer object
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifndef QDBUSSERVER_H
-#define QDBUSSERVER_H
-
-#include "qdbusmacros.h"
-#include <QtCore/qobject.h>
-#include <QtCore/qstring.h>
-
-class QDBusConnectionPrivate;
-class QDBusError;
-
-class QDBUS_EXPORT QDBusServer: public QObject
-{
- Q_OBJECT
-public:
- QDBusServer(const QString &address, QObject *parent = 0);
-
- bool isConnected() const;
- QDBusError lastError() const;
- QString address() const;
-
-private:
- Q_DISABLE_COPY(QDBusServer)
- QDBusConnectionPrivate *d;
-};
-
-#endif
diff --git a/qt/src/qdbusthread.cpp b/qt/src/qdbusthread.cpp
deleted file mode 100644
index f45a0096..00000000
--- a/qt/src/qdbusthread.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/* qdbusintegrator.cpp QDBusConnection private implementation
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include <QtCore/qmutex.h>
-#include <QtCore/qwaitcondition.h>
-
-#include <dbus/dbus.h>
-
-struct DBusMutex: public QMutex
-{
- inline DBusMutex()
- : QMutex( QMutex::NonRecursive )
- { }
-
- static DBusMutex* mutex_new()
- {
- return new DBusMutex;
- }
-
- static void mutex_free(DBusMutex *mutex)
- {
- delete mutex;
- }
-
- static dbus_bool_t mutex_lock(DBusMutex *mutex)
- {
- mutex->lock();
- return true;
- }
-
- static dbus_bool_t mutex_unlock(DBusMutex *mutex)
- {
- mutex->unlock();
- return true;
- }
-};
-
-struct DBusCondVar: public QWaitCondition
-{
- inline DBusCondVar()
- { }
-
- static DBusCondVar* condvar_new()
- {
- return new DBusCondVar;
- }
-
- static void condvar_free(DBusCondVar *cond)
- {
- delete cond;
- }
-
- static void condvar_wait(DBusCondVar *cond, DBusMutex *mutex)
- {
- cond->wait(mutex);
- }
-
- static dbus_bool_t condvar_wait_timeout(DBusCondVar *cond, DBusMutex *mutex, int msec)
- {
- return cond->wait(mutex, msec);
- }
-
- static void condvar_wake_one(DBusCondVar *cond)
- {
- cond->wakeOne();
- }
-
- static void condvar_wake_all(DBusCondVar *cond)
- {
- cond->wakeAll();
- }
-};
-
-bool qDBusInitThreads()
-{
- static DBusThreadFunctions fcn = {
- DBUS_THREAD_FUNCTIONS_ALL_MASK,
- DBusMutex::mutex_new,
- DBusMutex::mutex_free,
- DBusMutex::mutex_lock,
- DBusMutex::mutex_unlock,
- DBusCondVar::condvar_new,
- DBusCondVar::condvar_free,
- DBusCondVar::condvar_wait,
- DBusCondVar::condvar_wait_timeout,
- DBusCondVar::condvar_wake_one,
- DBusCondVar::condvar_wake_all,
- 0, 0, 0, 0, 0, 0, 0, 0
- };
-
- dbus_threads_init(&fcn);
- return true;
-}
-
-
diff --git a/qt/src/qdbustype.cpp b/qt/src/qdbustype.cpp
deleted file mode 100644
index 7f17a372..00000000
--- a/qt/src/qdbustype.cpp
+++ /dev/null
@@ -1,847 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2005 Thiago Macieira <thiago@kde.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbustype_p.h"
-#include "qdbustypehelper_p.h"
-#include <dbus/dbus.h>
-
-#include <QtCore/qstringlist.h>
-
-class QDBusTypePrivate: public QSharedData
-{
-public:
- int code;
- mutable int qvariantType;
- mutable QByteArray signature;
- QDBusTypeList subTypes;
-
- inline QDBusTypePrivate()
- : code(0), qvariantType(QVariant::Invalid)
- { }
-};
-
-/*!
- \class QDBusType
- \brief Represents one single D-Bus type.
- \internal
-
- D-Bus provides a set of primitive types that map to normal, C++ types and to QString, as well as
- the possibility to extend the set with the so-called "container" types. The available types are
- as follows:
-
- - Primitive (or basic): integers of 16, 32 and 64 bits, both signed and unsigned; byte (8 bits);
- double-precision floating point and Unicode strings
- - Arrays: a homogeneous, ordered list of zero or more entries
- - Maps: an unordered list of (key, value) pairs, where key must be a primitive type and value
- can be any D-Bus type
- - Structs: an ordered list of a fixed number of entries of any type
- - Variants: a "wildcard" container that can assume the value of any other type, including
- structs and arrays
-
- Any type can be placed inside an array (including other arrays), but only entries of the same
- type can be placed inside the same array. The analogous type for D-Bus arrays are the Qt
- #QList template classes.
-
- Structs have a fixed number of entries and each entry has a fixed type. They are analogous to C
- and C++ structs (hence the name).
-
- Maps or dictionaries are analogous to the Qt #QMap template class, with the additional
- restriction that the key type must be a primitive one. D-Bus implements maps by using arrays of
- a special type (a "dictionary entry"), so inspecting a QDBusType of a Map will reveal that it is
- an array (see isArray()).
-
- Variants contain exactly one entry, but the type can vary freely. It is analogous to the Qt
- class #QVariant, but the QtDBus implementation uses #QDBusVariant to represent D-Bus Variants.
-*/
-
-/*!
- Constructs an empty (invalid) type.
-*/
-QDBusType::QDBusType()
- : d(0)
-{
-}
-
-/*!
- Constructs the type based on the D-Bus type given by \a type.
-*/
-QDBusType::QDBusType(int type)
-{
- char c[2] = { type, 0 };
- *this = QDBusType(c);
-}
-
-/*!
- Constructs the type based on the QVariant type given by \a type.
-
- \sa QVariant::Type
-*/
-QDBusType::QDBusType(QVariant::Type type)
-{
- const char *sig = dbusSignature(type);
-
- // it never returns NULL
- // but it may return an empty string:
- if (sig[0] == '\0')
- return;
-
- if (qstrlen(sig) > 2) {
- *this = QDBusType(sig);
- } else {
- d = new QDBusTypePrivate;
- d->qvariantType = type;
- d->code = sig[0];
- if (sig[1] == '\0')
- // single-letter type
- return;
- else {
- // two-letter type
- // must be an array
- d->code = sig[0];
- QDBusType t;
- t.d = new QDBusTypePrivate;
- t.d->code = sig[1];
- d->subTypes << t;
- }
- }
-}
-
-/*!
- Parses the D-Bus signature given by \a signature and constructs the type it represents.
-*/
-QDBusType::QDBusType(const char* signature)
-{
- if ( !dbus_signature_validate_single(signature, 0) )
- return;
-
- DBusSignatureIter iter;
- dbus_signature_iter_init(&iter, signature);
- *this = QDBusType(&iter);
- if (d)
- d->signature = signature;
-}
-
-/*!
- \overload
- Parses the D-Bus signature given by \a str and constructs the type it represents.
-*/
-QDBusType::QDBusType(const QString& str)
-{
- *this = QDBusType( str.toUtf8().constData() );
-}
-
-/*!
- \overload
- Parses the D-Bus signature given by \a str and constructs the type it represents.
-*/
-QDBusType::QDBusType(const QByteArray& str)
-{
- *this = QDBusType( str.constData() );
-}
-
-/*!
- \internal
- Creates a QDBusType object based on the current element pointed to by \a iter.
-*/
-QDBusType::QDBusType(DBusSignatureIter* iter)
- : d(new QDBusTypePrivate)
-{
- if ( dbus_type_is_container( d->code = dbus_signature_iter_get_current_type(iter) ) ) {
- // we have to recurse
- if ( d->code == DBUS_TYPE_VARIANT )
- return; // no we don't. dbus_type_is_container lies to us
-
- // we have to recurse
- DBusSignatureIter subiter;
- dbus_signature_iter_recurse(iter, &subiter);
-
- d->subTypes = QDBusTypeList(&subiter);
-
- // sanity checking:
- if ( d->code == DBUS_TYPE_ARRAY )
- Q_ASSERT_X(d->subTypes.size() == 1, "QDBusType",
- "more than one element in array");
- else if (d->code == DBUS_TYPE_DICT_ENTRY )
- Q_ASSERT_X(d->subTypes.size() == 2, "QDBusType",
- "maps must have exactly two elements");
- }
-}
-
-/*!
- Copies the type from the object \a other.
-*/
-QDBusType::QDBusType(const QDBusType& other)
- : d(other.d)
-{
-}
-
-/*!
- Release the resources associated with this type.
-*/
-QDBusType::~QDBusType()
-{
-}
-
-/*!
- Copies the type from the object given by \a other.
-*/
-QDBusType& QDBusType::operator=(const QDBusType& other)
-{
- d = other.d;
- return *this;
-}
-
-/*!
- Returns the DBus type for this type.
-*/
-int QDBusType::dbusType() const
-{
- return d ? d->code : DBUS_TYPE_INVALID;
-}
-
-/*!
- Returns the DBus signature for this type and subtypes.
-*/
-QByteArray QDBusType::dbusSignature() const
-{
- if (!d)
- return QByteArray();
-
- if (!d->signature.isEmpty())
- return d->signature;
-
- if (d->subTypes.isEmpty())
- return d->signature = QByteArray(1, d->code);
-
- QByteArray retval;
- switch (d->code) {
- // can only be array, map or struct
-
- case DBUS_TYPE_ARRAY:
- Q_ASSERT_X(d->subTypes.size() == 1, "QDBusType::dbusSignature",
- "more than one element in array");
-
- retval += DBUS_TYPE_ARRAY;
- retval += d->subTypes.at(0).dbusSignature();
- break;
-
- case DBUS_TYPE_DICT_ENTRY: {
- Q_ASSERT_X(d->subTypes.size() == 2, "QDBusType::dbusSignature",
- "maps must have exactly two elements");
-
- QByteArray value = d->subTypes.at(1).dbusSignature();
- char key = d->subTypes.at(0).dbusType();
-
- Q_ASSERT(key != DBUS_TYPE_INVALID);
- Q_ASSERT(!value.isEmpty());
-
- retval.reserve(value.length() + 3);
- retval = DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING;
- retval += key;
- retval += value;
- retval += DBUS_DICT_ENTRY_END_CHAR;
- break;
- }
-
- case DBUS_TYPE_STRUCT:
- retval = d->subTypes.dbusSignature();
- retval.prepend(DBUS_STRUCT_BEGIN_CHAR);
- retval.append(DBUS_STRUCT_END_CHAR);
- break;
-
- default:
- Q_ASSERT_X(false, "QDBusType::dbusSignature", "invalid container type");
- }
-
- d->signature = retval;
- return retval;
-}
-
-/*!
- Returns the QVariant::Type for this entry.
-*/
-int QDBusType::qvariantType() const
-{
- if (d && d->qvariantType != QVariant::Invalid)
- return d->qvariantType;
-
- if (!d)
- return QVariant::Invalid;
-
- return d->qvariantType = qvariantType(dbusSignature().constData());
-}
-
-/*!
- Returns true if this type is a valid one.
-*/
-bool QDBusType::isValid() const
-{
- return d && d->code != DBUS_TYPE_INVALID;
-}
-
-/*!
- Returns true if this type is a basic one.
-*/
-bool QDBusType::isBasic() const
-{
- return d && dbus_type_is_basic(d->code);
-}
-
-/*!
- Returns true if this type is a container.
-*/
-bool QDBusType::isContainer() const
-{
- return d && dbus_type_is_container(d->code);
-}
-
-/*!
- Returns the subtypes of this type, if this is a container.
-
- \sa isContainer()
-*/
-QDBusTypeList QDBusType::subTypes() const
-{
- if (d)
- return d->subTypes;
- return QDBusTypeList();
-}
-
-/*!
- Returns true if this type is an array.
-
- \sa isContainer(), arrayElement()
-*/
-bool QDBusType::isArray() const
-{
- return dbusType() == DBUS_TYPE_ARRAY;
-}
-
-/*!
- This is a convenience function that returns the element type of an array.
- If this object is not an array, it returns an invalid QDBusType.
-
- \sa isArray()
-*/
-QDBusType QDBusType::arrayElement() const
-{
- if (isArray() && d->subTypes.count() == 1)
- return d->subTypes.first();
- return QDBusType();
-}
-
-/*!
- Returns true if this type is a map (i.e., an array of dictionary entries).
-
- \sa isContainer(), isArray(), arrayElement()
-*/
-bool QDBusType::isMap() const
-{
- return arrayElement().dbusType() == DBUS_TYPE_DICT_ENTRY;
-}
-
-/*!
- If this object is a map, returns the (basic) type that corresponds to the key type.
- If this object is not a map, returns an invalid QDBusType.
-
- \sa isMap()
-*/
-QDBusType QDBusType::mapKey() const
-{
- if (isMap())
- return arrayElement().d->subTypes.first();
- return QDBusType();
-}
-
-/*!
- If this object is a map, returns the type that corresponds to the value type.
- If this object is not a map, returns an invalid QDBusType.
-
- \sa isMap()
-*/
-QDBusType QDBusType::mapValue() const
-{
- if (isMap())
- return arrayElement().d->subTypes.at(1);
- return QDBusType();
-}
-
-/*!
- Returns true if this type is the same one as \a other.
-*/
-bool QDBusType::operator==(const QDBusType& other) const
-{
- if (!d && !other.d)
- return true;
- if (!d || !other.d)
- return false;
- return d->code == other.d->code && d->subTypes == other.d->subTypes;
-}
-
-/*!
- \fn QDBusType::operator!=(const QDBusType &other) const
- Returns true if the this type and the one given by \a other are different.
-*/
-
-/*!
- Converts the DBus type code \a type to QVariant::Type.
-*/
-int QDBusType::qvariantType(int type)
-{
- char c[2] = { type, 0 };
- return qvariantType(c);
-}
-
-/*!
- Converts the DBus type signature \a signature to QVariant::Type.
-*/
-int QDBusType::qvariantType(const char* signature)
-{
- if (!signature)
- return QVariant::Invalid;
-
- // three special cases that don't validate as single:
- if (qstrlen(signature) == 1) {
- if (signature[0] == DBUS_TYPE_STRUCT)
- return QVariant::List;
- else if (signature[0] == DBUS_TYPE_DICT_ENTRY)
- return QVariant::Map;
- else if (signature[0] == DBUS_TYPE_ARRAY)
- return QVariant::List;
- }
-
- // now we can validate
- if ( !dbus_signature_validate_single(signature, 0) )
- return QVariant::Invalid;
-
- switch (signature[0])
- {
- case DBUS_TYPE_BOOLEAN:
- return QVariant::Bool;
-
- case DBUS_TYPE_BYTE:
- return QMetaType::UChar;
-
- case DBUS_TYPE_INT16:
- return QMetaType::Short;
-
- case DBUS_TYPE_UINT16:
- return QMetaType::UShort;
-
- case DBUS_TYPE_INT32:
- return QVariant::Int;
-
- case DBUS_TYPE_UINT32:
- return QVariant::UInt;
-
- case DBUS_TYPE_INT64:
- return QVariant::LongLong;
-
- case DBUS_TYPE_UINT64:
- return QVariant::ULongLong;
-
- case DBUS_TYPE_DOUBLE:
- return QVariant::Double;
-
- case DBUS_TYPE_STRING:
- case DBUS_TYPE_OBJECT_PATH:
- case DBUS_TYPE_SIGNATURE:
- return QVariant::String;
-
- case DBUS_STRUCT_BEGIN_CHAR:
- return QVariant::List; // change to QDBusStruct in the future
-
- case DBUS_TYPE_VARIANT:
- return QDBusTypeHelper<QVariant>::id();
-
- case DBUS_TYPE_ARRAY: // special case
- switch (signature[1]) {
- case DBUS_TYPE_BOOLEAN:
- return QDBusTypeHelper<bool>::listId();
-
- case DBUS_TYPE_BYTE:
- return QVariant::ByteArray;
-
- case DBUS_TYPE_INT16:
- return QDBusTypeHelper<short>::listId();
-
- case DBUS_TYPE_UINT16:
- return QDBusTypeHelper<ushort>::listId();
-
- case DBUS_TYPE_INT32:
- return QDBusTypeHelper<int>::listId();
-
- case DBUS_TYPE_UINT32:
- return QDBusTypeHelper<uint>::listId();
-
- case DBUS_TYPE_INT64:
- return QDBusTypeHelper<qlonglong>::listId();
-
- case DBUS_TYPE_UINT64:
- return QDBusTypeHelper<qulonglong>::listId();
-
- case DBUS_TYPE_DOUBLE:
- return QDBusTypeHelper<double>::listId();
-
- case DBUS_TYPE_STRING:
- case DBUS_TYPE_OBJECT_PATH:
- case DBUS_TYPE_SIGNATURE:
- return QVariant::StringList;
-
- case DBUS_TYPE_VARIANT:
- return QVariant::List;
-
- case DBUS_DICT_ENTRY_BEGIN_CHAR:
- return QVariant::Map;
-
- default:
- return QVariant::List;
- }
- default:
- return QVariant::Invalid;
-
- }
-}
-
-/*!
- Converts the QVariant::Type \a t to a DBus type code.
-*/
-int QDBusType::dbusType(QVariant::Type t)
-{
- switch (t)
- {
- case QVariant::Bool:
- return DBUS_TYPE_BOOLEAN;
-
- case QVariant::Int:
- return DBUS_TYPE_INT32;
-
- case QVariant::UInt:
- return DBUS_TYPE_UINT32;
-
- case QVariant::LongLong:
- return DBUS_TYPE_INT64;
-
- case QVariant::ULongLong:
- return DBUS_TYPE_UINT64;
-
- case QVariant::Double:
- return DBUS_TYPE_DOUBLE;
-
- // from QMetaType:
- case QMetaType::Short:
- return DBUS_TYPE_INT16;
-
- case QMetaType::UShort:
- return DBUS_TYPE_UINT16;
-
- case QMetaType::UChar:
- return DBUS_TYPE_BYTE;
-
- case QVariant::String:
- return DBUS_TYPE_STRING;
-
- case QVariant::Map:
- // internal type information has been lost
- return DBUS_TYPE_DICT_ENTRY;
-
- case QVariant::List:
- case QVariant::StringList:
- case QVariant::ByteArray:
- // could also be a struct...
- return DBUS_TYPE_ARRAY;
-
- case QVariant::UserType:
- return DBUS_TYPE_INVALID; // invalid
-
- default:
- break; // avoid compiler warnings
- }
-
- if (int(t) == QDBusTypeHelper<QVariant>::id())
- return DBUS_TYPE_VARIANT;
-
- return DBUS_TYPE_INVALID;
-}
-
-/*!
- Converts the QVariant::Type \a t to a DBus type signature.
-*/
-const char* QDBusType::dbusSignature(QVariant::Type t)
-{
- switch (t)
- {
- case QVariant::Bool:
- return DBUS_TYPE_BOOLEAN_AS_STRING;
-
- case QVariant::Int:
- return DBUS_TYPE_INT32_AS_STRING;
-
- case QVariant::UInt:
- return DBUS_TYPE_UINT32_AS_STRING;
-
- case QMetaType::Short:
- return DBUS_TYPE_INT16_AS_STRING;
-
- case QMetaType::UShort:
- return DBUS_TYPE_UINT16_AS_STRING;
-
- case QMetaType::UChar:
- return DBUS_TYPE_BYTE_AS_STRING;
-
- case QVariant::LongLong:
- return DBUS_TYPE_INT64_AS_STRING;
-
- case QVariant::ULongLong:
- return DBUS_TYPE_UINT64_AS_STRING;
-
- case QVariant::Double:
- return DBUS_TYPE_DOUBLE_AS_STRING;
-
- case QVariant::String:
- return DBUS_TYPE_STRING_AS_STRING;
-
- case QVariant::Map:
- // internal type information has been lost
- return DBUS_TYPE_ARRAY_AS_STRING
- DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_STRING_AS_STRING
- DBUS_TYPE_VARIANT_AS_STRING
- DBUS_DICT_ENTRY_END_CHAR_AS_STRING; // a{sv}
-
- case QVariant::StringList:
- return DBUS_TYPE_ARRAY_AS_STRING
- DBUS_TYPE_STRING_AS_STRING; // as
-
- case QVariant::ByteArray:
- return DBUS_TYPE_ARRAY_AS_STRING
- DBUS_TYPE_BYTE_AS_STRING; // ay
-
- case QVariant::List:
- // not a string list
- // internal list data has been lost
- // could also be a struct...
- return DBUS_TYPE_ARRAY_AS_STRING
- DBUS_TYPE_VARIANT_AS_STRING; // av
-
- default:
- if (int(t) == QDBusTypeHelper<QVariant>::id())
- return DBUS_TYPE_VARIANT_AS_STRING;
- if (int(t) == QDBusTypeHelper<bool>::listId())
- return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BOOLEAN_AS_STRING;
- if (int(t) == QDBusTypeHelper<short>::listId())
- return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_INT16_AS_STRING;
- if (int(t) == QDBusTypeHelper<ushort>::listId())
- return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UINT16_AS_STRING;
- if (int(t) == QDBusTypeHelper<int>::listId())
- return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_INT32_AS_STRING;
- if (int(t) == QDBusTypeHelper<uint>::listId())
- return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UINT32_AS_STRING;
- if (int(t) == QDBusTypeHelper<qlonglong>::listId())
- return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_INT64_AS_STRING;
- if (int(t) == QDBusTypeHelper<qulonglong>::listId())
- return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UINT64_AS_STRING;
- if (int(t) == QDBusTypeHelper<double>::listId())
- return DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_DOUBLE_AS_STRING;
-
- return DBUS_TYPE_INVALID_AS_STRING;
- }
-}
-
-/*!
- \enum QDBusType::VariantListMode
- Defines how the guessFromVariant() function will behave when the QVariant is of type
- QVariant::List.
-*/
-
-/*!
- Guesses the DBus type from the given \a variant.
-*/
-QDBusType QDBusType::guessFromVariant(const QVariant& variant, VariantListMode mode)
-{
- if (variant.type() == QVariant::List) {
- // investigate deeper
- QDBusType t;
- t.d = new QDBusTypePrivate;
- const QVariantList list = variant.toList();
-
- t.d->code = DBUS_TYPE_ARRAY;
- if (!list.isEmpty()) {
- // check if all elements have the same type
- QVariant::Type type = list.first().type();
- foreach (const QVariant& v, list)
- if (type != v.type()) {
- // at least one is different
- type = QVariant::Invalid;
- break;
- }
-
- if (type != QVariant::Invalid) {
- // all are of the same type
- t.d->subTypes << guessFromVariant(list.first());
- return t;
- }
- } else {
- // an array of "something"
- t.d->subTypes << QDBusType('v');
- return t;
- }
-
- // treat it as a struct
- t.d->code = DBUS_TYPE_STRUCT;
- foreach (const QVariant& v, list)
- t.d->subTypes << guessFromVariant(v, mode);
-
- return t;
- }
- else if (variant.type() == QVariant::Map) {
- // investigate deeper
- QDBusType t, t2, t3;
- t2.d = new QDBusTypePrivate;
- t2.d->code = DBUS_TYPE_DICT_ENTRY;
-
- // the key
- t3.d = new QDBusTypePrivate;
- t3.d->code = DBUS_TYPE_STRING;
- t2.d->subTypes << t3;
-
- const QVariantMap map = variant.toMap();
- if (!map.isEmpty()) {
- // check if all elements have the same type
- QVariantMap::const_iterator it = map.constBegin(),
- end = map.constEnd();
- QVariant::Type type = it.value().type();
- for ( ; it != end; ++it)
- if (type != it.value().type()) {
- // at least one is different
- type = QVariant::Invalid;
- break;
- }
-
- if (type != QVariant::Invalid)
- t2.d->subTypes << guessFromVariant(map.constBegin().value());
- else {
- // multiple types
- t3.d->code = DBUS_TYPE_VARIANT;
- t2.d->subTypes << t3;
- }
- }
- else {
- // information lost
- t3.d->code = DBUS_TYPE_VARIANT;
- t2.d->subTypes << t3;
- }
-
- t.d = new QDBusTypePrivate;
- t.d->code = DBUS_TYPE_ARRAY;
- t.d->subTypes << t2;
- return t;
- }
- else
- return QDBusType( QVariant::Type( variant.userType() ) );
-}
-
-/*!
- \class QDBusTypeList
- \brief A list of DBus types.
- \internal
-
- Represents zero or more DBus types in sequence, such as those used in argument lists
- or in subtypes of structs and maps.
-*/
-
-/*!
- \fn QDBusTypeList::QDBusTypeList()
-
- Default constructor.
- */
-
-/*!
- \fn QDBusTypeList::QDBusTypeList(const QDBusTypeList& other)
-
- Copy constructor: copies the type list from \a other.
-*/
-
-/*!
- \fn QDBusTypeList::QDBusTypeList(const QList<QDBusType>& other)
-
- Copy constructor: copies the type list from \a other.
-*/
-
-/*!
- Constructs a type list by parsing the given \a signature.
-*/
-QDBusTypeList::QDBusTypeList(const char* signature)
-{
- if (!signature || !*signature)
- return; // empty
-
- // validate it first
- if ( !dbus_signature_validate(signature, 0) )
- return;
-
- // split it into components
- DBusSignatureIter iter;
- dbus_signature_iter_init(&iter, signature);
-
- do {
- *this << QDBusType(&iter);
- } while (dbus_signature_iter_next(&iter));
-}
-
-/*!
- \internal
- Constructs a type list by parsing the elements on this iterator level.
-*/
-QDBusTypeList::QDBusTypeList(DBusSignatureIter* iter)
-{
- do {
- QDBusType item(iter);
- if (!item.isValid()) {
- clear();
- return;
- }
-
- *this << item;
- } while (dbus_signature_iter_next(iter));
-}
-
-/*!
- Returns true if this type list can represent the inner components of a map.
-*/
-bool QDBusTypeList::canBeMap() const
-{
- return size() == 2 && at(0).isBasic();
-}
-
-/*!
- Reconstructs the type signature that this type list represents.
-*/
-QByteArray QDBusTypeList::dbusSignature() const
-{
- QByteArray retval;
- foreach (QDBusType t, *this)
- retval += t.dbusSignature();
- return retval;
-}
diff --git a/qt/src/qdbustype_p.h b/qt/src/qdbustype_p.h
deleted file mode 100644
index b719960e..00000000
--- a/qt/src/qdbustype_p.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2005 Thiago Macieira <thiago@kde.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSTYPE_H
-#define QDBUSTYPE_H
-
-#include <QtCore/qvariant.h>
-#include <QtCore/qbytearray.h>
-#include <QtCore/qshareddata.h>
-#include <QtCore/qlist.h>
-#include "qdbusmacros.h"
-#include <dbus/dbus.h>
-
-// forward declaration
-class QDBusTypeList;
-
-class QDBusTypePrivate;
-class QDBUS_EXPORT QDBusType
-{
-public:
- QDBusType();
- explicit QDBusType(int type);
- explicit QDBusType(QVariant::Type type);
- explicit QDBusType(const char* signature);
- explicit QDBusType(DBusSignatureIter*);
- explicit QDBusType(const QString& str);
- explicit QDBusType(const QByteArray& str);
- QDBusType(const QDBusType& other);
-
- ~QDBusType();
-
- QDBusType& operator=(const QDBusType& other);
-
- int qvariantType() const;
-
- int dbusType() const;
- QByteArray dbusSignature() const;
- bool isValid() const;
- bool isBasic() const;
- bool isContainer() const;
-
- QDBusTypeList subTypes() const;
-
- bool isArray() const;
- QDBusType arrayElement() const;
-
- bool isMap() const;
- QDBusType mapKey() const;
- QDBusType mapValue() const;
-
- bool operator==(const QDBusType& other) const;
- inline bool operator!=(const QDBusType &other) const
- { return !(*this == other); }
-
- static int qvariantType(int type);
- static int qvariantType(const char* signature);
- static int dbusType(QVariant::Type);
- static const char* dbusSignature(QVariant::Type);
-
- enum VariantListMode {
- ListIsArray,
- ListIsStruct
- };
- static QDBusType guessFromVariant(const QVariant &variant, VariantListMode = ListIsArray);
-
-private:
- QSharedDataPointer<QDBusTypePrivate> d;
-};
-
-class QDBUS_EXPORT QDBusTypeList: public QList<QDBusType>
-{
-public:
- inline QDBusTypeList() { }
- inline QDBusTypeList(const QDBusTypeList& other)
- : QList<QDBusType>(other)
- { }
- inline QDBusTypeList(const QList<QDBusType>& other)
- : QList<QDBusType>(other)
- { }
- QDBusTypeList(const char* signature);
- QDBusTypeList(DBusSignatureIter*);
-
- bool canBeMap() const;
-
- QByteArray dbusSignature() const;
-};
-
-#endif // QDBUSTYPE_H
diff --git a/qt/src/qdbustypehelper_p.h b/qt/src/qdbustypehelper_p.h
deleted file mode 100644
index 7ebd7f3e..00000000
--- a/qt/src/qdbustypehelper_p.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/* qdbuslisthelper_p.h Helper class to convert to and from QVariantList
- *
- * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the public API. This header file may
-// change from version to version without notice, or even be
-// removed.
-//
-// We mean it.
-//
-//
-
-#ifndef QDBUSTYPEHELPERPRIVATE_H
-#define QDBUSTYPEHELPERPRIVATE_H
-
-#include <QtCore/qlist.h>
-#include <QtCore/qvariant.h>
-#include <QtCore/qmetatype.h>
-
-// we're going to support all D-Bus primitive types here:
-// uchar -- not needed: QByteArray
-// bool
-// short
-// ushort
-// int
-// uint
-// qlonglong
-// qulonglong
-// double
-// QString -- not needed: QStringList
-// QList -- not possible: will use QVariant
-// QVariant
-// QDBusStruct -- not yet existant
-// QMap -- not possible: will use QVariant
-
-inline QDBUS_EXPORT int qDBusMetaTypeId(bool *) { return QVariant::Bool; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(uchar *) { return QMetaType::UChar; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(short *) { return QMetaType::Short; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(ushort *) { return QMetaType::UShort; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(int *) { return QVariant::Int; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(uint *) { return QVariant::UInt; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(qlonglong *) { return QVariant::LongLong; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(qulonglong *) { return QVariant::ULongLong; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(double *) { return QVariant::Double; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(QString *) { return QVariant::String; }
-QDBUS_EXPORT int qDBusMetaTypeId(QVariant *);
-QDBUS_EXPORT int qDBusMetaTypeId(QList<bool> *);
-inline QDBUS_EXPORT int qDBusMetaTypeId(QByteArray *) { return QVariant::ByteArray; }
-QDBUS_EXPORT int qDBusMetaTypeId(QList<short> *);
-QDBUS_EXPORT int qDBusMetaTypeId(QList<ushort> *);
-QDBUS_EXPORT int qDBusMetaTypeId(QList<int> *);
-QDBUS_EXPORT int qDBusMetaTypeId(QList<uint> *);
-QDBUS_EXPORT int qDBusMetaTypeId(QList<qlonglong> *);
-QDBUS_EXPORT int qDBusMetaTypeId(QList<qulonglong> *);
-QDBUS_EXPORT int qDBusMetaTypeId(QList<double> *);
-inline QDBUS_EXPORT int qDBusMetaTypeId(QStringList *) { return QVariant::StringList; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(QVariantList *) { return QVariant::List; }
-inline QDBUS_EXPORT int qDBusMetaTypeId(QVariantMap *) { return QVariant::Map; }
-
-// implement the copy mechanism
-template<class T>
-struct QDBusTypeHelper
-{
- typedef T Type;
- typedef QList<T> List;
-
- static inline int id()
- {
- Type* t = 0;
- return qDBusMetaTypeId(t);
- }
-
- static inline int listId()
- {
- List *l = 0;
- return qDBusMetaTypeId(l);
- }
-
- static inline QVariant toVariant(const Type &t)
- {
- return QVariant(id(), &t);
- }
-
- static bool canSpecialConvert(const QVariant &);
- static Type specialConvert(const QVariant &);
-
- static inline Type fromVariant(const QVariant &v)
- {
- if (canSpecialConvert(v))
- return specialConvert(v);
-
- QVariant copy(v);
- if (copy.convert( QVariant::Type(id()) ))
- return *reinterpret_cast<const Type *>(copy.constData());
- return Type();
- }
-
- static inline QVariantList toVariantList(const List list)
- {
- QVariantList tmp;
- Q_FOREACH (const Type &t, list)
- tmp.append(toVariant(t));
- return tmp;
- }
-
- static inline QVariantList toVariantList(const QVariant &v)
- {
- return toVariantList(QDBusTypeHelper<List>::fromVariant(v));
- }
-
- static inline List fromVariantList(const QVariantList list)
- {
- List tmp;
- Q_FOREACH (const QVariant &v, list)
- tmp.append(fromVariant(v));
- return tmp;
- }
-};
-
-template<>
-struct QDBusTypeHelper<QVariant>
-{
- static inline int id()
- {
- QVariant *t = 0;
- return qDBusMetaTypeId(t);
- }
-
- static inline int listId()
- {
- return QVariant::List;
- }
-
- static inline QVariant toVariant(const QVariant &t)
- {
- return QVariant(id(), &t);
- }
-
- static inline QVariant fromVariant(const QVariant &v)
- {
- if (v.userType() == id())
- return *reinterpret_cast<const QVariant *>(v.constData());
- return v;
- }
-
- static inline QVariantList toVariantList(const QVariantList &list)
- {
- return list;
- }
-
- static inline QVariantList fromVariantList(const QVariantList &list)
- {
- return list;
- }
-};
-
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_NO_CAST_TO_ASCII)
-template<>
-struct QDBusTypeHelper<char *>
-{
- static inline int id()
- { return QVariant::String; }
-
- static inline QVariant toVariant(const char *t)
- { return QVariant(t); }
-
- static inline QByteArray fromVariant(const QVariant &v)
- { return v.toString().toAscii(); }
-};
-
-template<>
-struct QDBusTypeHelper<const char *>
-{
- static inline int id()
- { return QVariant::String; }
-
- static inline QVariant toVariant(const char *t)
- { return QVariant(t); }
-
- static inline QByteArray fromVariant(const QVariant &v)
- { return v.toString().toAscii(); }
-};
-#endif
-
-// support three exceptions: uchar, short and ushort
-// we have to do this as long as QVariant can't convert to/from the integer metatypes
-template<> inline bool QDBusTypeHelper<short>::canSpecialConvert(const QVariant &v)
-{ return v.userType() < int(QVariant::UserType); }
-template<> inline short QDBusTypeHelper<short>::specialConvert(const QVariant &v)
-{ return v.toInt(); }
-
-template<> inline bool QDBusTypeHelper<ushort>::canSpecialConvert(const QVariant &v)
-{ return v.userType() < int(QVariant::UserType); }
-template<> inline ushort QDBusTypeHelper<ushort>::specialConvert(const QVariant &v)
-{ return v.toUInt(); }
-
-template<> inline bool QDBusTypeHelper<uchar>::canSpecialConvert(const QVariant &v)
-{ return v.userType() < int(QVariant::UserType); }
-template<> inline uchar QDBusTypeHelper<uchar>::specialConvert(const QVariant &v)
-{ return v.toUInt(); }
-
-template<typename T> inline bool QDBusTypeHelper<T>::canSpecialConvert(const QVariant &)
-{ return false; }
-template<typename T> inline T QDBusTypeHelper<T>::specialConvert(const QVariant &)
-{ return T(); }
-
-#endif
diff --git a/qt/src/qdbusutil.cpp b/qt/src/qdbusutil.cpp
deleted file mode 100644
index 22ce3a81..00000000
--- a/qt/src/qdbusutil.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusutil.h"
-
-#include <dbus/dbus.h>
-
-#include <QtCore/qstringlist.h>
-#include <QtCore/qregexp.h>
-
-#include "qdbustype_p.h"
-
-/*!
- \namespace QDBusUtil
- The QDBusUtil namespace contains a few functions that are of general use when dealing with D-Bus
- strings.
-*/
-namespace QDBusUtil
-{
- /*!
- \fn QDBusUtil::isValidInterfaceName(const QString &ifaceName)
- Returns true if this is \a ifaceName is a valid interface name.
-
- Valid interface names must:
- - not be empty
- - not exceed 255 characters in length
- - be composed of dot-separated string components that contain only ASCII letters, digits
- and the underscore ("_") character
- - contain at least two such components
- */
- bool isValidInterfaceName(const QString& ifaceName)
- {
- if (ifaceName.isEmpty() || ifaceName.length() > DBUS_MAXIMUM_NAME_LENGTH)
- return false;
-
- QStringList parts = ifaceName.split(QLatin1Char('.'));
- if (parts.count() < 2)
- return false; // at least two parts
-
- foreach (QString part, parts)
- if (!isValidMemberName(part))
- return false;
-
- return true;
- }
-
- /*!
- \fn QDBusUtil::isValidUniqueConnectionName(const QString &connName)
- Returns true if \a connName is a valid unique connection name.
-
- Unique connection names start with a colon (":") and are followed by a list of dot-separated
- components composed of ASCII letters, digits, the hypen or the underscore ("_") character.
- */
- bool isValidUniqueConnectionName(const QString &connName)
- {
- if (connName.isEmpty() || connName.length() > DBUS_MAXIMUM_NAME_LENGTH ||
- !connName.startsWith(QLatin1Char(':')))
- return false;
-
- QStringList parts = connName.mid(1).split(QLatin1Char('.'));
- if (parts.count() < 1)
- return false;
-
- QRegExp regex(QLatin1String("[a-zA-Z0-9_-]+"));
- foreach (QString part, parts)
- if (!regex.exactMatch(part))
- return false;
-
- return true;
- }
-
- /*!
- \fn QDBusUtil::isValidBusName(const QString &busName)
- Returns true if \a busName is a valid bus name.
-
- A valid bus name is either a valid unique connection name or follows the rules:
- - is not empty
- - does not exceed 255 characters in length
- - be composed of dot-separated string components that contain only ASCII letters, digits,
- hyphens or underscores ("_"), but don't start with a digit
- - contains at least two such elements
-
- \sa isValidUniqueConnectionName()
- */
- bool isValidBusName(const QString &busName)
- {
- if (busName.isEmpty() || busName.length() > DBUS_MAXIMUM_NAME_LENGTH)
- return false;
-
- if (busName.startsWith(QLatin1Char(':')))
- return isValidUniqueConnectionName(busName);
-
- QStringList parts = busName.split(QLatin1Char('.'));
- if (parts.count() < 1)
- return false;
-
- QRegExp regex(QLatin1String("[a-zA-Z_-][a-zA-Z0-9_-]*"));
- foreach (QString part, parts)
- if (!regex.exactMatch(part))
- return false;
-
- return true;
- }
-
- /*!
- \fn QDBusUtil::isValidMemberName(const QString &memberName)
- Returns true if \a memberName is a valid member name. A valid member name does not exceed
- 255 characters in length, is not empty, is composed only of ASCII letters, digits and
- underscores, but does not start with a digit.
- */
- bool isValidMemberName(const QString &memberName)
- {
- if (memberName.isEmpty() || memberName.length() > DBUS_MAXIMUM_NAME_LENGTH)
- return false;
-
- QRegExp regex(QLatin1String("[a-zA-Z_][a-zA-Z0-9_]*"));
- return regex.exactMatch(memberName);
- }
-
- /*!
- \fn QDBusUtil::isValidErrorName(const QString &errorName)
- Returns true if \a errorName is a valid error name. Valid error names are valid interface
- names and vice-versa, so this function is actually an alias for isValidInterfaceName.
- */
- bool isValidErrorName(const QString &errorName)
- {
- return isValidInterfaceName(errorName);
- }
-
- /*!
- \fn QDBusUtil::isValidObjectPath(const QString &path)
- Returns true if \a path is valid object path.
-
- Valid object paths follow the rules:
- - start with the slash character ("/")
- - do not end in a slash, unless the path is just the initial slash
- - do not contain any two slashes in sequence
- - contain slash-separated parts, each of which is composed of ASCII letters, digits and
- underscores ("_")
- */
- bool isValidObjectPath(const QString &path)
- {
- if (path == QLatin1String("/"))
- return true;
-
- if (!path.startsWith(QLatin1Char('/')) || path.indexOf(QLatin1String("//")) != -1 ||
- path.endsWith(QLatin1Char('/')))
- return false;
-
- QStringList parts = path.split(QLatin1Char('/'));
- Q_ASSERT(parts.count() >= 1);
- parts.removeFirst(); // it starts with /, so we get an empty first part
-
- QRegExp regex(QLatin1String("[a-zA-Z0-9_]+"));
- foreach (QString part, parts)
- if (!regex.exactMatch(part))
- return false;
-
- return true;
- }
-
- /*!
- \fn QDBusUtil::isValidSignature(const QString &signature)
- Returns true if \a signature is a valid D-Bus type signature for one or more types.
- This function returns true if it can all of \a signature into valid, individual types and no
- characters remain in \a signature.
-
- \sa isValidSingleSignature()
- */
- bool isValidSignature(const QString &signature)
- {
- return dbus_signature_validate(signature.toUtf8(), 0);
- }
-
- /*!
- \fn QDBusUtil::isValidSingleSignature(const QString &signature)
- Returns true if \a signature is a valid D-Bus type signature for exactly one full type. This
- function tries to convert the type signature into a D-Bus type and, if it succeeds and no
- characters remain in the signature, it returns true.
- */
- bool isValidSingleSignature(const QString &signature)
- {
- return dbus_signature_validate_single(signature.toUtf8(), 0);
- }
-
- /*!
- \fn QDBusUtil::signatureToType(const QString &signature)
- Returns the Qt meta type id for the given D-Bus signature for exactly one full type, given
- by \a signature.
-
- \sa isValidSingleSignature(), typeToSignature(), QVariant::type(), QVariant::userType()
- */
- QVariant::Type signatureToType(const QString &signature)
- {
- return QVariant::Type( QDBusType::qvariantType(signature.toLatin1().constData()) );
- }
-
- /*!
- \fn QDBusUtil::typeToSignature(QVariant::Type type)
- Returns the D-Bus signature equivalent to the supplied meta type id \a type.
-
- \sa isValidSingleSignature(), signatureToType(), QVariant::type(), QVariant::userType()
- */
- const char *typeToSignature(QVariant::Type type)
- {
- return QDBusType::dbusSignature( type );
- }
-
-} // namespace QDBusUtil
diff --git a/qt/src/qdbusutil.h b/qt/src/qdbusutil.h
deleted file mode 100644
index dd2b4df9..00000000
--- a/qt/src/qdbusutil.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSUTIL_H
-#define QDBUSUTIL_H
-
-#include <QtCore/qstring.h>
-#include <QtCore/qvariant.h>
-
-#include "qdbusmacros.h"
-
-namespace QDBusUtil
-{
- QDBUS_EXPORT bool isValidInterfaceName(const QString &ifaceName);
-
- QDBUS_EXPORT bool isValidUniqueConnectionName(const QString &busName);
-
- QDBUS_EXPORT bool isValidBusName(const QString &busName);
-
- QDBUS_EXPORT bool isValidMemberName(const QString &memberName);
-
- QDBUS_EXPORT bool isValidErrorName(const QString &errorName);
-
- QDBUS_EXPORT bool isValidObjectPath(const QString &path);
-
- QDBUS_EXPORT bool isValidSignature(const QString &signature);
-
- QDBUS_EXPORT bool isValidSingleSignature(const QString &signature);
-
- QDBUS_EXPORT QVariant::Type signatureToType(const QString &signature);
-
- QDBUS_EXPORT const char *typeToSignature(QVariant::Type type);
-}
-
-#endif
diff --git a/qt/src/qdbusxmlgenerator.cpp b/qt/src/qdbusxmlgenerator.cpp
deleted file mode 100644
index 135b8d1c..00000000
--- a/qt/src/qdbusxmlgenerator.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-/* -*- mode: C++ -*-
- *
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qmetaobject.h>
-#include <QtCore/qstringlist.h>
-
-#include "qdbusinterface_p.h" // for ANNOTATION_NO_WAIT
-#include "qdbusabstractadaptor_p.h" // for QCLASSINFO_DBUS_*
-#include "qdbusconnection_p.h" // for the flags
-#include "qdbusutil.h"
-
-extern QDBUS_EXPORT QString qDBusGenerateMetaObjectXml(QString interface, const QMetaObject *mo,
- const QMetaObject *base, int flags);
-
-// implement the D-Bus org.freedesktop.DBus.Introspectable interface
-// we do that by analysing the metaObject of all the adaptor interfaces
-
-static QString generateInterfaceXml(const QMetaObject *mo, int flags, int methodOffset, int propOffset)
-{
- QString retval;
-
- // start with properties:
- if (flags & QDBusConnection::ExportProperties) {
- for (int i = propOffset; i < mo->propertyCount(); ++i) {
- static const char *accessvalues[] = {0, "read", "write", "readwrite"};
-
- QMetaProperty mp = mo->property(i);
-
- if (!mp.isScriptable() && (flags & QDBusConnection::ExportAllProperties) !=
- QDBusConnection::ExportAllProperties)
- continue;
-
- int access = 0;
- if (mp.isReadable())
- access |= 1;
- if (mp.isWritable())
- access |= 2;
-
- int typeId = qDBusNameToTypeId(mp.typeName());
- if (!typeId)
- continue;
-
- retval += QString(QLatin1String(" <property name=\"%1\" type=\"%2\" access=\"%3\" />\n"))
- .arg(QLatin1String(mp.name()))
- .arg(QLatin1String( QDBusUtil::typeToSignature( QVariant::Type(typeId) )))
- .arg(QLatin1String( accessvalues[access] ));
- }
- }
-
- // now add methods:
- for (int i = methodOffset; i < mo->methodCount(); ++i) {
- QMetaMethod mm = mo->method(i);
- QByteArray signature = mm.signature();
- int paren = signature.indexOf('(');
-
- bool isSignal;
- if (mm.methodType() == QMetaMethod::Signal)
- // adding a signal
- isSignal = true;
- else if (mm.methodType() == QMetaMethod::Slot && mm.access() == QMetaMethod::Public)
- isSignal = false;
- else
- continue; // neither signal nor public slot
-
- if ((isSignal && !(flags & QDBusConnection::ExportSignals)) ||
- (!isSignal && !(flags & QDBusConnection::ExportSlots)))
- continue;
-
- QString xml = QString(QLatin1String(" <%1 name=\"%2\">\n"))
- .arg(isSignal ? QLatin1String("signal") : QLatin1String("method"))
- .arg(QLatin1String(signature.left(paren)));
-
- // check the return type first
- int typeId = qDBusNameToTypeId(mm.typeName());
- if (typeId)
- xml += QString(QLatin1String(" <arg type=\"%1\" direction=\"out\"/>\n"))
- .arg(QLatin1String(QDBusUtil::typeToSignature( QVariant::Type(typeId) )));
- else if (*mm.typeName())
- continue; // wasn't a valid type
-
- QList<QByteArray> names = mm.parameterNames();
- QList<int> types;
- int inputCount = qDBusParametersForMethod(mm, types);
- if (inputCount == -1)
- continue; // invalid form
- if (isSignal && inputCount + 1 != types.count())
- continue; // signal with output arguments?
- if (isSignal && types.at(inputCount) == QDBusConnectionPrivate::messageMetaType)
- continue; // signal with QDBusMessage argument?
-
- int j;
- bool isScriptable = mm.attributes() & QMetaMethod::Scriptable;
- for (j = 1; j < types.count(); ++j) {
- // input parameter for a slot or output for a signal
- if (types.at(j) == QDBusConnectionPrivate::messageMetaType) {
- isScriptable = true;
- continue;
- }
-
- QString name;
- if (!names.at(j - 1).isEmpty())
- name = QString(QLatin1String("name=\"%1\" ")).arg(QLatin1String(names.at(j - 1)));
-
- bool isOutput = isSignal || j > inputCount;
-
- xml += QString(QLatin1String(" <arg %1type=\"%2\" direction=\"%3\"/>\n"))
- .arg(name)
- .arg(QLatin1String(QDBusUtil::typeToSignature( QVariant::Type(types.at(j)) )))
- .arg(isOutput ? QLatin1String("out") : QLatin1String("in"));
- }
-
- if (!isScriptable) {
- // check if this was added by other means
- if (isSignal && (flags & QDBusConnection::ExportAllSignals) != QDBusConnection::ExportAllSignals)
- continue;
- if (!isSignal && (flags & QDBusConnection::ExportAllSlots) != QDBusConnection::ExportAllSlots)
- continue;
- }
-
- if (qDBusCheckAsyncTag(mm.tag()))
- // add the no-reply annotation
- xml += QLatin1String(" <annotation name=\"" ANNOTATION_NO_WAIT "\""
- " value=\"true\"/>\n");
-
- retval += xml;
- retval += QString(QLatin1String(" </%1>\n"))
- .arg(isSignal ? QLatin1String("signal") : QLatin1String("method"));
- }
-
- return retval;
-}
-
-QString qDBusGenerateMetaObjectXml(QString interface, const QMetaObject *mo, const QMetaObject *base,
- int flags)
-{
- if (interface.isEmpty()) {
- // generate the interface name from the meta object
- int idx = mo->indexOfClassInfo(QCLASSINFO_DBUS_INTERFACE);
- if (idx >= mo->classInfoOffset()) {
- interface = QLatin1String(mo->classInfo(idx).value());
- } else {
- interface = QLatin1String(mo->className());
- interface.replace(QLatin1String("::"), QLatin1String("."));
-
- if (interface.startsWith( QLatin1String("QDBus") )) {
- interface.prepend( QLatin1String("com.trolltech.QtDBus.") );
- } else if (interface.startsWith( QLatin1Char('Q') ) &&
- interface.length() >= 2 && interface.at(1).isUpper()) {
- // assume it's Qt
- interface.prepend( QLatin1String("com.trolltech.Qt.") );
- } else if (!QCoreApplication::instance() ||
- QCoreApplication::instance()->applicationName().isEmpty()) {
- interface.prepend( QLatin1String("local.") );
- } else {
- interface.prepend(QLatin1Char('.')).prepend( QCoreApplication::instance()->applicationName() );
- QStringList domainName =
- QCoreApplication::instance()->organizationDomain().split(QLatin1Char('.'),
- QString::SkipEmptyParts);
- if (domainName.isEmpty())
- interface.prepend("local.");
- else
- foreach (const QString &part, domainName)
- interface.prepend(QLatin1Char('.')).prepend(part);
- }
- }
- }
-
- QString xml;
- int idx = mo->indexOfClassInfo(QCLASSINFO_DBUS_INTROSPECTION);
- if (idx >= mo->classInfoOffset())
- return QString::fromUtf8(mo->classInfo(idx).value());
- else
- xml = generateInterfaceXml(mo, flags, base->methodCount(), base->propertyCount());
-
- if (xml.isEmpty())
- return QString(); // don't add an empty interface
- return QString(QLatin1String(" <interface name=\"%1\">\n%2 </interface>\n"))
- .arg(interface, xml);
-}
diff --git a/qt/src/qdbusxmlparser.cpp b/qt/src/qdbusxmlparser.cpp
deleted file mode 100644
index 359967bf..00000000
--- a/qt/src/qdbusxmlparser.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2005 Thiago Macieira <thiago@kde.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "qdbusxmlparser_p.h"
-#include "qdbusinterface.h"
-#include "qdbusinterface_p.h"
-#include "qdbusconnection_p.h"
-#include "qdbusutil.h"
-
-#include <QtXml/qdom.h>
-#include <QtCore/qmap.h>
-#include <QtCore/qvariant.h>
-#include <QtCore/qtextstream.h>
-
-static QDBusIntrospection::Annotations
-parseAnnotations(const QDomElement& elem)
-{
- QDBusIntrospection::Annotations retval;
- QDomNodeList list = elem.elementsByTagName(QLatin1String("annotation"));
- for (int i = 0; i < list.count(); ++i)
- {
- QDomElement ann = list.item(i).toElement();
- if (ann.isNull())
- continue;
-
- QString name = ann.attribute(QLatin1String("name")),
- value = ann.attribute(QLatin1String("value"));
-
- if (!QDBusUtil::isValidInterfaceName(name)) {
- qWarning("Invalid D-BUS annotation '%s' found while parsing introspection",
- qPrintable(name));
- continue;
- }
-
- retval.insert(name, value);
- }
-
- return retval;
-}
-
-static QDBusIntrospection::Arguments
-parseArgs(const QDomElement& elem, const QLatin1String& direction, bool acceptEmpty = false)
-{
- QDBusIntrospection::Arguments retval;
- QDomNodeList list = elem.elementsByTagName(QLatin1String("arg"));
- for (int i = 0; i < list.count(); ++i)
- {
- QDomElement arg = list.item(i).toElement();
- if (arg.isNull())
- continue;
-
- if ((acceptEmpty && !arg.hasAttribute(QLatin1String("direction"))) ||
- arg.attribute(QLatin1String("direction")) == direction) {
-
- QDBusIntrospection::Argument argData;
- if (arg.hasAttribute(QLatin1String("name")))
- argData.name = arg.attribute(QLatin1String("name")); // can be empty
- argData.type = arg.attribute(QLatin1String("type"));
- if (!QDBusUtil::isValidSingleSignature(argData.type)) {
- qWarning("Invalid D-BUS type signature '%s' found while parsing introspection",
- qPrintable(argData.type));
- continue;
- }
-
- retval << argData;
- }
- }
- return retval;
-}
-
-QDBusXmlParser::QDBusXmlParser(const QString& service, const QString& path,
- const QString& xmlData)
- : m_service(service), m_path(path)
-{
- QDomDocument doc;
- doc.setContent(xmlData);
- m_node = doc.firstChildElement(QLatin1String("node"));
-}
-
-QDBusXmlParser::QDBusXmlParser(const QString& service, const QString& path,
- const QDomElement& node)
- : m_service(service), m_path(path), m_node(node)
-{
-}
-
-QDBusIntrospection::Interfaces
-QDBusXmlParser::interfaces() const
-{
- QDBusIntrospection::Interfaces retval;
-
- if (m_node.isNull())
- return retval;
-
- QDomNodeList interfaceList = m_node.elementsByTagName(QLatin1String("interface"));
- for (int i = 0; i < interfaceList.count(); ++i)
- {
- QDomElement iface = interfaceList.item(i).toElement();
- QString ifaceName = iface.attribute(QLatin1String("name"));
- if (iface.isNull())
- continue; // for whatever reason
- if (!QDBusUtil::isValidInterfaceName(ifaceName)) {
- qWarning("Invalid D-BUS interface name '%s' found while parsing introspection",
- qPrintable(ifaceName));
- continue;
- }
-
- QDBusIntrospection::Interface *ifaceData = new QDBusIntrospection::Interface;
- ifaceData->name = ifaceName;
- {
- // save the data
- QTextStream ts(&ifaceData->introspection);
- iface.save(ts,2);
- }
-
- // parse annotations
- ifaceData->annotations = parseAnnotations(iface);
-
- // parse methods
- QDomNodeList list = iface.elementsByTagName(QLatin1String("method"));
- for (int j = 0; j < list.count(); ++j)
- {
- QDomElement method = list.item(j).toElement();
- QString methodName = method.attribute(QLatin1String("name"));
- if (method.isNull())
- continue;
- if (!QDBusUtil::isValidMemberName(methodName)) {
- qWarning("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
- qPrintable(methodName), qPrintable(ifaceName));
- continue;
- }
-
- QDBusIntrospection::Method methodData;
- methodData.name = methodName;
-
- // parse arguments
- methodData.inputArgs = parseArgs(method, QLatin1String("in"));
- methodData.outputArgs = parseArgs(method, QLatin1String("out"));
- methodData.annotations = parseAnnotations(method);
-
- // add it
- ifaceData->methods.insert(methodName, methodData);
- }
-
- // parse signals
- list = iface.elementsByTagName(QLatin1String("signal"));
- for (int j = 0; j < list.count(); ++j)
- {
- QDomElement signal = list.item(j).toElement();
- QString signalName = signal.attribute(QLatin1String("name"));
- if (signal.isNull())
- continue;
- if (!QDBusUtil::isValidMemberName(signalName)) {
- qWarning("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
- qPrintable(signalName), qPrintable(ifaceName));
- continue;
- }
-
- QDBusIntrospection::Signal signalData;
- signalData.name = signalName;
-
- // parse data
- signalData.outputArgs = parseArgs(signal, QLatin1String("out"), true);
- signalData.annotations = parseAnnotations(signal);
-
- // add it
- ifaceData->signals_.insert(signalName, signalData);
- }
-
- // parse properties
- list = iface.elementsByTagName(QLatin1String("property"));
- for (int j = 0; j < list.count(); ++j)
- {
- QDomElement property = list.item(j).toElement();
- QString propertyName = property.attribute(QLatin1String("name"));
- if (property.isNull())
- continue;
- if (!QDBusUtil::isValidMemberName(propertyName)) {
- qWarning("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
- qPrintable(propertyName), qPrintable(ifaceName));
- continue;
- }
-
- QDBusIntrospection::Property propertyData;
-
- // parse data
- propertyData.name = propertyName;
- propertyData.type = property.attribute(QLatin1String("type"));
- propertyData.annotations = parseAnnotations(property);
-
- if (!QDBusUtil::isValidSingleSignature(propertyData.type)) {
- // cannot be!
- qWarning("Invalid D-BUS type signature '%s' found in property '%s.%s' while parsing introspection",
- qPrintable(propertyData.type), qPrintable(ifaceName),
- qPrintable(propertyName));
- continue;
- }
-
- QString access = property.attribute(QLatin1String("access"));
- if (access == QLatin1String("read"))
- propertyData.access = QDBusIntrospection::Property::Read;
- else if (access == QLatin1String("write"))
- propertyData.access = QDBusIntrospection::Property::Write;
- else if (access == QLatin1String("readwrite"))
- propertyData.access = QDBusIntrospection::Property::ReadWrite;
- else {
- qWarning("Invalid D-BUS property access '%s' found in property '%s.%s' while parsing introspection",
- qPrintable(access), qPrintable(ifaceName),
- qPrintable(propertyName));
- continue; // invalid one!
- }
-
- // add it
- ifaceData->properties.insert(propertyName, propertyData);
- }
-
- // add it
- retval.insert(ifaceName, QSharedDataPointer<QDBusIntrospection::Interface>(ifaceData));
- }
-
- return retval;
-}
-
-QSharedDataPointer<QDBusIntrospection::Object>
-QDBusXmlParser::object() const
-{
- if (m_node.isNull())
- return QSharedDataPointer<QDBusIntrospection::Object>();
-
- QDBusIntrospection::Object* objData;
- objData = new QDBusIntrospection::Object;
- objData->service = m_service;
- objData->path = m_path;
-
- // check if we have anything to process
- if (objData->introspection.isNull() && !m_node.firstChild().isNull()) {
- // yes, introspect this object
- QTextStream ts(&objData->introspection);
- m_node.save(ts,2);
-
- QDomNodeList objects = m_node.elementsByTagName(QLatin1String("node"));
- for (int i = 0; i < objects.count(); ++i) {
- QDomElement obj = objects.item(i).toElement();
- QString objName = obj.attribute(QLatin1String("name"));
- if (obj.isNull())
- continue; // for whatever reason
- if (!QDBusUtil::isValidObjectPath(m_path + QLatin1Char('/') + objName)) {
- qWarning("Invalid D-BUS object path '%s/%s' found while parsing introspection",
- qPrintable(m_path), qPrintable(objName));
- continue;
- }
-
- objData->childObjects.append(objName);
- }
-
- QDomNodeList interfaceList = m_node.elementsByTagName(QLatin1String("interface"));
- for (int i = 0; i < interfaceList.count(); ++i) {
- QDomElement iface = interfaceList.item(i).toElement();
- QString ifaceName = iface.attribute(QLatin1String("name"));
- if (iface.isNull())
- continue;
- if (!QDBusUtil::isValidInterfaceName(ifaceName)) {
- qWarning("Invalid D-BUS interface name '%s' found while parsing introspection",
- qPrintable(ifaceName));
- continue;
- }
-
- objData->interfaces.append(ifaceName);
- }
- } else {
- objData->introspection = QLatin1String("<node/>\n");
- }
-
- QSharedDataPointer<QDBusIntrospection::Object> retval;
- retval = objData;
- return retval;
-}
-
-QSharedDataPointer<QDBusIntrospection::ObjectTree>
-QDBusXmlParser::objectTree() const
-{
- QSharedDataPointer<QDBusIntrospection::ObjectTree> retval;
-
- if (m_node.isNull())
- return retval;
-
- retval = new QDBusIntrospection::ObjectTree;
-
- retval->service = m_service;
- retval->path = m_path;
-
- QTextStream ts(&retval->introspection);
- m_node.save(ts,2);
-
- // interfaces are easy:
- retval->interfaceData = interfaces();
- retval->interfaces = retval->interfaceData.keys();
-
- // sub-objects are slightly more difficult:
- QDomNodeList objects = m_node.elementsByTagName(QLatin1String("node"));
- for (int i = 0; i < objects.count(); ++i) {
- QDomElement obj = objects.item(i).toElement();
- QString objName = obj.attribute(QLatin1String("name"));
- if (obj.isNull() || objName.isEmpty())
- continue; // for whatever reason
-
- // check if we have anything to process
- if (!obj.firstChild().isNull()) {
- // yes, introspect this object
- QString xml;
- QTextStream ts2(&xml);
- obj.save(ts2,0);
-
- // parse it
- QString objAbsName = m_path;
- if (!objAbsName.endsWith(QLatin1Char('/')))
- objAbsName.append(QLatin1Char('/'));
- objAbsName += objName;
-
- QDBusXmlParser parser(m_service, objAbsName, obj);
- retval->childObjectData.insert(objName, parser.objectTree());
- }
-
- retval->childObjects << objName;
- }
-
- return QSharedDataPointer<QDBusIntrospection::ObjectTree>( retval );
-}
-
diff --git a/qt/src/qdbusxmlparser_p.h b/qt/src/qdbusxmlparser_p.h
deleted file mode 100644
index 8f4f69b1..00000000
--- a/qt/src/qdbusxmlparser_p.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- C++ -*-
- *
- * Copyright (C) 2005 Thiago Macieira <thiago@kde.org>
- * Copyright (C) 2006 Trolltech AS. All rights reserved.
- * Author: Thiago Macieira <thiago.macieira@trolltech.com>
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef QDBUSXMLPARSER_H
-#define QDBUSXMLPARSER_H
-
-#include <QtCore/qmap.h>
-#include <QtXml/qdom.h>
-#include "qdbusmacros.h"
-#include "qdbusintrospection_p.h"
-
-/*!
- \internal
-*/
-class QDBusXmlParser
-{
- QString m_service;
- QString m_path;
- QDomElement m_node;
-
-public:
- QDBusXmlParser(const QString& service, const QString& path,
- const QString& xmlData);
- QDBusXmlParser(const QString& service, const QString& path,
- const QDomElement& node);
-
- QDBusIntrospection::Interfaces interfaces() const;
- QSharedDataPointer<QDBusIntrospection::Object> object() const;
- QSharedDataPointer<QDBusIntrospection::ObjectTree> objectTree() const;
-};
-
-#endif