Blame include/freerdp/server/shadow.h

Packit Service fa4841
/**
Packit Service fa4841
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit Service fa4841
 * Session Shadowing
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifndef FREERDP_SERVER_SHADOW_H
Packit Service fa4841
#define FREERDP_SERVER_SHADOW_H
Packit Service fa4841
Packit Service fa4841
#include <freerdp/api.h>
Packit Service fa4841
#include <freerdp/types.h>
Packit Service fa4841
Packit Service fa4841
#include <freerdp/settings.h>
Packit Service fa4841
#include <freerdp/listener.h>
Packit Service fa4841
Packit Service fa4841
#include <freerdp/channels/wtsvc.h>
Packit Service fa4841
#include <freerdp/channels/channels.h>
Packit Service fa4841
Packit Service fa4841
#include <freerdp/server/encomsp.h>
Packit Service fa4841
#include <freerdp/server/remdesk.h>
Packit Service fa4841
#include <freerdp/server/rdpsnd.h>
Packit Service fa4841
#include <freerdp/server/audin.h>
Packit Service fa4841
#include <freerdp/server/rdpgfx.h>
Packit Service fa4841
Packit Service fa4841
#include <freerdp/codec/color.h>
Packit Service fa4841
#include <freerdp/codec/region.h>
Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/synch.h>
Packit Service fa4841
#include <winpr/collections.h>
Packit Service fa4841
Packit Service fa4841
typedef struct rdp_shadow_client rdpShadowClient;
Packit Service fa4841
typedef struct rdp_shadow_server rdpShadowServer;
Packit Service fa4841
typedef struct rdp_shadow_screen rdpShadowScreen;
Packit Service fa4841
typedef struct rdp_shadow_surface rdpShadowSurface;
Packit Service fa4841
typedef struct rdp_shadow_encoder rdpShadowEncoder;
Packit Service fa4841
typedef struct rdp_shadow_capture rdpShadowCapture;
Packit Service fa4841
typedef struct rdp_shadow_subsystem rdpShadowSubsystem;
Packit Service fa4841
typedef struct rdp_shadow_multiclient_event rdpShadowMultiClientEvent;
Packit Service fa4841
Packit Service fa4841
typedef struct _RDP_SHADOW_ENTRY_POINTS RDP_SHADOW_ENTRY_POINTS;
Packit Service fa4841
typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
Packit Service fa4841
Packit Service fa4841
typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)(void);
Packit Service fa4841
typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
Packit Service fa4841
Packit Service fa4841
typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem);
Packit Service fa4841
typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem);
Packit Service fa4841
Packit Service fa4841
typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem);
Packit Service fa4841
typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem);
Packit Service fa4841
Packit Service bb5c11
typedef UINT32(*pfnShadowEnumMonitors)(MONITOR_DEF* monitors, UINT32 maxMonitors);
Packit Service fa4841
Packit Service bb5c11
typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
                                     rdpShadowClient* client,
Packit Service fa4841
                                     const char* user, const char* domain, const char* password);
Packit Service bb5c11
typedef BOOL (*pfnShadowClientConnect)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
                                       rdpShadowClient* client);
Packit Service bb5c11
typedef void (*pfnShadowClientDisconnect)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
        rdpShadowClient* client);
Packit Service bb5c11
typedef BOOL (*pfnShadowClientCapabilities)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
        rdpShadowClient* client);
Packit Service bb5c11
Packit Service bb5c11
typedef BOOL (*pfnShadowSynchronizeEvent)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
        rdpShadowClient* client, UINT32 flags);
Packit Service bb5c11
typedef BOOL (*pfnShadowKeyboardEvent)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
                                       rdpShadowClient* client, UINT16 flags, UINT16 code);
Packit Service fa4841
typedef BOOL (*pfnShadowUnicodeKeyboardEvent)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
        rdpShadowClient* client, UINT16 flags, UINT16 code);
Packit Service bb5c11
typedef BOOL (*pfnShadowMouseEvent)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
                                    rdpShadowClient* client, UINT16 flags, UINT16 x, UINT16 y);
Packit Service bb5c11
typedef BOOL (*pfnShadowExtendedMouseEvent)(rdpShadowSubsystem* subsystem,
Packit Service bb5c11
        rdpShadowClient* client, UINT16 flags, UINT16 x, UINT16 y);
Packit Service fa4841
Packit Service bb5c11
typedef BOOL (*pfnShadowChannelAudinServerReceiveSamples)(
Packit Service bb5c11
    rdpShadowSubsystem* subsystem, rdpShadowClient* client,
Packit Service bb5c11
    const AUDIO_FORMAT* format, wStream* buf, size_t nframes);
Packit Service fa4841
Packit Service fa4841
struct rdp_shadow_client
Packit Service fa4841
{
Packit Service fa4841
	rdpContext context;
Packit Service fa4841
Packit Service fa4841
	HANDLE thread;
Packit Service fa4841
	BOOL activated;
Packit Service fa4841
	BOOL inLobby;
Packit Service fa4841
	BOOL mayView;
Packit Service fa4841
	BOOL mayInteract;
Packit Service fa4841
	BOOL suppressOutput;
Packit Service fa4841
	wMessageQueue* MsgQueue;
Packit Service fa4841
	CRITICAL_SECTION lock;
Packit Service fa4841
	REGION16 invalidRegion;
Packit Service fa4841
	rdpShadowServer* server;
Packit Service fa4841
	rdpShadowEncoder* encoder;
Packit Service fa4841
	rdpShadowSubsystem* subsystem;
Packit Service fa4841
Packit Service fa4841
	UINT32 pointerX;
Packit Service fa4841
	UINT32 pointerY;
Packit Service fa4841
Packit Service fa4841
	HANDLE vcm;
Packit Service fa4841
	EncomspServerContext* encomsp;
Packit Service fa4841
	RemdeskServerContext* remdesk;
Packit Service fa4841
	RdpsndServerContext* rdpsnd;
Packit Service fa4841
	audin_server_context* audin;
Packit Service fa4841
	RdpgfxServerContext* rdpgfx;
Packit Service fa4841
};
Packit Service fa4841
Packit Service fa4841
struct rdp_shadow_server
Packit Service fa4841
{
Packit Service fa4841
	void* ext;
Packit Service fa4841
	HANDLE thread;
Packit Service fa4841
	HANDLE StopEvent;
Packit Service fa4841
	wArrayList* clients;
Packit Service fa4841
	rdpSettings* settings;
Packit Service fa4841
	rdpShadowScreen* screen;
Packit Service fa4841
	rdpShadowSurface* surface;
Packit Service fa4841
	rdpShadowSurface* lobby;
Packit Service fa4841
	rdpShadowCapture* capture;
Packit Service fa4841
	rdpShadowSubsystem* subsystem;
Packit Service fa4841
Packit Service fa4841
	DWORD port;
Packit Service fa4841
	BOOL mayView;
Packit Service fa4841
	BOOL mayInteract;
Packit Service fa4841
	BOOL shareSubRect;
Packit Service fa4841
	BOOL authentication;
Packit Service fa4841
	int selectedMonitor;
Packit Service fa4841
	RECTANGLE_16 subRect;
Packit Service fa4841
Packit Service fa4841
	/* Codec settings */
