shadow: improve subsystem structure

This commit is contained in:
Marc-André Moreau 2014-09-18 15:43:11 -04:00
parent a5f8bdf51c
commit 7ef55ab9b7
7 changed files with 251 additions and 174 deletions

View File

@ -47,15 +47,19 @@ typedef struct rdp_shadow_encoder rdpShadowEncoder;
typedef struct rdp_shadow_capture rdpShadowCapture; typedef struct rdp_shadow_capture rdpShadowCapture;
typedef struct rdp_shadow_subsystem rdpShadowSubsystem; typedef struct rdp_shadow_subsystem rdpShadowSubsystem;
typedef rdpShadowSubsystem* (*pfnShadowCreateSubsystem)(rdpShadowServer* server); typedef struct _RDP_SHADOW_ENTRY_POINTS RDP_SHADOW_ENTRY_POINTS;
typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)();
typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem); typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem);
typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem); typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem);
typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem); typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem);
typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem); typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem);
typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
typedef int (*pfnShadowEnumMonitors)(rdpShadowSubsystem* subsystem, MONITOR_DEF* monitors, int maxMonitors); typedef int (*pfnShadowEnumMonitors)(MONITOR_DEF* monitors, int maxMonitors);
typedef int (*pfnShadowSurfaceCopy)(rdpShadowSubsystem* subsystem); typedef int (*pfnShadowSurfaceCopy)(rdpShadowSubsystem* subsystem);
typedef int (*pfnShadowSurfaceUpdate)(rdpShadowSubsystem* subsystem, REGION16* subRect); typedef int (*pfnShadowSurfaceUpdate)(rdpShadowSubsystem* subsystem, REGION16* subRect);
@ -112,7 +116,22 @@ struct rdp_shadow_server
freerdp_listener* listener; freerdp_listener* listener;
}; };
struct _RDP_SHADOW_ENTRY_POINTS
{
pfnShadowSubsystemNew New;
pfnShadowSubsystemFree Free;
pfnShadowSubsystemInit Init;
pfnShadowSubsystemUninit Uninit;
pfnShadowSubsystemStart Start;
pfnShadowSubsystemStop Stop;
pfnShadowEnumMonitors EnumMonitors;
};
#define RDP_SHADOW_SUBSYSTEM_COMMON() \ #define RDP_SHADOW_SUBSYSTEM_COMMON() \
RDP_SHADOW_ENTRY_POINTS ep; \
HANDLE event; \ HANDLE event; \
int numMonitors; \ int numMonitors; \
int selectedMonitor; \ int selectedMonitor; \
@ -123,16 +142,6 @@ struct rdp_shadow_server
wMessagePipe* MsgPipe; \ wMessagePipe* MsgPipe; \
SYNCHRONIZATION_BARRIER barrier; \ SYNCHRONIZATION_BARRIER barrier; \
\ \
pfnShadowSubsystemInit Init; \
pfnShadowSubsystemUninit Uninit; \
pfnShadowSubsystemStart Start; \
pfnShadowSubsystemStop Stop; \
pfnShadowSubsystemFree Free; \
\
pfnShadowEnumMonitors EnumMonitors; \
pfnShadowSurfaceCopy SurfaceCopy; \
pfnShadowSurfaceUpdate SurfaceUpdate; \
\
pfnShadowSynchronizeEvent SynchronizeEvent; \ pfnShadowSynchronizeEvent SynchronizeEvent; \
pfnShadowKeyboardEvent KeyboardEvent; \ pfnShadowKeyboardEvent KeyboardEvent; \
pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent; \ pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent; \
@ -159,7 +168,7 @@ FREERDP_API int shadow_server_stop(rdpShadowServer* server);
FREERDP_API int shadow_server_init(rdpShadowServer* server); FREERDP_API int shadow_server_init(rdpShadowServer* server);
FREERDP_API int shadow_server_uninit(rdpShadowServer* server); FREERDP_API int shadow_server_uninit(rdpShadowServer* server);
FREERDP_API int shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors, UINT32 flags); FREERDP_API int shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors, const char* name);
FREERDP_API rdpShadowServer* shadow_server_new(); FREERDP_API rdpShadowServer* shadow_server_new();
FREERDP_API void shadow_server_free(rdpShadowServer* server); FREERDP_API void shadow_server_free(rdpShadowServer* server);

