📄 qdbusmisc.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the tools applications of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <string.h>#include <QtCore/qvariant.h>#include <QtCore/qmetaobject.h>#include "qdbusutil_p.h"#include "qdbusconnection_p.h"#include "qdbusmetatype_p.h"bool qDBusCheckAsyncTag(const char *tag){ static const char noReplyTag[] = "Q_NOREPLY"; if (!tag || !*tag) return false; const char *p = strstr(tag, noReplyTag); if (p != NULL && (p == tag || *(p-1) == ' ') && (p[sizeof noReplyTag] == '\0' || p[sizeof noReplyTag] == ' ')) return true; return false;}int qDBusNameToTypeId(const char *name){ int id = static_cast<int>( QVariant::nameToType(name) ); if (id == QVariant::UserType) id = QMetaType::type(name); return id;}// calculates the metatypes for the method// the slot must have the parameters in the following form:// - zero or more value or const-ref parameters of any kind// - zero or one const ref of QDBusMessage// - zero or more non-const ref parameters// No parameter may be a template.// this function returns -1 if the parameters don't match the above form// this function returns the number of *input* parameters, including the QDBusMessage one if any// this function does not check the return type, so metaTypes[0] is always 0 and always present// metaTypes.count() >= retval + 1 in all cases//// sig must be the normalised signature for the methodint qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes){ QDBusMetaTypeId::init(); QList<QByteArray> parameterTypes = mm.parameterTypes(); metaTypes.clear(); metaTypes.append(0); // return type int inputCount = 0; bool seenMessage = false; QList<QByteArray>::ConstIterator it = parameterTypes.constBegin(); QList<QByteArray>::ConstIterator end = parameterTypes.constEnd(); for ( ; it != end; ++it) { const QByteArray &type = *it; if (type.endsWith('*')) { //qWarning("Could not parse the method '%s'", mm.signature()); // pointer? return -1; } if (type.endsWith('&')) { QByteArray basictype = type; basictype.truncate(type.length() - 1); int id = qDBusNameToTypeId(basictype); if (id == 0) { //qWarning("Could not parse the method '%s'", mm.signature()); // invalid type in method parameter list return -1; } else if (QDBusMetaType::typeToSignature(id) == 0) return -1; metaTypes.append( id ); seenMessage = true; // it cannot appear anymore anyways continue; } if (seenMessage) { // && !type.endsWith('&') //qWarning("Could not parse the method '%s'", mm.signature()); // non-output parameters after message or after output params return -1; // not allowed } int id = qDBusNameToTypeId(type); if (id == 0) { //qWarning("Could not parse the method '%s'", mm.signature()); // invalid type in method parameter list return -1; } if (id == QDBusMetaTypeId::message) seenMessage = true; else if (QDBusMetaType::typeToSignature(id) == 0) return -1; metaTypes.append(id); ++inputCount; } return inputCount;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -