rfbsrc: Add a internal method to disconnect

This also removes the disconnected boolean hack.
This commit is contained in:
Nicolas Dufresne 2016-03-24 18:14:17 -04:00
parent ff5dc55c8a
commit ba93b86011
3 changed files with 28 additions and 18 deletions

View file

@ -516,10 +516,7 @@ gst_rfb_src_stop (GstBaseSrc * bsrc)
{
GstRfbSrc *src = GST_RFB_SRC (bsrc);
if (src->decoder->connection) {
g_object_unref (src->decoder->connection);
src->decoder->connection = NULL;
}
rfb_decoder_disconnect (src->decoder);
if (src->decoder->frame) {
g_free (src->decoder->frame);

View file

@ -64,7 +64,6 @@ rfb_decoder_new (void)
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;
@ -79,16 +78,10 @@ rfb_decoder_free (RfbDecoder * decoder)
{
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);
}
@ -105,6 +98,8 @@ rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port)
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);
@ -113,7 +108,6 @@ rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port)
goto connect_failed;
decoder->connection = connection;
decoder->disconnected = FALSE;
return TRUE;
@ -134,6 +128,27 @@ connect_failed:
}
}
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
@ -205,7 +220,6 @@ recv_error:
}
}
g_clear_error (&err);
decoder->disconnected = TRUE;
return NULL;
}
}
@ -761,7 +775,6 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder)
if (((w * h) + (x * y)) > (decoder->width * decoder->height)) {
GST_ERROR ("Desktop resize is unsupported.");
decoder->state = NULL;
decoder->disconnected = TRUE;
return TRUE;
}
@ -786,7 +799,7 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder)
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;

View file

@ -56,7 +56,6 @@ struct _RfbDecoder
/* settable properties */
gboolean shared_flag;
gboolean disconnected;
/* readable properties */
gboolean inited;
@ -103,6 +102,7 @@ RfbDecoder *rfb_decoder_new (void);
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);