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); GstRfbSrc *src = GST_RFB_SRC (bsrc);
if (src->decoder->connection) { rfb_decoder_disconnect (src->decoder);
g_object_unref (src->decoder->connection);
src->decoder->connection = NULL;
}
if (src->decoder->frame) { if (src->decoder->frame) {
g_free (src->decoder->frame); g_free (src->decoder->frame);

View file

@ -64,7 +64,6 @@ rfb_decoder_new (void)
decoder->rect_width = 0; decoder->rect_width = 0;
decoder->rect_height = 0; decoder->rect_height = 0;
decoder->shared_flag = TRUE; decoder->shared_flag = TRUE;
decoder->disconnected = FALSE;
decoder->data = NULL; decoder->data = NULL;
decoder->data_len = 0; decoder->data_len = 0;
decoder->error = NULL; decoder->error = NULL;
@ -79,16 +78,10 @@ rfb_decoder_free (RfbDecoder * decoder)
{ {
g_return_if_fail (decoder != NULL); g_return_if_fail (decoder != NULL);
if (decoder->cancellable) { rfb_decoder_disconnect (decoder);
g_cancellable_cancel (decoder->cancellable);
g_object_unref (decoder->cancellable);
decoder->cancellable = NULL;
}
g_clear_object (&decoder->connection);
g_clear_object (&decoder->socket_client); g_clear_object (&decoder->socket_client);
g_clear_error (&decoder->error); g_clear_object (&decoder->cancellable);
g_free (decoder->data);
g_mutex_clear (&decoder->write_lock); g_mutex_clear (&decoder->write_lock);
g_free (decoder); 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 (decoder->connection == NULL, FALSE);
g_return_val_if_fail (host != NULL, FALSE); g_return_val_if_fail (host != NULL, FALSE);
g_cancellable_reset (decoder->cancellable);
connection = connection =
g_socket_client_connect_to_host (decoder->socket_client, host, port, g_socket_client_connect_to_host (decoder->socket_client, host, port,
decoder->cancellable, &err); decoder->cancellable, &err);
@ -113,7 +108,6 @@ rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port)
goto connect_failed; goto connect_failed;
decoder->connection = connection; decoder->connection = connection;
decoder->disconnected = FALSE;
return TRUE; 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: * rfb_decoder_iterate:
* @decoder: The rfb context * @decoder: The rfb context
@ -205,7 +220,6 @@ recv_error:
} }
} }
g_clear_error (&err); g_clear_error (&err);
decoder->disconnected = TRUE;
return NULL; return NULL;
} }
} }
@ -761,7 +775,6 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder)
if (((w * h) + (x * y)) > (decoder->width * decoder->height)) { if (((w * h) + (x * y)) > (decoder->width * decoder->height)) {
GST_ERROR ("Desktop resize is unsupported."); GST_ERROR ("Desktop resize is unsupported.");
decoder->state = NULL; decoder->state = NULL;
decoder->disconnected = TRUE;
return TRUE; return TRUE;
} }
@ -786,7 +799,7 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder)
break; break;
} }
decoder->n_rects--; decoder->n_rects--;
if (decoder->n_rects == 0 || decoder->disconnected) { if (decoder->n_rects == 0) {
decoder->state = NULL; decoder->state = NULL;
} else { } else {
decoder->state = rfb_decoder_state_framebuffer_update_rectangle; decoder->state = rfb_decoder_state_framebuffer_update_rectangle;

View file

@ -56,7 +56,6 @@ struct _RfbDecoder
/* settable properties */ /* settable properties */
gboolean shared_flag; gboolean shared_flag;
gboolean disconnected;
/* readable properties */ /* readable properties */
gboolean inited; gboolean inited;
@ -103,6 +102,7 @@ RfbDecoder *rfb_decoder_new (void);
void rfb_decoder_free (RfbDecoder * decoder); void rfb_decoder_free (RfbDecoder * decoder);
gboolean rfb_decoder_connect_tcp (RfbDecoder * decoder, gboolean rfb_decoder_connect_tcp (RfbDecoder * decoder,
gchar * host, guint port); gchar * host, guint port);
void rfb_decoder_disconnect (RfbDecoder * decoder);
gboolean rfb_decoder_iterate (RfbDecoder * decoder); gboolean rfb_decoder_iterate (RfbDecoder * decoder);
void rfb_decoder_send_update_request (RfbDecoder * decoder, void rfb_decoder_send_update_request (RfbDecoder * decoder,
gboolean incremental, gint x, gint y, gint width, gint height); gboolean incremental, gint x, gint y, gint width, gint height);