View File

@ -538,7 +538,7 @@ void* mac_shadow_subsystem_thread(macShadowSubsystem* subsystem)
return NULL; return NULL;
} }
int mac_shadow_enum_monitors(macShadowSubsystem* subsystem, MONITOR_DEF* monitors, int maxMonitors) int mac_shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors)
{ {
int index; int index;
size_t wide, high; size_t wide, high;
@ -621,7 +621,7 @@ void mac_shadow_subsystem_free(macShadowSubsystem* subsystem)
free(subsystem); free(subsystem);
} }
macShadowSubsystem* mac_shadow_subsystem_new(rdpShadowServer* server) macShadowSubsystem* mac_shadow_subsystem_new()
{ {
macShadowSubsystem* subsystem; macShadowSubsystem* subsystem;
@ -630,14 +630,6 @@ macShadowSubsystem* mac_shadow_subsystem_new(rdpShadowServer* server)
if (!subsystem) if (!subsystem)
return NULL; return NULL;
subsystem->Init = (pfnShadowSubsystemInit) mac_shadow_subsystem_init;
subsystem->Uninit = (pfnShadowSubsystemInit) mac_shadow_subsystem_uninit;
subsystem->Start = (pfnShadowSubsystemStart) mac_shadow_subsystem_start;
subsystem->Stop = (pfnShadowSubsystemStop) mac_shadow_subsystem_stop;
subsystem->Free = (pfnShadowSubsystemFree) mac_shadow_subsystem_free;
subsystem->EnumMonitors = (pfnShadowEnumMonitors) mac_shadow_enum_monitors;
subsystem->SynchronizeEvent = (pfnShadowSynchronizeEvent) mac_shadow_input_synchronize_event; subsystem->SynchronizeEvent = (pfnShadowSynchronizeEvent) mac_shadow_input_synchronize_event;
subsystem->KeyboardEvent = (pfnShadowKeyboardEvent) mac_shadow_input_keyboard_event; subsystem->KeyboardEvent = (pfnShadowKeyboardEvent) mac_shadow_input_keyboard_event;
subsystem->UnicodeKeyboardEvent = (pfnShadowUnicodeKeyboardEvent) mac_shadow_input_unicode_keyboard_event; subsystem->UnicodeKeyboardEvent = (pfnShadowUnicodeKeyboardEvent) mac_shadow_input_unicode_keyboard_event;
@ -647,7 +639,18 @@ macShadowSubsystem* mac_shadow_subsystem_new(rdpShadowServer* server)
return subsystem; return subsystem;
} }
rdpShadowSubsystem* Mac_ShadowCreateSubsystem(rdpShadowServer* server) int Mac_ShadowSubsystemEntry(RDP_SHADOW_ENTRY_POINTS* pEntryPoints)
{ {
return (rdpShadowSubsystem*) mac_shadow_subsystem_new(server); pEntryPoints->New = (pfnShadowSubsystemNew) mac_shadow_subsystem_new;
pEntryPoints->Free = (pfnShadowSubsystemFree) mac_shadow_subsystem_free;
pEntryPoints->Init = (pfnShadowSubsystemInit) mac_shadow_subsystem_init;
pEntryPoints->Uninit = (pfnShadowSubsystemInit) mac_shadow_subsystem_uninit;
pEntryPoints->Start = (pfnShadowSubsystemStart) mac_shadow_subsystem_start;
pEntryPoints->Stop = (pfnShadowSubsystemStop) mac_shadow_subsystem_stop;
pEntryPoints->EnumMonitors = (pfnShadowEnumMonitors) mac_shadow_enum_monitors;
return 1;
} }

