tools/qdbus/src/qdbusconnection_p.h File Reference

#include <qdbuserror.h>
#include <qdbusconnection.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>

Include dependency graph for qdbusconnection_p.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  QDBusConnectionPrivate
struct  QDBusConnectionPrivate::Watcher
struct  QDBusConnectionPrivate::SignalHook
struct  QDBusConnectionPrivate::ObjectTreeNode
struct  QDBusConnectionPrivate::ObjectTreeNode::Data
class  QDBusReplyWaiter

Functions

int qDBusParametersForMethod (const QMetaMethod &mm, QList< int > &metaTypes)
int qDBusNameToTypeId (const char *name)
bool qDBusCheckAsyncTag (const char *tag)
QString qDBusIntrospectObject (const QDBusConnectionPrivate::ObjectTreeNode *node)
QDBusMessage qDBusPropertyGet (const QDBusConnectionPrivate::ObjectTreeNode *node, const QDBusMessage &msg)
QDBusMessage qDBusPropertySet (const QDBusConnectionPrivate::ObjectTreeNode *node, const QDBusMessage &msg)


Function Documentation

bool qDBusCheckAsyncTag ( const char *  tag  ) 

Definition at line 33 of file qdbusmisc.cpp.

References NULL, and p.

Referenced by findSlot(), and generateInterfaceXml().

00034 {
00035     static const char noReplyTag[] = "Q_NOREPLY";
00036     if (!tag || !*tag)
00037         return false;
00038 
00039     const char *p = strstr(tag, noReplyTag);
00040     if (p != NULL &&
00041         (p == tag || *(p-1) == ' ') &&
00042         (p[sizeof noReplyTag] == '\0' || p[sizeof noReplyTag] == ' '))
00043         return true;
00044 
00045     return false;
00046 }

QString qDBusIntrospectObject ( const QDBusConnectionPrivate::ObjectTreeNode node  ) 

Definition at line 99 of file qdbusinternalfilters.cpp.

References QDBusAdaptorConnector::adaptors, QString::arg(), QDBusConnectionPrivate::ObjectTreeNode::children, QDBusConnection::ExportAdaptors, QDBusConnection::ExportChildObjects, QDBusConnection::ExportNonScriptableContents, QDBusConnection::ExportScriptableContents, QDBusConnectionPrivate::ObjectTreeNode::flags, QString::fromLatin1(), generateSubObjectXml(), introspectableInterfaceXml, QDBusConnectionPrivate::ObjectTreeNode::obj, propertiesInterfaceXml, qDBusFindAdaptorConnector(), qDBusGenerateMetaObjectXml(), QDBusAbstractAdaptorPrivate::retrieveIntrospectionXml(), QDBusAbstractAdaptorPrivate::saveIntrospectionXml(), and QMetaObject::superClass().

Referenced by QDBusConnectionPrivate::activateInternalFilters(), and qdbus_Introspect::operator()().

00100 {
00101     // object may be null
00102 
00103     QString xml_data(QLatin1String(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE));
00104     xml_data += QLatin1String("<node>\n");
00105 
00106     if (node->obj) {
00107         if (node->flags & (QDBusConnection::ExportScriptableContents
00108                            | QDBusConnection::ExportNonScriptableContents)) {
00109             // create XML for the object itself
00110             const QMetaObject *mo = node->obj->metaObject();
00111             for ( ; mo != &QObject::staticMetaObject; mo = mo->superClass())
00112                 xml_data += qDBusGenerateMetaObjectXml(QString(), mo, mo->superClass(),
00113                                                   node->flags);
00114         }
00115 
00116         // does this object have adaptors?
00117         QDBusAdaptorConnector *connector;
00118         if (node->flags & QDBusConnection::ExportAdaptors &&
00119             (connector = qDBusFindAdaptorConnector(node->obj))) {
00120 
00121             // trasverse every adaptor in this object
00122             QDBusAdaptorConnector::AdaptorMap::ConstIterator it = connector->adaptors.constBegin();
00123             QDBusAdaptorConnector::AdaptorMap::ConstIterator end = connector->adaptors.constEnd();
00124             for ( ; it != end; ++it) {
00125                 // add the interface:
00126                 QString ifaceXml = QDBusAbstractAdaptorPrivate::retrieveIntrospectionXml(it->adaptor);
00127                 if (ifaceXml.isEmpty()) {
00128                     // add the interface's contents:
00129                     ifaceXml += qDBusGenerateMetaObjectXml(QString::fromLatin1(it->interface),
00130                                                            it->adaptor->metaObject(),
00131                                                            &QDBusAbstractAdaptor::staticMetaObject,
00132                                                            QDBusConnection::ExportScriptableContents
00133                                                            | QDBusConnection::ExportNonScriptableContents);
00134 
00135                     QDBusAbstractAdaptorPrivate::saveIntrospectionXml(it->adaptor, ifaceXml);
00136                 }
00137 
00138                 xml_data += ifaceXml;
00139             }
00140         }
00141 
00142         xml_data += QLatin1String( propertiesInterfaceXml );
00143     }
00144 
00145     xml_data += QLatin1String( introspectableInterfaceXml );
00146 
00147     if (node->flags & QDBusConnection::ExportChildObjects) {
00148         xml_data += generateSubObjectXml(node->obj);
00149     } else {
00150         // generate from the object tree
00151         QDBusConnectionPrivate::ObjectTreeNode::DataList::ConstIterator it =
00152             node->children.constBegin();
00153         QDBusConnectionPrivate::ObjectTreeNode::DataList::ConstIterator end =
00154             node->children.constEnd();
00155         for ( ; it != end; ++it) {
00156             const QDBusConnectionPrivate::ObjectTreeNode::Data &entry = *it;
00157             if (entry.node && (entry.node->obj || !entry.node->children.isEmpty()))
00158                 xml_data += QString(QLatin1String("  <node name=\"%1\"/>\n"))
00159                             .arg(entry.name);
00160         }
00161     }
00162 
00163     xml_data += QLatin1String("</node>\n");
00164     return xml_data;
00165 }

