qdbusmarshaller.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 518 行 · 第 1/2 页

CPP
518
字号
        case DBUS_TYPE_DICT_ENTRY:            sub.closeCode = 0;            break;        case DBUS_TYPE_STRUCT:            *ba += DBUS_STRUCT_BEGIN_CHAR;            sub.closeCode = DBUS_STRUCT_END_CHAR;            break;        }    else        dbus_message_iter_open_container(&iterator, code, signature, &sub.iterator);}QDBusMarshaller *QDBusMarshaller::beginCommon(int code, const char *signature){    QDBusMarshaller *d = new QDBusMarshaller;    open(*d, code, signature);    return d;}inline QDBusMarshaller *QDBusMarshaller::endStructure(){ return endCommon(); }inline QDBusMarshaller *QDBusMarshaller::endArray(){ return endCommon(); }inline QDBusMarshaller *QDBusMarshaller::endMap(){ return endCommon(); }inline QDBusMarshaller *QDBusMarshaller::endMapEntry(){ return endCommon(); }QDBusMarshaller *QDBusMarshaller::endCommon(){    QDBusMarshaller *retval = parent;    delete this;    return retval;}void QDBusMarshaller::close(){    if (ba) {        if (closeCode)            *ba += closeCode;    } else if (parent) {        dbus_message_iter_close_container(&parent->iterator, &iterator);    }}void QDBusMarshaller::error(){    ok = false;    if (parent)        parent->error();}bool QDBusMarshaller::appendVariantInternal(const QVariant &arg){    int id = arg.userType();    if (id == QVariant::Invalid) {        qWarning("QDBusMarshaller: cannot add an invalid QVariant");        error();        return false;    }    // intercept QDBusArgument parameters here    if (id == qMetaTypeId<QDBusArgument>()) {        QDBusArgument dbusargument = qvariant_cast<QDBusArgument>(arg);        QDBusArgumentPrivate *d = QDBusArgumentPrivate::d(dbusargument);        if (!d->message)            return false;       // can't append this one...        QDBusDemarshaller demarshaller;        demarshaller.message = dbus_message_ref(d->message);        if (d->direction == Demarshalling) {            // it's demarshalling; just copy            demarshaller.iterator = static_cast<QDBusDemarshaller *>(d)->iterator;        } else {            // it's marshalling; start over            if (!dbus_message_iter_init(demarshaller.message, &demarshaller.iterator))                return false;   // error!        }        return appendCrossMarshalling(&demarshaller);    }    const char *signature = QDBusMetaType::typeToSignature( QVariant::Type(id) );    if (!signature) {        qWarning("QDBusMarshaller: type `%s' (%d) is not registered with D-BUS. "                 "Use qDBusRegisterMetaType to register it",                 QVariant::typeToName( QVariant::Type(id) ), id);        error();        return false;    }    switch (*signature) {#ifdef __OPTIMIZE__    case DBUS_TYPE_BYTE:    case DBUS_TYPE_BOOLEAN:    case DBUS_TYPE_INT16:    case DBUS_TYPE_UINT16:    case DBUS_TYPE_INT32:    case DBUS_TYPE_UINT32:    case DBUS_TYPE_INT64:    case DBUS_TYPE_UINT64:    case DBUS_TYPE_DOUBLE:        qIterAppend(&iterator, ba, *signature, arg.constData());        return true;    case DBUS_TYPE_STRING:    case DBUS_TYPE_OBJECT_PATH:    case DBUS_TYPE_SIGNATURE: {        const QByteArray data =            reinterpret_cast<const QString *>(arg.constData())->toUtf8();        const char *rawData = data.constData();        qIterAppend(&iterator, ba, *signature, &rawData);        return true;    }#else    case DBUS_TYPE_BYTE:        append( qvariant_cast<uchar>(arg) );        return true;    case DBUS_TYPE_BOOLEAN:        append( arg.toBool() );        return true;    case DBUS_TYPE_INT16:        append( qvariant_cast<short>(arg) );        return true;    case DBUS_TYPE_UINT16:        append( qvariant_cast<ushort>(arg) );        return true;    case DBUS_TYPE_INT32:        append( static_cast<dbus_int32_t>(arg.toInt()) );        return true;    case DBUS_TYPE_UINT32:        append( static_cast<dbus_uint32_t>(arg.toUInt()) );        return true;    case DBUS_TYPE_INT64:        append( arg.toLongLong() );        return true;    case DBUS_TYPE_UINT64:        append( arg.toULongLong() );        return true;    case DBUS_TYPE_DOUBLE:        append( arg.toDouble() );        return true;    case DBUS_TYPE_STRING:        append( arg.toString() );        return true;    case DBUS_TYPE_OBJECT_PATH:        append( qvariant_cast<QDBusObjectPath>(arg) );        return true;    case DBUS_TYPE_SIGNATURE:        append( qvariant_cast<QDBusSignature>(arg) );        return true;#endif    // compound types:    case DBUS_TYPE_VARIANT:        // nested QVariant        return append( qvariant_cast<QDBusVariant>(arg) );    case DBUS_TYPE_ARRAY:        // could be many things        // find out what kind of array it is        switch (arg.type()) {        case QVariant::StringList:            append( arg.toStringList() );            return true;        case QVariant::ByteArray:            append( arg.toByteArray() );            return true;        default:            ;                   // fall through        }        // fall through    case DBUS_TYPE_STRUCT:    case DBUS_STRUCT_BEGIN_CHAR:        return appendRegisteredType( arg );    case DBUS_TYPE_DICT_ENTRY:    case DBUS_DICT_ENTRY_BEGIN_CHAR:        qFatal("QDBusMarshaller::appendVariantInternal got a DICT_ENTRY!");        return false;    default:        qWarning("QDBusMarshaller::appendVariantInternal: Found unknown D-BUS type '%s'",                 signature);        return false;    }    return true;}bool QDBusMarshaller::appendRegisteredType(const QVariant &arg){    ref.ref();                  // reference up    QDBusArgument self(QDBusArgumentPrivate::create(this));    return QDBusMetaType::marshall(self, arg.userType(), arg.constData());}bool QDBusMarshaller::appendCrossMarshalling(QDBusDemarshaller *demarshaller){    int code = dbus_message_iter_get_arg_type(&demarshaller->iterator);    if (dbus_type_is_basic(code)) {        // easy: just append        // do exactly like the D-BUS docs suggest        // (see apidocs for dbus_message_iter_get_basic)        qlonglong value;        dbus_message_iter_get_basic(&demarshaller->iterator, &value);        dbus_message_iter_next(&demarshaller->iterator);        dbus_message_iter_append_basic(&iterator, code, &value);        return true;    }    if (code == DBUS_TYPE_ARRAY) {        int element = dbus_message_iter_get_element_type(&demarshaller->iterator);        if (dbus_type_is_fixed(element)) {            // another optimisation: fixed size arrays            // code is exactly like QDBusDemarshaller::toByteArray            DBusMessageIter sub;            dbus_message_iter_recurse(&demarshaller->iterator, &sub);            dbus_message_iter_next(&demarshaller->iterator);            int len = dbus_message_iter_get_array_len(&sub);            void* data;            dbus_message_iter_get_fixed_array(&sub,&data,&len);            char signature[2] = { element, 0 };            dbus_message_iter_open_container(&iterator, DBUS_TYPE_ARRAY, signature, &sub);            dbus_message_iter_append_fixed_array(&sub, element, &data, len);            dbus_message_iter_close_container(&iterator, &sub);            return true;        }    }    // We have to recurse    QDBusDemarshaller *drecursed = demarshaller->beginCommon();    QDBusMarshaller mrecursed;  // create on the stack makes it autoclose    open(mrecursed, code, drecursed->currentSignature().toLatin1());    while (!drecursed->atEnd()) {        if (!mrecursed.appendCrossMarshalling(drecursed)) {            delete drecursed;            return false;        }    }    delete drecursed;    return true;}

⌨️ 快捷键说明

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