View File

@ -399,7 +399,7 @@ void* win_shadow_subsystem_thread(winShadowSubsystem* subsystem)
#endif #endif
int win_shadow_enum_monitors(winShadowSubsystem* subsystem, MONITOR_DEF* monitors, int maxMonitors) int win_shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors)
{ {
HDC hdc; HDC hdc;
int index; int index;
@ -440,25 +440,10 @@ int win_shadow_enum_monitors(winShadowSubsystem* subsystem, MONITOR_DEF* monitor
int win_shadow_subsystem_init(winShadowSubsystem* subsystem) int win_shadow_subsystem_init(winShadowSubsystem* subsystem)
{ {
HDC hdc;
int status; int status;
DWORD iDevNum = 0;
MONITOR_DEF* virtualScreen; MONITOR_DEF* virtualScreen;
DISPLAY_DEVICE DisplayDevice;
ZeroMemory(&DisplayDevice, sizeof(DISPLAY_DEVICE)); subsystem->numMonitors = win_shadow_enum_monitors(subsystem->monitors, 16);
DisplayDevice.cb = sizeof(DISPLAY_DEVICE);
if (!EnumDisplayDevices(NULL, iDevNum, &DisplayDevice, 0))
return -1;
hdc = CreateDC(DisplayDevice.DeviceName, NULL, NULL, NULL);
subsystem->width = GetDeviceCaps(hdc, HORZRES);
subsystem->height = GetDeviceCaps(hdc, VERTRES);
subsystem->bpp = GetDeviceCaps(hdc, BITSPIXEL);
DeleteDC(hdc);
#if defined(WITH_WDS_API) #if defined(WITH_WDS_API)
status = win_shadow_wds_init(subsystem); status = win_shadow_wds_init(subsystem);
@ -474,16 +459,6 @@ int win_shadow_subsystem_init(winShadowSubsystem* subsystem)
virtualScreen->bottom = subsystem->height; virtualScreen->bottom = subsystem->height;
virtualScreen->flags = 1; virtualScreen->flags = 1;
if (subsystem->numMonitors < 1)
{
subsystem->numMonitors = 1;
subsystem->monitors[0].left = virtualScreen->left;
subsystem->monitors[0].top = virtualScreen->top;
subsystem->monitors[0].right = virtualScreen->right;
subsystem->monitors[0].bottom = virtualScreen->bottom;
subsystem->monitors[0].flags = 1;
}
WLog_INFO(TAG, "width: %d height: %d", subsystem->width, subsystem->height); WLog_INFO(TAG, "width: %d height: %d", subsystem->width, subsystem->height);
return 1; return 1;
@ -535,7 +510,7 @@ void win_shadow_subsystem_free(winShadowSubsystem* subsystem)
free(subsystem); free(subsystem);
} }
winShadowSubsystem* win_shadow_subsystem_new(rdpShadowServer* server) winShadowSubsystem* win_shadow_subsystem_new()
{ {
winShadowSubsystem* subsystem; winShadowSubsystem* subsystem;
@ -544,14 +519,6 @@ winShadowSubsystem* win_shadow_subsystem_new(rdpShadowServer* server)
if (!subsystem) if (!subsystem)
return NULL; return NULL;
subsystem->Init = (pfnShadowSubsystemInit) win_shadow_subsystem_init;
subsystem->Uninit = (pfnShadowSubsystemInit) win_shadow_subsystem_uninit;
subsystem->Start = (pfnShadowSubsystemStart) win_shadow_subsystem_start;
subsystem->Stop = (pfnShadowSubsystemStop) win_shadow_subsystem_stop;
subsystem->Free = (pfnShadowSubsystemFree) win_shadow_subsystem_free;
subsystem->EnumMonitors = (pfnShadowEnumMonitors) win_shadow_enum_monitors;
subsystem->SynchronizeEvent = (pfnShadowSynchronizeEvent) win_shadow_input_synchronize_event; subsystem->SynchronizeEvent = (pfnShadowSynchronizeEvent) win_shadow_input_synchronize_event;
subsystem->KeyboardEvent = (pfnShadowKeyboardEvent) win_shadow_input_keyboard_event; subsystem->KeyboardEvent = (pfnShadowKeyboardEvent) win_shadow_input_keyboard_event;
subsystem->UnicodeKeyboardEvent = (pfnShadowUnicodeKeyboardEvent) win_shadow_input_unicode_keyboard_event; subsystem->UnicodeKeyboardEvent = (pfnShadowUnicodeKeyboardEvent) win_shadow_input_unicode_keyboard_event;
@ -561,7 +528,18 @@ winShadowSubsystem* win_shadow_subsystem_new(rdpShadowServer* server)
return subsystem; return subsystem;
} }
rdpShadowSubsystem* Win_ShadowCreateSubsystem(rdpShadowServer* server) int Win_ShadowSubsystemEntry(RDP_SHADOW_ENTRY_POINTS* pEntryPoints)
{ {
return (rdpShadowSubsystem*) win_shadow_subsystem_new(server); pEntryPoints->New = (pfnShadowSubsystemNew) win_shadow_subsystem_new;
pEntryPoints->Free = (pfnShadowSubsystemFree) win_shadow_subsystem_free;
pEntryPoints->Init = (pfnShadowSubsystemInit) win_shadow_subsystem_init;
pEntryPoints->Uninit = (pfnShadowSubsystemInit) win_shadow_subsystem_uninit;
pEntryPoints->Start = (pfnShadowSubsystemStart) win_shadow_subsystem_start;
pEntryPoints->Stop = (pfnShadowSubsystemStop) win_shadow_subsystem_stop;
pEntryPoints->EnumMonitors = (pfnShadowEnumMonitors) win_shadow_enum_monitors;
return 1;
} }

View File

@ -781,39 +781,62 @@ int x11_shadow_xshm_init(x11ShadowSubsystem* subsystem)
return 1; return 1;
} }
int x11_shadow_enum_monitors(x11ShadowSubsystem* subsystem, MONITOR_DEF* monitors, int maxMonitors) int x11_shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors)
{ {
int index; int index;
Display* display;
int displayWidth;
int displayHeight;
int numMonitors = 0; int numMonitors = 0;
MONITOR_DEF* monitor; MONITOR_DEF* monitor;
#ifdef WITH_XINERAMA if (!getenv("DISPLAY"))
if (x11_shadow_xinerama_init(subsystem) > 0) setenv("DISPLAY", ":0", 1);
display = XOpenDisplay(NULL);
if (!display)
{ {
WLog_ERR(TAG, "failed to open display: %s", XDisplayName(NULL));
return -1;
}
displayWidth = WidthOfScreen(DefaultScreenOfDisplay(display));
displayHeight = HeightOfScreen(DefaultScreenOfDisplay(display));
#ifdef WITH_XINERAMA
{
int major, minor;
int xinerama_event;
int xinerama_error;
XineramaScreenInfo* screen; XineramaScreenInfo* screen;
XineramaScreenInfo* screens; XineramaScreenInfo* screens;
screens = XineramaQueryScreens(subsystem->display, &numMonitors); if (XineramaQueryExtension(display, &xinerama_event, &xinerama_error) &&
XDamageQueryVersion(display, &major, &minor) && XineramaIsActive(display))
if (numMonitors > maxMonitors)
numMonitors = maxMonitors;
if (screens && (numMonitors > 0))
{ {
for (index = 0; index < numMonitors; index++) screens = XineramaQueryScreens(display, &numMonitors);
if (numMonitors > maxMonitors)
numMonitors = maxMonitors;
if (screens && (numMonitors > 0))
{ {
screen = &screens[index]; for (index = 0; index < numMonitors; index++)
monitor = &monitors[index]; {
screen = &screens[index];
monitor = &monitors[index];
monitor->left = screen->x_org; monitor->left = screen->x_org;
monitor->top = screen->y_org; monitor->top = screen->y_org;
monitor->right = monitor->left + screen->width; monitor->right = monitor->left + screen->width;
monitor->bottom = monitor->top + screen->height; monitor->bottom = monitor->top + screen->height;
monitor->flags = (index == 0) ? 1 : 0; monitor->flags = (index == 0) ? 1 : 0;
}
} }
}
XFree(screens); XFree(screens);
}
} }
#endif #endif
@ -822,14 +845,12 @@ int x11_shadow_enum_monitors(x11ShadowSubsystem* subsystem, MONITOR_DEF* monitor
index = 0; index = 0;
numMonitors = 1; numMonitors = 1;
x11_shadow_subsystem_base_init(subsystem);
monitor = &monitors[index]; monitor = &monitors[index];
monitor->left = 0; monitor->left = 0;
monitor->top = 0; monitor->top = 0;
monitor->right = subsystem->width; monitor->right = displayWidth;
monitor->bottom = subsystem->height; monitor->bottom = displayHeight;
monitor->flags = 1; monitor->flags = 1;
} }
@ -850,9 +871,9 @@ int x11_shadow_subsystem_init(x11ShadowSubsystem* subsystem)
XPixmapFormatValues* pfs; XPixmapFormatValues* pfs;
MONITOR_DEF* virtualScreen; MONITOR_DEF* virtualScreen;
x11_shadow_subsystem_base_init(subsystem); subsystem->numMonitors = x11_shadow_enum_monitors(subsystem->monitors, 16);
subsystem->numMonitors = x11_shadow_enum_monitors(subsystem, subsystem->monitors, 16); x11_shadow_subsystem_base_init(subsystem);
extensions = XListExtensions(subsystem->display, &nextensions); extensions = XListExtensions(subsystem->display, &nextensions);
@ -960,16 +981,6 @@ int x11_shadow_subsystem_init(x11ShadowSubsystem* subsystem)
virtualScreen->bottom = subsystem->height; virtualScreen->bottom = subsystem->height;
virtualScreen->flags = 1; virtualScreen->flags = 1;
if (subsystem->numMonitors < 1)
{
subsystem->numMonitors = 1;
subsystem->monitors[0].left = virtualScreen->left;
subsystem->monitors[0].top = virtualScreen->top;
subsystem->monitors[0].right = virtualScreen->right;
subsystem->monitors[0].bottom = virtualScreen->bottom;
subsystem->monitors[0].flags = 1;
}
WLog_INFO(TAG, "X11 Extensions: XFixes: %d Xinerama: %d XDamage: %d XShm: %d", WLog_INFO(TAG, "X11 Extensions: XFixes: %d Xinerama: %d XDamage: %d XShm: %d",
subsystem->use_xfixes, subsystem->use_xinerama, subsystem->use_xdamage, subsystem->use_xshm); subsystem->use_xfixes, subsystem->use_xinerama, subsystem->use_xdamage, subsystem->use_xshm);
@ -1034,7 +1045,7 @@ void x11_shadow_subsystem_free(x11ShadowSubsystem* subsystem)
free(subsystem); free(subsystem);
} }
x11ShadowSubsystem* x11_shadow_subsystem_new(rdpShadowServer* server) x11ShadowSubsystem* x11_shadow_subsystem_new()
{ {
x11ShadowSubsystem* subsystem; x11ShadowSubsystem* subsystem;
@ -1043,14 +1054,6 @@ x11ShadowSubsystem* x11_shadow_subsystem_new(rdpShadowServer* server)
if (!subsystem) if (!subsystem)
return NULL; return NULL;
subsystem->Init = (pfnShadowSubsystemInit) x11_shadow_subsystem_init;
subsystem->Uninit = (pfnShadowSubsystemInit) x11_shadow_subsystem_uninit;
subsystem->Start = (pfnShadowSubsystemStart) x11_shadow_subsystem_start;
subsystem->Stop = (pfnShadowSubsystemStop) x11_shadow_subsystem_stop;
subsystem->Free = (pfnShadowSubsystemFree) x11_shadow_subsystem_free;
subsystem->EnumMonitors = (pfnShadowEnumMonitors) x11_shadow_enum_monitors;
subsystem->SynchronizeEvent = (pfnShadowSynchronizeEvent) x11_shadow_input_synchronize_event; subsystem->SynchronizeEvent = (pfnShadowSynchronizeEvent) x11_shadow_input_synchronize_event;
subsystem->KeyboardEvent = (pfnShadowKeyboardEvent) x11_shadow_input_keyboard_event; subsystem->KeyboardEvent = (pfnShadowKeyboardEvent) x11_shadow_input_keyboard_event;
subsystem->UnicodeKeyboardEvent = (pfnShadowUnicodeKeyboardEvent) x11_shadow_input_unicode_keyboard_event; subsystem->UnicodeKeyboardEvent = (pfnShadowUnicodeKeyboardEvent) x11_shadow_input_unicode_keyboard_event;
@ -1066,7 +1069,18 @@ x11ShadowSubsystem* x11_shadow_subsystem_new(rdpShadowServer* server)
return subsystem; return subsystem;
} }
rdpShadowSubsystem* X11_ShadowCreateSubsystem(rdpShadowServer* server) int X11_ShadowSubsystemEntry(RDP_SHADOW_ENTRY_POINTS* pEntryPoints)
{ {
return (rdpShadowSubsystem*) x11_shadow_subsystem_new(server); pEntryPoints->New = (pfnShadowSubsystemNew) x11_shadow_subsystem_new;
pEntryPoints->Free = (pfnShadowSubsystemFree) x11_shadow_subsystem_free;
pEntryPoints->Init = (pfnShadowSubsystemInit) x11_shadow_subsystem_init;
pEntryPoints->Uninit = (pfnShadowSubsystemInit) x11_shadow_subsystem_uninit;
pEntryPoints->Start = (pfnShadowSubsystemStart) x11_shadow_subsystem_start;
pEntryPoints->Stop = (pfnShadowSubsystemStop) x11_shadow_subsystem_stop;
pEntryPoints->EnumMonitors = (pfnShadowEnumMonitors) x11_shadow_enum_monitors;
return 1;
} }

