#include "wf_client.h"
+#include <shellapi.h>
+
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
- int index;
int status;
HANDLE thread;
wfContext* wfc;
rdpContext* context;
rdpSettings* settings;
RDP_CLIENT_ENTRY_POINTS clientEntryPoints;
- int ret = 0;
+ int ret = 1;
+ int argc = 0, i;
+ LPWSTR* args;
+ LPWSTR cmd;
+ char** argv;
ZeroMemory(&clientEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS));
clientEntryPoints.Size = sizeof(RDP_CLIENT_ENTRY_POINTS);
RdpClientEntry(&clientEntryPoints);
context = freerdp_client_context_new(&clientEntryPoints);
+ if (!context)
+ return -1;
- settings = context->settings;
- wfc = (wfContext*) context;
+ cmd = GetCommandLineW();
+ if (!cmd)
+ goto out;
- settings->SoftwareGdi = TRUE;
+ args = CommandLineToArgvW(cmd, &argc);
+ if (!args)
+ goto out;
- context->argc = __argc;
- context->argv = (char**) malloc(sizeof(char*) * __argc);
- if (!context->argv)
- {
- ret = 1;
+ argv = calloc(argc, sizeof(char*));
+ if (!argv)
goto out;
- }
- for (index = 0; index < context->argc; index++)
+ for (i=0; i<argc; i++)
{
- context->argv[index] = _strdup(__argv[index]);
- if (!context->argv[index])
- {
- ret = 1;
- for (--index; index >= 0; --index)
- free(context->argv[index]);
- free(context->argv);
- context->argv = NULL;
+ int size = WideCharToMultiByte(CP_UTF8, 0, args[i], -1, NULL, 0, NULL, NULL);
+ argv[i] = calloc(size, sizeof(char));
+ if (!argv[i])
goto out;
- }
+ if (WideCharToMultiByte(CP_UTF8, 0, args[i], -1, argv[i], size, NULL, NULL) != size)
+ goto out;
}
- status = freerdp_client_settings_parse_command_line(settings, context->argc, context->argv, FALSE);
+ settings = context->settings;
+ wfc = (wfContext*) context;
+ if (!settings || !wfc)
+ goto out;
- status = freerdp_client_settings_command_line_status_print(settings, status, context->argc, context->argv);
+ status = freerdp_client_settings_parse_command_line(settings, argc, argv, FALSE);
+ if (status)
+ goto out;
+ status = freerdp_client_settings_command_line_status_print(settings, status, context->argc, context->argv);
if (status)
- {
- freerdp_client_context_free(context);
- return 0;
- }
+ goto out;
- freerdp_client_start(context);
+ if (freerdp_client_start(context) != 0)
+ goto out;
thread = freerdp_client_get_thread(context);
+ if (thread)
+ {
+ if (WaitForSingleObject(thread, INFINITE) == WAIT_OBJECT_0)
+ {
+ GetExitCodeThread(thread, &dwExitCode);
+ ret = dwExitCode;
+ }
+ }
- WaitForSingleObject(thread, INFINITE);
-
- GetExitCodeThread(thread, &dwExitCode);
+ if (freerdp_client_stop(context) != 0)
+ goto out;
- freerdp_client_stop(context);
out:
freerdp_client_context_free(context);
+ if (argv)
+ {
+ for (i=0; i<argc; i++)
+ free(argv[i]);
+
+ free (argv);
+ }
+ LocalFree(args);
+
return ret;
}