Implemented rdp file parser functions with a callback for custom settings.
authorArmin Novak <armin.novak@thincast.com>
Mon, 15 Jul 2019 08:30:16 +0000 (10:30 +0200)
committerArmin Novak <armin.novak@thincast.com>
Mon, 15 Jul 2019 10:01:30 +0000 (12:01 +0200)
client/common/file.c
include/freerdp/client/file.h

index 6869e23..c9f076e 100644 (file)
@@ -189,6 +189,7 @@ struct rdp_file
        int argc;
        char** argv;
        int argSize;
+       void* context;
 };
 
 /*
@@ -553,7 +554,13 @@ static BOOL freerdp_client_parse_rdp_file_option(rdpFile* file, char* option, in
 }
 
 BOOL freerdp_client_parse_rdp_file_buffer(rdpFile* file, const BYTE* buffer,
-        size_t size)
+                                                                                 size_t size)
+{
+       return freerdp_client_parse_rdp_file_buffer_ex(file, buffer, size, NULL);
+}
+
+BOOL freerdp_client_parse_rdp_file_buffer_ex(rdpFile* file, const BYTE* buffer,
+               size_t size, rdp_file_fkt_parse parse)
 {
        BOOL rc = FALSE;
        int index;
@@ -630,7 +637,11 @@ BOOL freerdp_client_parse_rdp_file_buffer(rdpFile* file, const BYTE* buffer,
                        name = beg;
                        value = &d2[1];
 
-                       if (*type == 'i')
+                       if (parse && parse(file->context, name, *type, value))
+                       {
+
+                       }
+                       else if (*type == 'i')
                        {
                                /* integer type */
                                if (!freerdp_client_parse_rdp_file_integer(file, name, value, index))
@@ -662,6 +673,12 @@ fail:
 
 BOOL freerdp_client_parse_rdp_file(rdpFile* file, const char* name)
 {
+    return freerdp_client_parse_rdp_file_ex(file, name, NULL);
+}
+
+BOOL freerdp_client_parse_rdp_file_ex(rdpFile* file, const char* name,
+                                                                         rdp_file_fkt_parse parse)
+{
        BOOL status;
        BYTE* buffer;
        FILE* fp = NULL;
@@ -713,7 +730,7 @@ BOOL freerdp_client_parse_rdp_file(rdpFile* file, const char* name)
 
        buffer[file_size] = '\0';
        buffer[file_size + 1] = '\0';
-       status = freerdp_client_parse_rdp_file_buffer(file, buffer, file_size);
+       status = freerdp_client_parse_rdp_file_buffer_ex(file, buffer, file_size, parse);
        free(buffer);
        return status;
 }
@@ -1616,3 +1633,8 @@ void freerdp_client_rdp_file_free(rdpFile* file)
                free(file);
        }
 }
+
+void freerdp_client_rdp_file_set_callback_context(rdpFile* file, void* context)
+{
+       file->context = context;
+}
index 74bb3d3..d3d6442 100644 (file)
 #include <freerdp/freerdp.h>
 
 typedef struct rdp_file rdpFile;
+typedef BOOL (*rdp_file_fkt_parse)(void* context, const char* key, char type, const char* value);
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+/* When using freerdp_client_parse_rdp_file_ex or freerdp_client_parse_rdp_file_buffer_ex
+ * set the context for the callback with this function. */
+FREERDP_API void freerdp_client_rdp_file_set_callback_context(rdpFile* file, void* context);
+
 FREERDP_API BOOL freerdp_client_parse_rdp_file(rdpFile* file, const char* name);
+FREERDP_API BOOL freerdp_client_parse_rdp_file_ex(rdpFile* file, const char* name, rdp_file_fkt_parse parse);
 FREERDP_API BOOL freerdp_client_parse_rdp_file_buffer(rdpFile* file, const BYTE* buffer, size_t size);
+FREERDP_API BOOL freerdp_client_parse_rdp_file_buffer_ex(rdpFile* file, const BYTE* buffer, size_t size,
+                                                         rdp_file_fkt_parse parse);
 FREERDP_API BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* settings);
 
 FREERDP_API BOOL freerdp_client_populate_rdp_file_from_settings(rdpFile* file, const rdpSettings* settings);