#include "e-flag.h"
#include "e-gdbus-templates.h"
+static GThread *main_thread = NULL;
+
+void
+e_gdbus_templates_init_main_thread (void)
+{
+ if (!main_thread) {
+ main_thread = g_thread_self ();
+ } else if (main_thread != g_thread_self ()) {
+ g_warning ("%s: Called in different main thread, stored: %p would use: %p", G_STRFUNC, main_thread, g_thread_self ());
+ }
+}
+
gboolean
e_gdbus_signal_emission_hook_void (GSignalInvocationHint *ihint,
guint n_param_values,
}
static void
-gdbus_op_cancelled_cb (GCancellable *cancellable,
- AsyncOpData *op_data)
+e_gdbus_op_cancelled_cb (GCancellable *cancellable,
+ AsyncOpData *op_data)
{
GError *call_error = NULL;
}
static void
-gdbus_async_call_opid_ready_cb (GObject *source_proxy,
- GAsyncResult *result,
- gpointer user_data)
+e_gdbus_async_call_opid_ready_cb (GObject *source_proxy,
+ GAsyncResult *result,
+ gpointer user_data)
{
GVariant *_result;
GError *error = NULL;
g_variant_unref (_result);
if (op_data->cancellable && !g_cancellable_set_error_if_cancelled (op_data->cancellable, &error))
- op_data->cancel_id = g_cancellable_connect (op_data->cancellable, G_CALLBACK (gdbus_op_cancelled_cb), op_data, NULL);
+ op_data->cancel_id = g_cancellable_connect (op_data->cancellable, G_CALLBACK (e_gdbus_op_cancelled_cb), op_data, NULL);
else
add_pending = op_data->cancellable == NULL;
}
static void
-gdbus_proxy_async_method_done (guint e_gdbus_type,
- gconstpointer out_value,
- EGdbusAsyncOpKeeper *object,
- guint arg_opid,
- const GError *error)
+e_gdbus_proxy_async_method_done (guint e_gdbus_type,
+ gconstpointer out_value,
+ EGdbusAsyncOpKeeper *object,
+ guint arg_opid,
+ const GError *error)
{
AsyncOpData *op_data;
GHashTable *pending_ops;
guint arg_opid,
const GError *error)
{
- gdbus_proxy_async_method_done (E_GDBUS_TYPE_VOID, NULL, proxy, arg_opid, error);
+ e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_VOID, NULL, proxy, arg_opid, error);
}
void
const GError *error,
gboolean out_boolean)
{
- gdbus_proxy_async_method_done (E_GDBUS_TYPE_BOOLEAN, &out_boolean, proxy, arg_opid, error);
+ e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_BOOLEAN, &out_boolean, proxy, arg_opid, error);
}
/* takes ownership of the out parameter */
const GError *error,
const gchar *out_string)
{
- gdbus_proxy_async_method_done (E_GDBUS_TYPE_STRING, out_string, proxy, arg_opid, error);
+ e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_STRING, out_string, proxy, arg_opid, error);
}
/* takes ownership of the out parameter */
const GError *error,
const gchar * const *out_strv)
{
- gdbus_proxy_async_method_done (E_GDBUS_TYPE_STRV, out_strv, proxy, arg_opid, error);
+ e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_STRV, out_strv, proxy, arg_opid, error);
}
void
const GError *error,
guint out_uint)
{
- gdbus_proxy_async_method_done (E_GDBUS_TYPE_UINT, &out_uint, proxy, arg_opid, error);
+ e_gdbus_proxy_async_method_done (E_GDBUS_TYPE_UINT, &out_uint, proxy, arg_opid, error);
}
/* takes ownership of _params */
static void
-gdbus_proxy_call_with_params (GVariant *_params,
- const gchar *method_name,
- gpointer source_tag,
- EGdbusAsyncOpKeeper *proxy,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+e_gdbus_proxy_call_with_params (GVariant *_params,
+ const gchar *method_name,
+ gpointer source_tag,
+ EGdbusAsyncOpKeeper *proxy,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
AsyncOpData *op_data;
if (op_data->cancellable)
g_object_ref (op_data->cancellable);
- 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, gdbus_async_call_opid_ready_cb, op_data);
+ 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);
}
void
GAsyncReadyCallback callback,
gpointer user_data)
{
- gdbus_proxy_call_with_params (NULL, method_name, source_tag, proxy, cancellable, callback, user_data);
+ e_gdbus_proxy_call_with_params (NULL, method_name, source_tag, proxy, cancellable, callback, user_data);
}
void
_params = g_variant_new ("(b)", in_boolean);
- gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
+ e_gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
}
void
_params = g_variant_new ("(s)", in_string);
- gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
+ e_gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
}
void
_params = g_variant_new ("(^as)", in_strv);
- gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
+ e_gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
}
void
_params = g_variant_new ("(u)", in_uint);
- gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
+ e_gdbus_proxy_call_with_params (_params, method_name, source_tag, proxy, cancellable, callback, user_data);
}
gboolean
} SyncOpData;
static void
-gdbus_proxy_sync_ready_cb (GObject *proxy,
- GAsyncResult *result,
- gpointer user_data)
+e_gdbus_proxy_sync_ready_cb (GObject *proxy,
+ GAsyncResult *result,
+ gpointer user_data)
{
SyncOpData *sync_data = user_data;
}
static gboolean
-gdbus_proxy_call_sync (GDBusProxy *proxy,
- GCancellable *cancellable,
- GError **error,
- gpointer start_func,
- gpointer finish_func,
- guint in_type,
- gconstpointer in_value,
- guint out_type,
- gpointer out_value)
+e_gdbus_proxy_call_sync (GDBusProxy *proxy,
+ GCancellable *cancellable,
+ GError **error,
+ gpointer start_func,
+ gpointer finish_func,
+ guint in_type,
+ gconstpointer in_value,
+ guint out_type,
+ gpointer out_value)
{
SyncOpData sync_data = { 0 };
switch (in_type) {
case E_GDBUS_TYPE_VOID: {
EGdbusCallStartVoid start = start_func;
- start (proxy, cancellable, gdbus_proxy_sync_ready_cb, &sync_data);
+ start (proxy, cancellable, e_gdbus_proxy_sync_ready_cb, &sync_data);
} break;
case E_GDBUS_TYPE_BOOLEAN: {
EGdbusCallStartBoolean start = start_func;
- start (proxy, * ((gboolean *) in_value), cancellable, gdbus_proxy_sync_ready_cb, &sync_data);
+ start (proxy, * ((gboolean *) in_value), cancellable, e_gdbus_proxy_sync_ready_cb, &sync_data);
} break;
case E_GDBUS_TYPE_STRING: {
EGdbusCallStartString start = start_func;
- start (proxy, (const gchar *) in_value, cancellable, gdbus_proxy_sync_ready_cb, &sync_data);
+ start (proxy, (const gchar *) in_value, cancellable, e_gdbus_proxy_sync_ready_cb, &sync_data);
} break;
case E_GDBUS_TYPE_STRV: {
EGdbusCallStartStrv start = start_func;
- start (proxy, (const gchar * const *) in_value, cancellable, gdbus_proxy_sync_ready_cb, &sync_data);
+ start (proxy, (const gchar * const *) in_value, cancellable, e_gdbus_proxy_sync_ready_cb, &sync_data);
} break;
case E_GDBUS_TYPE_UINT: {
EGdbusCallStartUint start = start_func;
- start (proxy, * ((guint *) in_value), cancellable, gdbus_proxy_sync_ready_cb, &sync_data);
+ start (proxy, * ((guint *) in_value), cancellable, e_gdbus_proxy_sync_ready_cb, &sync_data);
} break;
default:
g_warning ("%s: Unknown 'in' E_GDBUS_TYPE %x", G_STRFUNC, in_type);
}
/* check if called from the main thread */
- if (g_main_context_is_owner (g_main_context_default ())
+ if ((main_thread && main_thread == g_thread_self ()) ||
+ (!main_thread && (g_main_context_is_owner (g_main_context_default ())
|| g_main_context_default () == g_main_context_get_thread_default ()
- || !g_main_context_get_thread_default ()) {
+ || !g_main_context_get_thread_default ()))) {
+ /* the call to e_gdbus_templates_init_main_thread() wasn't done, but no problem,
+ check if the call was done in the main thread with main loop running,
+ and if so, then remember it
+ */
+ if (!main_thread && g_main_context_is_owner (g_main_context_default ()))
+ e_gdbus_templates_init_main_thread ();
+
/* Might not be the best thing here, but as the async operation
* is divided into two-step process, invoking the method and
* waiting for its "done" signal, then if the sync method is called
g_return_val_if_fail (start_func != NULL, FALSE);
g_return_val_if_fail (finish_func != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_VOID, NULL);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_VOID, NULL);
}
gboolean
g_return_val_if_fail (finish_func != NULL, FALSE);
g_return_val_if_fail (out_boolean != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_BOOLEAN, out_boolean);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_BOOLEAN, out_boolean);
}
gboolean
g_return_val_if_fail (finish_func != NULL, FALSE);
g_return_val_if_fail (out_string != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_STRING, out_string);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_STRING, out_string);
}
gboolean
g_return_val_if_fail (finish_func != NULL, FALSE);
g_return_val_if_fail (out_strv != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_STRV, out_strv);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_STRV, out_strv);
}
gboolean
g_return_val_if_fail (finish_func != NULL, FALSE);
g_return_val_if_fail (out_uint != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_UINT, out_uint);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_VOID, NULL, E_GDBUS_TYPE_UINT, out_uint);
}
gboolean
g_return_val_if_fail (start_func != NULL, FALSE);
g_return_val_if_fail (finish_func != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_BOOLEAN, &in_boolean, E_GDBUS_TYPE_VOID, NULL);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_BOOLEAN, &in_boolean, E_GDBUS_TYPE_VOID, NULL);
}
gboolean
g_return_val_if_fail (finish_func != NULL, FALSE);
g_return_val_if_fail (in_string != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_VOID, NULL);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_VOID, NULL);
}
gboolean
g_return_val_if_fail (finish_func != NULL, FALSE);
g_return_val_if_fail (in_strv != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_VOID, NULL);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_VOID, NULL);
}
gboolean
g_return_val_if_fail (start_func != NULL, FALSE);
g_return_val_if_fail (finish_func != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_UINT, &in_uint, E_GDBUS_TYPE_VOID, NULL);
+ return e_gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_UINT, &in_uint, E_GDBUS_TYPE_VOID, NULL);
}
gboolean
g_return_val_if_fail (in_string != NULL, FALSE);
g_return_val_if_fail (out_string != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_STRING, out_string);
+ 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);
}
gboolean
g_return_val_if_fail (in_string != NULL, FALSE);
g_return_val_if_fail (out_strv != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRING, in_string, E_GDBUS_TYPE_STRV, out_strv);
+ 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);
}
gboolean
g_return_val_if_fail (in_strv != NULL, FALSE);
g_return_val_if_fail (out_string != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_STRING, out_string);
+ 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);
}
gboolean
g_return_val_if_fail (in_strv != NULL, FALSE);
g_return_val_if_fail (out_strv != NULL, FALSE);
- return gdbus_proxy_call_sync (proxy, cancellable, error, start_func, finish_func, E_GDBUS_TYPE_STRV, in_strv, E_GDBUS_TYPE_STRV, out_strv);
+ 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);
}
static void