/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef GUAC_RDP_DVC_H #define GUAC_RDP_DVC_H #include "config.h" #include "common/list.h" #include /** * The set of all arguments that should be passed to a given dynamic virtual * channel plugin, including the name of that plugin. */ typedef struct guac_rdp_dvc { /** * The number of arguments in the argv array. This MUST be at least 1. */ int argc; /** * The argument values being passed to the dynamic virtual channel plugin. * The first entry in this array is always the name of the plugin. If * guac_rdp_load_drdynvc() has been invoked, and freeing the argument * values is being delegated to FreeRDP, this will be NULL. */ char** argv; } guac_rdp_dvc; /** * A list of dynamic virtual channels which should be provided to the DRDYNVC * plugin once loaded via guac_rdp_load_drdynvc(). This interface exists purely * to bridge incompatibilities between differing versions of FreeRDP and its * DRDYNVC plugin. Any allocated guac_rdp_dvc_list is unlikely to be needed * after the DRDYNVC plugin has been loaded. */ typedef struct guac_rdp_dvc_list { /** * Array of all dynamic virtual channels which should be registered with * the DRDYNVC plugin once loaded. Each list element will point to a * guac_rdp_dvc structure which must eventually be freed. */ guac_common_list* channels; /** * The number of channels within the list. */ int channel_count; } guac_rdp_dvc_list; /** * Allocates a new, empty list of dynamic virtual channels. New channels may * be added via guac_rdp_dvc_list_add(). The loading of those channels' * associated plugins will be deferred until guac_rdp_load_drdynvc() is * invoked. * * @return * A newly-allocated, empty list of dynamic virtual channels. */ guac_rdp_dvc_list* guac_rdp_dvc_list_alloc(); /** * Adds the given dynamic virtual channel plugin name and associated arguments * to the list. The provied arguments list is NOT optional and MUST be * NULL-terminated, even if there are no arguments for the named dynamic * virtual channel plugin. Though FreeRDP requires that the arguments for a * dynamic virtual channel plugin contain the name of the plugin itself as the * first argument, the name must be excluded from the arguments provided here. * This function will automatically take care of adding the plugin name to * the arguments. * * @param list * The guac_rdp_dvc_list to which the given plugin name and arguments * should be added, for later bulk registration via * guac_rdp_load_drdynvc(). * * @param name * The name of the dynamic virtual channel plugin that should be given * the provided arguments when guac_rdp_load_drdynvc() is invoked. * * @param ... * The string (char*) arguments which should be passed to the dynamic * virtual channel plugin when it is loaded via guac_rdp_load_drdynvc(), * excluding the plugin name itself. */ void guac_rdp_dvc_list_add(guac_rdp_dvc_list* list, const char* name, ...); /** * Frees the given list of dynamic virtual channels. Note that, while each * individual entry within this list will be freed, it is partially up to * FreeRDP to free the storage associated with the arguments passed to the * virtual channels. * * @param list * The list to free. */ void guac_rdp_dvc_list_free(guac_rdp_dvc_list* list); /** * Loads FreeRDP's DRDYNVC plugin and registers the dynamic virtual channel * plugins described by the given guac_rdp_dvc_list. This function MUST be * invoked no more than once per RDP connection. Invoking this function * multiple times, even if the guac_rdp_dvc_list is different each time, will * result in undefined behavior. * * @param context * The rdpContext associated with the RDP connection for which the DRDYNVC * plugin should be loaded. * * @param list * A guac_rdp_dvc_list describing the dynamic virtual channel plugins that * should be registered with the DRDYNVC plugin, along with any arguments. */ int guac_rdp_load_drdynvc(rdpContext* context, guac_rdp_dvc_list* list); #endif