int rdp_guac_client_free_handler(guac_client* client) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; freerdp* rdp_inst = guac_client_data->rdp_inst; rdpChannels* channels = rdp_inst->context->channels; /* Clean up RDP client */ freerdp_channels_close(channels, rdp_inst); freerdp_channels_free(channels); freerdp_disconnect(rdp_inst); freerdp_clrconv_free(((rdp_freerdp_context*) rdp_inst->context)->clrconv); cache_free(rdp_inst->context->cache); freerdp_free(rdp_inst); /* Clean up filesystem, if allocated */ if (guac_client_data->filesystem != NULL) guac_rdp_fs_free(guac_client_data->filesystem); /* Free SVC list */ guac_common_list_free(guac_client_data->available_svc); /* Free client data */ guac_common_clipboard_free(guac_client_data->clipboard); guac_common_surface_free(guac_client_data->default_surface); free(guac_client_data); return 0; }
/** * Frees all layers and associated surfaces within the given list, as well as * their corresponding list elements. If the provided pointer to the linked * list is NULL, this function has no effect. * * @param layers * The head element of the linked list of layers to free, which may be NULL * if the list is currently empty. * * @param client * The client owning the layers wrapped by each of the layers in the list. */ static void guac_common_display_free_layers(guac_common_display_layer* layers, guac_client* client) { guac_common_display_layer* current = layers; /* Free each surface in given list */ while (current != NULL) { guac_common_display_layer* next = current->next; guac_layer* layer = current->layer; /* Free surface */ guac_common_surface_free(current->surface); /* Destroy layer within remotely-connected client */ guac_protocol_send_dispose(client->socket, layer); /* Free layer or buffer depending on index */ if (layer->index < 0) guac_client_free_buffer(client, layer); else if (layer->index > 0) guac_client_free_layer(client, layer); /* Free current element and advance to next */ free(current); current = next; } }
void guac_common_display_free_buffer(guac_common_display* display, guac_common_display_layer* display_buffer) { /* Remove list element from list */ guac_common_display_remove_layer(&display->buffers, display_buffer); /* Free associated layer and surface */ guac_common_surface_free(display_buffer->surface); guac_client_free_buffer(display->client, display_buffer->layer); /* Free list element */ free(display_buffer); }
void guac_rdp_bitmap_free(rdpContext* context, rdpBitmap* bitmap) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_layer* buffer = ((guac_rdp_bitmap*) bitmap)->buffer; guac_common_surface* surface = ((guac_rdp_bitmap*) bitmap)->surface; /* If cached, free surface */ if (surface != NULL) guac_common_surface_free(surface); /* If cached, free buffer */ if (buffer != NULL) guac_client_free_buffer(client, buffer); }
void guac_common_display_free(guac_common_display* display) { /* Free shared cursor */ guac_common_cursor_free(display->cursor); /* Free default surface */ guac_common_surface_free(display->default_surface); /* Free all layers and buffers */ guac_common_display_free_layers(display->buffers, display->client); guac_common_display_free_layers(display->layers, display->client); free(display); }