decoder->rect_width = 0;
decoder->rect_height = 0;
decoder->shared_flag = TRUE;
- decoder->disconnected = FALSE;
decoder->data = NULL;
decoder->data_len = 0;
decoder->error = NULL;
{
g_return_if_fail (decoder != NULL);
- if (decoder->cancellable) {
- g_cancellable_cancel (decoder->cancellable);
- g_object_unref (decoder->cancellable);
- decoder->cancellable = NULL;
- }
+ rfb_decoder_disconnect (decoder);
- g_clear_object (&decoder->connection);
g_clear_object (&decoder->socket_client);
- g_clear_error (&decoder->error);
- g_free (decoder->data);
+ g_clear_object (&decoder->cancellable);
g_mutex_clear (&decoder->write_lock);
g_free (decoder);
}
g_return_val_if_fail (decoder->connection == NULL, FALSE);
g_return_val_if_fail (host != NULL, FALSE);
+ g_cancellable_reset (decoder->cancellable);
+
connection =
g_socket_client_connect_to_host (decoder->socket_client, host, port,
decoder->cancellable, &err);
goto connect_failed;
decoder->connection = connection;
- decoder->disconnected = FALSE;
return TRUE;
}
}
+void
+rfb_decoder_disconnect (RfbDecoder * decoder)
+{
+ GST_DEBUG ("Disconnecting from the rfb server");
+
+ g_return_if_fail (decoder);
+ g_return_if_fail (decoder->cancellable);
+
+ g_cancellable_cancel (decoder->cancellable);
+
+ /* Make sure threaded write a done first, this avoids race condition,
+ * specially when the decoder is freed */
+ g_mutex_lock (&decoder->write_lock);
+
+ g_clear_object (&decoder->connection);
+ g_clear_error (&decoder->error);
+ g_clear_pointer (&decoder->data, g_free);
+
+ g_mutex_unlock (&decoder->write_lock);
+}
+
/**
* rfb_decoder_iterate:
* @decoder: The rfb context
}
}
g_clear_error (&err);
- decoder->disconnected = TRUE;
return NULL;
}
}
if (((w * h) + (x * y)) > (decoder->width * decoder->height)) {
GST_ERROR ("Desktop resize is unsupported.");
decoder->state = NULL;
- decoder->disconnected = TRUE;
return TRUE;
}
break;
}
decoder->n_rects--;
- if (decoder->n_rects == 0 || decoder->disconnected) {
+ if (decoder->n_rects == 0) {
decoder->state = NULL;
} else {
decoder->state = rfb_decoder_state_framebuffer_update_rectangle;
/* settable properties */
gboolean shared_flag;
- gboolean disconnected;
/* readable properties */
gboolean inited;
void rfb_decoder_free (RfbDecoder * decoder);
gboolean rfb_decoder_connect_tcp (RfbDecoder * decoder,
gchar * host, guint port);
+void rfb_decoder_disconnect (RfbDecoder * decoder);
gboolean rfb_decoder_iterate (RfbDecoder * decoder);
void rfb_decoder_send_update_request (RfbDecoder * decoder,
gboolean incremental, gint x, gint y, gint width, gint height);