View File

@ -304,10 +304,7 @@ void* shadow_server_thread(rdpShadowServer* server)
StopEvent = server->StopEvent; StopEvent = server->StopEvent;
subsystem = server->subsystem; subsystem = server->subsystem;
if (subsystem->Start) shadow_subsystem_start(server->subsystem);
{
subsystem->Start(subsystem);
}
while (1) while (1)
{ {
@ -341,10 +338,7 @@ void* shadow_server_thread(rdpShadowServer* server)
listener->Close(listener); listener->Close(listener);
if (subsystem->Stop) shadow_subsystem_stop(server->subsystem);
{
subsystem->Stop(subsystem);
}
ExitThread(0); ExitThread(0);
@ -560,7 +554,7 @@ int shadow_server_init(rdpShadowServer* server)
server->listener->info = (void*) server; server->listener->info = (void*) server;
server->listener->PeerAccepted = shadow_client_accepted; server->listener->PeerAccepted = shadow_client_accepted;
server->subsystem = shadow_subsystem_new(0); server->subsystem = shadow_subsystem_new(NULL);
if (!server->subsystem) if (!server->subsystem)
return -1; return -1;
@ -580,12 +574,6 @@ int shadow_server_uninit(rdpShadowServer* server)
server->listener = NULL; server->listener = NULL;
} }
if (server->subsystem)
{
server->subsystem->Free(server->subsystem);
server->subsystem = NULL;
}
if (server->CertificateFile) if (server->CertificateFile)
{ {
free(server->CertificateFile); free(server->CertificateFile);
@ -609,26 +597,6 @@ int shadow_server_uninit(rdpShadowServer* server)
return 1; return 1;
} }
int shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors, UINT32 flags)
{
int numMonitors = 0;
rdpShadowSubsystem* subsystem;
subsystem = shadow_subsystem_new(flags);
if (!subsystem)
return -1;
if (!subsystem->EnumMonitors)
return -1;
numMonitors = subsystem->EnumMonitors(subsystem, monitors, maxMonitors);
shadow_subsystem_free(subsystem);
return numMonitors;
}
rdpShadowServer* shadow_server_new() rdpShadowServer* shadow_server_new()
{ {
rdpShadowServer* server; rdpShadowServer* server;
@ -658,7 +626,7 @@ void shadow_server_free(rdpShadowServer* server)
server->clients = NULL; server->clients = NULL;
} }
shadow_server_uninit(server); shadow_subsystem_free(server->subsystem);
free(server); free(server);
} }

