IBus: Implement QDBusArgument serialization operators

Task-number: QTBUG-37540
Change-Id: Idbe952dbd9851dde2c4aee0662d845996bf0c36a
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
bb10
Trung Ngo 2014-03-16 02:00:02 +07:00 committed by The Qt Project
parent db665477e9
commit 52b802cc66
4 changed files with 135 additions and 51 deletions

View File

@ -41,7 +41,9 @@
#include <qpa/qplatforminputcontextplugin_p.h>
#include <QtCore/QStringList>
#include <QDBusMetaType>
#include "qibusplatforminputcontext.h"
#include "qibustypes.h"
QT_BEGIN_NAMESPACE
@ -58,8 +60,13 @@ QIBusPlatformInputContext *QIbusPlatformInputContextPlugin::create(const QString
{
Q_UNUSED(paramList);
if (system.compare(system, QStringLiteral("ibus"), Qt::CaseInsensitive) == 0)
if (system.compare(system, QStringLiteral("ibus"), Qt::CaseInsensitive) == 0) {
qDBusRegisterMetaType<QIBusSerializable>();
qDBusRegisterMetaType<QIBusAttribute>();
qDBusRegisterMetaType<QIBusAttributeList>();
qDBusRegisterMetaType<QIBusText>();
return new QIBusPlatformInputContext;
}
return 0;
}

View File

@ -191,7 +191,7 @@ void QIBusPlatformInputContext::commitText(const QDBusVariant &text)
QIBusText t;
if (debug)
qDebug() << arg.currentSignature();
t.fromDBusArgument(arg);
arg >> t;
if (debug)
qDebug() << "commit text:" << t.text;
@ -211,7 +211,7 @@ void QIBusPlatformInputContext::updatePreeditText(const QDBusVariant &text, uint
const QDBusArgument arg = text.variant().value<QDBusArgument>();
QIBusText t;
t.fromDBusArgument(arg);
arg >> t;
if (debug)
qDebug() << "preedit text:" << t.text;

View File

@ -42,6 +42,7 @@
#include "qibustypes.h"
#include <qtextformat.h>
#include <QtDBus>
#include <QHash>
QT_BEGIN_NAMESPACE
@ -53,23 +54,45 @@ QIBusSerializable::~QIBusSerializable()
{
}
void QIBusSerializable::fromDBusArgument(const QDBusArgument &arg)
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusSerializable &object)
{
arg >> name;
arg.beginMap();
while (!arg.atEnd()) {
arg.beginMapEntry();
argument >> object.name;
argument.beginMap();
while (!argument.atEnd()) {
argument.beginMapEntry();
QString key;
QDBusVariant value;
arg >> key;
arg >> value;
arg.endMapEntry();
attachments[key] = value.variant().value<QDBusArgument>();
argument >> key;
argument >> value;
argument.endMapEntry();
object.attachments[key] = value.variant().value<QDBusArgument>();
}
arg.endMap();
argument.endMap();
return argument;
}
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusSerializable &object)
{
argument << object.name;
argument.beginMap(qMetaTypeId<QString>(), qMetaTypeId<QDBusVariant>());
QHashIterator<QString, QDBusArgument> i(object.attachments);
while (i.hasNext()) {
i.next();
argument.beginMapEntry();
argument << i.key();
QDBusVariant variant(i.value().asVariant());
argument << variant;
argument.endMapEntry();
}
argument.endMap();
return argument;
}
QIBusAttribute::QIBusAttribute()
: type(Invalid),
@ -77,28 +100,46 @@ QIBusAttribute::QIBusAttribute()
start(0),
end(0)
{
name = "IBusAttribute";
}
QIBusAttribute::~QIBusAttribute()
{
}
void QIBusAttribute::fromDBusArgument(const QDBusArgument &arg)
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusAttribute &attribute)
{
// qDebug() << "QIBusAttribute::fromDBusArgument()" << arg.currentSignature();
arg.beginStructure();
argument.beginStructure();
QIBusSerializable::fromDBusArgument(arg);
argument << static_cast<const QIBusSerializable &>(attribute);
quint32 t = (quint32) attribute.type;
argument << t;
argument << attribute.value;
argument << attribute.start;
argument << attribute.end;
argument.endStructure();
return argument;
}
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusAttribute &attribute)
{
argument.beginStructure();
argument >> static_cast<QIBusSerializable &>(attribute);
quint32 t;
arg >> t;
type = (Type)t;
arg >> value;
arg >> start;
arg >> end;
argument >> t;
attribute.type = (QIBusAttribute::Type) t;
argument >> attribute.value;
argument >> attribute.start;
argument >> attribute.end;
arg.endStructure();
argument.endStructure();
return argument;
}
QTextFormat QIBusAttribute::format() const
@ -141,36 +182,53 @@ QTextFormat QIBusAttribute::format() const
return fmt;
}
QIBusAttributeList::QIBusAttributeList()
{
name = "IBusAttrList";
}
QIBusAttributeList::~QIBusAttributeList()
{
}
void QIBusAttributeList::fromDBusArgument(const QDBusArgument &arg)
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusAttributeList &attrList)
{
argument.beginStructure();
argument << static_cast<const QIBusSerializable &>(attrList);
argument.beginArray(qMetaTypeId<QDBusVariant>());
for (int i = 0; i < attrList.attributes.size(); ++i) {
QVariant variant;
variant.setValue(attrList.attributes.at(i));
argument << QDBusVariant (variant);
}
argument.endArray();
argument.endStructure();
return argument;
}
const QDBusArgument &operator>>(const QDBusArgument &arg, QIBusAttributeList &attrList)
{
// qDebug() << "QIBusAttributeList::fromDBusArgument()" << arg.currentSignature();
arg.beginStructure();
QIBusSerializable::fromDBusArgument(arg);
arg >> static_cast<QIBusSerializable &>(attrList);
arg.beginArray();
while(!arg.atEnd()) {
while (!arg.atEnd()) {
QDBusVariant var;
arg >> var;
QIBusAttribute attr;
attr.fromDBusArgument(var.variant().value<QDBusArgument>());
attributes.append(attr);
var.variant().value<QDBusArgument>() >> attr;
attrList.attributes.append(attr);
}
arg.endArray();
arg.endStructure();
return arg;
}
QList<QInputMethodEvent::Attribute> QIBusAttributeList::imAttributes() const
@ -183,30 +241,40 @@ QList<QInputMethodEvent::Attribute> QIBusAttributeList::imAttributes() const
return imAttrs;
}
QIBusText::QIBusText()
{
name = "IBusText";
}
QIBusText::~QIBusText()
{
}
void QIBusText::fromDBusArgument(const QDBusArgument &arg)
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusText &text)
{
argument.beginStructure();
argument << static_cast<const QIBusSerializable &>(text);
argument << text.text << text.attributes;
argument.endStructure();
return argument;
}
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusText &text)
{
// qDebug() << "QIBusText::fromDBusArgument()" << arg.currentSignature();
arg.beginStructure();
argument.beginStructure();
QIBusSerializable::fromDBusArgument(arg);
argument >> static_cast<QIBusSerializable &>(text);
arg >> text;
argument >> text.text;
QDBusVariant variant;
arg >> variant;
attributes.fromDBusArgument(variant.variant().value<QDBusArgument>());
argument >> variant;
variant.variant().value<QDBusArgument>() >> text.attributes;
arg.endStructure();
argument.endStructure();
return argument;
}
QT_END_NAMESPACE

