libfreerdp-client: add support for ascii .rdp files
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Sun, 28 Oct 2012 02:46:37 +0000 (22:46 -0400)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Sun, 28 Oct 2012 02:46:37 +0000 (22:46 -0400)
client/common/file.c
client/common/test/TestClientRdpFile.c

index b9e6761..43d9e49 100644 (file)
@@ -206,6 +206,12 @@ void freerdp_client_parse_rdp_file_integer_unicode(rdpFile* file, WCHAR* name, W
        free(valueA);
 }
 
+void freerdp_client_parse_rdp_file_integer_ascii(rdpFile* file, char* name, char* value)
+{
+       int ivalue = atoi(value);
+       freerdp_client_rdp_file_set_integer(file, name, ivalue);
+}
+
 BOOL freerdp_client_rdp_file_set_string(rdpFile* file, char* name, char* value)
 {
        if (_stricmp(name, "username") == 0)
@@ -272,9 +278,75 @@ void freerdp_client_parse_rdp_file_string_unicode(rdpFile* file, WCHAR* name, WC
        free(nameA);
 }
 
+void freerdp_client_parse_rdp_file_string_ascii(rdpFile* file, char* name, char* value)
+{
+       freerdp_client_rdp_file_set_string(file, name, value);
+}
+
 BOOL freerdp_client_parse_rdp_file_buffer_ascii(rdpFile* file, BYTE* buffer, size_t size)
 {
-       return FALSE;
+       int length;
+       char* line;
+       char* type;
+       char* context;
+       char *d1, *d2;
+       char *beg, *end;
+       char *name, *value;
+
+       line = strtok_s((char*) buffer, "\r\n", &context);
+
+       while (line != NULL)
+       {
+               length = strlen(line);
+
+               if (length > 1)
+               {
+                       beg = line;
+                       end = &line[length - 1];
+
+                       d1 = strchr(line, ':');
+
+                       if (!d1)
+                               goto next_line; /* not first delimiter */
+
+                       type = &d1[1];
+                       d2 = strchr(type, ':');
+
+                       if (!d2)
+                               goto next_line; /* no second delimiter */
+
+                       if ((d2 - d1) != 2)
+                               goto next_line; /* improper type length */
+
+                       if (d2 == end)
+                               goto next_line; /* no value */
+
+                       *d1 = 0;
+                       *d2 = 0;
+                       name = beg;
+                       value = &d2[1];
+
+                       if (*type == 'i')
+                       {
+                               /* integer type */
+                               freerdp_client_parse_rdp_file_integer_ascii(file, name, value);
+                       }
+                       else if (*type == 's')
+                       {
+                               /* string type */
+                               freerdp_client_parse_rdp_file_string_ascii(file, name, value);
+                       }
+                       else if (*type == 'b')
+                       {
+                               /* binary type */
+                       }
+               }
+
+next_line:
+               line = strtok_s(NULL, "\r\n", &context);
+       }
+
+       return TRUE;
 }
 
 BOOL freerdp_client_parse_rdp_file_buffer_unicode(rdpFile* file, BYTE* buffer, size_t size)
@@ -450,8 +522,6 @@ BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings*
        if (~file->RemoteApplicationMode)
                settings->remote_app = file->RemoteApplicationMode;
 
-       printf("Username: %s Password: %s Domain: %s\n", settings->username, settings->password, settings->domain);
-
        return TRUE;
 }
 
index 779ee99..7381903 100644 (file)
@@ -209,63 +209,62 @@ static BYTE testRdpFileUTF16[] =
        0x0a, 0x00
 };
 
