/*
 * Copyright (C) 2017~2017 by CSSlayer
 * wengxt@gmail.com
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above Copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above Copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the authors nor the names of its contributors
 *    may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 */

#include <QDBusMetaType>

#include "fcitxqtdbustypes.h"

void FcitxFormattedPreedit::registerMetaType() {
    qRegisterMetaType<FcitxFormattedPreedit>("FcitxFormattedPreedit");
    qDBusRegisterMetaType<FcitxFormattedPreedit>();
    qRegisterMetaType<FcitxFormattedPreeditList>("FcitxFormattedPreeditList");
    qDBusRegisterMetaType<FcitxFormattedPreeditList>();
}

qint32 FcitxFormattedPreedit::format() const { return m_format; }

const QString &FcitxFormattedPreedit::string() const { return m_string; }

void FcitxFormattedPreedit::setFormat(qint32 format) { m_format = format; }

void FcitxFormattedPreedit::setString(const QString &str) { m_string = str; }

bool FcitxFormattedPreedit::operator==(
    const FcitxFormattedPreedit &preedit) const {
    return (preedit.m_format == m_format) && (preedit.m_string == m_string);
}

QDBusArgument &operator<<(QDBusArgument &argument,
                          const FcitxFormattedPreedit &preedit) {
    argument.beginStructure();
    argument << preedit.string();
    argument << preedit.format();
    argument.endStructure();
    return argument;
}

const QDBusArgument &operator>>(const QDBusArgument &argument,
                                FcitxFormattedPreedit &preedit) {
    QString str;
    qint32 format;
    argument.beginStructure();
    argument >> str >> format;
    argument.endStructure();
    preedit.setString(str);
    preedit.setFormat(format);
    return argument;
}

void FcitxInputContextArgument::registerMetaType() {
    qRegisterMetaType<FcitxInputContextArgument>("FcitxInputContextArgument");
    qDBusRegisterMetaType<FcitxInputContextArgument>();
    qRegisterMetaType<FcitxInputContextArgumentList>(
        "FcitxInputContextArgumentList");
    qDBusRegisterMetaType<FcitxInputContextArgumentList>();
}

const QString &FcitxInputContextArgument::name() const { return m_name; }

void FcitxInputContextArgument::setName(const QString &name) { m_name = name; }

const QString &FcitxInputContextArgument::value() const { return m_value; }

void FcitxInputContextArgument::setValue(const QString &value) {
    m_value = value;
}

QDBusArgument &operator<<(QDBusArgument &argument,
                          const FcitxInputContextArgument &arg) {
    argument.beginStructure();
    argument << arg.name();
    argument << arg.value();
    argument.endStructure();
    return argument;
}

const QDBusArgument &operator>>(const QDBusArgument &argument,
                                FcitxInputContextArgument &arg) {
    QString name, value;
    argument.beginStructure();
    argument >> name >> value;
    argument.endStructure();
    arg.setName(name);
    arg.setValue(value);
    return argument;
}
