diff options
Diffstat (limited to 'server/Windows/cli/wfreerdp.c')
-rw-r--r-- | server/Windows/cli/wfreerdp.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/server/Windows/cli/wfreerdp.c b/server/Windows/cli/wfreerdp.c new file mode 100644 index 0000000..efc1bf5 --- /dev/null +++ b/server/Windows/cli/wfreerdp.c @@ -0,0 +1,171 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Windows Server + * + * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed 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. + */ + +#include <freerdp/config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include <winpr/tchar.h> +#include <winpr/windows.h> + +#include "wf_interface.h" + +#include "wfreerdp.h" + +#include <freerdp/server/server-common.h> +#include <freerdp/log.h> +#define TAG SERVER_TAG("windows") + +int IDcount = 0; + +BOOL CALLBACK moncb(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) +{ + WLog_DBG(TAG, "%d\t(%ld, %ld), (%ld, %ld)", IDcount, lprcMonitor->left, lprcMonitor->top, + lprcMonitor->right, lprcMonitor->bottom); + IDcount++; + return TRUE; +} + +int main(int argc, char* argv[]) +{ + freerdp_server_warn_unmaintained(argc, argv); + + BOOL screen_selected = FALSE; + int index = 1; + wfServer* server; + server = wfreerdp_server_new(); + set_screen_id(0); + // handle args + errno = 0; + + while (index < argc) + { + // first the args that will cause the program to terminate + if (strcmp("--list-screens", argv[index]) == 0) + { + int width; + int height; + int bpp; + WLog_INFO(TAG, "Detecting screens..."); + WLog_INFO(TAG, "ID\tResolution\t\tName (Interface)"); + + for (int i = 0;; i++) + { + _TCHAR name[128] = { 0 }; + if (get_screen_info(i, name, ARRAYSIZE(name), &width, &height, &bpp) != 0) + { + if ((width * height * bpp) == 0) + continue; + + WLog_INFO(TAG, "%d\t%dx%dx%d\t", i, width, height, bpp); + WLog_INFO(TAG, "%s", name); + } + else + { + break; + } + } + + { + int vscreen_w; + int vscreen_h; + vscreen_w = GetSystemMetrics(SM_CXVIRTUALSCREEN); + vscreen_h = GetSystemMetrics(SM_CYVIRTUALSCREEN); + WLog_INFO(TAG, ""); + EnumDisplayMonitors(NULL, NULL, moncb, 0); + IDcount = 0; + WLog_INFO(TAG, "Virtual Screen = %dx%d", vscreen_w, vscreen_h); + } + + return 0; + } + + if (strcmp("--screen", argv[index]) == 0) + { + UINT32 val; + screen_selected = TRUE; + index++; + + if (index == argc) + { + WLog_INFO(TAG, "missing screen id parameter"); + return 0; + } + + val = strtoul(argv[index], NULL, 0); + + if ((errno != 0) || (val > UINT32_MAX)) + return -1; + + set_screen_id(val); + index++; + } + + if (index == argc - 1) + { + UINT32 val = strtoul(argv[index], NULL, 0); + + if ((errno != 0) || (val > UINT32_MAX)) + return -1; + + server->port = val; + break; + } + } + + if (screen_selected == FALSE) + { + int width; + int height; + int bpp; + WLog_INFO(TAG, "screen id not provided. attempting to detect..."); + WLog_INFO(TAG, "Detecting screens..."); + WLog_INFO(TAG, "ID\tResolution\t\tName (Interface)"); + + for (int i = 0;; i++) + { + _TCHAR name[128] = { 0 }; + if (get_screen_info(i, name, ARRAYSIZE(name), &width, &height, &bpp) != 0) + { + if ((width * height * bpp) == 0) + continue; + + WLog_INFO(TAG, "%d\t%dx%dx%d\t", i, width, height, bpp); + WLog_INFO(TAG, "%s", name); + set_screen_id(i); + break; + } + else + { + break; + } + } + } + + WLog_INFO(TAG, "Starting server"); + wfreerdp_server_start(server); + WaitForSingleObject(server->thread, INFINITE); + WLog_INFO(TAG, "Stopping server"); + wfreerdp_server_stop(server); + wfreerdp_server_free(server); + return 0; +} |