From 1deb78f21142ddd92a7574e65250b16a9c4b685d Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 15 Jul 2019 10:30:16 +0200 Subject: [PATCH] Implemented rdp file parser functions with a callback for custom settings. --- client/common/file.c | 28 +++++++++++++++++++++++++--- include/freerdp/client/file.h | 8 ++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/client/common/file.c b/client/common/file.c index 6869e23..c9f076e 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -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; +} diff --git a/include/freerdp/client/file.h b/include/freerdp/client/file.h index 74bb3d3..d3d6442 100644 --- a/include/freerdp/client/file.h +++ b/include/freerdp/client/file.h @@ -24,13 +24,21 @@ #include 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); -- 2.7.4