blob: b1207e2a35416abcbc8aa2cc6ec6093926e2a08e [file] [log] [blame]
/*
* 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_PLUGINS_CHANNELS_H
#define GUAC_RDP_PLUGINS_CHANNELS_H
#include <freerdp/channels/channels.h>
#include <freerdp/freerdp.h>
#include <freerdp/settings.h>
#include <guacamole/client.h>
#include <winpr/wtsapi.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. With the exception that
* this function requires the rdpContext rather than rdpChannels and
* rdpSettings, this function is essentially 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 context
* The rdpContext associated with the active RDP session.
*
* @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(rdpContext* context,
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 client
* The guac_client associated with the relevant RDP session.
*
* @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(guac_client* client,
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 client
* The guac_client associated with the relevant RDP session.
*
* @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(guac_client* client,
PVIRTUALCHANNELENTRY entry);
#endif