204 lines
8.3 KiB
C
204 lines
8.3 KiB
C
/*
|
|
* 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_CHANNELS_H
|
|
#define GUAC_RDP_CHANNELS_H
|
|
|
|
#include "config.h"
|
|
|
|
#include <freerdp/channels/channels.h>
|
|
#include <freerdp/freerdp.h>
|
|
|
|
/**
|
|
* The maximum number of static channels supported by Guacamole's RDP support.
|
|
* This value should be given a value which is at least the value of FreeRDP's
|
|
* CHANNEL_MAX_COUNT.
|
|
*
|
|
* NOTE: The value of this macro must be specified statically (not as a
|
|
* reference to CHANNEL_MAX_COUNT), as its value is extracted and used by the
|
|
* entry point wrapper code generator (generate-entry-wrappers.pl).
|
|
*/
|
|
#define GUAC_RDP_MAX_CHANNELS 64
|
|
|
|
/* Validate GUAC_RDP_MAX_CHANNELS is sane at compile time */
|
|
#if GUAC_RDP_MAX_CHANNELS < CHANNEL_MAX_COUNT
|
|
#error "GUAC_RDP_MAX_CHANNELS must not be less than CHANNEL_MAX_COUNT"
|
|
#endif
|
|
|
|
/**
|
|
* Loads the FreeRDP plugin having the given name. This function is a drop-in
|
|
* replacement for freerdp_channels_load_plugin() which additionally loads
|
|
* plugins implementing the PVIRTUALCHANNELENTRYEX version of the channel
|
|
* plugin entry point. The freerdp_channels_load_plugin() function which is
|
|
* part of FreeRDP can load only plugins which implement the
|
|
* PVIRTUALCHANNELENTRY version of the entry point.
|
|
*
|
|
* This MUST be called within the PreConnect callback of the freerdp instance
|
|
* for the referenced plugin to be loaded correctly.
|
|
*
|
|
* @param channels
|
|
* The rdpChannels structure with which the plugin should be registered
|
|
* once loaded. This structure should be retrieved directly from the
|
|
* relevant FreeRDP instance.
|
|
*
|
|
* @param settings
|
|
* The rdpSettings structure associated with the FreeRDP instance, already
|
|
* populated with any settings applicable to the plugin being loaded.
|
|
*
|
|
* @param name
|
|
* The name of the plugin to load. If the plugin is not statically built
|
|
* into FreeRDP, this name will determine the filename of the library to be
|
|
* loaded dynamically. For a plugin named "NAME", the library called
|
|
* "libNAME-client" will be loaded from the "freerdp2" subdirectory of the
|
|
* main directory containing the FreeRDP libraries.
|
|
*
|
|
* @param data
|
|
* Arbitrary data to be passed to the plugin entry point. For most plugins
|
|
* which are built into FreeRDP, this will be another reference to the
|
|
* rdpSettings struct. The source of the relevant plugin must be consulted
|
|
* to determine the proper value to pass here.
|
|
*
|
|
* @return
|
|
* Zero if the plugin was loaded successfully, non-zero if the plugin could
|
|
* not be loaded.
|
|
*/
|
|
int guac_freerdp_channels_load_plugin(rdpChannels* channels,
|
|
rdpSettings* settings, const char* name, void* data);
|
|
|
|
/**
|
|
* Schedules loading of the FreeRDP dynamic virtual channel plugin having the
|
|
* given name. This function is essentially a wrapper for
|
|
* freerdp_dynamic_channel_collection_add() which additionally takes care of
|
|
* housekeeping tasks which would otherwise need to be performed manually:
|
|
*
|
|
* - The ADDIN_ARGV structure used to pass arguments to dynamic virtual
|
|
* channel plugins is automatically allocated and populated with any given
|
|
* arguments.
|
|
* - The SupportDynamicChannels member of the rdpSettings structure is
|
|
* automatically set to TRUE.
|
|
*
|
|
* The "drdynvc" plugin must still eventually be loaded for this function to
|
|
* have any effect, as it is the "drdynvc" plugin which processes the
|
|
* collection this function manipulates.
|
|
*
|
|
* This MUST be called within the PreConnect callback of the freerdp instance
|
|
* and the "drdynvc" plugin MUST be loaded at some point after this function is
|
|
* called for the referenced dynamic channel plugin to be loaded correctly.
|
|
*
|
|
* @param settings
|
|
* The rdpSettings structure associated with the FreeRDP instance, already
|
|
* populated with any settings applicable to the plugin being loaded.
|
|
*
|
|
* @param name
|
|
* The name of the plugin to load. If the plugin is not statically built
|
|
* into FreeRDP, this name will determine the filename of the library to be
|
|
* loaded dynamically. For a plugin named "NAME", the library called
|
|
* "libNAME-client" will be loaded from the "freerdp2" subdirectory of the
|
|
* main directory containing the FreeRDP libraries.
|
|
*
|
|
* @param ...
|
|
* Arbitrary arguments to be passed to the plugin entry point. For most
|
|
* plugins which are built into FreeRDP, this will be another reference to
|
|
* the rdpSettings struct or NULL. The source of the relevant plugin must
|
|
* be consulted to determine the proper value(s) to pass here.
|
|
*/
|
|
void guac_freerdp_dynamic_channel_collection_add(rdpSettings* settings,
|
|
const char* name, ...);
|
|
|
|
/**
|
|
* The number of wrapped channel entry points currently stored within
|
|
* guac_rdp_wrapped_entry_ex.
|
|
*/
|
|
extern int guac_rdp_wrapped_entry_ex_count;
|
|
|
|
/**
|
|
* All currently wrapped entry points that use the PVIRTUALCHANNELENTRYEX
|
|
* variant.
|
|
*/
|
|
extern PVIRTUALCHANNELENTRYEX guac_rdp_wrapped_entry_ex[GUAC_RDP_MAX_CHANNELS];
|
|
|
|
/**
|
|
* Lookup table of wrapper functions for PVIRTUALCHANNELENTRYEX entry points.
|
|
* Each function within this array is generated at compile time by the entry
|
|
* point wrapper code generator (generate-entry-wrappers.pl) and automatically
|
|
* invokes the corresponding wrapped entry point stored within
|
|
* guac_rdp_wrapped_entry_ex.
|
|
*/
|
|
extern PVIRTUALCHANNELENTRYEX guac_rdp_entry_ex_wrappers[GUAC_RDP_MAX_CHANNELS];
|
|
|
|
/**
|
|
* Wraps the provided entry point function, returning a different entry point
|
|
* which simply invokes the original. As long as this function is not invoked
|
|
* more than GUAC_RDP_MAX_CHANNELS times, each returned entry point will be
|
|
* unique, even if the provided entry point is not. As FreeRDP will refuse to
|
|
* load a plugin if its entry point is already loaded, this allows a single
|
|
* FreeRDP plugin to be loaded multiple times.
|
|
*
|
|
* @param entry_ex
|
|
* The entry point function to wrap.
|
|
*
|
|
* @return
|
|
* A wrapped version of the provided entry point, or the unwrapped entry
|
|
* point if there is insufficient space remaining within
|
|
* guac_rdp_entry_ex_wrappers to wrap the entry point.
|
|
*/
|
|
PVIRTUALCHANNELENTRYEX guac_rdp_plugin_wrap_entry_ex(PVIRTUALCHANNELENTRYEX entry_ex);
|
|
|
|
/**
|
|
* The number of wrapped channel entry points currently stored within
|
|
* guac_rdp_wrapped_entry.
|
|
*/
|
|
extern int guac_rdp_wrapped_entry_count;
|
|
|
|
/**
|
|
* All currently wrapped entry points that use the PVIRTUALCHANNELENTRY
|
|
* variant.
|
|
*/
|
|
extern PVIRTUALCHANNELENTRY guac_rdp_wrapped_entry[GUAC_RDP_MAX_CHANNELS];
|
|
|
|
/**
|
|
* Lookup table of wrapper functions for PVIRTUALCHANNELENTRY entry points.
|
|
* Each function within this array is generated at compile time by the entry
|
|
* point wrapper code generator (generate-entry-wrappers.pl) and automatically
|
|
* invokes the corresponding wrapped entry point stored within
|
|
* guac_rdp_wrapped_entry.
|
|
*/
|
|
extern PVIRTUALCHANNELENTRY guac_rdp_entry_wrappers[GUAC_RDP_MAX_CHANNELS];
|
|
|
|
/**
|
|
* Wraps the provided entry point function, returning a different entry point
|
|
* which simply invokes the original. As long as this function is not invoked
|
|
* more than GUAC_RDP_MAX_CHANNELS times, each returned entry point will be
|
|
* unique, even if the provided entry point is not. As FreeRDP will refuse to
|
|
* load a plugin if its entry point is already loaded, this allows a single
|
|
* FreeRDP plugin to be loaded multiple times.
|
|
*
|
|
* @param entry
|
|
* The entry point function to wrap.
|
|
*
|
|
* @return
|
|
* A wrapped version of the provided entry point, or the unwrapped entry
|
|
* point if there is insufficient space remaining within
|
|
* guac_rdp_entry_wrappers to wrap the entry point.
|
|
*/
|
|
PVIRTUALCHANNELENTRY guac_rdp_plugin_wrap_entry(PVIRTUALCHANNELENTRY entry);
|
|
|
|
#endif
|
|
|