Here is the call graph for this function:

int qDBusNameToTypeId ( const char *  name  ) 

Definition at line 48 of file qdbusmisc.cpp.

References QVariant::nameToType(), QMetaType::type(), and QVariant::UserType.

Referenced by findSlot(), generateInterfaceXml(), and qDBusParametersForMethod().

00049 {
00050     int id = static_cast<int>( QVariant::nameToType(name) );
00051     if (id == QVariant::UserType)
00052         id = QMetaType::type(name);
00053     return id;
00054 }

Here is the call graph for this function:

int qDBusParametersForMethod ( const QMetaMethod mm,
QList< int > &  metaTypes 
)

Definition at line 68 of file qdbusmisc.cpp.

References QList< T >::append(), QList< T >::clear(), QList< T >::constBegin(), QList< T >::constEnd(), QDBusMetaTypeId::init(), QDBusMetaTypeId::message, QMetaMethod::parameterTypes(), qDBusNameToTypeId(), type, and QDBusMetaType::typeToSignature().

Referenced by QDBusConnectionPrivate::findSlot(), findSlot(), generateInterfaceXml(), and QDBusAdaptorConnector::relay().

00069 {
00070     QDBusMetaTypeId::init();
00071 
00072     QList<QByteArray> parameterTypes = mm.parameterTypes();
00073     metaTypes.clear();
00074 
00075     metaTypes.append(0);        // return type
00076     int inputCount = 0;
00077     bool seenMessage = false;
00078     QList<QByteArray>::ConstIterator it = parameterTypes.constBegin();
00079     QList<QByteArray>::ConstIterator end = parameterTypes.constEnd();
00080     for ( ; it != end; ++it) {
00081         const QByteArray &type = *it;
00082         if (type.endsWith('*')) {
00083             //qWarning("Could not parse the method '%s'", mm.signature());
00084             // pointer?
00085             return -1;
00086         }
00087 
00088         if (type.endsWith('&')) {
00089             QByteArray basictype = type;
00090             basictype.truncate(type.length() - 1);
00091 
00092             int id = qDBusNameToTypeId(basictype);
00093             if (id == 0) {
00094                 //qWarning("Could not parse the method '%s'", mm.signature());
00095                 // invalid type in method parameter list
00096                 return -1;
00097             } else if (QDBusMetaType::typeToSignature(id) == 0)
00098                 return -1;
00099 
00100             metaTypes.append( id );
00101             seenMessage = true; // it cannot appear anymore anyways
00102             continue;
00103         }
00104 
00105         if (seenMessage) {      // && !type.endsWith('&')
00106             //qWarning("Could not parse the method '%s'", mm.signature());
00107             // non-output parameters after message or after output params
00108             return -1;          // not allowed
00109         }
00110 
00111         int id = qDBusNameToTypeId(type);
00112         if (id == 0) {
00113             //qWarning("Could not parse the method '%s'", mm.signature());
00114             // invalid type in method parameter list
00115             return -1;
00116         }
00117 
00118         if (id == QDBusMetaTypeId::message)
00119             seenMessage = true;
00120         else if (QDBusMetaType::typeToSignature(id) == 0)
00121             return -1;
00122 
00123         metaTypes.append(id);
00124         ++inputCount;
00125     }
00126 
00127     return inputCount;
00128 }

Here is the call graph for this function:

QDBusMessage qDBusPropertyGet ( const QDBusConnectionPrivate::ObjectTreeNode node,
const QDBusMessage msg 
)

Definition at line 177 of file qdbusinternalfilters.cpp.

References QDBusAdaptorConnector::adaptors, QDBusMessage::arguments(), QList< T >::at(), QList< T >::count(), QDBusMessage::createReply(), QDBusConnection::ExportAdaptors, QDBusConnection::ExportNonScriptableProperties, QDBusConnection::ExportScriptableProperties, QDBusConnectionPrivate::ObjectTreeNode::flags, QMetaProperty::isScriptable(), QDBusConnectionPrivate::ObjectTreeNode::obj, QObject::property(), qDBusFindAdaptorConnector(), qDBusPropertyError(), qLowerBound(), QVariant::qVariantFromValue(), QMetaProperty::read(), QVariant::toString(), QString::toUtf8(), and value.

