#ifndef __FREERDP_H
#define __FREERDP_H
+typedef struct rdp_rdp rdpRdp;
+typedef struct rdp_gdi rdpGdi;
+typedef struct rdp_rail rdpRail;
+typedef struct rdp_cache rdpCache;
+typedef struct rdp_channels rdpChannels;
+typedef struct rdp_graphics rdpGraphics;
+
+typedef struct rdp_freerdp freerdp;
+typedef struct rdp_context rdpContext;
+typedef struct rdp_freerdp_peer freerdp_peer;
+
#include <freerdp/api.h>
#include <freerdp/types.h>
#include <freerdp/settings.h>
#include <freerdp/extension.h>
+#include <freerdp/utils/stream.h>
#include <freerdp/input.h>
#include <freerdp/update.h>
extern "C" {
#endif
-FREERDP_API boolean freerdp_global_init();
-FREERDP_API void freerdp_global_finish();
+typedef void (*pContextNew)(freerdp* instance, rdpContext* context);
+typedef void (*pContextFree)(freerdp* instance, rdpContext* context);
-typedef struct rdp_freerdp freerdp;
+typedef boolean (*pPreConnect)(freerdp* instance);
+typedef boolean (*pPostConnect)(freerdp* instance);
+typedef boolean (*pAuthenticate)(freerdp* instance, char** username, char** password, char** domain);
+typedef boolean (*pVerifyCertificate)(freerdp* instance, char* subject, char* issuer, char* fingerprint);
-typedef boolean (*pcConnect)(freerdp* freerdp);
-typedef boolean (*pcPreConnect)(freerdp* freerdp);
-typedef boolean (*pcPostConnect)(freerdp* freerdp);
-typedef boolean (*pcGetFileDescriptor)(freerdp* freerdp, void** rfds, int* rcount, void** wfds, int* wcount);
-typedef boolean (*pcCheckFileDescriptor)(freerdp* freerdp);
-typedef int (*pcSendChannelData)(freerdp* freerdp, int channelId, uint8* data, int size);
-typedef int (*pcReceiveChannelData)(freerdp* freerdp, int channelId, uint8* data, int size, int flags, int total_size);
+typedef int (*pSendChannelData)(freerdp* instance, int channelId, uint8* data, int size);
+typedef int (*pReceiveChannelData)(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size);
+/**
+ * Defines the context for a given instance of RDP connection.
+ * It is embedded in the rdp_freerdp structure, and allocated by a call to freerdp_context_new().
+ * It is deallocated by a call to freerdp_context_free().
+ */
+struct rdp_context
+{
+ freerdp* instance; /**< (offset 0)
+ Pointer to a rdp_freerdp structure.
+ This is a back-link to retrieve the freerdp instance from the context.
+ It is set by the freerdp_context_new() function */
+ freerdp_peer* peer; /**< (offset 1)
+ Pointer to the client peer.
+ This is set by a call to freerdp_peer_context_new() during peer initialization.
+ This field is used only on the server side. */
+ uint32 paddingA[16 - 2]; /* 2 */
+
+ int argc; /**< (offset 16)
+ Number of arguments given to the program at launch time.
+ Used to keep this data available and used later on, typically just before connection initialization.
+ @see freerdp_parse_args() */
+ char** argv; /**< (offset 17)
+ List of arguments given to the program at launch time.
+ Used to keep this data available and used later on, typically just before connection initialization.
+ @see freerdp_parse_args() */
+ uint32 paddingB[32 - 18]; /* 18 */
+
+ rdpRdp* rdp; /**< (offset 32)
+ Pointer to a rdp_rdp structure used to keep the connection's parameters.
+ It is allocated by freerdp_context_new() and deallocated by freerdp_context_free(), at the same
+ time that this rdp_context structure - there is no need to specifically allocate/deallocate this. */
+ rdpGdi* gdi; /**< (offset 33)
+ Pointer to a rdp_gdi structure used to keep the gdi settings.
+ It is allocated by gdi_init() and deallocated by gdi_free().
+ It must be deallocated before deallocating this rdp_context structure. */
+ rdpRail* rail; /* 34 */
+ rdpCache* cache; /* 35 */
+ rdpChannels* channels; /* 36 */
+ rdpGraphics* graphics; /* 37 */
+ uint32 paddingC[64 - 38]; /* 38 */
+};
+
+/** Defines the options for a given instance of RDP connection.
+ * This is built by the client and given to the FreeRDP library to create the connection
+ * with the expected options.
+ * It is allocated by a call to freerdp_new() and deallocated by a call to freerdp_free().
+ * Some of its content need specific allocation/deallocation - see field description for details.
+ */
struct rdp_freerdp
{
- void* rdp;
- void* param1;
- void* param2;
- void* param3;
- void* param4;
-
- rdpInput* input;
- rdpUpdate* update;
- rdpSettings* settings;
-
- pcConnect Connect;
- pcPreConnect PreConnect;
- pcPostConnect PostConnect;
- pcGetFileDescriptor GetFileDescriptor;
- pcCheckFileDescriptor CheckFileDescriptor;
- pcSendChannelData SendChannelData;
- pcReceiveChannelData ReceiveChannelData;
+ rdpContext* context; /**< (offset 0)
+ Pointer to a rdpContext structure.
+ Client applications can use the context_size field to register a context bigger than the rdpContext
+ structure. This allow clients to use additional context information.
+ When using this capability, client application should ALWAYS declare their structure with the
+ rdpContext field first, and any additional content following it.
+ Can be allocated by a call to freerdp_context_new().
+ Must be dealocated by a call to freerdp_context_free() before deallocating the current instance. */
+ uint32 paddingA[16 - 1]; /* 1 */
+
+ rdpInput* input; /* (offset 16)
+ Input handle for the connection.
+ Will be initialized by a call to freerdp_context_new() */
+ rdpUpdate* update; /* (offset 17)
+ Update display parameters. Used to register display events callbacks and settings.
+ Will be initialized by a call to freerdp_context_new() */
+ rdpSettings* settings; /**< (offset 18)
+ Pointer to a rdpSettings structure. Will be used to maintain the required RDP settings.
+ Will be initialized by a call to freerdp_context_new() */
+ uint32 paddingB[32 - 19]; /* 19 */
+
+ size_t context_size; /* (offset 32)
+ Specifies the size of the 'context' field. freerdp_context_new() will use this size to allocate the context buffer.
+ freerdp_new() sets it to sizeof(rdpContext).
+ If modifying it, there should always be a minimum of sizeof(rdpContext), as the freerdp library will assume it can use the
+ 'context' field to set the required informations in it.
+ Clients will typically make it bigger, and use a context structure embedding the rdpContext, and
+ adding additional information after that.
+ */
+
+ pContextNew ContextNew; /**< (offset 33)
+ Callback for context allocation
+ Can be set before calling freerdp_context_new() to have it executed after allocation and initialization.
+ Must be set to NULL if not needed. */
+
+ pContextFree ContextFree; /**< (offset 34)
+ Callback for context deallocation
+ Can be set before calling freerdp_context_free() to have it executed before deallocation.
+ Must be set to NULL if not needed. */
+ uint32 paddingC[48 - 35]; /* 35 */
+
+ pPreConnect PreConnect; /**< (offset 48)
+ Callback for pre-connect operations.
+ Can be set before calling freerdp_connect() to have it executed before the actual connection happens.
+ Must be set to NULL if not needed. */
+
+ pPostConnect PostConnect; /**< (offset 49)
+ Callback for post-connect operations.
+ Can be set before calling freerdp_connect() to have it executed after the actual connection has succeeded.
+ Must be set to NULL if not needed. */
+
+ pAuthenticate Authenticate; /**< (offset 50)
+ Callback for authentication.
+ It is used to get the username/password when it was not provided at connection time. */
+ pVerifyCertificate VerifyCertificate; /**< (offset 51)
+ Callback for certificate validation.
+ Used to verify that an unknown certificate is trusted. */
+ uint32 paddingD[64 - 52]; /* 52 */
+
+ pSendChannelData SendChannelData; /* (offset 64)
+ Callback for sending data to a channel.
+ By default, it is set by freerdp_new() to freerdp_send_channel_data(), which eventually calls
+ freerdp_channel_send() */
+ pReceiveChannelData ReceiveChannelData; /* (offset 65)
+ Callback for receiving data from a channel.
+ This is called by freerdp_channel_process() (if not NULL).
+ Clients will typically use a function that calls freerdp_channels_data() to perform the needed tasks. */
+ uint32 paddingE[80 - 66]; /* 66 */
};
+FREERDP_API void freerdp_context_new(freerdp* instance);
+FREERDP_API void freerdp_context_free(freerdp* instance);
+
+FREERDP_API boolean freerdp_connect(freerdp* instance);
+FREERDP_API boolean freerdp_shall_disconnect(freerdp* instance);
+FREERDP_API boolean freerdp_disconnect(freerdp* instance);
+
+FREERDP_API boolean freerdp_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount);
+FREERDP_API boolean freerdp_check_fds(freerdp* instance);
+
+FREERDP_API uint32 freerdp_error_info(freerdp* instance);
+
+FREERDP_API void freerdp_get_version(int* major, int* minor, int* revision);
+
FREERDP_API freerdp* freerdp_new();
FREERDP_API void freerdp_free(freerdp* instance);