⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qdbusdemarshaller.cpp

📁 QT 开发环境里面一个很重要的文件
💻 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 "qdbusargument_p.h"#include <stdlib.h>template <typename T>static inline T qIterGet(DBusMessageIter *it){    T t;    dbus_message_iter_get_basic(it, &t);    dbus_message_iter_next(it);    return t;}QDBusDemarshaller::~QDBusDemarshaller(){    if (message)        dbus_message_unref(message);}inline QString QDBusDemarshaller::currentSignature(){    char *sig = dbus_message_iter_get_signature(&iterator);    QString retval = QString::fromUtf8(sig);    free(sig);    return retval;}inline uchar QDBusDemarshaller::toByte(){    return qIterGet<uchar>(&iterator);}inline bool QDBusDemarshaller::toBool(){    return bool(qIterGet<dbus_bool_t>(&iterator));}inline ushort QDBusDemarshaller::toUShort(){    return qIterGet<dbus_uint16_t>(&iterator);}inline short QDBusDemarshaller::toShort(){    return qIterGet<dbus_int16_t>(&iterator);}inline int QDBusDemarshaller::toInt(){    return qIterGet<dbus_int32_t>(&iterator);}inline uint QDBusDemarshaller::toUInt(){    return qIterGet<dbus_uint32_t>(&iterator);}inline qlonglong QDBusDemarshaller::toLongLong(){    return qlonglong(qIterGet<dbus_int64_t>(&iterator));}inline qulonglong QDBusDemarshaller::toULongLong(){    return qulonglong(qIterGet<dbus_uint64_t>(&iterator));}inline double QDBusDemarshaller::toDouble(){    return qIterGet<double>(&iterator);}inline QString QDBusDemarshaller::toString(){    return QString::fromUtf8(qIterGet<char *>(&iterator));}inline QDBusObjectPath QDBusDemarshaller::toObjectPath(){    return QDBusObjectPath(QString::fromUtf8(qIterGet<char *>(&iterator)));}inline QDBusSignature QDBusDemarshaller::toSignature(){    return QDBusSignature(QString::fromUtf8(qIterGet<char *>(&iterator)));}inline QDBusVariant QDBusDemarshaller::toVariant(){    QDBusDemarshaller sub;    sub.message = dbus_message_ref(message);    dbus_message_iter_recurse(&iterator, &sub.iterator);    dbus_message_iter_next(&iterator);    return QDBusVariant( sub.toVariantInternal() );}QVariant QDBusDemarshaller::toVariantInternal(){    switch (dbus_message_iter_get_arg_type(&iterator)) {    case DBUS_TYPE_BYTE:        return qVariantFromValue(toByte());    case DBUS_TYPE_INT16:	return qVariantFromValue(toShort());    case DBUS_TYPE_UINT16:	return qVariantFromValue(toUShort());    case DBUS_TYPE_INT32:        return toInt();    case DBUS_TYPE_UINT32:        return toUInt();    case DBUS_TYPE_DOUBLE:        return toDouble();    case DBUS_TYPE_BOOLEAN:        return toBool();    case DBUS_TYPE_INT64:        return toLongLong();    case DBUS_TYPE_UINT64:        return toULongLong();    case DBUS_TYPE_STRING:        return toString();    case DBUS_TYPE_OBJECT_PATH:        return qVariantFromValue(toObjectPath());    case DBUS_TYPE_SIGNATURE:        return qVariantFromValue(toSignature());    case DBUS_TYPE_VARIANT:        return qVariantFromValue(toVariant());    case DBUS_TYPE_ARRAY:        switch (dbus_message_iter_get_element_type(&iterator)) {        case DBUS_TYPE_BYTE:            // QByteArray            return toByteArray();        case DBUS_TYPE_STRING:            return toStringList();        case DBUS_TYPE_DICT_ENTRY:            return qVariantFromValue(duplicate());        default:            return qVariantFromValue(duplicate());        }    case DBUS_TYPE_STRUCT:        return qVariantFromValue(duplicate());    default:        qWarning("QDDBusDemarshaller: Found unknown D-DBUS type %d '%c'",                 dbus_message_iter_get_arg_type(&iterator),                 dbus_message_iter_get_arg_type(&iterator));        return QVariant();        break;    };}QStringList QDBusDemarshaller::toStringList(){    QStringList list;    QDBusDemarshaller sub;    dbus_message_iter_recurse(&iterator, &sub.iterator);    dbus_message_iter_next(&iterator);    while (!sub.atEnd())        list.append(sub.toString());    return list;}QByteArray QDBusDemarshaller::toByteArray(){    DBusMessageIter sub;    dbus_message_iter_recurse(&iterator, &sub);    dbus_message_iter_next(&iterator);    int len = dbus_message_iter_get_array_len(&sub);    char* data;    dbus_message_iter_get_fixed_array(&sub,&data,&len);    return QByteArray(data,len);}bool QDBusDemarshaller::atEnd(){    // dbus_message_iter_has_next is broken if the list has one single element    return dbus_message_iter_get_arg_type(&iterator) == DBUS_TYPE_INVALID;}inline QDBusDemarshaller *QDBusDemarshaller::beginStructure(){    return beginCommon();}inline QDBusDemarshaller *QDBusDemarshaller::beginArray(){    return beginCommon();}inline QDBusDemarshaller *QDBusDemarshaller::beginMap(){    return beginCommon();}inline QDBusDemarshaller *QDBusDemarshaller::beginMapEntry(){    return beginCommon();}QDBusDemarshaller *QDBusDemarshaller::beginCommon(){    QDBusDemarshaller *d = new QDBusDemarshaller;    d->parent = this;    d->message = dbus_message_ref(message);    // recurse    dbus_message_iter_recurse(&iterator, &d->iterator);    dbus_message_iter_next(&iterator);    return d;}inline QDBusDemarshaller *QDBusDemarshaller::endStructure(){    return endCommon();}inline QDBusDemarshaller *QDBusDemarshaller::endArray(){    return endCommon();}inline QDBusDemarshaller *QDBusDemarshaller::endMap(){    return endCommon();}inline QDBusDemarshaller *QDBusDemarshaller::endMapEntry(){    return endCommon();}QDBusDemarshaller *QDBusDemarshaller::endCommon(){    QDBusDemarshaller *retval = parent;    delete this;    return retval;}QDBusArgument QDBusDemarshaller::duplicate(){    QDBusDemarshaller *d = new QDBusDemarshaller;    d->iterator = iterator;    d->message = dbus_message_ref(message);    dbus_message_iter_next(&iterator);    return QDBusArgumentPrivate::create(d);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -