diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index cc870e9d9..9adf77bb7 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -298,7 +298,9 @@ struct rdp_settings boolean frame_acknowledge; boolean dump_rfx; + boolean play_rfx; char* dump_rfx_file; + char* play_rfx_file; boolean remote_app; uint8 num_icon_caches; diff --git a/include/freerdp/update.h b/include/freerdp/update.h index 006f624b2..aaaf56567 100644 --- a/include/freerdp/update.h +++ b/include/freerdp/update.h @@ -1076,6 +1076,7 @@ struct rdp_update void* param2; boolean dump_rfx; + boolean play_rfx; rdpPcap* pcap_rfx; pcBeginPaint BeginPaint; diff --git a/libfreerdp-core/freerdp.c b/libfreerdp-core/freerdp.c index 4b06392e5..bd88f449d 100644 --- a/libfreerdp-core/freerdp.c +++ b/libfreerdp-core/freerdp.c @@ -20,6 +20,7 @@ #include "rdp.h" #include "input.h" #include "update.h" +#include "surface.h" #include "transport.h" #include "connection.h" @@ -46,6 +47,37 @@ boolean freerdp_connect(freerdp* instance) } IFCALL(instance->PostConnect, instance); + + if (instance->settings->play_rfx) + { + STREAM* s; + rdpUpdate* update; + pcap_record record; + + s = stream_new(1024); + instance->update->play_rfx = instance->settings->play_rfx; + instance->update->pcap_rfx = pcap_open(instance->settings->play_rfx_file, False); + update = instance->update; + + while (pcap_has_next_record(update->pcap_rfx)) + { + pcap_get_next_record_header(update->pcap_rfx, &record); + + s->data = xrealloc(s->data, record.length); + record.data = s->data; + s->size = record.length; + + pcap_get_next_record_content(update->pcap_rfx, &record); + stream_set_pos(s, 0); + + update->BeginPaint(update); + update_recv_surfcmds(update, s->size, s); + update->EndPaint(update); + } + + xfree(s->data); + return True; + } } return status; diff --git a/libfreerdp-utils/args.c b/libfreerdp-utils/args.c index 2d177d306..b6ce38145 100644 --- a/libfreerdp-utils/args.c +++ b/libfreerdp-utils/args.c @@ -293,6 +293,17 @@ int freerdp_parse_args(rdpSettings* settings, int argc, char** argv, settings->dump_rfx_file = xstrdup(argv[index]); settings->dump_rfx = True; } + else if (strcmp("--play-rfx", argv[index]) == 0) + { + index++; + if (index == argc) + { + printf("missing file name\n"); + return -1; + } + settings->play_rfx_file = xstrdup(argv[index]); + settings->play_rfx = True; + } else if (strcmp("-m", argv[index]) == 0) { settings->mouse_motion = 0; diff --git a/server/test/rfx_test.pcap b/server/test/rfx_test.pcap index 3a857a36a..c830e10b5 100644 Binary files a/server/test/rfx_test.pcap and b/server/test/rfx_test.pcap differ