Packit Service fa4841
	RLGR_MODE rfxMode;
Packit Service fa4841
	H264_RATECONTROL_MODE h264RateControlMode;
Packit Service fa4841
	UINT32 h264BitRate;
Packit Service fa4841
	FLOAT h264FrameRate;
Packit Service fa4841
	UINT32 h264QP;
Packit Service fa4841
Packit Service fa4841
	char* ipcSocket;
Packit Service fa4841
	char* ConfigPath;
Packit Service fa4841
	char* CertificateFile;
Packit Service fa4841
	char* PrivateKeyFile;
Packit Service fa4841
	CRITICAL_SECTION lock;
Packit Service fa4841
	freerdp_listener* listener;
Packit Service fa4841
};
Packit Service fa4841
Packit Service fa4841
struct rdp_shadow_surface
Packit Service fa4841
{
Packit Service fa4841
	rdpShadowServer* server;
Packit Service fa4841
Packit Service fa4841
	int x;
Packit Service fa4841
	int y;
Packit Service fa4841
	int width;
Packit Service fa4841
	int height;
Packit Service fa4841
	int scanline;
Packit Service fa4841
	DWORD format;
Packit Service fa4841
	BYTE* data;
Packit Service fa4841
Packit Service fa4841
	CRITICAL_SECTION lock;
Packit Service fa4841
	REGION16 invalidRegion;
Packit Service fa4841
};
Packit Service fa4841
Packit Service fa4841
struct _RDP_SHADOW_ENTRY_POINTS
Packit Service fa4841
{
Packit Service fa4841
	pfnShadowSubsystemNew New;
Packit Service fa4841
	pfnShadowSubsystemFree Free;
Packit Service fa4841
Packit Service fa4841
	pfnShadowSubsystemInit Init;
Packit Service fa4841
	pfnShadowSubsystemUninit Uninit;
Packit Service fa4841
Packit Service fa4841
	pfnShadowSubsystemStart Start;
Packit Service fa4841
	pfnShadowSubsystemStop Stop;
Packit Service fa4841
Packit Service fa4841
	pfnShadowEnumMonitors EnumMonitors;
Packit Service fa4841
};
Packit Service fa4841
Packit Service fa4841
struct rdp_shadow_subsystem
Packit Service fa4841
{
Packit Service fa4841
	RDP_SHADOW_ENTRY_POINTS ep;
Packit Service fa4841
	HANDLE event;
Packit Service fa4841
	int numMonitors;
Packit Service fa4841
	int captureFrameRate;
Packit Service fa4841
	int selectedMonitor;
Packit Service fa4841
	MONITOR_DEF monitors[16];
Packit Service fa4841
	MONITOR_DEF virtualScreen;
Packit Service fa4841
Packit Service fa4841
	/* This event indicates that we have graphic change */
Packit Service fa4841
	/* such as screen update and resize. It should not be */
Packit Service fa4841
	/* used by subsystem implementation directly */
Packit Service fa4841
	rdpShadowMultiClientEvent* updateEvent;
Packit Service fa4841
Packit Service fa4841
	wMessagePipe* MsgPipe;
Packit Service fa4841
	UINT32 pointerX;
Packit Service fa4841
	UINT32 pointerY;
Packit Service fa4841
Packit Service fa4841
	AUDIO_FORMAT* rdpsndFormats;
Packit Service fa4841
	size_t nRdpsndFormats;
Packit Service fa4841
	AUDIO_FORMAT* audinFormats;
Packit Service fa4841
	size_t nAudinFormats;
Packit Service fa4841
Packit Service fa4841
	pfnShadowSynchronizeEvent SynchronizeEvent;
Packit Service fa4841
	pfnShadowKeyboardEvent KeyboardEvent;
Packit Service fa4841
	pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent;
Packit Service fa4841
	pfnShadowMouseEvent MouseEvent;
Packit Service fa4841
	pfnShadowExtendedMouseEvent ExtendedMouseEvent;
Packit Service fa4841
	pfnShadowChannelAudinServerReceiveSamples AudinServerReceiveSamples;
Packit Service fa4841
Packit Service fa4841
	pfnShadowAuthenticate Authenticate;
Packit Service fa4841
	pfnShadowClientConnect ClientConnect;
Packit Service fa4841
	pfnShadowClientDisconnect ClientDisconnect;
Packit Service fa4841
	pfnShadowClientCapabilities ClientCapabilities;
Packit Service fa4841
Packit Service fa4841
	rdpShadowServer* server;
Packit Service fa4841
};
Packit Service fa4841
Packit Service fa4841
/* Definition of message between subsystem and clients */
Packit Service bb5c11
#define SHADOW_MSG_IN_REFRESH_REQUEST_ID		1001
Packit Service fa4841
Packit Service fa4841
typedef struct _SHADOW_MSG_OUT SHADOW_MSG_OUT;
Packit Service fa4841
typedef void (*MSG_OUT_FREE_FN)(UINT32 id,
Packit Service fa4841
                                SHADOW_MSG_OUT* msg); /* function to free SHADOW_MSG_OUT */