View File

@ -24,45 +24,110 @@
#include "shadow_subsystem.h" #include "shadow_subsystem.h"
#ifdef WITH_SHADOW_X11 struct _RDP_SHADOW_SUBSYSTEM
extern rdpShadowSubsystem* X11_ShadowCreateSubsystem(rdpShadowServer* server);
#endif
#ifdef WITH_SHADOW_MAC
extern rdpShadowSubsystem* Mac_ShadowCreateSubsystem(rdpShadowServer* server);
#endif
#ifdef WITH_SHADOW_WIN
extern rdpShadowSubsystem* Win_ShadowCreateSubsystem(rdpShadowServer* server);
#endif
rdpShadowSubsystem* shadow_subsystem_new(UINT32 flags)
{ {
rdpShadowSubsystem* subsystem = NULL; const char* name;
pfnShadowCreateSubsystem CreateSubsystem = NULL; pfnShadowSubsystemEntry entry;
};
typedef struct _RDP_SHADOW_SUBSYSTEM RDP_SHADOW_SUBSYSTEM;
#ifdef WITH_SHADOW_X11 #ifdef WITH_SHADOW_X11
CreateSubsystem = X11_ShadowCreateSubsystem; extern int X11_ShadowSubsystemEntry(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
#endif #endif
#ifdef WITH_SHADOW_MAC #ifdef WITH_SHADOW_MAC
CreateSubsystem = Mac_ShadowCreateSubsystem; extern int Mac_ShadowSubsystemEntry(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
#endif #endif
#ifdef WITH_SHADOW_WIN #ifdef WITH_SHADOW_WIN
CreateSubsystem = Win_ShadowCreateSubsystem; extern int Win_ShadowSubsystemEntry(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
#endif #endif
if (CreateSubsystem)
subsystem = CreateSubsystem(NULL); static RDP_SHADOW_SUBSYSTEM g_Subsystems[] =
{
#ifdef WITH_SHADOW_X11
{ "X11", X11_ShadowSubsystemEntry },
#endif
#ifdef WITH_SHADOW_MAC
{ "Mac", Mac_ShadowSubsystemEntry },
#endif
#ifdef WITH_SHADOW_WIN
{ "Win", Win_ShadowSubsystemEntry },
#endif
{ "", NULL }
};
static int g_SubsystemCount = (sizeof(g_Subsystems) / sizeof(g_Subsystems[0]));
pfnShadowSubsystemEntry shadow_subsystem_load_static_entry(const char* name)
{
int index;
if (!name)
{
for (index = 0; index < g_SubsystemCount; index++)
{
if (g_Subsystems[index].name)
return g_Subsystems[index].entry;
}
}
for (index = 0; index < g_SubsystemCount; index++)
{
if (strcmp(name, g_Subsystems[index].name) == 0)
return g_Subsystems[index].entry;
}
return NULL;
}
int shadow_subsystem_load_entry_points(RDP_SHADOW_ENTRY_POINTS* pEntryPoints, const char* name)
{
pfnShadowSubsystemEntry entry;
entry = shadow_subsystem_load_static_entry(name);
if (!entry)
return -1;
ZeroMemory(pEntryPoints, sizeof(RDP_SHADOW_ENTRY_POINTS));
if (entry(pEntryPoints) < 0)
return -1;
return 1;
}
rdpShadowSubsystem* shadow_subsystem_new(const char* name)
{
RDP_SHADOW_ENTRY_POINTS ep;
rdpShadowSubsystem* subsystem = NULL;
shadow_subsystem_load_entry_points(&ep, name);
if (!ep.New)
return NULL;
subsystem = ep.New();
if (!subsystem)
return NULL;
CopyMemory(&(subsystem->ep), &ep, sizeof(RDP_SHADOW_ENTRY_POINTS));
return subsystem; return subsystem;
} }
void shadow_subsystem_free(rdpShadowSubsystem* subsystem) void shadow_subsystem_free(rdpShadowSubsystem* subsystem)
{ {
if (subsystem->Free) if (subsystem->ep.Free)
subsystem->Free(subsystem); subsystem->ep.Free(subsystem);
} }
int shadow_subsystem_init(rdpShadowSubsystem* subsystem, rdpShadowServer* server) int shadow_subsystem_init(rdpShadowSubsystem* subsystem, rdpShadowServer* server)
@ -76,19 +141,19 @@ int shadow_subsystem_init(rdpShadowSubsystem* subsystem, rdpShadowServer* server
subsystem->MsgPipe = MessagePipe_New(); subsystem->MsgPipe = MessagePipe_New();
region16_init(&(subsystem->invalidRegion)); region16_init(&(subsystem->invalidRegion));
if (!subsystem->Init) if (!subsystem->ep.Init)
return -1; return -1;
if (subsystem->Init) if (subsystem->ep.Init)
status = subsystem->Init(subsystem); status = subsystem->ep.Init(subsystem);
return status; return status;
} }
void shadow_subsystem_uninit(rdpShadowSubsystem* subsystem) void shadow_subsystem_uninit(rdpShadowSubsystem* subsystem)
{ {
if (subsystem->Uninit) if (subsystem->ep.Uninit)
subsystem->Uninit(subsystem); subsystem->ep.Uninit(subsystem);
if (subsystem->updateEvent) if (subsystem->updateEvent)
{ {
@ -107,3 +172,40 @@ void shadow_subsystem_uninit(rdpShadowSubsystem* subsystem)
region16_uninit(&(subsystem->invalidRegion)); region16_uninit(&(subsystem->invalidRegion));
} }
} }
int shadow_subsystem_start(rdpShadowSubsystem* subsystem)
{
int status;
if (!subsystem->ep.Start)
return -1;
status = subsystem->ep.Start(subsystem);
return status;
}
int shadow_subsystem_stop(rdpShadowSubsystem* subsystem)
{
int status;
if (!subsystem->ep.Stop)
return -1;
status = subsystem->ep.Stop(subsystem);
return status;
}
int shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors, const char* name)
{
int numMonitors = 0;
RDP_SHADOW_ENTRY_POINTS ep;
if (shadow_subsystem_load_entry_points(&ep, name) < 0)
return -1;
numMonitors = ep.EnumMonitors(monitors, maxMonitors);
return numMonitors;
}

View File

@ -30,12 +30,15 @@
extern "C" { extern "C" {
#endif #endif
rdpShadowSubsystem* shadow_subsystem_new(UINT32 flags); rdpShadowSubsystem* shadow_subsystem_new(const char* name);
void shadow_subsystem_free(rdpShadowSubsystem* subsystem); void shadow_subsystem_free(rdpShadowSubsystem* subsystem);
int shadow_subsystem_init(rdpShadowSubsystem* subsystem, rdpShadowServer* server); int shadow_subsystem_init(rdpShadowSubsystem* subsystem, rdpShadowServer* server);
void shadow_subsystem_uninit(rdpShadowSubsystem* subsystem); void shadow_subsystem_uninit(rdpShadowSubsystem* subsystem);
int shadow_subsystem_start(rdpShadowSubsystem* subsystem);
int shadow_subsystem_stop(rdpShadowSubsystem* subsystem);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif