diff --git a/libguac/include/client-handlers.h b/libguac/include/client-handlers.h index c48f12b8..7db42e6f 100644 --- a/libguac/include/client-handlers.h +++ b/libguac/include/client-handlers.h @@ -106,20 +106,6 @@ int __guac_handle_clipboard(guac_client* client, guac_instruction* instruction); */ int __guac_handle_disconnect(guac_client* client, guac_instruction* instruction); -/** - * Internal initial handler for the accept instruction. When an accept instruction - * is received, this handler will be called. The accept handler of the corresponding - * resource will be called if the resource is valid and the handler is defined. - */ -int __guac_handle_accept(guac_client* client, guac_instruction* instruction); - -/** - * Internal initial handler for the reject instruction. When a reject instruction - * is received, this handler will be called. The reject handler of the corresponding - * resource will be called if the resource is valid and the handler is defined. - */ -int __guac_handle_reject(guac_client* client, guac_instruction* instruction); - /** * Instruction handler mapping table. This is a NULL-terminated array of * __guac_instruction_handler_mapping structures, each mapping an opcode diff --git a/libguac/include/client.h b/libguac/include/client.h index 05d14172..1c600c12 100644 --- a/libguac/include/client.h +++ b/libguac/include/client.h @@ -44,7 +44,6 @@ #include "instruction.h" #include "layer.h" #include "pool.h" -#include "resource.h" #include "socket.h" #include "timestamp.h" @@ -134,14 +133,6 @@ typedef int guac_client_init_handler(guac_client* client, int argc, char** argv) */ #define GUAC_BUFFER_POOL_INITIAL_SIZE 1024 -/** - * The number of initial slots to allocate for resources within the client resource - * map. The client resource map maps resource indices to actual guac_resource instances. - * This map will need to be reallocated once the number of resources required exceeds - * the available number of slots. - */ -#define GUAC_RESOURCE_MAP_INITIAL_SIZE 1024 - /** * Possible current states of the Guacamole client. Currently, the only * two states are GUAC_CLIENT_RUNNING and GUAC_CLIENT_STOPPING. @@ -373,21 +364,6 @@ struct guac_client { */ guac_pool* __layer_pool; - /** - * Pool of server-side resource indices. - */ - guac_pool* __resource_pool; - - /** - * Array of all allocated resources. - */ - guac_resource** __resource_map; - - /** - * The number of elements in the __resource_map array. - */ - int __available_resource_slots; - }; /** @@ -512,25 +488,6 @@ void guac_client_free_buffer(guac_client* client, guac_layer* layer); */ void guac_client_free_layer(guac_client* client, guac_layer* layer); -/** - * Allocates a new resource. An arbitrary index is automatically assigned - * if no existing resource index is available for use. - * - * @param client The proxy client to allocate the resource for. - * @return The next available resource, or a newly allocated resource. - */ -guac_resource* guac_client_alloc_resource(guac_client* client); - -/** - * Frees an existing resource, re-adding it to the client's resource - * pool, such that it can be reused by a subsequent call to - * guac_client_alloc_resource(). - * - * @param client The proxy client to free the resource for. - * @oaran resource The resource to return to the resource pool. - */ -void guac_client_free_resource(guac_client* client, guac_resource* resource); - /** * The default Guacamole client layer, layer 0. */ diff --git a/libguac/include/layer.h b/libguac/include/layer.h index 6e867b35..956a84e3 100644 --- a/libguac/include/layer.h +++ b/libguac/include/layer.h @@ -56,13 +56,6 @@ struct guac_layer { */ int index; - /** - * The URI which must be passed via a resource instruction to denote - * a resource related to this layer. This value is automatically set - * upon allocation. - */ - char* uri; - }; #endif diff --git a/libguac/include/protocol.h b/libguac/include/protocol.h index 62ade022..6c4fca8c 100644 --- a/libguac/include/protocol.h +++ b/libguac/include/protocol.h @@ -41,7 +41,6 @@ #include #include "layer.h" -#include "resource.h" #include "socket.h" #include "timestamp.h" @@ -193,22 +192,6 @@ int guac_protocol_send_args(guac_socket* socket, const char** args); */ int guac_protocol_send_connect(guac_socket* socket, const char** args); -/** - * Sends a data instruction over the given guac_socket connection. - * - * If an error occurs sending the instruction, a non-zero value is - * returned, and guac_error is set appropriately. - * - * @param socket The guac_socket connection to use. - * @param resource The resource associated with the data being sent. - * @param data The data to send. - * @param size The number of bytes from the beginning of the given buffer - * of data to send. - * @return Zero on success, non-zero on error. - */ -int guac_protocol_send_data(guac_socket* socket, guac_resource* resource, - const unsigned char* data, size_t size); - /** * Sends a disconnect instruction over the given guac_socket connection. * @@ -220,18 +203,6 @@ int guac_protocol_send_data(guac_socket* socket, guac_resource* resource, */ int guac_protocol_send_disconnect(guac_socket* socket); -/** - * Sends an end instruction over the given guac_socket connection. - * - * If an error occurs sending the instruction, a non-zero value is - * returned, and guac_error is set appropriately. - * - * @param socket The guac_socket connection to use. - * @param resource The resource being closed. - * @return Zero on success, non-zero on error. - */ -int guac_protocol_send_end(guac_socket* socket, guac_resource* resource); - /** * Sends an error instruction over the given guac_socket connection. * @@ -244,22 +215,6 @@ int guac_protocol_send_end(guac_socket* socket, guac_resource* resource); */ int guac_protocol_send_error(guac_socket* socket, const char* error); -/** - * Sends a resource instruction over the given guac_socket connection. - * - * If an error occurs sending the instruction, a non-zero value is - * returned, and guac_error is set appropriately. - * - * @param socket The guac_socket connection to use. - * @param resource The resource being exposed. - * @param uri The URI this resource should be exposed to. - * @param mimetypes A NULL-terminated array of strings, where each string is - * an available mimetype. - * @return Zero on success, non-zero on error. - */ -int guac_protocol_send_resource(guac_socket* socket, guac_resource* resource, - const char* uri, const char** mimetypes); - /** * Sends a set instruction over the given guac_socket connection. * diff --git a/libguac/include/resource.h b/libguac/include/resource.h deleted file mode 100644 index 612b5a0f..00000000 --- a/libguac/include/resource.h +++ /dev/null @@ -1,111 +0,0 @@ - -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is libguac. - * - * The Initial Developer of the Original Code is - * Michael Jumper. - * Portions created by the Initial Developer are Copyright (C) 2010 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - - -#ifndef _GUAC_RESOURCE_H -#define _GUAC_RESOURCE_H - -#include "client.h" - -/** - * Provides functions and structures required for handling resources. - * - * NOTE: The data and end instructions are currently implemented client-side - * only, and allocation of resources must ALWAYS be server-side. - * - * Each resource is mono-directional. Two resources must be allocated for - * bidirectional communication. - * - * Exposure of client-side resources to the server will be accomplished - * over the same protocol (resource -> accept/reject -> data -> end). The - * mono-directional nature of resources will allow the index spaces of - * client and server resources to be independent. - * - * @file resource.h - */ - -typedef struct guac_resource guac_resource; - -/** - * Handler which begins resource transfer when the client accepts an exposed - * resource. - */ -typedef int guac_resource_accept_handler(guac_resource* resource, - const char* mimetype); - -/** - * Handler which cancels resource transfer when the client rejects an exposed - * resource. - */ -typedef int guac_resource_reject_handler(guac_resource* resource); - -/** - * Represents a single resource which can be requested or exposed via - * the Guacamole protocol. - */ -struct guac_resource { - - /** - * The index of this resource. - */ - int index; - - /** - * Handler which will be called when this resource is accepted by the - * client. - */ - guac_resource_accept_handler* accept_handler; - - /** - * Handler which will be called when this resource is rejected by the - * client. - */ - guac_resource_reject_handler* reject_handler; - - /** - * The client this resource was allocated for. - */ - guac_client* client; - - /** - * Arbitrary data associated with this resource. - */ - void* data; - -}; - -#endif diff --git a/libguac/src/Makefile.am b/libguac/src/Makefile.am index 750dd817..241e98de 100644 --- a/libguac/src/Makefile.am +++ b/libguac/src/Makefile.am @@ -48,7 +48,6 @@ libguacinc_HEADERS = \ ../include/plugin.h \ ../include/pool.h \ ../include/protocol.h \ - ../include/resource.h \ ../include/socket.h \ ../include/timestamp.h diff --git a/libguac/src/client-handlers.c b/libguac/src/client-handlers.c index 459b6d47..a6a144f3 100644 --- a/libguac/src/client-handlers.c +++ b/libguac/src/client-handlers.c @@ -50,8 +50,6 @@ __guac_instruction_handler_mapping __guac_instruction_handler_map[] = { {"key", __guac_handle_key}, {"clipboard", __guac_handle_clipboard}, {"disconnect", __guac_handle_disconnect}, - {"accept", __guac_handle_accept}, - {"reject", __guac_handle_reject}, {NULL, NULL} }; @@ -122,42 +120,3 @@ int __guac_handle_disconnect(guac_client* client, guac_instruction* instruction) return -1; } -int __guac_handle_accept(guac_client* client, guac_instruction* instruction) { - - /* Get index, check validity */ - int index = __guac_parse_int(instruction->argv[0]); - if (index < client->__available_resource_slots) { - - /* Build parameters */ - char* mimetype = instruction->argv[1]; - guac_resource* resource = client->__resource_map[index]; - - /* If accept handler defined, call it */ - if (resource->accept_handler) - return resource->accept_handler(resource, mimetype); - - } - - /* Ignore invalid indices */ - return 0; - -} - -int __guac_handle_reject(guac_client* client, guac_instruction* instruction) { - - /* Get index, check validity */ - int index = __guac_parse_int(instruction->argv[0]); - if (index < client->__available_resource_slots) { - - /* Build parameters */ - guac_resource* resource = client->__resource_map[index]; - - /* If reject handler defined, call it */ - if (resource->reject_handler) - return resource->reject_handler(resource); - - } - - return 0; -} - diff --git a/libguac/src/client.c b/libguac/src/client.c index 34ebbbed..259a959d 100644 --- a/libguac/src/client.c +++ b/libguac/src/client.c @@ -50,42 +50,16 @@ #include "time.h" guac_layer __GUAC_DEFAULT_LAYER = { - .index = 0, - .uri = "layer://0", + .index = 0 }; const guac_layer* GUAC_DEFAULT_LAYER = &__GUAC_DEFAULT_LAYER; -guac_resource* guac_client_alloc_resource(guac_client* client) { - - /* Init new layer */ - guac_resource* resource = malloc(sizeof(guac_resource)); - resource->index = guac_pool_next_int(client->__resource_pool); - resource->accept_handler = NULL; - resource->reject_handler = NULL; - resource->data = NULL; - - /* Resize resource map if necessary */ - if (resource->index >= client->__available_resource_slots) { - client->__available_resource_slots = resource->index * 2; - client->__resource_map = realloc(client->__resource_map, - sizeof(guac_resource*) * client->__available_resource_slots); - } - - /* Store resource in map */ - client->__resource_map[resource->index] = resource; - - return resource; - -} - guac_layer* guac_client_alloc_layer(guac_client* client) { /* Init new layer */ guac_layer* allocd_layer = malloc(sizeof(guac_layer)); allocd_layer->index = guac_pool_next_int(client->__layer_pool)+1; - allocd_layer->uri = malloc(64); - snprintf(allocd_layer->uri, 64, "layer://%i", allocd_layer->index); return allocd_layer; @@ -96,23 +70,11 @@ guac_layer* guac_client_alloc_buffer(guac_client* client) { /* Init new layer */ guac_layer* allocd_layer = malloc(sizeof(guac_layer)); allocd_layer->index = -guac_pool_next_int(client->__buffer_pool) - 1; - allocd_layer->uri = malloc(64); - snprintf(allocd_layer->uri, 64, "layer://%i", allocd_layer->index); return allocd_layer; } -void guac_client_free_resource(guac_client* client, guac_resource* resource) { - - /* Release index to pool */ - guac_pool_free_int(client->__resource_pool, resource->index); - - /* Free resource */ - free(resource); - -} - void guac_client_free_buffer(guac_client* client, guac_layer* layer) { /* Release index to pool */ @@ -155,12 +117,6 @@ guac_client* guac_client_alloc() { client->__buffer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE); client->__layer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE); - /* Allocate resource pool */ - client->__resource_pool = guac_pool_alloc(0); - client->__available_resource_slots = GUAC_RESOURCE_MAP_INITIAL_SIZE; - client->__resource_map = - malloc(sizeof(guac_resource*) * client->__available_resource_slots); - return client; } @@ -178,10 +134,6 @@ void guac_client_free(guac_client* client) { guac_pool_free(client->__buffer_pool); guac_pool_free(client->__layer_pool); - /* Free resource pool */ - guac_pool_free(client->__resource_pool); - free(client->__resource_map); - free(client); } diff --git a/libguac/src/protocol.c b/libguac/src/protocol.c index 42fe5f9c..84344470 100644 --- a/libguac/src/protocol.c +++ b/libguac/src/protocol.c @@ -575,26 +575,6 @@ int guac_protocol_send_curve(guac_socket* socket, const guac_layer* layer, } -int guac_protocol_send_data(guac_socket* socket, guac_resource* resource, - const unsigned char* data, size_t size) { - - /* Calculate base64 length */ - int base64_length = (size + 2) / 3 * 4; - - /* Send base64-encoded data */ - return - guac_socket_write_string(socket, "4.data,") - || __guac_socket_write_length_int(socket, resource->index) - || guac_socket_write_string(socket, ",") - || guac_socket_write_int(socket, base64_length) - || guac_socket_write_string(socket, ".") - || guac_socket_write_base64(socket, data, size) - || guac_socket_flush_base64(socket) - || guac_socket_write_string(socket, ";"); - -} - - int guac_protocol_send_disconnect(guac_socket* socket) { return guac_socket_write_string(socket, "10.disconnect;"); } @@ -634,15 +614,6 @@ int guac_protocol_send_distort(guac_socket* socket, const guac_layer* layer, } -int guac_protocol_send_end(guac_socket* socket, guac_resource* resource) { - - return - guac_socket_write_string(socket, "3.end,") - || __guac_socket_write_length_int(socket, resource->index) - || guac_socket_write_string(socket, ";"); -} - - int guac_protocol_send_error(guac_socket* socket, const char* error) { return @@ -813,39 +784,6 @@ int guac_protocol_send_reset(guac_socket* socket, const guac_layer* layer) { } -int guac_protocol_send_resource(guac_socket* socket, guac_resource* resource, - const char* uri, const char** mimetypes) { - - /* Write resource header */ - if ( - guac_socket_write_string(socket, "8.resource,") - || __guac_socket_write_length_int(socket, resource->index) - || guac_socket_write_string(socket, ",") - || __guac_socket_write_length_string(socket, uri) - ) - return -1; - - /* Write each mimetype */ - while (*mimetypes != NULL) { - - /* Write mimetype */ - if ( - guac_socket_write_string(socket, ",") - || __guac_socket_write_length_string(socket, *mimetypes) - ) - return -1; - - /* Next mimetype */ - mimetypes++; - - } - - /* Finish instruction */ - return guac_socket_write_string(socket, ";"); - -} - - int guac_protocol_send_set(guac_socket* socket, const guac_layer* layer, const char* name, const char* value) { diff --git a/libguac/tests/Makefile.am b/libguac/tests/Makefile.am index fc49c680..8a4d0254 100644 --- a/libguac/tests/Makefile.am +++ b/libguac/tests/Makefile.am @@ -51,7 +51,6 @@ test_libguac_SOURCES = \ client/client_suite.c \ client/buffer_pool.c \ client/layer_pool.c \ - client/resource_pool.c \ protocol/suite.c \ protocol/instruction_read.c \ protocol/instruction_write.c \ diff --git a/libguac/tests/client/client_suite.c b/libguac/tests/client/client_suite.c index 9834dec4..b2c83c72 100644 --- a/libguac/tests/client/client_suite.c +++ b/libguac/tests/client/client_suite.c @@ -61,7 +61,6 @@ int register_client_suite() { if ( CU_add_test(suite, "layer-pool", test_layer_pool) == NULL || CU_add_test(suite, "buffer-pool", test_buffer_pool) == NULL - || CU_add_test(suite, "resource-pool", test_resource_pool) == NULL ) { CU_cleanup_registry(); return CU_get_error(); diff --git a/libguac/tests/client/client_suite.h b/libguac/tests/client/client_suite.h index 5415ebed..804c85dd 100644 --- a/libguac/tests/client/client_suite.h +++ b/libguac/tests/client/client_suite.h @@ -42,7 +42,6 @@ int register_client_suite(); void test_layer_pool(); void test_buffer_pool(); -void test_resource_pool(); #endif diff --git a/libguac/tests/client/resource_pool.c b/libguac/tests/client/resource_pool.c deleted file mode 100644 index 6f1d0f2b..00000000 --- a/libguac/tests/client/resource_pool.c +++ /dev/null @@ -1,139 +0,0 @@ - -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is libguac. - * - * The Initial Developer of the Original Code is - * Michael Jumper. - * Portions created by the Initial Developer are Copyright (C) 2010 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include - -#include "client.h" -#include "client_suite.h" - -void test_resource_pool() { - - guac_client* client; - guac_resource* resource0; - guac_resource* resource1; - guac_resource* resource2; - - /* Get client */ - client = guac_client_alloc(); - CU_ASSERT_PTR_NOT_NULL_FATAL(client); - - /* - * POOL: [ EMPTY ] - * IN USE: [ NONE ] - */ - - /* First resource should be resource 0 */ - resource0 = guac_client_alloc_resource(client); - CU_ASSERT_PTR_NOT_NULL_FATAL(resource0); - CU_ASSERT_EQUAL_FATAL(0, resource0->index); - - /* - * POOL: [ EMPTY ] - * IN USE: [ 0 ] - */ - - /* Put 0 back in pool (1) */ - guac_client_free_resource(client, resource0); - - /* - * POOL: [ 0 ] - * IN USE: [ NONE ] - */ - - /* Since we free'd 0, we should get 0 again here (1) */ - resource0 = guac_client_alloc_resource(client); - CU_ASSERT_PTR_NOT_NULL_FATAL(resource0); - CU_ASSERT_EQUAL_FATAL(0, resource0->index); - - /* - * POOL: [ EMPTY ] - * IN USE: [ 0 ] - */ - - /* We should get a new resource here */ - resource1 = guac_client_alloc_resource(client); - CU_ASSERT_PTR_NOT_NULL_FATAL(resource1); - CU_ASSERT_EQUAL_FATAL(1, resource1->index); - - /* - * POOL: [ EMPTY ] - * IN USE: [ 0 1 ] - */ - - /* Put 0 back in pool (2) */ - guac_client_free_resource(client, resource0); - - /* - * POOL: [ 0 ] - * IN USE: [ 1 ] - */ - - /* Since we free'd 0, we should get 0 again here (2) */ - resource0 = guac_client_alloc_resource(client); - CU_ASSERT_PTR_NOT_NULL_FATAL(resource0); - CU_ASSERT_EQUAL_FATAL(0, resource0->index); - - /* - * POOL: [ EMPTY ] - * IN USE: [ 0 1 ] - */ - - /* We should get a new resource here */ - resource2 = guac_client_alloc_resource(client); - CU_ASSERT_PTR_NOT_NULL_FATAL(resource2); - CU_ASSERT_EQUAL_FATAL(2, resource2->index); - - /* - * POOL: [ EMPTY ] - * IN USE: [ 0 1 2 ] - */ - - /* Free all resources */ - guac_client_free_resource(client, resource2); - guac_client_free_resource(client, resource1); - guac_client_free_resource(client, resource0); - - /* - * POOL: [ 0 1 2 ] - * IN USE: [ EMPTY ] - */ - - /* Free client */ - guac_client_free(client); - -} -