]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
* qt/qdbusconnection_p.h:
authorThiago Macieira <thiago@kde.org>
Sun, 23 Apr 2006 19:04:53 +0000 (19:04 +0000)
committerThiago Macieira <thiago@kde.org>
Sun, 23 Apr 2006 19:04:53 +0000 (19:04 +0000)
* qt/qdbusmetaobject.cpp:
* qt/qdbusmetaobject_p.h:
* qt/qdbusintegrator.cpp: Use the new merged-interface mode
for the dynamic meta object. No need to guess which
interface to call.
* qt/qdbusabstractinterface_p.h:
* qt/qdbusconnection.cpp:
* qt/qdbusintegrator.cpp:
* qt/qdbusinterface.cpp:
* qt/qdbusinterface.h: Make findInterface always return a non-null pointer.
Add a QDBusRef that looks and behaves like DCOPRef.

ChangeLog
qt/qdbusabstractinterface_p.h
qt/qdbusconnection.cpp
qt/qdbusconnection_p.h
qt/qdbusintegrator.cpp
qt/qdbusinterface.cpp
qt/qdbusinterface.h
qt/qdbusmetaobject.cpp
qt/qdbusmetaobject_p.h

index 9b52b8b8767cefceba8f1e9646e52ccc3d720137..75f598bd81b2affee95883145a342c10fd1c0ce1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2006-04-23  Thiago Macieira  <thiago.macieira@trolltech.com>
+
+       * qt/qdbusconnection_p.h:
+       * qt/qdbusmetaobject.cpp:
+       * qt/qdbusmetaobject_p.h:
+       * qt/qdbusintegrator.cpp: Use the new merged-interface mode
+       for the dynamic meta object. No need to guess which
+       interface to call.
+       * qt/qdbusabstractinterface_p.h:
+       * qt/qdbusconnection.cpp:
+       * qt/qdbusintegrator.cpp:
+       * qt/qdbusinterface.cpp:
+       * qt/qdbusinterface.h: Make findInterface always return a non-null pointer.
+       Add a QDBusRef that looks and behaves like DCOPRef.
+
 2006-04-23  Thiago Macieira  <thiago.macieira@trolltech.com>
 
        * dbus/dbus-connection.c: Interfaces are optional in method
index 38cc42215da447d88d33383938589469e5670b66..8f4d8dc341d8fd62aff294d823e2c2bb051038ed 100644 (file)
@@ -55,10 +55,11 @@ public:
     QString path;
     QString interface;
     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)
+        : conn(con), connp(conp), service(serv), path(p), interface(iface), isValid(true)
     { }
     virtual ~QDBusAbstractInterfacePrivate() { }
 };
index 668cef5ad1fa1d07c3fabe9c22744d9aa5b8c74a..52875a07efa86c7bc63d988679a729f90836cb22 100644 (file)
@@ -614,8 +614,6 @@ QDBusInterface *QDBusConnection::findInterface(const QString& service, const QSt
         return 0;
     
     QDBusInterfacePrivate *p = d->findInterface(service, path, interface);
-    if (!p)
-        return 0;
     QDBusInterface *retval = new QDBusInterface(p);
     retval->setParent(d);
     return retval;
index 53cb4361943bf3cc8217444a496fe548bd27bd93..36f21db7446bb83ddba7ebd76b393d01fe310b3c 100644 (file)
@@ -172,7 +172,7 @@ protected:
 
 private:
     QDBusMetaObject *findMetaObject(const QString &service, const QString &path,
-                                    QString &interface);        
+                                    const QString &interface);        
 
 public slots:
     // public slots
index 4a72d197a185b8fcdf4aed4b798a02c92571c52f..4dabd435231c5d4f751781d703403f4b5fb80495 100644 (file)
@@ -1474,27 +1474,44 @@ QDBusConnectionPrivate::findInterface(const QString &service,
                                       const QString &path,
                                       const QString &interface)
 {
-    
-    if (!connection || !QDBusUtil::isValidObjectPath(path))
-        return 0;
-    if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface))
-        return 0;
-
     // check if it's there first -- FIXME: add binding mode
+    QDBusMetaObject *mo = 0;
     QString owner = getNameOwner(service);
-    if (owner.isEmpty())
-        return 0;
+    if (connection && !owner.isEmpty() && QDBusUtil::isValidObjectPath(path) &&
+        (interface.isEmpty() || QDBusUtil::isValidInterfaceName(interface)))
+        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));
+            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));
+            else
+                p->lastError = QDBusError(QDBusError::Other, QLatin1String("Unknown error"));
+        }
+    }
 