Packit Service fa4841
Packit Service fa4841
struct _SHADOW_MSG_OUT
Packit Service fa4841
{
Packit Service fa4841
	int refCount;
Packit Service fa4841
	MSG_OUT_FREE_FN Free;
Packit Service fa4841
};
Packit Service fa4841
Packit Service bb5c11
#define SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID		2001
Packit Service bb5c11
#define SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID			2002
Packit Service bb5c11
#define SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID				2003
Packit Service bb5c11
#define SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID				2004
Packit Service fa4841
Packit Service fa4841
struct _SHADOW_MSG_OUT_POINTER_POSITION_UPDATE
Packit Service fa4841
{
Packit Service fa4841
	SHADOW_MSG_OUT common;
Packit Service fa4841
	UINT32 xPos;
Packit Service fa4841
	UINT32 yPos;
Packit Service fa4841
};
Packit Service bb5c11
typedef struct _SHADOW_MSG_OUT_POINTER_POSITION_UPDATE
Packit Service bb5c11
	SHADOW_MSG_OUT_POINTER_POSITION_UPDATE;
Packit Service fa4841
Packit Service fa4841
struct _SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE
Packit Service fa4841
{
Packit Service fa4841
	SHADOW_MSG_OUT common;
Packit Service fa4841
	UINT32 xHot;
Packit Service fa4841
	UINT32 yHot;
Packit Service fa4841
	UINT32 width;
Packit Service fa4841
	UINT32 height;
Packit Service fa4841
	UINT32 lengthAndMask;
Packit Service fa4841
	UINT32 lengthXorMask;
Packit Service fa4841
	BYTE* xorMaskData;
Packit Service fa4841
	BYTE* andMaskData;
Packit Service fa4841
};
Packit Service bb5c11
typedef struct _SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE
Packit Service bb5c11
	SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE;
