* 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 9b52b8b..75f598b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 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
         calls, so don't give up if the interface parameter is NULL.
        Patch reviewed by Havoc Pennington.
index 38cc422..8f4d8dc 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 668cef5..52875a0 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 53cb436..36f21db 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 4a72d19..4dabd43 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 e0d1049..ff8fdc9 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 0495ada..f667698 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 ccc3865..2992c70 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 c62c972..7d6c5ca 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()