2
* FreeRDP: A Remote Desktop Protocol Implementation
3
* FreeRDP Windows Server
5
* Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6
* Copyright 2012 Corey Clayton <can.of.tuna@gmail.com>
8
* Licensed under the Apache License, Version 2.0 (the "License");
9
* you may not use this file except in compliance with the License.
10
* You may obtain a copy of the License at
12
* http://www.apache.org/licenses/LICENSE-2.0
14
* Unless required by applicable law or agreed to in writing, software
15
* distributed under the License is distributed on an "AS IS" BASIS,
16
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
* See the License for the specific language governing permissions and
18
* limitations under the License.
26
#include <winpr/tchar.h>
27
#include <winpr/windows.h>
28
#include <freerdp/utils/tcp.h>
29
#include <freerdp\listener.h>
32
#include "wf_settings.h"
35
#include "wf_interface.h"
39
int get_screen_info(int id, _TCHAR* name, int* width, int* height, int* bpp)
43
memset(&dd, 0, sizeof(DISPLAY_DEVICE));
44
dd.cb = sizeof(DISPLAY_DEVICE);
46
if (EnumDisplayDevices(NULL, id, &dd, 0) != 0)
51
_stprintf(name, _T("%s (%s)"), dd.DeviceName, dd.DeviceString);
53
dc = CreateDC(dd.DeviceName, NULL, NULL, NULL);
54
*width = GetDeviceCaps(dc, HORZRES);
55
*height = GetDeviceCaps(dc, VERTRES);
56
*bpp = GetDeviceCaps(dc, BITSPIXEL);
57
//ReleaseDC(NULL, dc);
69
void set_screen_id(int id)
73
wfi = wf_info_get_instance();
79
DWORD WINAPI wf_server_main_loop(LPVOID lpParam)
86
freerdp_listener* instance;
89
wfi = wf_info_get_instance();
90
wfi->force_all_disconnect = FALSE;
92
ZeroMemory(rfds, sizeof(rfds));
93
instance = (freerdp_listener*) lpParam;
95
while(wfi->force_all_disconnect == FALSE)
99
if (instance->GetFileDescriptor(instance, rfds, &rcount) != TRUE)
101
printf("Failed to get FreeRDP file descriptor\n");
108
for (i = 0; i < rcount; i++)
110
fds = (int)(long)(rfds[i]);
115
FD_SET(fds, &rfds_set);
122
select(max_fds + 1, &rfds_set, NULL, NULL, NULL);
124
if (instance->CheckFileDescriptor(instance) != TRUE)
126
printf("Failed to check FreeRDP file descriptor\n");
131
printf("wf_server_main_loop terminating\n");
133
instance->Close(instance);
138
BOOL wfreerdp_server_start(wfServer* server)
140
freerdp_listener* instance;
142
server->instance = freerdp_listener_new();
143
server->instance->PeerAccepted = wf_peer_accepted;
144
instance = server->instance;
146
wf_settings_read_dword(HKEY_LOCAL_MACHINE, _T("Software\\FreeRDP\\Server"), _T("DefaultPort"), &server->port);
148
if (instance->Open(instance, NULL, (UINT16) server->port))
150
server->thread = CreateThread(NULL, 0, wf_server_main_loop, (void*) instance, 0, NULL);
157
BOOL wfreerdp_server_stop(wfServer* server)
161
wfi = wf_info_get_instance();
163
printf("Stopping server\n");
164
wfi->force_all_disconnect = TRUE;
165
server->instance->Close(server->instance);
169
wfServer* wfreerdp_server_new()
173
server = (wfServer*) malloc(sizeof(wfServer));
174
ZeroMemory(server, sizeof(wfServer));
176
freerdp_wsa_startup();
188
void wfreerdp_server_free(wfServer* server)
195
freerdp_wsa_cleanup();
199
FREERDP_API BOOL wfreerdp_server_is_running(wfServer* server)
204
bRet = GetExitCodeThread(server->thread, &tStatus);
207
printf("Error in call to GetExitCodeThread\n");
211
if (tStatus == STILL_ACTIVE)
216
FREERDP_API UINT32 wfreerdp_server_num_peers()
220
wfi = wf_info_get_instance();
221
return wfi->peerCount;
224
FREERDP_API UINT32 wfreerdp_server_get_peer_hostname(int pId, wchar_t * dstStr)
229
wfi = wf_info_get_instance();
230
peer = wfi->peers[pId];
237
sLen = strnlen_s(peer->hostname, 50);
238
swprintf(dstStr, 50, L"%hs", peer->hostname);
243
printf("nonexistent peer id=%d\n", pId);
249
FREERDP_API BOOL wfreerdp_server_peer_is_local(int pId)
254
wfi = wf_info_get_instance();
255
peer = wfi->peers[pId];
267
FREERDP_API BOOL wfreerdp_server_peer_is_connected(int pId)
272
wfi = wf_info_get_instance();
273
peer = wfi->peers[pId];
278
return peer->connected;
286
FREERDP_API BOOL wfreerdp_server_peer_is_activated(int pId)
291
wfi = wf_info_get_instance();
292
peer = wfi->peers[pId];
297
return peer->activated;
305
FREERDP_API BOOL wfreerdp_server_peer_is_authenticated(int pId)
310
wfi = wf_info_get_instance();
311
peer = wfi->peers[pId];
316
return peer->authenticated;
324
FREERDP_API void wfreerdp_server_register_callback_event(cbCallback cb)
329
void wfreerdp_server_peer_callback_event(int pId, UINT32 eType)