View File

@ -43,19 +43,16 @@
#include <qvector.h>
#include <qevent.h>
#include <QDBusArgument>
QT_BEGIN_NAMESPACE
class QDBusArgument;
class QIBusSerializable
{
public:
QIBusSerializable();
virtual ~QIBusSerializable();
virtual void fromDBusArgument(const QDBusArgument &arg);
QString name;
QHash<QString, QDBusArgument> attachments;
};
@ -81,7 +78,6 @@ public:
QIBusAttribute();
~QIBusAttribute();
void fromDBusArgument(const QDBusArgument &arg);
QTextFormat format() const;
Type type;
@ -96,8 +92,6 @@ public:
QIBusAttributeList();
~QIBusAttributeList();
void fromDBusArgument(const QDBusArgument &arg);
QList<QInputMethodEvent::Attribute> imAttributes() const;
QVector<QIBusAttribute> attributes;
@ -109,12 +103,27 @@ public:
QIBusText();
~QIBusText();
void fromDBusArgument(const QDBusArgument &arg);
QString text;
QIBusAttributeList attributes;
};
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusSerializable &object);
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusSerializable &object);
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusAttribute &attribute);
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusAttribute &attribute);
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusAttributeList &attributeList);
const QDBusArgument &operator>>(const QDBusArgument &arg, QIBusAttributeList &attrList);
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusText &text);
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusText &text);
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QIBusSerializable)
Q_DECLARE_METATYPE(QIBusAttribute)
Q_DECLARE_METATYPE(QIBusAttributeList)
Q_DECLARE_METATYPE(QIBusText)
#endif