Referenced by QDBusConnectionPrivate::activateInternalFilters().

00179 {
00180     Q_ASSERT(msg.arguments().count() == 2);
00181     QString interface_name = msg.arguments().at(0).toString();
00182     QByteArray property_name = msg.arguments().at(1).toString().toUtf8();
00183 
00184     QDBusAdaptorConnector *connector;
00185     QVariant value;
00186     if (node->flags & QDBusConnection::ExportAdaptors &&
00187         (connector = qDBusFindAdaptorConnector(node->obj))) {
00188 
00189         // find the class that implements interface_name
00190         QDBusAdaptorConnector::AdaptorMap::ConstIterator it;
00191         it = qLowerBound(connector->adaptors.constBegin(), connector->adaptors.constEnd(),
00192                          interface_name);
00193         if (it != connector->adaptors.constEnd() && interface_name == QLatin1String(it->interface))
00194             value = it->adaptor->property(property_name);
00195     }
00196 
00197     if (!value.isValid() && node->flags & (QDBusConnection::ExportScriptableProperties |
00198                                            QDBusConnection::ExportNonScriptableProperties)) {
00199         // try the object itself
00200         int pidx = node->obj->metaObject()->indexOfProperty(property_name);
00201         if (pidx != -1) {
00202             QMetaProperty mp = node->obj->metaObject()->property(pidx);
00203             if ((mp.isScriptable() && (node->flags & QDBusConnection::ExportScriptableProperties)) ||
00204                 (!mp.isScriptable() && (node->flags & QDBusConnection::ExportNonScriptableProperties)))
00205                 value = mp.read(node->obj);
00206         }
00207     }
00208 
00209     if (!value.isValid()) {
00210         // the property was not found
00211         return qDBusPropertyError(msg, interface_name);
00212     }
00213 
00214     return msg.createReply(qVariantFromValue(QDBusVariant(value)));
00215 }

Here is the call graph for this function:

QDBusMessage qDBusPropertySet ( const QDBusConnectionPrivate::ObjectTreeNode node,
const QDBusMessage msg 
)

Definition at line 217 of file qdbusinternalfilters.cpp.

References QDBusAdaptorConnector::adaptors, QDBusMessage::arguments(), QList< T >::at(), QList< T >::count(), QDBusMessage::createReply(), QDBusConnection::ExportAdaptors, QDBusConnection::ExportNonScriptableProperties, QDBusConnection::ExportScriptableProperties, QDBusConnectionPrivate::ObjectTreeNode::flags, QMetaProperty::isScriptable(), QDBusConnectionPrivate::ObjectTreeNode::obj, QObject::property(), qDBusFindAdaptorConnector(), qDBusPropertyError(), qLowerBound(), QVariant::toString(), QString::toUtf8(), value, variant, and QMetaProperty::write().

Referenced by QDBusConnectionPrivate::activateInternalFilters().

00219 {
00220     Q_ASSERT(msg.arguments().count() == 3);
00221     QString interface_name = msg.arguments().at(0).toString();
00222     QByteArray property_name = msg.arguments().at(1).toString().toUtf8();
00223     QVariant value = qvariant_cast<QDBusVariant>(msg.arguments().at(2)).variant();
00224 
00225     QDBusAdaptorConnector *connector;
00226     if (node->flags & QDBusConnection::ExportAdaptors &&
00227         (connector = qDBusFindAdaptorConnector(node->obj))) {
00228 
00229         // find the class that implements interface_name
00230         QDBusAdaptorConnector::AdaptorMap::ConstIterator it;
00231         it = qLowerBound(connector->adaptors.constBegin(), connector->adaptors.constEnd(),
00232                          interface_name);
00233         if (it != connector->adaptors.end() && interface_name == QLatin1String(it->interface))
00234             if (it->adaptor->setProperty(property_name, value))
00235                 return msg.createReply();
00236     }
00237 
00238     if (node->flags & (QDBusConnection::ExportScriptableProperties |
00239                        QDBusConnection::ExportNonScriptableProperties)) {
00240         // try the object itself
00241         int pidx = node->obj->metaObject()->indexOfProperty(property_name);
00242         if (pidx != -1) {
00243             QMetaProperty mp = node->obj->metaObject()->property(pidx);
00244             if ((mp.isScriptable() && (node->flags & QDBusConnection::ExportScriptableProperties)) ||
00245                 (!mp.isScriptable() && (node->flags & QDBusConnection::ExportNonScriptableProperties)))
00246                 if (mp.write(node->obj, value))
00247                     return msg.createReply();
00248         }
00249     }
00250 
00251     // the property was not found or not written to
00252     return qDBusPropertyError(msg, interface_name);
00253 }

Here is the call graph for this function:


Generated on Thu Mar 15 14:32:46 2007 for Qt 4.2 User's Guide by  doxygen 1.5.1