void xmmsc_ipc_destroy (xmmsc_ipc_t *ipc) { if (!ipc) return; x_list_free (ipc->results_list); if (ipc->transport) { xmms_ipc_transport_destroy (ipc->transport); } if (ipc->out_msg) { x_queue_free (ipc->out_msg); } if (ipc->read_msg) { xmms_ipc_msg_destroy (ipc->read_msg); } if (ipc->error) { free (ipc->error); } if (ipc->disconnect_data && ipc->disconnect_data_free_func) { xmmsc_user_data_free_func_t f = ipc->disconnect_data_free_func; f (ipc->disconnect_data); } if (ipc->need_out_data && ipc->need_out_data_free_func) { xmmsc_user_data_free_func_t f = ipc->need_out_data_free_func; f (ipc->need_out_data); } free (ipc); }
static void xmms_ipc_client_destroy (xmms_ipc_client_t *client) { guint i; XMMS_DBG ("Destroying client!"); if (client->ipc) { g_mutex_lock (client->ipc->mutex_lock); client->ipc->clients = g_list_remove (client->ipc->clients, client); g_mutex_unlock (client->ipc->mutex_lock); } g_main_loop_unref (client->ml); g_io_channel_unref (client->iochan); xmms_ipc_transport_destroy (client->transport); g_mutex_lock (client->lock); while (!g_queue_is_empty (client->out_msg)) { xmms_ipc_msg_t *msg = g_queue_pop_head (client->out_msg); xmms_ipc_msg_destroy (msg); } g_queue_free (client->out_msg); for (i = 0; i < XMMS_IPC_SIGNAL_END; i++) { g_list_free (client->broadcasts[i]); } g_mutex_unlock (client->lock); g_mutex_free (client->lock); g_free (client); }
int xmmsc_ipc_io_out_callback (xmmsc_ipc_t *ipc) { bool disco = false; x_return_val_if_fail (ipc, false); x_return_val_if_fail (!ipc->disconnect, false); while (!x_queue_is_empty (ipc->out_msg)) { xmms_ipc_msg_t *msg = x_queue_peek_head (ipc->out_msg); if (xmms_ipc_msg_write_transport (msg, ipc->transport, &disco)) { x_queue_pop_head (ipc->out_msg); xmms_ipc_msg_destroy (msg); } else { break; } } if (disco) { xmmsc_ipc_disconnect (ipc); } else { if (ipc->need_out_callback) ipc->need_out_callback (xmmsc_ipc_io_out (ipc), ipc->need_out_data); } return !disco; }
static gboolean xmms_ipc_client_read_cb (GIOChannel *iochan, GIOCondition cond, gpointer data) { xmms_ipc_client_t *client = data; bool disconnect = FALSE; g_return_val_if_fail (client, FALSE); if (cond & G_IO_IN) { while (TRUE) { if (!client->read_msg) { client->read_msg = xmms_ipc_msg_alloc (); } if (xmms_ipc_msg_read_transport (client->read_msg, client->transport, &disconnect)) { xmms_ipc_msg_t *msg = client->read_msg; client->read_msg = NULL; process_msg (client, msg); xmms_ipc_msg_destroy (msg); } else { break; } } } if (disconnect || (cond & G_IO_HUP)) { if (client->read_msg) { xmms_ipc_msg_destroy (client->read_msg); client->read_msg = NULL; } XMMS_DBG ("disconnect was true!"); g_main_loop_quit (client->ml); return FALSE; } if (cond & G_IO_ERR) { xmms_log_error ("Client got error, maybe connection died?"); g_main_loop_quit (client->ml); return FALSE; } return TRUE; }
void xmmsc_ipc_disconnect (xmmsc_ipc_t *ipc) { ipc->disconnect = true; if (ipc->read_msg) { xmms_ipc_msg_destroy (ipc->read_msg); ipc->read_msg = NULL; } xmmsc_ipc_error_set (ipc, strdup ("Disconnected")); if (ipc->disconnect_callback) { ipc->disconnect_callback (ipc->disconnect_data); } }
static void xmmsc_ipc_exec_msg (xmmsc_ipc_t *ipc, xmms_ipc_msg_t *msg) { xmmsc_result_t *res; res = xmmsc_ipc_result_lookup (ipc, xmms_ipc_msg_get_cookie (msg)); if (!res) { xmms_ipc_msg_destroy (msg); return; } xmmsc_result_run (res, msg); }
static gboolean xmms_ipc_client_write_cb (GIOChannel *iochan, GIOCondition cond, gpointer data) { xmms_ipc_client_t *client = data; bool disconnect = FALSE; g_return_val_if_fail (client, FALSE); while (TRUE) { xmms_ipc_msg_t *msg; g_mutex_lock (client->lock); msg = g_queue_peek_head (client->out_msg); g_mutex_unlock (client->lock); if (!msg) break; if (!xmms_ipc_msg_write_transport (msg, client->transport, &disconnect)) { if (disconnect) { break; } else { /* try sending again later */ return TRUE; } } g_mutex_lock (client->lock); g_queue_pop_head (client->out_msg); g_mutex_unlock (client->lock); xmms_ipc_msg_destroy (msg); } return FALSE; }