Exemple #1
0
static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp)
{
	rfContext* rfi;
	freerdp* instance;


	rfi = GET_DATA(gp);
	instance = rfi->instance;

	if (rfi->thread)
	{
		pthread_cancel(rfi->thread);

		if (rfi->thread)
			pthread_join(rfi->thread, NULL);
	}

	pthread_mutex_destroy(&rfi->mutex);

	g_mutex_free(rfi->gmutex);
	g_cond_free(rfi->gcond);

	remmina_rdp_event_uninit(gp);
	remmina_plugin_service->protocol_plugin_emit_signal(gp, "disconnect");

	if (instance)
	{
		if ( rfi->connected ) {
			if (instance->context->channels)
				freerdp_channels_close(instance->context->channels, instance);
			freerdp_disconnect(instance);
			rfi->connected = False;
		}
	}

	if (rfi->rfx_context)
	{
		rfx_context_free(rfi->rfx_context);
		rfi->rfx_context = NULL;
	}

	if (instance)
	{
		/* Remove instance->context from gp object data to avoid double free */
		g_object_steal_data(G_OBJECT(gp), "plugin-data");

		if (instance->context->channels) {
			freerdp_channels_free(instance->context->channels);
			instance->context->channels = NULL;
		}

		freerdp_context_free(instance); /* context is rfContext* rfi */
		freerdp_free(instance);
		rfi->instance = NULL;
	}

	return FALSE;
}
Exemple #2
0
static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp)
{
    rfContext* rfi;
    freerdp* instance;

    rfi = GET_DATA(gp);
    instance = rfi->instance;

    if (rfi->thread)
    {
        pthread_cancel(rfi->thread);

        if (rfi->thread)
            pthread_join(rfi->thread, NULL);
    }

    pthread_mutex_destroy(&rfi->mutex);

    g_mutex_free(rfi->gmutex);
    g_cond_free(rfi->gcond);

    remmina_rdp_event_uninit(gp);
    remmina_plugin_service->protocol_plugin_emit_signal(gp, "disconnect");

    if (instance)
    {
        if (rfi->channels)
        {
            //freerdp_channels_close(rfi->channels, instance);
            freerdp_channels_free(rfi->channels);
            rfi->channels = NULL;
        }
        if (freerdp_shall_disconnect(instance))
        {
            freerdp_disconnect(instance);
        }
    }

    if (rfi->rfx_context)
    {
        rfx_context_free(rfi->rfx_context);
        rfi->rfx_context = NULL;
    }

    if (instance)
    {
        //freerdp_context_free(instance); /* context is rfContext* rfi */
        freerdp_free(instance);
    }

    return FALSE;
}