4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) version 3.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with the program; if not, see <http://www.gnu.org/licenses/>
18 * Copyright (C) 2011 Red Hat, Inc. (www.redhat.com)
26 #include "e-data-server-util.h"
28 #include "e-gdbus-templates.h"
30 static GThread *main_thread = NULL;
33 e_gdbus_templates_init_main_thread (void)
36 main_thread = g_thread_self ();
37 } else if (main_thread != g_thread_self ()) {
38 g_warning ("%s: Called in different main thread, stored: %p would use: %p", G_STRFUNC, main_thread, g_thread_self ());
43 e_gdbus_signal_emission_hook_void (GSignalInvocationHint *ihint,
45 const GValue *param_values,
46 const gchar *signal_name,
47 const gchar *iface_name)
50 GDBusConnection *connection;
53 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
56 object = g_value_get_object (¶m_values[0]);
57 path = g_object_get_data (object, "gdbus-codegen-path");
58 connection = g_object_get_data (object, "gdbus-codegen-connection");
59 if (connection == NULL || path == NULL)
62 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, NULL, NULL);
68 e_gdbus_signal_emission_hook_boolean (GSignalInvocationHint *ihint,
70 const GValue *param_values,
71 const gchar *signal_name,
72 const gchar *iface_name)
75 GDBusConnection *connection;
79 GVariantBuilder *builder;
81 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
84 object = g_value_get_object (¶m_values[0]);
85 path = g_object_get_data (object, "gdbus-codegen-path");
86 connection = g_object_get_data (object, "gdbus-codegen-connection");
87 if (connection == NULL || path == NULL)
90 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
91 g_assert_cmpint (n_param_values - 1, ==, 1);
93 item = g_variant_new_boolean (g_value_get_boolean (param_values));
94 g_variant_builder_add_value (builder, item);
96 params = g_variant_builder_end (builder);
97 g_variant_builder_unref (builder);
99 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
105 e_gdbus_signal_emission_hook_string (GSignalInvocationHint *ihint,
106 guint n_param_values,
107 const GValue *param_values,
108 const gchar *signal_name,
109 const gchar *iface_name)
112 GDBusConnection *connection;
116 GVariantBuilder *builder;
118 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
121 object = g_value_get_object (¶m_values[0]);
122 path = g_object_get_data (object, "gdbus-codegen-path");
123 connection = g_object_get_data (object, "gdbus-codegen-connection");
124 if (connection == NULL || path == NULL)
127 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
128 g_assert_cmpint (n_param_values - 1, ==, 1);
130 item = g_variant_new_string (g_value_get_string (param_values));
131 g_variant_builder_add_value (builder, item);
133 params = g_variant_builder_end (builder);
134 g_variant_builder_unref (builder);
136 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
142 e_gdbus_signal_emission_hook_strv (GSignalInvocationHint *ihint,
143 guint n_param_values,
144 const GValue *param_values,
145 const gchar *signal_name,
146 const gchar *iface_name)
149 GDBusConnection *connection;
153 GVariantBuilder *builder;
154 const gchar * const *arg_strv;
156 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
159 object = g_value_get_object (¶m_values[0]);
160 path = g_object_get_data (object, "gdbus-codegen-path");
161 connection = g_object_get_data (object, "gdbus-codegen-connection");
162 if (connection == NULL || path == NULL)
165 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
166 g_assert_cmpint (n_param_values - 1, ==, 1);
168 arg_strv = g_value_get_boxed (param_values);
169 item = g_variant_new_strv (arg_strv, -1);
170 g_variant_builder_add_value (builder, item);
172 params = g_variant_builder_end (builder);
173 g_variant_builder_unref (builder);
175 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
181 e_gdbus_signal_emission_hook_uint (GSignalInvocationHint *ihint,
182 guint n_param_values,
183 const GValue *param_values,
184 const gchar *signal_name,
185 const gchar *iface_name)
188 GDBusConnection *connection;
192 GVariantBuilder *builder;
194 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
197 object = g_value_get_object (¶m_values[0]);
198 path = g_object_get_data (object, "gdbus-codegen-path");
199 connection = g_object_get_data (object, "gdbus-codegen-connection");
200 if (connection == NULL || path == NULL)
203 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
204 g_assert_cmpint (n_param_values - 1, ==, 1);
206 item = g_variant_new_uint32 (g_value_get_uint (param_values));
207 g_variant_builder_add_value (builder, item);
209 params = g_variant_builder_end (builder);
210 g_variant_builder_unref (builder);
212 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
218 e_gdbus_signal_emission_hook_uint_string (GSignalInvocationHint *ihint,
219 guint n_param_values,
220 const GValue *param_values,
221 const gchar *signal_name,
222 const gchar *iface_name)
225 GDBusConnection *connection;
229 GVariantBuilder *builder;
231 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
234 object = g_value_get_object (¶m_values[0]);
235 path = g_object_get_data (object, "gdbus-codegen-path");
236 connection = g_object_get_data (object, "gdbus-codegen-connection");
237 if (connection == NULL || path == NULL)
240 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
241 g_assert_cmpint (n_param_values - 1, ==, 2);
243 item = g_variant_new_uint32 (g_value_get_uint (param_values));
244 g_variant_builder_add_value (builder, item);
246 item = g_variant_new_string (g_value_get_string (param_values));
247 g_variant_builder_add_value (builder, item);
249 params = g_variant_builder_end (builder);
250 g_variant_builder_unref (builder);
252 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
258 e_gdbus_signal_emission_hook_async_void (GSignalInvocationHint *ihint,
259 guint n_param_values,
260 const GValue *param_values,
261 const gchar *signal_name,
262 const gchar *iface_name)
265 GDBusConnection *connection;
269 GVariantBuilder *builder;
272 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
275 object = g_value_get_object (¶m_values[0]);
276 path = g_object_get_data (object, "gdbus-codegen-path");
277 connection = g_object_get_data (object, "gdbus-codegen-connection");
278 if (connection == NULL || path == NULL)
281 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
282 g_assert_cmpint (n_param_values - 1, ==, 2);
284 item = g_variant_new_uint32 (g_value_get_uint (param_values));
285 g_variant_builder_add_value (builder, item);
287 arg_error = g_value_get_boxed (param_values);
289 gchar *dbus_error_name = g_dbus_error_encode_gerror (arg_error);
290 item = g_variant_new_string (dbus_error_name ? dbus_error_name : "");
291 g_variant_builder_add_value (builder, item);
292 item = g_variant_new_string (arg_error->message);
293 g_variant_builder_add_value (builder, item);
294 g_free (dbus_error_name);
296 item = g_variant_new_string ("");
297 g_variant_builder_add_value (builder, item);
298 item = g_variant_new_string ("");
299 g_variant_builder_add_value (builder, item);
303 params = g_variant_builder_end (builder);
304 g_variant_builder_unref (builder);
306 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
312 e_gdbus_signal_emission_hook_async_boolean (GSignalInvocationHint *ihint,
313 guint n_param_values,
314 const GValue *param_values,
315 const gchar *signal_name,
316 const gchar *iface_name)
319 GDBusConnection *connection;
323 GVariantBuilder *builder;
326 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
329 object = g_value_get_object (¶m_values[0]);
330 path = g_object_get_data (object, "gdbus-codegen-path");
331 connection = g_object_get_data (object, "gdbus-codegen-connection");
332 if (connection == NULL || path == NULL)
335 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
336 g_assert_cmpint (n_param_values - 1, ==, 3);
338 item = g_variant_new_uint32 (g_value_get_uint (param_values));
339 g_variant_builder_add_value (builder, item);
341 arg_error = g_value_get_boxed (param_values);
343 gchar *dbus_error_name = g_dbus_error_encode_gerror (arg_error);
344 item = g_variant_new_string (dbus_error_name ? dbus_error_name : "");
345 g_variant_builder_add_value (builder, item);
346 item = g_variant_new_string (arg_error->message);
347 g_variant_builder_add_value (builder, item);
348 g_free (dbus_error_name);
350 /* fake value for easier processing in e_gdbus_proxy_emit_signal() */
351 item = g_variant_new_boolean (FALSE);
352 g_variant_builder_add_value (builder, item);
354 item = g_variant_new_string ("");
355 g_variant_builder_add_value (builder, item);
356 item = g_variant_new_string ("");
357 g_variant_builder_add_value (builder, item);
360 item = g_variant_new_boolean (g_value_get_boolean (param_values));
361 g_variant_builder_add_value (builder, item);
364 params = g_variant_builder_end (builder);
365 g_variant_builder_unref (builder);
367 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
373 e_gdbus_signal_emission_hook_async_string (GSignalInvocationHint *ihint,
374 guint n_param_values,
375 const GValue *param_values,
376 const gchar *signal_name,
377 const gchar *iface_name)
380 GDBusConnection *connection;
384 GVariantBuilder *builder;
387 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
390 object = g_value_get_object (¶m_values[0]);
391 path = g_object_get_data (object, "gdbus-codegen-path");
392 connection = g_object_get_data (object, "gdbus-codegen-connection");
393 if (connection == NULL || path == NULL)
396 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
397 g_assert_cmpint (n_param_values - 1, ==, 3);
399 item = g_variant_new_uint32 (g_value_get_uint (param_values));
400 g_variant_builder_add_value (builder, item);
402 arg_error = g_value_get_boxed (param_values);
404 gchar *dbus_error_name = g_dbus_error_encode_gerror (arg_error);
405 item = g_variant_new_string (dbus_error_name ? dbus_error_name : "");
406 g_variant_builder_add_value (builder, item);
407 item = g_variant_new_string (arg_error->message);
408 g_variant_builder_add_value (builder, item);
409 g_free (dbus_error_name);
411 /* fake value for easier processing in e_gdbus_proxy_emit_signal() */
412 item = g_variant_new_string ("");
413 g_variant_builder_add_value (builder, item);
415 item = g_variant_new_string ("");
416 g_variant_builder_add_value (builder, item);
417 item = g_variant_new_string ("");
418 g_variant_builder_add_value (builder, item);
421 item = g_variant_new_string (g_value_get_string (param_values));
422 g_variant_builder_add_value (builder, item);
425 params = g_variant_builder_end (builder);
426 g_variant_builder_unref (builder);
428 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
434 e_gdbus_signal_emission_hook_async_strv (GSignalInvocationHint *ihint,
435 guint n_param_values,
436 const GValue *param_values,
437 const gchar *signal_name,
438 const gchar *iface_name)
441 GDBusConnection *connection;
445 GVariantBuilder *builder;
446 const GError *arg_error;
447 const gchar * const *arg_strv;
449 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
452 object = g_value_get_object (¶m_values[0]);
453 path = g_object_get_data (object, "gdbus-codegen-path");
454 connection = g_object_get_data (object, "gdbus-codegen-connection");
455 if (connection == NULL || path == NULL)
458 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
459 g_assert_cmpint (n_param_values - 1, ==, 3);
461 item = g_variant_new_uint32 (g_value_get_uint (param_values));
462 g_variant_builder_add_value (builder, item);
464 arg_error = g_value_get_boxed (param_values);
466 const gchar *fake_strv;
467 gchar *dbus_error_name = g_dbus_error_encode_gerror (arg_error);
468 item = g_variant_new_string (dbus_error_name ? dbus_error_name : "");
469 g_variant_builder_add_value (builder, item);
470 item = g_variant_new_string (arg_error->message);
471 g_variant_builder_add_value (builder, item);
472 g_free (dbus_error_name);
474 /* fake value for easier processing in e_gdbus_proxy_emit_signal() */
476 item = g_variant_new_strv (&fake_strv, -1);
477 g_variant_builder_add_value (builder, item);
479 item = g_variant_new_string ("");
480 g_variant_builder_add_value (builder, item);
481 item = g_variant_new_string ("");
482 g_variant_builder_add_value (builder, item);
485 arg_strv = g_value_get_boxed (param_values);
486 item = g_variant_new_strv (arg_strv, -1);
487 g_variant_builder_add_value (builder, item);
490 params = g_variant_builder_end (builder);
491 g_variant_builder_unref (builder);
493 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
499 e_gdbus_signal_emission_hook_async_uint (GSignalInvocationHint *ihint,
500 guint n_param_values,
501 const GValue *param_values,
502 const gchar *signal_name,
503 const gchar *iface_name)
506 GDBusConnection *connection;
510 GVariantBuilder *builder;
513 if (n_param_values < 1 || !G_VALUE_HOLDS (¶m_values[0], G_TYPE_OBJECT))
516 object = g_value_get_object (¶m_values[0]);
517 path = g_object_get_data (object, "gdbus-codegen-path");
518 connection = g_object_get_data (object, "gdbus-codegen-connection");
519 if (connection == NULL || path == NULL)
522 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
523 g_assert_cmpint (n_param_values - 1, ==, 3);
525 item = g_variant_new_uint32 (g_value_get_uint (param_values));
526 g_variant_builder_add_value (builder, item);
528 arg_error = g_value_get_boxed (param_values);
530 gchar *dbus_error_name = g_dbus_error_encode_gerror (arg_error);
531 item = g_variant_new_string (dbus_error_name ? dbus_error_name : "");
532 g_variant_builder_add_value (builder, item);
533 item = g_variant_new_string (arg_error->message);
534 g_variant_builder_add_value (builder, item);
535 g_free (dbus_error_name);
537 /* fake value for easier processing in e_gdbus_proxy_emit_signal() */
538 item = g_variant_new_uint32 (g_value_get_uint (0));
539 g_variant_builder_add_value (builder, item);
541 item = g_variant_new_string ("");
542 g_variant_builder_add_value (builder, item);
543 item = g_variant_new_string ("");
544 g_variant_builder_add_value (builder, item);
547 item = g_variant_new_uint32 (g_value_get_uint (param_values));
548 g_variant_builder_add_value (builder, item);
551 params = g_variant_builder_end (builder);
552 g_variant_builder_unref (builder);
554 g_dbus_connection_emit_signal (connection, NULL, path, iface_name, signal_name, params, NULL);
560 e_gdbus_proxy_emit_signal (GDBusProxy *proxy,
561 GVariant *parameters,
565 gboolean arg_boolean = FALSE;
566 const gchar *arg_const_string = NULL;
567 const gchar **arg_const_strv = NULL;
570 g_return_if_fail (proxy != NULL);
572 if ((signal_type & E_GDBUS_TYPE_IS_ASYNC) != 0) {
573 /* the signal is a done signal, thus opid and error name with error message are first two parameters */
575 const gchar *dbus_error_name = NULL, *dbus_error_message = NULL;
576 GError *arg_error = NULL;
578 signal_type = signal_type & (~E_GDBUS_TYPE_IS_ASYNC);
579 switch (signal_type) {
580 case E_GDBUS_TYPE_VOID:
581 g_variant_get (parameters, "(u&s&s)", &arg_opid, &dbus_error_name, &dbus_error_message);
583 case E_GDBUS_TYPE_BOOLEAN:
584 g_variant_get (parameters, "(u&s&sb)", &arg_opid, &dbus_error_name, &dbus_error_message, &arg_boolean);
586 case E_GDBUS_TYPE_STRING:
587 g_variant_get (parameters, "(u&s&s&s)", &arg_opid, &dbus_error_name, &dbus_error_message, &arg_const_string);
589 case E_GDBUS_TYPE_STRV:
590 /* array is newly allocated, but items are gvariant's */
591 g_variant_get (parameters, "(u&s&s^a&s)", &arg_opid, &dbus_error_name, &dbus_error_message, &arg_const_strv);
593 case E_GDBUS_TYPE_UINT:
594 g_variant_get (parameters, "(u&s&su)", &arg_opid, &dbus_error_name, &dbus_error_message, &arg_uint);
597 /* fix below too, if this is reached */
598 g_warning ("%s: Unknown E_GDBUS_TYPE %x", G_STRFUNC, signal_type);
602 if (dbus_error_name && *dbus_error_name && dbus_error_message)
603 arg_error = g_dbus_error_new_for_dbus_error (dbus_error_name, dbus_error_message);
605 switch (signal_type) {
606 case E_GDBUS_TYPE_VOID:
607 g_signal_emit (proxy, signal_id, 0, arg_opid, arg_error);
609 case E_GDBUS_TYPE_BOOLEAN:
610 g_signal_emit (proxy, signal_id, 0, arg_opid, arg_error, arg_boolean);
612 case E_GDBUS_TYPE_STRING:
613 g_signal_emit (proxy, signal_id, 0, arg_opid, arg_error, arg_const_string);
615 case E_GDBUS_TYPE_STRV:
616 g_signal_emit (proxy, signal_id, 0, arg_opid, arg_error, arg_const_strv);
617 g_free (arg_const_strv);
619 case E_GDBUS_TYPE_UINT:
620 g_signal_emit (proxy, signal_id, 0, arg_opid, arg_error, arg_uint);
625 g_error_free (arg_error);
627 switch (signal_type) {
628 case E_GDBUS_TYPE_VOID:
629 g_signal_emit (proxy, signal_id, 0);
631 case E_GDBUS_TYPE_BOOLEAN:
632 g_variant_get (parameters, "(b)", &arg_boolean);
633 g_signal_emit (proxy, signal_id, 0, arg_boolean);
635 case E_GDBUS_TYPE_STRING:
636 g_variant_get (parameters, "(&s)", &arg_const_string);
637 g_signal_emit (proxy, signal_id, 0, arg_const_string);
639 case E_GDBUS_TYPE_STRV:
640 /* array is newly allocated, but items are gvariant's */
641 g_variant_get (parameters, "(^a&s)", &arg_const_strv);
642 g_signal_emit (proxy, signal_id, 0, arg_const_strv);
643 g_free (arg_const_strv);
645 case E_GDBUS_TYPE_UINT:
646 g_variant_get (parameters, "(u)", &arg_uint);
647 g_signal_emit (proxy, signal_id, 0, arg_uint);
649 case E_GDBUS_TYPE_UINT | E_GDBUS_TYPE_STRING:
650 g_variant_get (parameters, "(u&s)", &arg_uint, &arg_const_string);
651 g_signal_emit (proxy, signal_id, 0, arg_uint, arg_const_string);
654 g_warning ("%s: Unknown E_GDBUS_TYPE %x", G_STRFUNC, signal_type);
661 e_gdbus_stub_handle_method_call (GObject *stub_object,
662 GDBusMethodInvocation *invocation,
663 GVariant *parameters,
664 const gchar *method_name,
668 gboolean handled = FALSE;
669 gboolean arg_boolean = FALSE;
670 const gchar *arg_const_string = NULL;
671 const gchar ** arg_const_strv = NULL;
674 g_return_if_fail (stub_object != NULL);
675 g_return_if_fail (method_name != NULL);
677 switch (method_type & (~E_GDBUS_TYPE_IS_ASYNC)) {
678 case E_GDBUS_TYPE_VOID:
679 g_signal_emit (stub_object, method_id, 0, invocation, &handled);
681 case E_GDBUS_TYPE_BOOLEAN:
682 g_variant_get (parameters, "(b)", &arg_boolean);
683 g_signal_emit (stub_object, method_id, 0, invocation, arg_boolean, &handled);
685 case E_GDBUS_TYPE_STRING:
686 g_variant_get (parameters, "(&s)", &arg_const_string);
687 g_signal_emit (stub_object, method_id, 0, invocation, arg_const_string, &handled);
689 case E_GDBUS_TYPE_STRV:
690 /* array is newly allocated, but items are gvariant's */
691 g_variant_get (parameters, "(^a&s)", &arg_const_strv);
692 g_signal_emit (stub_object, method_id, 0, invocation, arg_const_strv, &handled);
693 g_free (arg_const_strv);
695 case E_GDBUS_TYPE_UINT:
696 g_variant_get (parameters, "(u)", &arg_uint);
697 g_signal_emit (stub_object, method_id, 0, invocation, arg_uint, &handled);
700 g_warning ("%s: Unknown E_GDBUS_TYPE %x", G_STRFUNC, method_type);
705 g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_NOT_SUPPORTED, "Method `%s' is not implemented", method_name);
708 G_DEFINE_INTERFACE (EGdbusAsyncOpKeeper, e_gdbus_async_op_keeper, G_TYPE_OBJECT)
711 e_gdbus_async_op_keeper_default_init (EGdbusAsyncOpKeeperInterface *iface)
716 * e_gdbus_async_op_keeper_create_pending_ops:
717 * @object: a #EGdbusAsyncOpKeeper
719 * Create a hash table of pending async operations. This can be freed
720 * with g_hash_table_unref() in dispose. The interface asks for this
721 * pointer by calling e_gdbus_async_op_keeper_create_pending_ops().
723 * Returns: (transfer full) (element-type gpointer gpointer): hash table of
724 * pending async operations; free with g_hash_table_unref()
727 e_gdbus_async_op_keeper_create_pending_ops (EGdbusAsyncOpKeeper *object)
729 g_return_val_if_fail (object != NULL, NULL);
730 g_return_val_if_fail (E_IS_GDBUS_ASYNC_OP_KEEPER (object), NULL);
732 return g_hash_table_new (g_direct_hash, g_direct_equal);
736 * e_gdbus_async_op_keeper_get_pending_ops:
737 * @object: a #EGdbusAsyncOpKeeper
739 * Get the hash table of pending async operations previously created
740 * by e_gdbus_async_op_keeper_create_pending_ops().
742 * Returns: (transfer none): hash table of pending async operations
745 e_gdbus_async_op_keeper_get_pending_ops (EGdbusAsyncOpKeeper *object)
747 EGdbusAsyncOpKeeperInterface *iface;
749 g_return_val_if_fail (E_IS_GDBUS_ASYNC_OP_KEEPER (object), NULL);
751 iface = E_GDBUS_ASYNC_OP_KEEPER_GET_IFACE (object);
752 g_return_val_if_fail (iface->get_pending_ops != NULL, NULL);
754 return iface->get_pending_ops (object);
757 /* synchronously cancels one operation - sends a request from client to the server */
759 e_gdbus_async_op_keeper_cancel_op_sync (EGdbusAsyncOpKeeper *object,
761 GCancellable *cancellable,
764 EGdbusAsyncOpKeeperInterface *iface;
766 g_return_val_if_fail (E_IS_GDBUS_ASYNC_OP_KEEPER (object), FALSE);
768 iface = E_GDBUS_ASYNC_OP_KEEPER_GET_IFACE (object);
769 g_return_val_if_fail (iface->cancel_op_sync != NULL, FALSE);
771 return iface->cancel_op_sync (object, in_opid, cancellable, error);
774 /* Used to finish asynchronous GDBus call - this might be done in the callback
775 * as soon as possible; method returns to a caller operation ID which was started */
777 e_gdbus_complete_async_method (gpointer object,
778 GDBusMethodInvocation *invocation,
781 g_dbus_method_invocation_return_value (invocation, g_variant_new ("(u)", opid));
784 /* Used to finish synchronous GDBus call - this might be done in the callback
785 * as soon as possible */
787 e_gdbus_complete_sync_method_void (gpointer object,
788 GDBusMethodInvocation *invocation,
792 g_dbus_method_invocation_return_gerror (invocation, error);
794 g_dbus_method_invocation_return_value (invocation, NULL);
798 e_gdbus_complete_sync_method_boolean (gpointer object,
799 GDBusMethodInvocation *invocation,
800 gboolean out_boolean,
804 g_dbus_method_invocation_return_gerror (invocation, error);
806 g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", out_boolean));
810 e_gdbus_complete_sync_method_string (gpointer object,
811 GDBusMethodInvocation *invocation,
812 const gchar *out_string,
816 g_dbus_method_invocation_return_gerror (invocation, error);
818 g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", out_string));
822 e_gdbus_complete_sync_method_strv (gpointer object,
823 GDBusMethodInvocation *invocation,
824 const gchar * const *out_strv,
828 g_dbus_method_invocation_return_gerror (invocation, error);
830 g_dbus_method_invocation_return_value (invocation, g_variant_new ("(^as)", out_strv));
834 e_gdbus_complete_sync_method_uint (gpointer object,
835 GDBusMethodInvocation *invocation,
840 g_dbus_method_invocation_return_gerror (invocation, error);
842 g_dbus_method_invocation_return_value (invocation, g_variant_new ("(u)", out_uint));
845 typedef struct _AsyncOpData
848 EGdbusAsyncOpKeeper *proxy;
851 GCancellable *cancellable;
853 guint cancel_idle_id;
855 gpointer async_source_tag;
856 GAsyncReadyCallback async_callback;
857 gpointer async_user_data;
859 guint result_type; /* any of E_GDBUS_TYPE_... except of E_GDBUS_TYPE_IS_ASYNC */
861 gboolean out_boolean;
869 async_op_data_free (AsyncOpData *op_data)
871 GHashTable *pending_ops;
873 g_return_if_fail (op_data != NULL);
875 pending_ops = e_gdbus_async_op_keeper_get_pending_ops (op_data->proxy);
877 if (op_data->cancel_idle_id) {
878 GError *error = NULL;
880 g_source_remove (op_data->cancel_idle_id);
881 op_data->cancel_idle_id = 0;
884 g_hash_table_remove (pending_ops, GUINT_TO_POINTER (op_data->opid));
886 if (!e_gdbus_async_op_keeper_cancel_op_sync (op_data->proxy, op_data->opid, NULL, &error)) {
887 g_debug ("%s: Failed to cancel operation: %s\n", G_STRFUNC, error ? error->message : "Unknown error");
888 g_clear_error (&error);
890 } else if (pending_ops) {
891 g_hash_table_remove (pending_ops, GUINT_TO_POINTER (op_data->opid));
894 if (op_data->cancellable) {
895 if (op_data->cancel_id) {
896 g_cancellable_disconnect (op_data->cancellable, op_data->cancel_id);
897 op_data->cancel_id = 0;
899 g_object_unref (op_data->cancellable);
900 op_data->cancellable = NULL;
903 if (!g_atomic_int_dec_and_test (&op_data->ref_count))
906 g_object_unref (op_data->proxy);
908 switch (op_data->result_type) {
909 case E_GDBUS_TYPE_STRING:
910 if (op_data->result.out_string)
911 g_free (op_data->result.out_string);
913 case E_GDBUS_TYPE_STRV:
914 if (op_data->result.out_strv)
915 g_strfreev (op_data->result.out_strv);
921 g_return_if_fail (pending_ops != NULL);
925 async_op_complete (AsyncOpData *op_data,
929 GSimpleAsyncResult *simple;
931 g_return_if_fail (op_data != NULL);
933 g_atomic_int_inc (&op_data->ref_count);
934 simple = g_simple_async_result_new (G_OBJECT (op_data->proxy), op_data->async_callback, op_data->async_user_data, op_data->async_source_tag);
935 g_simple_async_result_set_op_res_gpointer (simple, op_data, (GDestroyNotify) async_op_data_free);
937 g_simple_async_result_set_from_error (simple, error);
940 g_simple_async_result_complete_in_idle (simple);
942 g_simple_async_result_complete (simple);
944 g_object_unref (simple);
947 typedef struct _CancelData
949 EGdbusAsyncOpKeeper *proxy;
951 AsyncOpData *op_data;
955 cancel_data_free (gpointer ptr)
957 CancelData *cd = ptr;
962 g_object_unref (cd->proxy);
967 e_gdbus_op_cancelled_idle_cb (gpointer user_data)
969 CancelData *cd = user_data;
970 AsyncOpData *op_data;
971 GHashTable *pending_ops;
972 GCancellable *cancellable;
973 GError *error = NULL;
975 g_return_val_if_fail (cd != NULL, FALSE);
977 pending_ops = e_gdbus_async_op_keeper_get_pending_ops (cd->proxy);
978 if (pending_ops && !g_hash_table_lookup (pending_ops, GUINT_TO_POINTER (cd->opid))) {
979 /* got served already */
983 op_data = cd->op_data;
984 g_return_val_if_fail (op_data != NULL, FALSE);
986 cancellable = op_data->cancellable;
987 op_data->cancel_idle_id = 0;
989 if (!e_gdbus_async_op_keeper_cancel_op_sync (op_data->proxy, op_data->opid, NULL, &error)) {
990 g_debug ("%s: Failed to cancel operation: %s\n", G_STRFUNC, error ? error->message : "Unknown error");
991 g_clear_error (&error);
994 g_return_val_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error), FALSE);
996 async_op_complete (op_data, error, TRUE);
997 g_clear_error (&error);
1003 e_gdbus_op_cancelled_cb (GCancellable *cancellable,
1004 AsyncOpData *op_data)
1008 g_return_if_fail (op_data != NULL);
1009 g_return_if_fail (op_data->cancellable == cancellable);
1011 cd = g_new0 (CancelData, 1);
1012 cd->proxy = g_object_ref (op_data->proxy);
1013 cd->opid = op_data->opid;
1014 cd->op_data = op_data;
1016 /* do this on idle, because this callback should be left
1017 * as soon as possible, with no sync calls being done;
1018 * also schedule with priority higher than gtk+ uses
1019 * for animations (check docs for G_PRIORITY_HIGH_IDLE) */
1020 op_data->cancel_idle_id = g_idle_add_full (G_PRIORITY_DEFAULT, e_gdbus_op_cancelled_idle_cb, cd, cancel_data_free);
1024 e_gdbus_async_call_opid_ready_cb (GObject *source_proxy,
1025 GAsyncResult *result,
1029 GError *error = NULL;
1030 AsyncOpData *op_data = user_data;
1032 _result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_proxy), result, &error);
1034 if (_result != NULL && !error) {
1035 EGdbusAsyncOpKeeper *op_keeper = E_GDBUS_ASYNC_OP_KEEPER (source_proxy);
1036 GHashTable *pending_ops;
1037 gboolean add_pending = TRUE;
1039 g_return_if_fail (op_keeper != NULL);
1041 pending_ops = e_gdbus_async_op_keeper_get_pending_ops (op_keeper);
1042 g_return_if_fail (pending_ops != NULL);
1044 g_variant_get (_result, "(u)", &op_data->opid);
1045 g_variant_unref (_result);
1047 if (op_data->cancellable && !g_cancellable_set_error_if_cancelled (op_data->cancellable, &error))
1048 op_data->cancel_id = g_cancellable_connect (op_data->cancellable, G_CALLBACK (e_gdbus_op_cancelled_cb), op_data, NULL);
1050 add_pending = op_data->cancellable == NULL;
1052 /* add to pending ops, waiting for associated 'done' signal */
1054 g_hash_table_insert (pending_ops, GUINT_TO_POINTER (op_data->opid), op_data);
1055 } else if (_result) {
1056 g_variant_unref (_result);
1060 async_op_complete (op_data, error, FALSE);
1061 g_error_free (error);
1066 copy_strv (const gchar * const *strv)
1071 array = g_ptr_array_sized_new (g_strv_length ((gchar **) strv) + 1);
1073 for (ii = 0; strv[ii]; ii++) {
1074 g_ptr_array_add (array, g_strdup (strv[ii]));
1077 /* NULL-terminated */
1078 g_ptr_array_add (array, NULL);
1080 return (gchar **) g_ptr_array_free (array, FALSE);
1084 e_gdbus_proxy_async_method_done (guint e_gdbus_type,
1085 gconstpointer out_value,
1086 EGdbusAsyncOpKeeper *object,
1088 const GError *error)
1090 AsyncOpData *op_data;
1091 GHashTable *pending_ops;
1093 g_return_if_fail (object != NULL);
1094 g_return_if_fail (E_IS_GDBUS_ASYNC_OP_KEEPER (object));
1096 pending_ops = e_gdbus_async_op_keeper_get_pending_ops (object);
1097 g_return_if_fail (pending_ops != NULL);
1099 op_data = g_hash_table_lookup (pending_ops, GUINT_TO_POINTER (arg_opid));
1101 /* it happens for cancelled operations, thus rather than track cancelled ops disable the debug warning */
1102 /* g_debug ("%s: Operation %d gone before got done signal for it", G_STRFUNC, arg_opid); */
1107 op_data->result_type = e_gdbus_type;
1109 switch (e_gdbus_type) {
1110 case E_GDBUS_TYPE_VOID:
1112 case E_GDBUS_TYPE_BOOLEAN:
1113 op_data->result.out_boolean = * ((const gboolean *) out_value);
1115 case E_GDBUS_TYPE_STRING:
1116 op_data->result.out_string = g_strdup ((const gchar *) out_value);
1118 case E_GDBUS_TYPE_STRV:
1119 op_data->result.out_strv = copy_strv ((const gchar * const *) out_value);
1121 case E_GDBUS_TYPE_UINT:
1122 op_data->result.out_uint = * ((const guint *) out_value);
1125 g_warning ("%s: Unknown E_GDBUS_TYPE %x", G_STRFUNC, e_gdbus_type);
1130 async_op_complete (op_data, error, TRUE);
1134 e_gdbus_proxy_async_method_done_void (EGdbusAsyncOpKeeper *proxy,
1136 const GError *error)
1138 e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_VOID, NULL, proxy, arg_opid, error);
1142 e_gdbus_proxy_async_method_done_boolean (EGdbusAsyncOpKeeper *proxy,
1144 const GError *error,
1145 gboolean out_boolean)
1147 e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_BOOLEAN, &out_boolean, proxy, arg_opid, error);
1150 /* takes ownership of the out parameter */
1152 e_gdbus_proxy_async_method_done_string (EGdbusAsyncOpKeeper *proxy,
1154 const GError *error,
1155 const gchar *out_string)
1157 e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_STRING, out_string, proxy, arg_opid, error);
1160 /* takes ownership of the out parameter */
1162 e_gdbus_proxy_async_method_done_strv (EGdbusAsyncOpKeeper *proxy,
1164 const GError *error,
1165 const gchar * const *out_strv)
1167 e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_STRV, out_strv, proxy, arg_opid, error);
1171 e_gdbus_proxy_async_method_done_uint (EGdbusAsyncOpKeeper *proxy,
1173 const GError *error,
1176 e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_UINT, &out_uint, proxy, arg_opid, error);
1179 /* takes ownership of _params */
1181 e_gdbus_proxy_call_with_params (GVariant *_params,
1182 const gchar *method_name,
1183 gpointer source_tag,
1184 EGdbusAsyncOpKeeper *proxy,
1185 GCancellable *cancellable,
1186 GAsyncReadyCallback callback,
1189 AsyncOpData *op_data;
1191 op_data = g_new0 (AsyncOpData, 1);
1192 op_data->proxy = g_object_ref (proxy);
1194 op_data->async_source_tag = source_tag;
1195 op_data->async_callback = callback;
1196 op_data->async_user_data = user_data;
1197 op_data->cancellable = cancellable;
1198 if (op_data->cancellable)
1199 g_object_ref (op_data->cancellable);
1201 g_dbus_proxy_call (G_DBUS_PROXY (proxy), method_name, _params, G_DBUS_CALL_FLAGS_NONE, e_data_server_util_get_dbus_call_timeout (), cancellable, e_gdbus_async_call_opid_ready_cb, op_data);
1205 e_gdbus_proxy_call_void (const gchar *method_name,
1206 gpointer source_tag,
1207 EGdbusAsyncOpKeeper *proxy,
1208 GCancellable *cancellable,
1209 GAsyncReadyCallback callback,
1212 e_gdbus_proxy_call_with_params (NULL, method_name, source_tag, proxy, cancellable, callback, user_data);
1216 e_gdbus_proxy_call_boolean (const gchar *method_name,
1217 gpointer source_tag,
1218 EGdbusAsyncOpKeeper *proxy,
1219 gboolean in_boolean,
1220 GCancellable *cancellable,
1221 GAsyncReadyCallback callback,
1226 _params = g_variant_new ("(b)", in_boolean);
1228 e_gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
1232 e_gdbus_proxy_call_string (const gchar *method_name,
1233 gpointer source_tag,
1234 EGdbusAsyncOpKeeper *proxy,
1235 const gchar *in_string,
1236 GCancellable *cancellable,
1237 GAsyncReadyCallback callback,
1242 _params = g_variant_new ("(s)", in_string);
1244 e_gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
1248 e_gdbus_proxy_call_strv (const gchar *method_name,
1249 gpointer source_tag,
1250 EGdbusAsyncOpKeeper *proxy,
1251 const gchar * const *in_strv,
1252 GCancellable *cancellable,
1253 GAsyncReadyCallback callback,
1258 _params = g_variant_new ("(^as)", in_strv);
1260 e_gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
1264 e_gdbus_proxy_call_uint (const gchar *method_name,
1265 gpointer source_tag,
1266 EGdbusAsyncOpKeeper *proxy,
1268 GCancellable *cancellable,
1269 GAsyncReadyCallback callback,
1274 _params = g_variant_new ("(u)", in_uint);
1276 e_gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
1280 e_gdbus_proxy_finish_call_void (EGdbusAsyncOpKeeper *proxy,
1281 GAsyncResult *result,
1283 gpointer source_tag)
1285 g_return_val_if_fail (proxy != NULL, FALSE);
1286 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (proxy), source_tag), FALSE);
1288 return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error);
1292 e_gdbus_proxy_finish_call_boolean (EGdbusAsyncOpKeeper *proxy,
1293 GAsyncResult *result,
1294 gboolean *out_boolean,
1296 gpointer source_tag)
1298 AsyncOpData *op_data;
1300 g_return_val_if_fail (proxy != NULL, FALSE);
1301 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (proxy), source_tag), FALSE);
1302 g_return_val_if_fail (out_boolean != NULL, FALSE);
1304 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
1307 op_data = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
1308 g_return_val_if_fail (op_data != NULL, FALSE);
1309 g_return_val_if_fail (op_data->result_type == E_GDBUS_TYPE_BOOLEAN, FALSE);
1311 *out_boolean = op_data->result.out_boolean;
1316 /* caller takes ownership and responsibility for freeing the out parameter */
1318 e_gdbus_proxy_finish_call_string (EGdbusAsyncOpKeeper *proxy,
1319 GAsyncResult *result,
1322 gpointer source_tag)
1324 AsyncOpData *op_data;
1326 g_return_val_if_fail (proxy != NULL, FALSE);
1327 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (proxy), source_tag), FALSE);
1328 g_return_val_if_fail (out_string != NULL, FALSE);
1330 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
1333 op_data = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
1334 g_return_val_if_fail (op_data != NULL, FALSE);
1335 g_return_val_if_fail (op_data->result_type == E_GDBUS_TYPE_STRING, FALSE);
1337 *out_string = op_data->result.out_string;
1338 op_data->result.out_string = NULL;
1343 /* caller takes ownership and responsibility for freeing the out parameter */
1345 e_gdbus_proxy_finish_call_strv (EGdbusAsyncOpKeeper *proxy,
1346 GAsyncResult *result,
1349 gpointer source_tag)
1351 AsyncOpData *op_data;
1353 g_return_val_if_fail (proxy != NULL, FALSE);
1354 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (proxy), source_tag), FALSE);
1355 g_return_val_if_fail (out_strv != NULL, FALSE);
1357 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
1360 op_data = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
1361 g_return_val_if_fail (op_data != NULL, FALSE);
1362 g_return_val_if_fail (op_data->result_type == E_GDBUS_TYPE_STRV, FALSE);
1364 *out_strv = op_data->result.out_strv;
1365 op_data->result.out_strv = NULL;
1371 e_gdbus_proxy_finish_call_uint (EGdbusAsyncOpKeeper *proxy,
1372 GAsyncResult *result,
1375 gpointer source_tag)
1377 AsyncOpData *op_data;
1379 g_return_val_if_fail (proxy != NULL, FALSE);
1380 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (proxy), source_tag), FALSE);
1381 g_return_val_if_fail (out_uint != NULL, FALSE);
1383 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
1386 op_data = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
1387 g_return_val_if_fail (op_data != NULL, FALSE);
1388 g_return_val_if_fail (op_data->result_type == E_GDBUS_TYPE_UINT, FALSE);
1390 *out_uint = op_data->result.out_uint;
1395 typedef struct _SyncOpData
1400 guint out_type; /* one of E_GDBUS_TYPE_... except of E_GDBUS_TYPE_IS_ASYNC */
1402 gboolean *out_boolean;
1409 EGdbusCallFinishVoid finish_void;
1410 EGdbusCallFinishBoolean finish_boolean;
1411 EGdbusCallFinishString finish_string;
1412 EGdbusCallFinishStrv finish_strv;
1413 EGdbusCallFinishUint finish_uint;
1416 gboolean finish_result;
1420 e_gdbus_proxy_sync_ready_cb (GObject *proxy,
1421 GAsyncResult *result,
1424 gint sync_opid = GPOINTER_TO_INT (user_data);
1425 gchar *sync_opid_ident;
1426 SyncOpData *sync_data;
1428 sync_opid_ident = g_strdup_printf ("EGdbusTemplates-SyncOp-%d", sync_opid);
1429 sync_data = g_object_get_data (proxy, sync_opid_ident);
1430 g_free (sync_opid_ident);
1433 /* already finished operation; it can happen when the operation is cancelled,
1434 * but the result is already waiting in an idle queue.
1439 g_return_if_fail (sync_data->flag != NULL);
1441 switch (sync_data->out_type) {
1442 case E_GDBUS_TYPE_VOID:
1443 g_return_if_fail (sync_data->finish_func.finish_void != NULL);
1444 sync_data->finish_result = sync_data->finish_func.finish_void (G_DBUS_PROXY (proxy), result, sync_data->error);
1446 case E_GDBUS_TYPE_BOOLEAN:
1447 g_return_if_fail (sync_data->finish_func.finish_boolean != NULL);
1448 sync_data->finish_result = sync_data->finish_func.finish_boolean (G_DBUS_PROXY (proxy), result, sync_data->out_arg.out_boolean, sync_data->error);
1450 case E_GDBUS_TYPE_STRING:
1451 g_return_if_fail (sync_data->finish_func.finish_string != NULL);
1452 sync_data->finish_result = sync_data->finish_func.finish_string (G_DBUS_PROXY (proxy), result, sync_data->out_arg.out_string, sync_data->error);
1454 case E_GDBUS_TYPE_STRV:
1455 g_return_if_fail (sync_data->finish_func.finish_strv != NULL);
1456 sync_data->finish_result = sync_data->finish_func.finish_strv (G_DBUS_PROXY (proxy), result, sync_data->out_arg.out_strv, sync_data->error);
1458 case E_GDBUS_TYPE_UINT:
1459 g_return_if_fail (sync_data->finish_func.finish_uint != NULL);
1460 sync_data->finish_result = sync_data->finish_func.finish_uint (G_DBUS_PROXY (proxy), result, sync_data->out_arg.out_uint, sync_data->error);
1463 g_warning ("%s: Unknown 'out' E_GDBUS_TYPE %x", G_STRFUNC, sync_data->out_type);
1464 sync_data->finish_result = FALSE;
1467 e_flag_set (sync_data->flag);
1471 e_gdbus_proxy_call_sync (GDBusProxy *proxy,
1472 GCancellable *cancellable,
1474 gpointer start_func,
1475 gpointer finish_func,
1477 gconstpointer in_value,
1481 static volatile gint sync_op_counter = 0;
1483 gchar *sync_opid_ident;
1484 SyncOpData sync_data = { 0 };
1486 g_return_val_if_fail (proxy != NULL, FALSE);
1487 g_return_val_if_fail (start_func != NULL, FALSE);
1488 g_return_val_if_fail (finish_func != NULL, FALSE);
1490 g_object_ref (proxy);
1493 case E_GDBUS_TYPE_VOID:
1494 sync_data.finish_func.finish_void = finish_func;
1496 case E_GDBUS_TYPE_BOOLEAN:
1497 sync_data.out_arg.out_boolean = out_value;
1498 sync_data.finish_func.finish_boolean = finish_func;
1500 case E_GDBUS_TYPE_STRING:
1501 sync_data.out_arg.out_string = out_value;
1502 sync_data.finish_func.finish_string = finish_func;
1504 case E_GDBUS_TYPE_STRV:
1505 sync_data.out_arg.out_strv = out_value;
1506 sync_data.finish_func.finish_strv = finish_func;
1508 case E_GDBUS_TYPE_UINT:
1509 sync_data.out_arg.out_uint = out_value;
1510 sync_data.finish_func.finish_uint = finish_func;
1513 g_warning ("%s: Unknown 'out' E_GDBUS_TYPE %x", G_STRFUNC, out_type);
1514 g_object_unref (proxy);
1518 sync_data.flag = e_flag_new ();
1519 sync_data.error = error;
1520 sync_data.out_type = out_type;
1522 sync_opid = g_atomic_int_add (&sync_op_counter, 1);
1523 sync_opid_ident = g_strdup_printf ("EGdbusTemplates-SyncOp-%d", sync_opid);
1524 g_object_set_data (G_OBJECT (proxy), sync_opid_ident, &sync_data);
1527 case E_GDBUS_TYPE_VOID: {
1528 EGdbusCallStartVoid start = start_func;
1529 start (proxy, cancellable, e_gdbus_proxy_sync_ready_cb, GINT_TO_POINTER (sync_opid));
1531 case E_GDBUS_TYPE_BOOLEAN: {
1532 EGdbusCallStartBoolean start = start_func;
1533 start (proxy, * ((gboolean *) in_value), cancellable, e_gdbus_proxy_sync_ready_cb, GINT_TO_POINTER (sync_opid));
1535 case E_GDBUS_TYPE_STRING: {
1536 EGdbusCallStartString start = start_func;
1537 start (proxy, (const gchar *) in_value, cancellable, e_gdbus_proxy_sync_ready_cb, GINT_TO_POINTER (sync_opid));
1539 case E_GDBUS_TYPE_STRV: {
1540 EGdbusCallStartStrv start = start_func;
1541 start (proxy, (const gchar * const *) in_value, cancellable, e_gdbus_proxy_sync_ready_cb, GINT_TO_POINTER (sync_opid));
1543 case E_GDBUS_TYPE_UINT: {
1544 EGdbusCallStartUint start = start_func;
1545 start (proxy, * ((guint *) in_value), cancellable, e_gdbus_proxy_sync_ready_cb, GINT_TO_POINTER (sync_opid));
1548 g_warning ("%s: Unknown 'in' E_GDBUS_TYPE %x", G_STRFUNC, in_type);
1549 e_flag_free (sync_data.flag);
1550 g_object_set_data (G_OBJECT (proxy), sync_opid_ident, NULL);
1551 g_free (sync_opid_ident);
1552 g_object_unref (proxy);
1556 /* check if called from the main thread */
1557 if ((main_thread && main_thread == g_thread_self ()) ||
1558 (!main_thread && (g_main_context_is_owner (g_main_context_default ())
1559 || g_main_context_default () == g_main_context_get_thread_default ()
1560 || !g_main_context_get_thread_default ()))) {
1561 /* the call to e_gdbus_templates_init_main_thread() wasn't done, but no problem,
1562 * check if the call was done in the main thread with main loop running,
1563 * and if so, then remember it
1565 if (!main_thread && g_main_context_is_owner (g_main_context_default ()))
1566 e_gdbus_templates_init_main_thread ();
1568 /* Might not be the best thing here, but as the async operation
1569 * is divided into two-step process, invoking the method and
1570 * waiting for its "done" signal, then if the sync method is called
1571 * from the main thread, then there is probably no other option.
1573 while (!e_flag_is_set (sync_data.flag)) {
1575 g_main_context_iteration (NULL, FALSE);
1578 /* is called in a dedicated thread */
1579 e_flag_wait (sync_data.flag);
1581 g_object_set_data (G_OBJECT (proxy), sync_opid_ident, NULL);
1582 e_flag_free (sync_data.flag);
1584 g_free (sync_opid_ident);
1585 g_object_unref (proxy);
1587 return sync_data.finish_result;
1591 e_gdbus_proxy_call_sync_void__void (GDBusProxy *proxy,
1592 GCancellable *cancellable,
1594 EGdbusCallStartVoid start_func,
1595 EGdbusCallFinishVoid finish_func)
1597 g_return_val_if_fail (proxy != NULL, FALSE);
1598 g_return_val_if_fail (start_func != NULL, FALSE);
1599 g_return_val_if_fail (finish_func != NULL, FALSE);
1601 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_VOID, NULL);
1605 * e_gdbus_proxy_call_sync_void__boolean:
1608 * @cancellable: (allow-none):
1610 * @start_func: (scope call):
1611 * @finish_func: (scope call):
1616 e_gdbus_proxy_call_sync_void__boolean (GDBusProxy *proxy,
1617 gboolean *out_boolean,
1618 GCancellable *cancellable,
1620 EGdbusCallStartVoid start_func,
1621 EGdbusCallFinishBoolean finish_func)
1623 g_return_val_if_fail (proxy != NULL, FALSE);
1624 g_return_val_if_fail (start_func != NULL, FALSE);
1625 g_return_val_if_fail (finish_func != NULL, FALSE);
1626 g_return_val_if_fail (out_boolean != NULL, FALSE);
1628 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_BOOLEAN, out_boolean);
1632 * e_gdbus_proxy_call_sync_void__string:
1635 * @cancellable: (allow-none):
1637 * @start_func: (scope call):
1638 * @finish_func: (scope call):
1643 e_gdbus_proxy_call_sync_void__string (GDBusProxy *proxy,
1645 GCancellable *cancellable,
1647 EGdbusCallStartVoid start_func,
1648 EGdbusCallFinishString finish_func)
1650 g_return_val_if_fail (proxy != NULL, FALSE);
1651 g_return_val_if_fail (start_func != NULL, FALSE);
1652 g_return_val_if_fail (finish_func != NULL, FALSE);
1653 g_return_val_if_fail (out_string != NULL, FALSE);
1655 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_STRING, out_string);
1659 * e_gdbus_proxy_call_sync_void__strv:
1662 * @cancellable: (allow-none):
1664 * @start_func: (scope call):
1665 * @finish_func: (scope call):
1670 e_gdbus_proxy_call_sync_void__strv (GDBusProxy *proxy,
1672 GCancellable *cancellable,
1674 EGdbusCallStartVoid start_func,
1675 EGdbusCallFinishStrv finish_func)
1677 g_return_val_if_fail (proxy != NULL, FALSE);
1678 g_return_val_if_fail (start_func != NULL, FALSE);
1679 g_return_val_if_fail (finish_func != NULL, FALSE);
1680 g_return_val_if_fail (out_strv != NULL, FALSE);
1682 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_STRV, out_strv);
1686 * e_gdbus_proxy_call_sync_void__uint:
1689 * @cancellable: (allow-none):
1691 * @start_func: (scope call):
1692 * @finish_func: (scope call):
1697 e_gdbus_proxy_call_sync_void__uint (GDBusProxy *proxy,
1699 GCancellable *cancellable,
1701 EGdbusCallStartVoid start_func,
1702 EGdbusCallFinishUint finish_func)
1704 g_return_val_if_fail (proxy != NULL, FALSE);
1705 g_return_val_if_fail (start_func != NULL, FALSE);
1706 g_return_val_if_fail (finish_func != NULL, FALSE);
1707 g_return_val_if_fail (out_uint != NULL, FALSE);
1709 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_UINT, out_uint);
1713 e_gdbus_proxy_call_sync_boolean__void (GDBusProxy *proxy,
1714 gboolean in_boolean,
1715 GCancellable *cancellable,
1717 EGdbusCallStartBoolean start_func,
1718 EGdbusCallFinishVoid finish_func)
1720 g_return_val_if_fail (proxy != NULL, FALSE);
1721 g_return_val_if_fail (start_func != NULL, FALSE);
1722 g_return_val_if_fail (finish_func != NULL, FALSE);
1724 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_BOOLEAN, &in_boolean, E_GDBUS_TYPE_VOID, NULL);
1728 * e_gdbus_proxy_call_sync_string__void:
1731 * @cancellable: (allow-none):
1733 * @start_func: (scope call):
1734 * @finish_func: (scope call):
1739 e_gdbus_proxy_call_sync_string__void (GDBusProxy *proxy,
1740 const gchar *in_string,
1741 GCancellable *cancellable,
1743 EGdbusCallStartString start_func,
1744 EGdbusCallFinishVoid finish_func)
1746 g_return_val_if_fail (proxy != NULL, FALSE);
1747 g_return_val_if_fail (start_func != NULL, FALSE);
1748 g_return_val_if_fail (finish_func != NULL, FALSE);
1749 g_return_val_if_fail (in_string != NULL, FALSE);
1751 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_VOID, NULL);
1755 e_gdbus_proxy_call_sync_strv__void (GDBusProxy *proxy,
1756 const gchar * const *in_strv,
1757 GCancellable *cancellable,
1759 EGdbusCallStartStrv start_func,
1760 EGdbusCallFinishVoid finish_func)
1762 g_return_val_if_fail (proxy != NULL, FALSE);
1763 g_return_val_if_fail (start_func != NULL, FALSE);
1764 g_return_val_if_fail (finish_func != NULL, FALSE);
1765 g_return_val_if_fail (in_strv != NULL, FALSE);
1767 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_VOID, NULL);
1771 * e_gdbus_proxy_call_sync_uint__void:
1774 * @cancellable: (allow-none):
1776 * @start_func: (scope call):
1777 * @finish_func: (scope call):
1782 e_gdbus_proxy_call_sync_uint__void (GDBusProxy *proxy,
1784 GCancellable *cancellable,
1786 EGdbusCallStartUint start_func,
1787 EGdbusCallFinishVoid finish_func)
1789 g_return_val_if_fail (proxy != NULL, FALSE);
1790 g_return_val_if_fail (start_func != NULL, FALSE);
1791 g_return_val_if_fail (finish_func != NULL, FALSE);
1793 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_UINT, &in_uint, E_GDBUS_TYPE_VOID, NULL);
1797 e_gdbus_proxy_call_sync_string__string (GDBusProxy *proxy,
1798 const gchar *in_string,
1800 GCancellable *cancellable,
1802 EGdbusCallStartString start_func,
1803 EGdbusCallFinishString finish_func)
1805 g_return_val_if_fail (proxy != NULL, FALSE);
1806 g_return_val_if_fail (start_func != NULL, FALSE);
1807 g_return_val_if_fail (finish_func != NULL, FALSE);
1808 g_return_val_if_fail (in_string != NULL, FALSE);
1809 g_return_val_if_fail (out_string != NULL, FALSE);
1811 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_STRING, out_string);
1815 * e_gdbus_proxy_call_sync_string__strv:
1817 * @cancellable: (allow-none):
1819 * @start_func: (scope call):
1820 * @finish_func: (scope call):
1825 e_gdbus_proxy_call_sync_string__strv (GDBusProxy *proxy,
1826 const gchar *in_string,
1828 GCancellable *cancellable,
1830 EGdbusCallStartString start_func,
1831 EGdbusCallFinishStrv finish_func)
1833 g_return_val_if_fail (proxy != NULL, FALSE);
1834 g_return_val_if_fail (start_func != NULL, FALSE);
1835 g_return_val_if_fail (finish_func != NULL, FALSE);
1836 g_return_val_if_fail (in_string != NULL, FALSE);
1837 g_return_val_if_fail (out_strv != NULL, FALSE);
1839 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_STRV, out_strv);
1843 e_gdbus_proxy_call_sync_strv__string (GDBusProxy *proxy,
1844 const gchar * const *in_strv,
1846 GCancellable *cancellable,
1848 EGdbusCallStartStrv start_func,
1849 EGdbusCallFinishString finish_func)
1851 g_return_val_if_fail (proxy != NULL, FALSE);
1852 g_return_val_if_fail (start_func != NULL, FALSE);
1853 g_return_val_if_fail (finish_func != NULL, FALSE);
1854 g_return_val_if_fail (in_strv != NULL, FALSE);
1855 g_return_val_if_fail (out_string != NULL, FALSE);
1857 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_STRING, out_string);
1861 * e_gdbus_proxy_call_sync_strv__strv:
1865 * @cancellable: (allow-none):
1867 * @start_func: (scope call):
1868 * @finish_func: (scope call):
1873 e_gdbus_proxy_call_sync_strv__strv (GDBusProxy *proxy,
1874 const gchar * const *in_strv,
1876 GCancellable *cancellable,
1878 EGdbusCallStartStrv start_func,
1879 EGdbusCallFinishStrv finish_func)
1881 g_return_val_if_fail (proxy != NULL, FALSE);
1882 g_return_val_if_fail (start_func != NULL, FALSE);
1883 g_return_val_if_fail (finish_func != NULL, FALSE);
1884 g_return_val_if_fail (in_strv != NULL, FALSE);
1885 g_return_val_if_fail (out_strv != NULL, FALSE);
1887 return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_STRV, out_strv);
1891 proxy_method_call (const gchar *method_name,
1893 gconstpointer param_value,
1895 GCancellable *cancellable,
1896 GAsyncReadyCallback callback,
1899 GVariant *params = NULL;
1901 GVariantBuilder *builder = NULL;
1903 g_return_if_fail (method_name != NULL);
1904 g_return_if_fail (proxy != NULL);
1905 g_return_if_fail (G_IS_DBUS_PROXY (proxy));
1906 if (param_type != E_GDBUS_TYPE_VOID)
1907 g_return_if_fail (param_value != NULL);
1909 switch (param_type) {
1910 case E_GDBUS_TYPE_VOID:
1912 case E_GDBUS_TYPE_BOOLEAN:
1913 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
1914 item = g_variant_new_boolean (* ((const gboolean *) param_value));
1915 g_variant_builder_add_value (builder, item);
1917 case E_GDBUS_TYPE_STRING:
1918 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
1919 item = g_variant_new_string ((const gchar *) param_value);
1920 g_variant_builder_add_value (builder, item);
1922 case E_GDBUS_TYPE_STRV:
1923 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
1924 item = g_variant_new_strv ((const gchar * const *) param_value, -1);
1925 g_variant_builder_add_value (builder, item);
1927 case E_GDBUS_TYPE_UINT:
1928 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
1929 item = g_variant_new_uint32 (* ((const guint *) param_value));
1930 g_variant_builder_add_value (builder, item);
1933 g_warning ("%s: Unknown 'param' E_GDBUS_TYPE %x", G_STRFUNC, param_type);
1937 if (builder != NULL) {
1938 params = g_variant_builder_end (builder);
1939 g_variant_builder_unref (builder);
1942 g_dbus_proxy_call (G_DBUS_PROXY (proxy), method_name, params, G_DBUS_CALL_FLAGS_NONE, e_data_server_util_get_dbus_call_timeout (), cancellable, callback, user_data);
1946 e_gdbus_proxy_method_call_void (const gchar *method_name,
1948 GCancellable *cancellable,
1949 GAsyncReadyCallback callback,
1952 proxy_method_call (method_name, E_GDBUS_TYPE_VOID, NULL, proxy, cancellable, callback, user_data);
1956 e_gdbus_proxy_method_call_boolean (const gchar *method_name,
1958 gboolean in_boolean,
1959 GCancellable *cancellable,
1960 GAsyncReadyCallback callback,
1963 proxy_method_call (method_name, E_GDBUS_TYPE_BOOLEAN, &in_boolean, proxy, cancellable, callback, user_data);
1967 e_gdbus_proxy_method_call_string (const gchar *method_name,
1969 const gchar *in_string,
1970 GCancellable *cancellable,
1971 GAsyncReadyCallback callback,
1974 proxy_method_call (method_name, E_GDBUS_TYPE_STRING, in_string, proxy, cancellable, callback, user_data);
1978 e_gdbus_proxy_method_call_strv (const gchar *method_name,
1980 const gchar * const *in_strv,
1981 GCancellable *cancellable,
1982 GAsyncReadyCallback callback,
1985 proxy_method_call (method_name, E_GDBUS_TYPE_STRV, in_strv, proxy, cancellable, callback, user_data);
1989 e_gdbus_proxy_method_call_uint (const gchar *method_name,
1992 GCancellable *cancellable,
1993 GAsyncReadyCallback callback,
1996 proxy_method_call (method_name, E_GDBUS_TYPE_VOID, &in_uint, proxy, cancellable, callback, user_data);
2000 process_result (const gchar *caller_func_name,
2005 if (out_type != E_GDBUS_TYPE_VOID)
2006 g_return_val_if_fail (out_value != NULL, FALSE);
2008 if (_result == NULL)
2012 case E_GDBUS_TYPE_VOID:
2014 case E_GDBUS_TYPE_BOOLEAN:
2015 g_variant_get (_result, "(b)", (gboolean *) out_value);
2017 case E_GDBUS_TYPE_STRING:
2018 g_variant_get (_result, "(s)", (gchar **) out_value);
2020 case E_GDBUS_TYPE_STRV:
2021 g_variant_get (_result, "(^as)", (gchar ***) out_value);
2023 case E_GDBUS_TYPE_UINT:
2024 g_variant_get (_result, "(u)", (guint *) out_value);
2027 g_warning ("%s: Unknown 'out' E_GDBUS_TYPE %x", caller_func_name ? caller_func_name : G_STRFUNC, out_type);
2031 g_variant_unref (_result);
2037 proxy_method_call_finish (guint out_type,
2040 GAsyncResult *result,
2043 g_return_val_if_fail (proxy != NULL, FALSE);
2044 g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), FALSE);
2045 if (out_type != E_GDBUS_TYPE_VOID)
2046 g_return_val_if_fail (out_param != NULL, FALSE);
2048 return process_result (G_STRFUNC, out_type, out_param, g_dbus_proxy_call_finish (proxy, result, error));
2052 e_gdbus_proxy_method_call_finish_void (GDBusProxy *proxy,
2053 GAsyncResult *result,
2056 return proxy_method_call_finish (E_GDBUS_TYPE_VOID, NULL, proxy, result, error);
2060 e_gdbus_proxy_method_call_finish_boolean (GDBusProxy *proxy,
2061 GAsyncResult *result,
2062 gboolean *out_boolean,
2065 return proxy_method_call_finish (E_GDBUS_TYPE_BOOLEAN, out_boolean, proxy, result, error);
2069 e_gdbus_proxy_method_call_finish_string (GDBusProxy *proxy,
2070 GAsyncResult *result,
2074 return proxy_method_call_finish (E_GDBUS_TYPE_STRING, out_string, proxy, result, error);
2078 e_gdbus_proxy_method_call_finish_strv (GDBusProxy *proxy,
2079 GAsyncResult *result,
2083 return proxy_method_call_finish (E_GDBUS_TYPE_STRV, out_strv, proxy, result, error);
2087 e_gdbus_proxy_method_call_finish_uint (GDBusProxy *proxy,
2088 GAsyncResult *result,
2092 return proxy_method_call_finish (E_GDBUS_TYPE_UINT, out_uint, proxy, result, error);
2096 proxy_method_call_sync (const gchar *method_name,
2098 gconstpointer in_value,
2102 GCancellable *cancellable,
2105 GVariant *params = NULL;
2107 GVariantBuilder *builder = NULL;
2109 g_return_val_if_fail (method_name != NULL, FALSE);
2110 g_return_val_if_fail (proxy != NULL, FALSE);
2111 g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), FALSE);
2112 if (in_type != E_GDBUS_TYPE_VOID)
2113 g_return_val_if_fail (in_value != NULL, FALSE);
2114 if (out_type != E_GDBUS_TYPE_VOID)
2115 g_return_val_if_fail (out_value != NULL, FALSE);
2118 case E_GDBUS_TYPE_VOID:
2120 case E_GDBUS_TYPE_BOOLEAN:
2121 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
2122 item = g_variant_new_boolean (* ((const gboolean *) in_value));
2123 g_variant_builder_add_value (builder, item);
2125 case E_GDBUS_TYPE_STRING:
2126 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
2127 item = g_variant_new_string ((const gchar *) in_value);
2128 g_variant_builder_add_value (builder, item);
2130 case E_GDBUS_TYPE_STRV:
2131 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
2132 item = g_variant_new_strv ((const gchar * const *) in_value, -1);
2133 g_variant_builder_add_value (builder, item);
2135 case E_GDBUS_TYPE_UINT:
2136 builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
2137 item = g_variant_new_uint32 (* ((const guint *) in_value));
2138 g_variant_builder_add_value (builder, item);
2141 g_warning ("%s: Unknown 'in' E_GDBUS_TYPE %x", G_STRFUNC, in_type);
2145 if (builder != NULL) {
2146 params = g_variant_builder_end (builder);
2147 g_variant_builder_unref (builder);
2150 return process_result (G_STRFUNC, out_type, out_value, g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), method_name, params, G_DBUS_CALL_FLAGS_NONE, e_data_server_util_get_dbus_call_timeout (), cancellable, error));
2154 * e_gdbus_proxy_call_sync_void__void:
2156 * @cancellable: (allow-none):
2158 * @start_func: (scope call):
2159 * @finish_func: (scope call):
2164 e_gdbus_proxy_method_call_sync_void__void (const gchar *method_name,
2166 GCancellable *cancellable,
2169 return proxy_method_call_sync (method_name, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_VOID, NULL, proxy, cancellable, error);
2173 * e_gdbus_proxy_call_sync_boolean__void:
2176 * @cancellable: (allow-none):
2178 * @start_func: (scope call):
2179 * @finish_func: (scope call):
2184 e_gdbus_proxy_method_call_sync_boolean__void (const gchar *method_name,
2186 gboolean in_boolean,
2187 GCancellable *cancellable,
2190 return proxy_method_call_sync (method_name, E_GDBUS_TYPE_BOOLEAN, &in_boolean, E_GDBUS_TYPE_VOID, NULL, proxy, cancellable, error);
2194 e_gdbus_proxy_method_call_sync_string__void (const gchar *method_name,
2196 const gchar *in_string,
2197 GCancellable *cancellable,
2200 return proxy_method_call_sync (method_name, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_VOID, NULL, proxy, cancellable, error);
2204 * e_gdbus_proxy_call_sync_strv__void:
2207 * @cancellable: (allow-none):
2209 * @start_func: (scope call):
2210 * @finish_func: (scope call):
2215 e_gdbus_proxy_method_call_sync_strv__void (const gchar *method_name,
2217 const gchar * const *in_strv,
2218 GCancellable *cancellable,
2221 return proxy_method_call_sync (method_name, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_VOID, NULL, proxy, cancellable, error);
2225 e_gdbus_proxy_method_call_sync_uint__void (const gchar *method_name,
2228 GCancellable *cancellable,
2231 return proxy_method_call_sync (method_name, E_GDBUS_TYPE_UINT, &in_uint, E_GDBUS_TYPE_VOID, NULL, proxy, cancellable, error);
2235 * e_gdbus_proxy_call_sync_string__string:
2239 * @cancellable: (allow-none):
2241 * @start_func: (scope call):
2242 * @finish_func: (scope call):
2247 e_gdbus_proxy_method_call_sync_string__string (const gchar *method_name,
2249 const gchar *in_string,
2251 GCancellable *cancellable,
2254 return proxy_method_call_sync (method_name, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_STRING, out_string, proxy, cancellable, error);
2258 * e_gdbus_proxy_call_sync_strv__string:
2262 * @cancellable: (allow-none):
2264 * @start_func: (scope call):
2265 * @finish_func: (scope call):
2270 e_gdbus_proxy_method_call_sync_strv__string (const gchar *method_name,
2272 const gchar * const *in_strv,
2274 GCancellable *cancellable,
2277 return proxy_method_call_sync (method_name, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_STRING, out_string, proxy, cancellable, error);
2281 * e_gdbus_templates_encode_error:
2282 * @in_error: (allow-none):
2284 * Returns: (transfer full): a %NULL-terminated array of strings; free with
2288 e_gdbus_templates_encode_error (const GError *in_error)
2292 strv = g_new0 (gchar *, 3);
2295 strv[0] = g_strdup ("");
2296 strv[1] = g_strdup ("");
2298 gchar *dbus_error_name = g_dbus_error_encode_gerror (in_error);
2300 strv[0] = e_util_utf8_make_valid (dbus_error_name ? dbus_error_name : "");
2301 strv[1] = e_util_utf8_make_valid (in_error->message);
2303 g_free (dbus_error_name);
2309 /* free *out_error with g_error_free(), if not NULL */
2311 e_gdbus_templates_decode_error (const gchar * const *in_strv,
2314 const gchar *error_name, *error_message;
2316 g_return_val_if_fail (out_error != NULL, FALSE);
2320 g_return_val_if_fail (in_strv != NULL, FALSE);
2321 g_return_val_if_fail (in_strv[0] != NULL, FALSE);
2322 g_return_val_if_fail (in_strv[1] != NULL, FALSE);
2323 g_return_val_if_fail (in_strv[2] == NULL, FALSE);
2325 error_name = in_strv[0];
2326 error_message = in_strv[1];
2328 if (error_name && *error_name && error_message)
2329 *out_error = g_dbus_error_new_for_dbus_error (error_name, error_message);
2335 * e_gdbus_templates_encode_two_strings:
2336 * @in_str1: (allow-none):
2337 * @in_str2: (allow-none):
2339 * Returns: (transfer full): a %NULL-terminated array of strings; free with
2343 e_gdbus_templates_encode_two_strings (const gchar *in_str1,
2344 const gchar *in_str2)
2348 strv = g_new0 (gchar *, 3);
2349 strv[0] = e_util_utf8_make_valid (in_str1 ? in_str1 : "");
2350 strv[1] = e_util_utf8_make_valid (in_str2 ? in_str2 : "");
2356 /* free *out_str1 and *out_str2 with g_free() */
2358 e_gdbus_templates_decode_two_strings (const gchar * const *in_strv,
2362 g_return_val_if_fail (in_strv != NULL, FALSE);
2363 g_return_val_if_fail (in_strv[0] != NULL, FALSE);
2364 g_return_val_if_fail (in_strv[1] != NULL, FALSE);
2365 g_return_val_if_fail (in_strv[2] == NULL, FALSE);
2366 g_return_val_if_fail (out_str1 != NULL, FALSE);
2367 g_return_val_if_fail (out_str2 != NULL, FALSE);
2369 *out_str1 = g_strdup (in_strv[0]);
2370 *out_str2 = g_strdup (in_strv[1]);