8 #include "mpd-async-request.h"
10 #define LOG_DOMAIN "MpdAsyncRequest"
15 MpdAsyncFunction
*function
;
16 gpointer function_data
;
17 MpdAsyncCallback
*callback
;
18 gpointer callback_data
;
22 static void __async_handler_function(GSimpleAsyncResult
* simple
, GObject
* object
, GCancellable
* cancel
)
24 MpdAsyncData
*data
= g_simple_async_result_get_op_res_gpointer(G_SIMPLE_ASYNC_RESULT(simple
));
25 g_log(LOG_DOMAIN
, G_LOG_LEVEL_DEBUG
, "Start async function\n");
26 if (mpd_connect(data
->mi
) == MPD_OK
)
28 g_log(LOG_DOMAIN
, G_LOG_LEVEL_DEBUG
, "call function\n");
29 data
->result
= (data
->function(data
->mi
, data
->function_data
));
30 g_log(LOG_DOMAIN
, G_LOG_LEVEL_DEBUG
, "Got result: %p\n", data
->result
);
36 static void __mpd_async_simple_callback(GObject
* object
, GAsyncResult
* simple
, gpointer user_data
)
38 MpdAsyncData
*data
= g_simple_async_result_get_op_res_gpointer(G_SIMPLE_ASYNC_RESULT(simple
));
39 g_log(LOG_DOMAIN
, G_LOG_LEVEL_DEBUG
, "Start async result function %p\n", data
);
41 data
->callback(data
->result
, data
->callback_data
);
44 static void __mpd_async_result_free_data(gpointer udata
)
46 MpdAsyncData
*data
= (MpdAsyncData
*) udata
;
47 g_log(LOG_DOMAIN
, G_LOG_LEVEL_DEBUG
, "Free data\n");
51 void mpd_async_request(MpdAsyncCallback
* callback
, gpointer callback_data
, MpdAsyncFunction
* function
,
52 gpointer function_data
)
55 GSimpleAsyncResult
*res
= NULL
;
56 MpdAsyncData
*data
= g_new0(MpdAsyncData
, 1);
57 data
->mi
= mpd_new_default();
58 data
->function
= function
;
59 data
->function_data
= function_data
;
60 data
->callback
= callback
;
61 data
->callback_data
= callback_data
;
65 string
= connection_get_hostname();
66 mpd_set_hostname(data
->mi
, string
);
70 mpd_set_port(data
->mi
, connection_get_port());
74 mpd_set_connection_timeout(data
->mi
,
75 cfg_get_single_value_as_float_with_default(config
, "connection", "timeout",
78 if (connection_use_auth())
80 string
= connection_get_password();
81 mpd_set_password(data
->mi
, string
);
84 mpd_set_password(data
->mi
, "");
87 res
= g_simple_async_result_new(NULL
, __mpd_async_simple_callback
, NULL
, mpd_async_request
);
88 g_simple_async_result_set_op_res_gpointer(G_SIMPLE_ASYNC_RESULT(res
), data
, __mpd_async_result_free_data
);
89 g_log(LOG_DOMAIN
, G_LOG_LEVEL_DEBUG
, "Start async thread %p\n", data
);
90 g_simple_async_result_run_in_thread(res
, __async_handler_function
, G_PRIORITY_LOW
, NULL
);