Packit Service fa4841
Packit Service fa4841
struct _SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES
Packit Service fa4841
{
Packit Service fa4841
	SHADOW_MSG_OUT common;
Packit Service fa4841
	AUDIO_FORMAT* audio_format;
Packit Service fa4841
	void* buf;
Packit Service fa4841
	int nFrames;
Packit Service fa4841
	UINT16 wTimestamp;
Packit Service fa4841
};
Packit Service bb5c11
typedef struct _SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES
Packit Service bb5c11
	SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES;
Packit Service fa4841
Packit Service fa4841
struct _SHADOW_MSG_OUT_AUDIO_OUT_VOLUME
Packit Service fa4841
{
Packit Service fa4841
	SHADOW_MSG_OUT common;
Packit Service fa4841
	int left;
Packit Service fa4841
	int right;
Packit Service fa4841
};
Packit Service fa4841
typedef struct _SHADOW_MSG_OUT_AUDIO_OUT_VOLUME SHADOW_MSG_OUT_AUDIO_OUT_VOLUME;
Packit Service fa4841
Packit Service fa4841
#ifdef __cplusplus
Packit Service bb5c11
extern "C" {
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service bb5c11
FREERDP_API void shadow_subsystem_set_entry_builtin(const char* name);
Packit Service bb5c11
FREERDP_API void shadow_subsystem_set_entry(pfnShadowSubsystemEntry pEntry);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API int shadow_subsystem_pointer_convert_alpha_pointer_data(
Packit Service bb5c11
    BYTE* pixels, BOOL premultiplied,
Packit Service bb5c11
    UINT32 width, UINT32 height, SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* pointerColor);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API int shadow_server_parse_command_line(rdpShadowServer* server,
Packit Service bb5c11
        int argc, char** argv);
Packit Service bb5c11
FREERDP_API int shadow_server_command_line_status_print(rdpShadowServer* server,
Packit Service bb5c11
        int argc, char** argv, int status);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API int shadow_server_start(rdpShadowServer* server);
Packit Service bb5c11
FREERDP_API int shadow_server_stop(rdpShadowServer* server);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API int shadow_server_init(rdpShadowServer* server);
Packit Service bb5c11
FREERDP_API int shadow_server_uninit(rdpShadowServer* server);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API UINT32 shadow_enum_monitors(MONITOR_DEF* monitors, UINT32 maxMonitors);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API rdpShadowServer* shadow_server_new(void);
Packit Service bb5c11
FREERDP_API void shadow_server_free(rdpShadowServer* server);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API int shadow_capture_align_clip_rect(RECTANGLE_16* rect,
Packit Service bb5c11
        RECTANGLE_16* clip);
Packit Service bb5c11
FREERDP_API int shadow_capture_compare(BYTE* pData1, UINT32 nStep1, UINT32 nWidth,
Packit Service bb5c11
                                       UINT32 nHeight, BYTE* pData2, UINT32 nStep2, RECTANGLE_16* rect);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API void shadow_subsystem_frame_update(rdpShadowSubsystem* subsystem);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API BOOL shadow_client_post_msg(rdpShadowClient* client, void* context,
Packit Service bb5c11
                                        UINT32 type, SHADOW_MSG_OUT* msg, void* lParam);
Packit Service bb5c11
FREERDP_API int shadow_client_boardcast_msg(rdpShadowServer* server,
Packit Service bb5c11
        void* context, UINT32 type, SHADOW_MSG_OUT* msg, void* lParam);
Packit Service bb5c11
FREERDP_API int shadow_client_boardcast_quit(rdpShadowServer* server,
Packit Service bb5c11
        int nExitCode);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API int shadow_encoder_preferred_fps(rdpShadowEncoder* encoder);
Packit Service bb5c11
FREERDP_API UINT32 shadow_encoder_inflight_frames(rdpShadowEncoder* encoder);
Packit Service fa4841
Packit Service bb5c11
FREERDP_API BOOL shadow_screen_resize(rdpShadowScreen* screen);
Packit Service fa4841
Packit Service fa4841
#ifdef __cplusplus
Packit Service fa4841
}
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#endif /* FREERDP_SERVER_SHADOW_H */
Packit Service bb5c11