#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) |
| bool qDBusCheckAsyncTag | ( | const char * | tag | ) |
Definition at line 33 of file qdbusmisc.cpp.
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:

1.5.1