1 /*
2  * SPDX-FileCopyrightText: 2012~2017 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include <QDBusMetaType>
9 
10 #include "fcitxqtdbustypes.h"
11 
12 namespace fcitx {
13 
14 #define FCITX5_QT_DEFINE_DBUS_TYPE(TYPE)                                       \
15     qRegisterMetaType<TYPE>(#TYPE);                                            \
16     qDBusRegisterMetaType<TYPE>();                                             \
17     qRegisterMetaType<TYPE##List>(#TYPE "List");                               \
18     qDBusRegisterMetaType<TYPE##List>();
19 
registerFcitxQtDBusTypes()20 void registerFcitxQtDBusTypes() {
21     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtFormattedPreedit);
22     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtStringKeyValue);
23     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtInputMethodEntry);
24     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtLayoutInfo);
25     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtVariantInfo);
26     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtConfigOption);
27     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtConfigType);
28     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtAddonInfo);
29     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtAddonState);
30     FCITX5_QT_DEFINE_DBUS_TYPE(FcitxQtAddonInfoV2);
31 }
32 
operator ==(const FcitxQtFormattedPreedit & preedit) const33 bool FcitxQtFormattedPreedit::operator==(
34     const FcitxQtFormattedPreedit &preedit) const {
35     return (preedit.format_ == format_) && (preedit.string_ == string_);
36 }
37 
operator <<(QDBusArgument & argument,const FcitxQtFormattedPreedit & preedit)38 QDBusArgument &operator<<(QDBusArgument &argument,
39                           const FcitxQtFormattedPreedit &preedit) {
40     argument.beginStructure();
41     argument << preedit.string();
42     argument << preedit.format();
43     argument.endStructure();
44     return argument;
45 }
46 
operator >>(const QDBusArgument & argument,FcitxQtFormattedPreedit & preedit)47 const QDBusArgument &operator>>(const QDBusArgument &argument,
48                                 FcitxQtFormattedPreedit &preedit) {
49     QString str;
50     qint32 format;
51     argument.beginStructure();
52     argument >> str >> format;
53     argument.endStructure();
54     preedit.setString(str);
55     preedit.setFormat(format);
56     return argument;
57 }
58 
operator <<(QDBusArgument & argument,const FcitxQtStringKeyValue & arg)59 QDBusArgument &operator<<(QDBusArgument &argument,
60                           const FcitxQtStringKeyValue &arg) {
61     argument.beginStructure();
62     argument << arg.key();
63     argument << arg.value();
64     argument.endStructure();
65     return argument;
66 }
67 
operator >>(const QDBusArgument & argument,FcitxQtStringKeyValue & arg)68 const QDBusArgument &operator>>(const QDBusArgument &argument,
69                                 FcitxQtStringKeyValue &arg) {
70     QString key, value;
71     argument.beginStructure();
72     argument >> key >> value;
73     argument.endStructure();
74     arg.setKey(key);
75     arg.setValue(value);
76     return argument;
77 }
78 
operator <<(QDBusArgument & argument,const FcitxQtInputMethodEntry & arg)79 QDBusArgument &operator<<(QDBusArgument &argument,
80                           const FcitxQtInputMethodEntry &arg) {
81     argument.beginStructure();
82     argument << arg.uniqueName();
83     argument << arg.name();
84     argument << arg.nativeName();
85     argument << arg.icon();
86     argument << arg.label();
87     argument << arg.languageCode();
88     argument << arg.configurable();
89     argument.endStructure();
90     return argument;
91 }
92 
operator >>(const QDBusArgument & argument,FcitxQtInputMethodEntry & arg)93 const QDBusArgument &operator>>(const QDBusArgument &argument,
94                                 FcitxQtInputMethodEntry &arg) {
95     QString uniqueName, name, nativeName, icon, label, languageCode;
96     bool configurable;
97     argument.beginStructure();
98     argument >> uniqueName >> name >> nativeName >> icon >> label >>
99         languageCode >> configurable;
100     argument.endStructure();
101     arg.setUniqueName(uniqueName);
102     arg.setName(name);
103     arg.setNativeName(nativeName);
104     arg.setIcon(icon);
105     arg.setLabel(label);
106     arg.setLanguageCode(languageCode);
107     arg.setConfigurable(configurable);
108     return argument;
109 }
110 
operator <<(QDBusArgument & argument,const FcitxQtVariantInfo & arg)111 QDBusArgument &operator<<(QDBusArgument &argument,
112                           const FcitxQtVariantInfo &arg) {
113     argument.beginStructure();
114     argument << arg.variant();
115     argument << arg.description();
116     argument << arg.languages();
117     argument.endStructure();
118     return argument;
119 }
120 
operator >>(const QDBusArgument & argument,FcitxQtVariantInfo & arg)121 const QDBusArgument &operator>>(const QDBusArgument &argument,
122                                 FcitxQtVariantInfo &arg) {
123     QString variant, description;
124     QStringList languages;
125     argument.beginStructure();
126     argument >> variant >> description >> languages;
127     argument.endStructure();
128     arg.setVariant(variant);
129     arg.setDescription(description);
130     arg.setLanguages(languages);
131     return argument;
132 }
133 
operator <<(QDBusArgument & argument,const FcitxQtLayoutInfo & arg)134 QDBusArgument &operator<<(QDBusArgument &argument,
135                           const FcitxQtLayoutInfo &arg) {
136     argument.beginStructure();
137     argument << arg.layout();
138     argument << arg.description();
139     argument << arg.languages();
140     argument << arg.variants();
141     argument.endStructure();
142     return argument;
143 }
144 
operator >>(const QDBusArgument & argument,FcitxQtLayoutInfo & arg)145 const QDBusArgument &operator>>(const QDBusArgument &argument,
146                                 FcitxQtLayoutInfo &arg) {
147     QString layout, description;
148     QStringList languages;
149     FcitxQtVariantInfoList variants;
150     argument.beginStructure();
151     argument >> layout >> description >> languages >> variants;
152     argument.endStructure();
153     arg.setLayout(layout);
154     arg.setDescription(description);
155     arg.setLanguages(languages);
156     arg.setVariants(variants);
157     return argument;
158 }
159 
operator <<(QDBusArgument & argument,const FcitxQtConfigOption & arg)160 QDBusArgument &operator<<(QDBusArgument &argument,
161                           const FcitxQtConfigOption &arg) {
162     argument.beginStructure();
163     argument << arg.name();
164     argument << arg.type();
165     argument << arg.description();
166     argument << arg.defaultValue();
167     argument << arg.properties();
168     argument.endStructure();
169     return argument;
170 }
171 
operator >>(const QDBusArgument & argument,FcitxQtConfigOption & arg)172 const QDBusArgument &operator>>(const QDBusArgument &argument,
173                                 FcitxQtConfigOption &arg) {
174     QString name, description, type;
175     QDBusVariant defaultValue;
176     QVariantMap properties;
177     argument.beginStructure();
178     argument >> name >> type >> description >> defaultValue >> properties;
179     argument.endStructure();
180     arg.setName(name);
181     arg.setType(type);
182     arg.setDescription(description);
183     arg.setDefaultValue(defaultValue);
184     arg.setProperties(properties);
185     return argument;
186 }
187 
operator <<(QDBusArgument & argument,const FcitxQtConfigType & arg)188 QDBusArgument &operator<<(QDBusArgument &argument,
189                           const FcitxQtConfigType &arg) {
190     argument.beginStructure();
191     argument << arg.name();
192     argument << arg.options();
193     argument.endStructure();
194     return argument;
195 }
196 
operator >>(const QDBusArgument & argument,FcitxQtConfigType & arg)197 const QDBusArgument &operator>>(const QDBusArgument &argument,
198                                 FcitxQtConfigType &arg) {
199     QString name;
200     FcitxQtConfigOptionList options;
201     argument.beginStructure();
202     argument >> name >> options;
203     argument.endStructure();
204     arg.setName(name);
205     arg.setOptions(options);
206     return argument;
207 }
208 
operator <<(QDBusArgument & argument,const FcitxQtAddonInfo & arg)209 QDBusArgument &operator<<(QDBusArgument &argument,
210                           const FcitxQtAddonInfo &arg) {
211     argument.beginStructure();
212     argument << arg.uniqueName();
213     argument << arg.name();
214     argument << arg.comment();
215     argument << arg.category();
216     argument << arg.configurable();
217     argument << arg.enabled();
218     argument.endStructure();
219     return argument;
220 }
221 
operator >>(const QDBusArgument & argument,FcitxQtAddonInfo & arg)222 const QDBusArgument &operator>>(const QDBusArgument &argument,
223                                 FcitxQtAddonInfo &arg) {
224     QString uniqueName, name, comment;
225     int category;
226     bool configurable, enabled;
227     argument.beginStructure();
228     argument >> uniqueName >> name >> comment >> category >> configurable >>
229         enabled;
230     argument.endStructure();
231     arg.setUniqueName(uniqueName);
232     arg.setName(name);
233     arg.setComment(comment);
234     arg.setCategory(category);
235     arg.setConfigurable(configurable);
236     arg.setEnabled(enabled);
237     return argument;
238 }
239 
operator <<(QDBusArgument & argument,const FcitxQtAddonInfoV2 & arg)240 QDBusArgument &operator<<(QDBusArgument &argument,
241                           const FcitxQtAddonInfoV2 &arg) {
242     argument.beginStructure();
243     argument << arg.uniqueName();
244     argument << arg.name();
245     argument << arg.comment();
246     argument << arg.category();
247     argument << arg.configurable();
248     argument << arg.enabled();
249     argument << arg.onDemand();
250     argument << arg.dependencies();
251     argument << arg.optionalDependencies();
252     argument.endStructure();
253     return argument;
254 }
255 
operator >>(const QDBusArgument & argument,FcitxQtAddonInfoV2 & arg)256 const QDBusArgument &operator>>(const QDBusArgument &argument,
257                                 FcitxQtAddonInfoV2 &arg) {
258     QString uniqueName, name, comment;
259     int category;
260     bool configurable, enabled, onDemand;
261     QStringList dependencies, optionalDependencies;
262     argument.beginStructure();
263     argument >> uniqueName >> name >> comment >> category >> configurable >>
264         enabled >> onDemand >> dependencies >> optionalDependencies;
265     argument.endStructure();
266     arg.setUniqueName(uniqueName);
267     arg.setName(name);
268     arg.setComment(comment);
269     arg.setCategory(category);
270     arg.setConfigurable(configurable);
271     arg.setEnabled(enabled);
272     arg.setOnDemand(onDemand);
273     arg.setDependencies(dependencies);
274     arg.setOptionalDependencies(optionalDependencies);
275     return argument;
276 }
277 
operator <<(QDBusArgument & argument,const FcitxQtAddonState & arg)278 QDBusArgument &operator<<(QDBusArgument &argument,
279                           const FcitxQtAddonState &arg) {
280     argument.beginStructure();
281     argument << arg.uniqueName();
282     argument << arg.enabled();
283     argument.endStructure();
284     return argument;
285 }
286 
operator >>(const QDBusArgument & argument,FcitxQtAddonState & arg)287 const QDBusArgument &operator>>(const QDBusArgument &argument,
288                                 FcitxQtAddonState &arg) {
289     QString uniqueName;
290     bool enabled;
291     argument.beginStructure();
292     argument >> uniqueName >> enabled;
293     argument.endStructure();
294     arg.setUniqueName(uniqueName);
295     arg.setEnabled(enabled);
296     return argument;
297 }
298 } // namespace fcitx
299