* 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.
This commit is contained in:
Thiago Macieira 2006-04-23 19:04:53 +00:00
parent bed69341bb
commit 4eb5b11af7
9 changed files with 97 additions and 29 deletions

View file

@ -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

View 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() { }
};

View 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;

View file

@ -172,7 +172,7 @@ protected:
private:
QDBusMetaObject *findMetaObject(const QString &service, const QString &path,
QString &interface);
const QString &interface);
public slots:
// public slots

View 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);
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
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"));
}
}
return p;
}
QDBusMetaObject *
QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &path,
QString &interface)
const QString &interface)
{
if (!interface.isEmpty()) {
QReadLocker locker(&lock);

View 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))
{
}

View 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

View 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

View 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()