-/*
-screen mode id:i:2
-use multimon:i:0
-desktopwidth:i:1920
-desktopheight:i:1080
-session bpp:i:32
-winposstr:s:0,1,553,211,1353,811
-compression:i:1
-keyboardhook:i:2
-audiocapturemode:i:0
-videoplaybackmode:i:1
-connection type:i:7
-networkautodetect:i:1
-bandwidthautodetect:i:1
-displayconnectionbar:i:1
-enableworkspacereconnect:i:0
-disable wallpaper:i:0
-allow font smoothing:i:0
-allow desktop composition:i:0
-disable full window drag:i:1
-disable menu anims:i:1
-disable themes:i:0
-disable cursor setting:i:0
-bitmapcachepersistenable:i:1
-full address:s:LAB1-W7-DM-01.lab1.awake.local
-audiomode:i:0
-redirectprinters:i:1
-redirectcomports:i:0
-redirectsmartcards:i:1
-redirectclipboard:i:1
-redirectposdevices:i:0
-autoreconnection enabled:i:1
-authentication level:i:2
-prompt for credentials:i:0
-negotiate security layer:i:1
-remoteapplicationmode:i:0
-alternate shell:s:
-shell working directory:s:
-gatewayhostname:s:LAB1-W2K8R2-GW.lab1.awake.local
-gatewayusagemethod:i:1
-gatewaycredentialssource:i:0
-gatewayprofileusagemethod:i:1
-promptcredentialonce:i:1
-use redirection server name:i:0
-rdgiskdcproxy:i:0
-kdcproxyname:s:
-drivestoredirect:s:*
-username:s:LAB1\JohnDoe
- */
+static char testRdpFileUTF8[] =
+       "screen mode id:i:2\n"
+       "use multimon:i:0\n"
+       "desktopwidth:i:1920\n"
+       "desktopheight:i:1080\n"
+       "session bpp:i:32\n"
+       "winposstr:s:0,1,553,211,1353,811\n"
+       "compression:i:1\n"
+       "keyboardhook:i:2\n"
+       "audiocapturemode:i:0\n"
+       "videoplaybackmode:i:1\n"
+       "connection type:i:7\n"
+       "networkautodetect:i:1\n"
+       "bandwidthautodetect:i:1\n"
+       "displayconnectionbar:i:1\n"
+       "enableworkspacereconnect:i:0\n"
+       "disable wallpaper:i:0\n"
+       "allow font smoothing:i:0\n"
+       "allow desktop composition:i:0\n"
+       "disable full window drag:i:1\n"
+       "disable menu anims:i:1\n"
+       "disable themes:i:0\n"
+       "disable cursor setting:i:0\n"
+       "bitmapcachepersistenable:i:1\n"
+       "full address:s:LAB1-W7-DM-01.lab1.awake.local\n"
+       "audiomode:i:0\n"
+       "redirectprinters:i:1\n"
+       "redirectcomports:i:0\n"
+       "redirectsmartcards:i:1\n"
+       "redirectclipboard:i:1\n"
+       "redirectposdevices:i:0\n"
+       "autoreconnection enabled:i:1\n"
+       "authentication level:i:2\n"
+       "prompt for credentials:i:0\n"
+       "negotiate security layer:i:1\n"
+       "remoteapplicationmode:i:0\n"
+       "alternate shell:s:\n"
+       "shell working directory:s:\n"
+       "gatewayhostname:s:LAB1-W2K8R2-GW.lab1.awake.local\n"
+       "gatewayusagemethod:i:1\n"
+       "gatewaycredentialssource:i:0\n"
+       "gatewayprofileusagemethod:i:1\n"
+       "promptcredentialonce:i:1\n"
+       "use redirection server name:i:0\n"
+       "rdgiskdcproxy:i:0\n"
+       "kdcproxyname:s:\n"
+       "drivestoredirect:s:*\n"
+       "username:s:LAB1\\JohnDoe\n";
 
 int TestClientRdpFile(int argc, char* argv[])
 {
        rdpFile* file;
 
-       file = (rdpFile*) malloc(sizeof(rdpFile));
-       ZeroMemory(file, sizeof(rdpFile));
+       /* Unicode */
 
+       file = freerdp_client_rdp_file_new();
        freerdp_client_parse_rdp_file_buffer(file, testRdpFileUTF16, sizeof(testRdpFileUTF16));
 
        if (file->UseMultiMon != 0)
@@ -290,7 +289,42 @@ int TestClientRdpFile(int argc, char* argv[])
        {
                printf("GatewayHostname mismatch: Actual: %s, Expected: %s\n",
                                file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local");
+               return -1;
+       }
+
+       freerdp_client_rdp_file_free(file);
+
+       /* Ascii */
+
+       file = freerdp_client_rdp_file_new();
+       freerdp_client_parse_rdp_file_buffer(file, (BYTE*) testRdpFileUTF8, sizeof(testRdpFileUTF8));
+
+       if (file->UseMultiMon != 0)
+       {
+               printf("UseMultiMon mismatch: Actual: %d, Expected: %d\n", file->UseMultiMon, 0);
+               return -1;
+       }
+
+       if (file->ScreenModeId != 2)
+       {
+               printf("ScreenModeId mismatch: Actual: %d, Expected: %d\n", file->ScreenModeId, 2);
+               return -1;
+       }
+
+       if (file->GatewayProfileUsageMethod != 1)
+       {
+               printf("GatewayProfileUsageMethod mismatch: Actual: %d, Expected: %d\n", file->GatewayProfileUsageMethod, 1);
+               return -1;
        }
 
+       if (strcmp(file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local") != 0)
+       {
+               printf("GatewayHostname mismatch: Actual: %s, Expected: %s\n",
+                               file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local");
+               return -1;
+       }
+
+       freerdp_client_rdp_file_free(file);
+
        return 0;
 }