-    QString tmp(interface);
-    QDBusMetaObject *mo = findMetaObject(owner, path, tmp);
-    if (mo)
-        return new QDBusInterfacePrivate(QDBusConnection(name), this, owner, path, tmp, mo);
-    return 0;                   // error has been set
+    return p;
 }
 
 QDBusMetaObject *
 QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &path,
-                                       QString &interface)
+                                       const QString &interface)
 {
     if (!interface.isEmpty()) {
         QReadLocker locker(&lock);
index e0d1049ce64f342cf80e4fe6cf218ef8759476b5..ff8fdc95fa86f9b4b4512cbf87512e1f929f905e 100644 (file)
@@ -63,7 +63,7 @@ QDBusInterface::~QDBusInterface()
 */
 const QMetaObject *QDBusInterface::metaObject() const
 {
-    return d_func()->metaObject;
+    return d_func()->isValid ? d_func()->metaObject : &QDBusAbstractInterface::staticMetaObject;
 }
 
 /*!
@@ -87,7 +87,7 @@ void *QDBusInterface::qt_metacast(const char *_clname)
 int QDBusInterface::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
 {
     _id = QDBusAbstractInterface::qt_metacall(_c, _id, _a);
-    if (_id < 0)
+    if (_id < 0 || !d_func()->isValid)
         return _id;
     return d_func()->metacall(_c, _id, _a);
 }
@@ -238,3 +238,14 @@ int QDBusInterfacePrivate::metacall(QMetaObject::Call c, int id, void **argv)
     return id;
 }
 
+QDBusRef::QDBusRef(QDBusConnection &conn, const QString &service, const QString &path,
+                   const QString &interface)
+    : d(conn.findInterface(service, path, interface))
+{
+}
+
+QDBusRef::QDBusRef(const QString &service, const QString &path, const QString &interface)
+    : d(QDBus::sessionBus().findInterface(service, path, interface))
+{
+}
+
index 0495ada1a0bcfe62278d0e4b0f602f812c12018b..f667698b58db77c8d59853a8168dfd1217a7d485 100644 (file)
@@ -43,4 +43,16 @@ private:
     Q_DECLARE_PRIVATE(QDBusInterface);
 };
 
+struct QDBUS_EXPORT QDBusRef
+{
+    QDBusRef(QDBusConnection &conn, const QString &service, const QString &path,
+             const QString &interface = QString());
+    QDBusRef(const QString &service, const QString &path, const QString &interface = QString());
+    ~QDBusRef() { delete d; }
+
+    QDBusInterface* operator->() const { return d; }
+private:
+    QDBusInterface *const d;
+};
+
 #endif
index ccc38652a7fd2a0c1d77b3895fab5dc06e5b1bb1..2992c70307636301b0d6b419d0f7807ead715a39 100644 (file)
@@ -437,7 +437,7 @@ void QDBusMetaObjectGenerator::writeWithoutXml(const QString &interface)
 /////////
 // class QDBusMetaObject
 
-QDBusMetaObject *QDBusMetaObject::createMetaObject(QString &interface, const QString &xml,
+QDBusMetaObject *QDBusMetaObject::createMetaObject(const QString &interface, const QString &xml,
                                                    QHash<QString, QDBusMetaObject *> &cache,
                                                    QDBusError &error)
 {
@@ -462,15 +462,9 @@ QDBusMetaObject *QDBusMetaObject::createMetaObject(QString &interface, const QSt
 
         }
 
-        if (it.key() == interface) {
+        if (it.key() == interface)
             // it's us
             we = obj;
-        } else if (interface.isEmpty() &&
-                 !it.key().startsWith(QLatin1String("org.freedesktop.DBus."))) {
-            // also us
-            we = obj;
-            interface = it.key();
-        }
     }
 
     if (we)
@@ -484,6 +478,26 @@ QDBusMetaObject *QDBusMetaObject::createMetaObject(QString &interface, const QSt
         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
index c62c9727b6c1ee6463e04638321b0f3d87c58f71..7d6c5caa4612841716586a55c638f69ac45d9a89 100644 (file)
@@ -46,7 +46,7 @@ struct QDBUS_EXPORT QDBusMetaObject: public QMetaObject
 {
     bool cached;
 
-    static QDBusMetaObject *createMetaObject(QString &interface, const QString &xml,
+    static QDBusMetaObject *createMetaObject(const QString &interface, const QString &xml,
                                              QHash<QString, QDBusMetaObject *> &map,
                                              QDBusError &error);
     ~QDBusMetaObject()