FreeRDP
Loading...
Searching...
No Matches
TestClientRdpFile.c
1#include <freerdp/config.h>
2
3#include <stdio.h>
4#include <errno.h>
5
6#include <winpr/crt.h>
7#include <winpr/windows.h>
8#include <winpr/path.h>
9#include <winpr/crypto.h>
10
11#include <freerdp/client/file.h>
12#include <freerdp/channels/rdpecam.h>
13
14static const BYTE testRdpFileUTF16[] = {
15 0xff, 0xfe, 0x73, 0x00, 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00,
16 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x64, 0x00, 0x3a, 0x00,
17 0x69, 0x00, 0x3a, 0x00, 0x32, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00,
18 0x20, 0x00, 0x6d, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x6f, 0x00,
19 0x6e, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x64, 0x00,
20 0x65, 0x00, 0x73, 0x00, 0x6b, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x77, 0x00, 0x69, 0x00,
21 0x64, 0x00, 0x74, 0x00, 0x68, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x39, 0x00,
22 0x32, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6b, 0x00,
23 0x74, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x68, 0x00, 0x65, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00,
24 0x74, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x30, 0x00, 0x38, 0x00, 0x30, 0x00,
25 0x0d, 0x00, 0x0a, 0x00, 0x73, 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00,
26 0x6e, 0x00, 0x20, 0x00, 0x62, 0x00, 0x70, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00,
27 0x33, 0x00, 0x32, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x77, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x70, 0x00,
28 0x6f, 0x00, 0x73, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x3a, 0x00, 0x73, 0x00, 0x3a, 0x00,
29 0x30, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x35, 0x00, 0x33, 0x00, 0x2c, 0x00,
30 0x32, 0x00, 0x31, 0x00, 0x31, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x33, 0x00, 0x35, 0x00, 0x33, 0x00,
31 0x2c, 0x00, 0x38, 0x00, 0x31, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x63, 0x00, 0x6f, 0x00,
32 0x6d, 0x00, 0x70, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00,
33 0x6e, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x6b, 0x00,
34 0x65, 0x00, 0x79, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x61, 0x00, 0x72, 0x00, 0x64, 0x00, 0x68, 0x00,
35 0x6f, 0x00, 0x6f, 0x00, 0x6b, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x32, 0x00, 0x0d, 0x00,
36 0x0a, 0x00, 0x61, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x61, 0x00,
37 0x70, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00,
38 0x65, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x76, 0x00,
39 0x69, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x79, 0x00,
40 0x62, 0x00, 0x61, 0x00, 0x63, 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x65, 0x00,
41 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x63, 0x00, 0x6f, 0x00,
42 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00,
43 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00,
44 0x37, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x74, 0x00, 0x77, 0x00, 0x6f, 0x00,
45 0x72, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x75, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x65, 0x00,
46 0x74, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00,
47 0x0d, 0x00, 0x0a, 0x00, 0x62, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x77, 0x00, 0x69, 0x00,
48 0x64, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x75, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x64, 0x00,
49 0x65, 0x00, 0x74, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00,
50 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6c, 0x00,
51 0x61, 0x00, 0x79, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x63, 0x00,
52 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x62, 0x00, 0x61, 0x00, 0x72, 0x00, 0x3a, 0x00,
53 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x61, 0x00,
54 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x73, 0x00,
55 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6f, 0x00,
56 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00,
57 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x61, 0x00, 0x62, 0x00,
58 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x70, 0x00,
59 0x61, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00,
60 0x0d, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x20, 0x00,
61 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6d, 0x00, 0x6f, 0x00,
62 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x3a, 0x00, 0x69, 0x00,
63 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00,
64 0x77, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x6b, 0x00, 0x74, 0x00, 0x6f, 0x00,
65 0x70, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x73, 0x00,
66 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00,
67 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x61, 0x00, 0x62, 0x00,
68 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00,
69 0x77, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x20, 0x00, 0x64, 0x00,
70 0x72, 0x00, 0x61, 0x00, 0x67, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00,
71 0x0a, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00,
72 0x20, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x75, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00,
73 0x69, 0x00, 0x6d, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00,
74 0x0a, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00,
75 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x3a, 0x00,
76 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00,
77 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00,
78 0x73, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, 0x00, 0x74, 0x00,
79 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00,
80 0x0a, 0x00, 0x62, 0x00, 0x69, 0x00, 0x74, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x70, 0x00, 0x63, 0x00,
81 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00,
82 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00,
83 0x65, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x66, 0x00,
84 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x72, 0x00,
85 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x4c, 0x00, 0x41, 0x00,
86 0x42, 0x00, 0x31, 0x00, 0x2d, 0x00, 0x57, 0x00, 0x37, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x4d, 0x00,
87 0x2d, 0x00, 0x30, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x62, 0x00, 0x31, 0x00,
88 0x2e, 0x00, 0x61, 0x00, 0x77, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x6c, 0x00,
89 0x6f, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x75, 0x00,
90 0x64, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x3a, 0x00,
91 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00,
92 0x69, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x70, 0x00, 0x72, 0x00, 0x69, 0x00,
93 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00,
94 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x72, 0x00,
95 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x6f, 0x00,
96 0x72, 0x00, 0x74, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00,
97 0x0a, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00,
98 0x74, 0x00, 0x73, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x63, 0x00, 0x61, 0x00,
99 0x72, 0x00, 0x64, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00,
100 0x0a, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00,
101 0x74, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x70, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x61, 0x00,
102 0x72, 0x00, 0x64, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00,
103 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00,
104 0x70, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x64, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00,
105 0x65, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00,
106 0x61, 0x00, 0x75, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6f, 0x00,
107 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00,
108 0x20, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x64, 0x00,
109 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x75, 0x00,
110 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00,
111 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x76, 0x00,
112 0x65, 0x00, 0x6c, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x32, 0x00, 0x0d, 0x00, 0x0a, 0x00,
113 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x74, 0x00, 0x20, 0x00, 0x66, 0x00,
114 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x65, 0x00,
115 0x6e, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x69, 0x00,
116 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x67, 0x00, 0x6f, 0x00,
117 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00,
118 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x20, 0x00, 0x6c, 0x00,
119 0x61, 0x00, 0x79, 0x00, 0x65, 0x00, 0x72, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00,
120 0x0d, 0x00, 0x0a, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x65, 0x00,
121 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x74, 0x00,
122 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x3a, 0x00,
123 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x74, 0x00,
124 0x65, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00,
125 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x3a, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x0d, 0x00,
126 0x0a, 0x00, 0x73, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x77, 0x00,
127 0x6f, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x64, 0x00,
128 0x69, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x79, 0x00,
129 0x3a, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x67, 0x00, 0x61, 0x00, 0x74, 0x00,
130 0x65, 0x00, 0x77, 0x00, 0x61, 0x00, 0x79, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x74, 0x00,
131 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x3a, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x4c, 0x00,
132 0x41, 0x00, 0x42, 0x00, 0x31, 0x00, 0x2d, 0x00, 0x57, 0x00, 0x32, 0x00, 0x4b, 0x00, 0x38, 0x00,
133 0x52, 0x00, 0x32, 0x00, 0x2d, 0x00, 0x47, 0x00, 0x57, 0x00, 0x2e, 0x00, 0x6c, 0x00, 0x61, 0x00,
134 0x62, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x77, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x65, 0x00,
135 0x2e, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x0d, 0x00, 0x0a, 0x00,
136 0x67, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x77, 0x00, 0x61, 0x00, 0x79, 0x00, 0x75, 0x00,
137 0x73, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x74, 0x00, 0x68, 0x00,
138 0x6f, 0x00, 0x64, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00,
139 0x67, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x77, 0x00, 0x61, 0x00, 0x79, 0x00, 0x63, 0x00,
140 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00,
141 0x6c, 0x00, 0x73, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00,
142 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x67, 0x00, 0x61, 0x00,
143 0x74, 0x00, 0x65, 0x00, 0x77, 0x00, 0x61, 0x00, 0x79, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00,
144 0x66, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x75, 0x00, 0x73, 0x00, 0x61, 0x00, 0x67, 0x00,
145 0x65, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x3a, 0x00,
146 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00,
147 0x6d, 0x00, 0x70, 0x00, 0x74, 0x00, 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x65, 0x00,
148 0x6e, 0x00, 0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x63, 0x00,
149 0x65, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x75, 0x00,
150 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x72, 0x00,
151 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x73, 0x00,
152 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00,
153 0x6d, 0x00, 0x65, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00, 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00,
154 0x72, 0x00, 0x64, 0x00, 0x67, 0x00, 0x69, 0x00, 0x73, 0x00, 0x6b, 0x00, 0x64, 0x00, 0x63, 0x00,
155 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x78, 0x00, 0x79, 0x00, 0x3a, 0x00, 0x69, 0x00, 0x3a, 0x00,
156 0x30, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x6b, 0x00, 0x64, 0x00, 0x63, 0x00, 0x70, 0x00, 0x72, 0x00,
157 0x6f, 0x00, 0x78, 0x00, 0x79, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x3a, 0x00,
158 0x73, 0x00, 0x3a, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x72, 0x00, 0x69, 0x00, 0x76, 0x00,
159 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00,
160 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x2a, 0x00,
161 0x0d, 0x00, 0x0a, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x61, 0x00,
162 0x6d, 0x00, 0x65, 0x00, 0x3a, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x42, 0x00,
163 0x31, 0x00, 0x5c, 0x00, 0x4a, 0x00, 0x6f, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x44, 0x00, 0x6f, 0x00,
164 0x65, 0x00, 0x0d, 0x00, 0x0a, 0x00
165};
166
167#if defined(CHANNEL_RDPECAM_CLIENT)
168static const char* camera_args[] = { RDPECAM_DVC_CHANNEL_NAME,
169 "device:*",
170 "device:\\?\\usb#vid_0bda&pid_58b0&mi",
171 "device:-\\?\\usb#vid_0bdc&pid_58b1&mi",
172 "encode:1",
173 "quality:2" };
174#endif
175
176#if defined(CHANNEL_URBDRC_CLIENT)
177static const char* urbdrc_args[] = { "urbdrc", "device:*", "device:USBInstanceID:someid",
178 "device:{72631e54-78a4-11d0-bcf7-00aa00b7b32a}" };
179#endif
180
181static char testRdpFileUTF8[] =
182 "screen mode id:i:2\n"
183 "use multimon:i:0\n"
184 "desktopwidth:i:1920\n"
185 "desktopheight:i:1080\n"
186 "dynamic resolution:i:1080\n"
187 "desktopscalefactor:i:1080\n"
188 "redirected video capture encoding quality:i:2\n"
189 "encode redirected video capture:i:1\n"
190 "camerastoredirect:s:*,\\?\\usb#vid_0bda&pid_58b0&mi,-\\?\\usb#vid_0bdc&pid_58b1&mi\n"
191 "usbdevicestoredirect:s:*,USBInstanceID:someid,{72631e54-78a4-11d0-bcf7-00aa00b7b32a}\n"
192 "selectedmonitors:s:3,2,42,23"
193 "session bpp:i:32\n"
194 "winposstr:s:0,1,553,211,1353,811\n"
195 "compression:i:1\n"
196 "keyboardhook:i:2\n"
197 "audiocapturemode:i:0\n"
198 "videoplaybackmode:i:2\n"
199 "connection type:i:7\n"
200 "networkautodetect:i:1\n"
201 "bandwidthautodetect:i:1\n"
202 "displayconnectionbar:i:1\n"
203 "enableworkspacereconnect:i:0\n"
204 "disable wallpaper:i:0\n"
205 "allow font smoothing:i:0\n"
206 "allow desktop composition:i:0\n"
207 "disable full window drag:i:1\n"
208 "disable menu anims:i:1\n"
209 "disable themes:i:0\n"
210 "disable cursor setting:i:0\n"
211 "bitmapcachepersistenable:i:1\n"
212 "full address:s:LAB1-W7-DM-01.lab1.awake.local\n"
213 "alternate full address:s:LAB1-W7-DM-01.lab1.awake.global\n"
214 "audiomode:i:0\n"
215 "redirectprinters:i:1\n"
216 "redirectcomports:i:0\n"
217 "redirectsmartcards:i:1\n"
218 "redirectclipboard:i:1\n"
219 "redirectposdevices:i:0\n"
220 "autoreconnection enabled:i:1\n"
221 "authentication level:i:2\n"
222 "prompt for credentials:i:0\n"
223 "negotiate security layer:i:1\n"
224 "remoteapplicationmode:i:0\n"
225 "alternate shell:s:\n"
226 "shell working directory:s:\n"
227 "gatewayhostname:s:LAB1-W2K8R2-GW.lab1.awake.local\n"
228 "gatewayusagemethod:i:1\n"
229 "gatewaycredentialssource:i:0\n"
230 "gatewayprofileusagemethod:i:1\n"
231 "promptcredentialonce:i:1\n"
232 "use redirection server name:i:0\n"
233 "rdgiskdcproxy:i:0\n"
234 "kdcproxyname:s:\n"
235 "drivestoredirect:s:*\n"
236 "username:s:LAB1\\JohnDoe\n"
237 "vendor integer:i:123\n"
238 "vendor string:s:microsoft\n";
239
240static char* append(const char* fmt, ...)
241{
242 int rc = 0;
243 char* dst = nullptr;
244 va_list ap = WINPR_C_ARRAY_INIT;
245
246 va_start(ap, fmt);
247 rc = vsnprintf(nullptr, 0, fmt, ap);
248 va_end(ap);
249 if (rc < 0)
250 return nullptr;
251 dst = malloc((size_t)rc + 1);
252 if (!dst)
253 return nullptr;
254
255 va_start(ap, fmt);
256 rc = vsnprintf(dst, (size_t)rc + 1, fmt, ap);
257 va_end(ap);
258 if (rc < 0)
259 {
260 free(dst);
261 return nullptr;
262 }
263 return dst;
264}
265
266static FILE* test_fopen(const char* name, const char* mode)
267{
268#ifndef TEST_SOURCE_DIR
269#error "TEST_SOURCE_DIR must be defined to the test source directory"
270#endif
271
272 char* path = GetCombinedPath(TEST_SOURCE_DIR, name);
273 FILE* fp = winpr_fopen(path, mode);
274 free(path);
275 return fp;
276}
277
278static void* read_rdp_data(const char* name, size_t* plen)
279{
280 BOOL success = FALSE;
281 char* json = nullptr;
282 FILE* fp = test_fopen(name, "r");
283 if (!fp)
284 goto fail;
285
286 if (fseek(fp, 0, SEEK_END) != 0)
287 goto fail;
288
289 const INT64 pos = _ftelli64(fp);
290 if (pos < 0)
291 goto fail;
292
293 if (fseek(fp, 0, SEEK_SET) != 0)
294 goto fail;
295
296 const size_t upos = WINPR_CXX_COMPAT_CAST(size_t, pos);
297 json = calloc(1ULL + upos, sizeof(char));
298 if (!json)
299 goto fail;
300 if (fread(json, 1, pos, fp) != pos)
301 goto fail;
302
303 *plen = upos;
304 success = TRUE;
305fail:
306 if (!success)
307 {
308 char buffer[128] = WINPR_C_ARRAY_INIT;
309 WLog_ERR(__func__, "failed to read data from '%s': %s", name,
310 winpr_strerror(errno, buffer, sizeof(buffer)));
311 free(json);
312 json = nullptr;
313 }
314
315 if (fp)
316 (void)fclose(fp);
317 return json;
318}
319
320static bool save_settings(const rdpSettings* settings, const char* name)
321{
322 bool rc = false;
323 size_t datalen = 0;
324 char* data = freerdp_settings_serialize(settings, TRUE, &datalen);
325 if (!data)
326 return false;
327
328 FILE* fp = test_fopen(name, "w");
329 if (fp)
330 {
331 const size_t res = fwrite(data, 1, datalen, fp);
332 (void)fclose(fp);
333 rc = res == datalen;
334 }
335
336 free(data);
337 return rc;
338}
339
340static char* get_json_name(const char* base, bool unchecked)
341{
342 size_t namelen = 0;
343 char* name = nullptr;
344 winpr_asprintf(&name, &namelen, "%s%s.json", base, unchecked ? ".unchecked" : "");
345 return name;
346}
347
348static rdpSettings* read_json(const char* name)
349{
350 size_t datalen = 0;
351 void* data = read_rdp_data(name, &datalen);
352 rdpSettings* settings = freerdp_settings_deserialize(data, datalen);
353fail:
354 free(data);
355 return settings;
356}
357
358static rdpSettings* load_from(const void* data, size_t len, bool unchecked)
359{
360 BOOL rc = false;
361 rdpFile* file = freerdp_client_rdp_file_new();
362 rdpSettings* settings = read_json("default-settings.json");
363 if (!settings)
364 {
365 settings = freerdp_settings_new(0);
366 if (settings)
367 {
368 save_settings(settings, "default-settings.json");
369 }
370 }
371 if (!file || !settings)
372 goto fail;
373
374 if (!freerdp_client_parse_rdp_file_buffer(file, data, len))
375 goto fail;
376
377 if (unchecked)
378 {
379 if (!freerdp_client_populate_settings_from_rdp_file_unchecked(file, settings))
380 goto fail;
381 }
382 else
383 {
384 if (!freerdp_client_populate_settings_from_rdp_file(file, settings))
385 goto fail;
386 }
387
388 rc = true;
389fail:
390 freerdp_client_rdp_file_free(file);
391 if (!rc)
392 {
393 freerdp_settings_free(settings);
394 return nullptr;
395 }
396 return settings;
397}
398
399static rdpSettings* load_from_file(const char* name, bool unchecked)
400{
401 size_t datalen = 0;
402 void* data = read_rdp_data(name, &datalen);
403 if (!data)
404 return nullptr;
405 rdpSettings* settings = load_from(data, datalen, unchecked);
406 free(data);
407 return settings;
408}
409
410static bool test_data(const char* json, const void* data, size_t len, bool unchecked)
411{
412 bool rc = false;
413
414 wLog* log = WLog_Get(__func__);
415 rdpSettings* settings = load_from(data, len, unchecked);
416 rdpSettings* expect = read_json(json);
417 if (!settings || !expect)
418 {
419 WLog_Print(log, WLOG_ERROR, "Test case '%s': settings=%p, expect=%p", json, settings,
420 expect);
421 goto fail;
422 }
423
424#ifndef WITH_GFX_H264
425 if (!freerdp_settings_set_bool(expect, FreeRDP_GfxH264, FALSE) ||
426 !freerdp_settings_set_bool(expect, FreeRDP_GfxAVC444, FALSE) ||
427 !freerdp_settings_set_bool(expect, FreeRDP_GfxAVC444v2, FALSE))
428 goto fail;
429#endif
430 WLog_Print(log, WLOG_INFO, "Test case '%s'", json);
431 if (freerdp_settings_print_diff(log, WLOG_ERROR, expect, settings))
432 goto fail;
433 rc = true;
434fail:
435 freerdp_settings_free(settings);
436 freerdp_settings_free(expect);
437 return rc;
438}
439
440static HANDLE FindFirstFileUTF8(LPCSTR pszSearchPath, WIN32_FIND_DATAW* FindData)
441{
442 HANDLE hdl = INVALID_HANDLE_VALUE;
443 if (!pszSearchPath)
444 return hdl;
445 WCHAR* wpath = ConvertUtf8ToWCharAlloc(pszSearchPath, nullptr);
446 if (!wpath)
447 return hdl;
448
449 hdl = FindFirstFileW(wpath, FindData);
450 free(wpath);
451
452 return hdl;
453}
454
455static bool test_rdp_file(const char* base, bool allowCreate, bool unchecked)
456{
457 bool rc = false;
458
459 size_t rdplen = 0;
460 char* rdp = nullptr;
461 winpr_asprintf(&rdp, &rdplen, "%s.rdp", base);
462 char* json = get_json_name(base, unchecked);
463 size_t datalen = 0;
464 void* data = read_rdp_data(rdp, &datalen);
465
466 if (!data)
467 goto fail;
468
469 rc = test_data(json, data, datalen, unchecked);
470 if (!rc && allowCreate)
471 {
472 rdpSettings* expect = read_json(json);
473 if (expect)
474 {
475 freerdp_settings_free(expect);
476 goto fail;
477 }
478
479 rdpSettings* settings = load_from_file(rdp, unchecked);
480 if (!settings)
481 goto fail;
482
483 rc = save_settings(settings, json);
484 }
485fail:
486 free(data);
487 free(json);
488 free(rdp);
489 return rc;
490}
491
492static bool test_rdp_files(bool allowCreate)
493{
494 bool rc = false;
495 /* Load RDP files from directory, compare to JSON in same directory.
496 * If JSON does not exist, create it.
497 */
498#ifndef TEST_SOURCE_DIR
499#error "TEST_SOURCE_DIR must be defined to the test source directory"
500#endif
501
502 HANDLE hdl = INVALID_HANDLE_VALUE;
503 char* path = GetCombinedPath(TEST_SOURCE_DIR, "rdp-testcases/*.rdp");
504 if (!path)
505 goto fail;
506
507 WIN32_FIND_DATAW FindData = WINPR_C_ARRAY_INIT;
508 hdl = FindFirstFileUTF8(path, &FindData);
509
510 if (hdl == INVALID_HANDLE_VALUE)
511 {
512 WLog_INFO(
513 __func__,
514 "no RDP files found in %s. Add RDP files to generate settings JSON for comparison.",
515 path);
516 rc = true;
517 goto fail;
518 }
519
520 do
521 {
522 if ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
523 {
524 char cFileName[6 * MAX_PATH] = WINPR_C_ARRAY_INIT;
525 char rdp[6 * MAX_PATH] = WINPR_C_ARRAY_INIT;
526 ConvertWCharToUtf8(FindData.cFileName, cFileName, sizeof(cFileName));
527 const size_t len = strnlen(cFileName, sizeof(cFileName));
528 if (len < 4)
529 continue;
530 strcpy(rdp, "rdp-testcases/");
531 strncpy(&rdp[14], cFileName, len - 4);
532
533 if (!test_rdp_file(rdp, allowCreate, false))
534 goto fail;
535 if (!test_rdp_file(rdp, allowCreate, true))
536 goto fail;
537 }
538 } while (FindNextFileW(hdl, &FindData));
539
540 rc = true;
541
542fail:
543 FindClose(hdl);
544 free(path);
545 return rc;
546}
547
548WINPR_ATTR_NODISCARD
549static BOOL test_ascii(rdpSettings* settings)
550{
551 WINPR_ASSERT(settings);
552
553 BOOL rc = FALSE;
554 /* Ascii */
555 rdpFile* file = freerdp_client_rdp_file_new();
556 if (!file)
557 {
558 printf("rdp_file_new failed\n");
559 goto fail;
560 }
561
562 if (!freerdp_client_parse_rdp_file_buffer(file, (BYTE*)testRdpFileUTF8,
563 sizeof(testRdpFileUTF8)))
564 goto fail;
565
566 if (!freerdp_client_populate_settings_from_rdp_file(file, settings))
567 goto fail;
568
569 if (freerdp_settings_get_bool(settings, FreeRDP_UseMultimon))
570 {
571 printf("UseMultiMon mismatch: Actual: %" PRIu32 ", Expected: 0\n",
572 freerdp_settings_get_bool(settings, FreeRDP_UseMultimon));
573 goto fail;
574 }
575
576 if (!freerdp_settings_get_bool(settings, FreeRDP_Fullscreen))
577 {
578 printf("ScreenModeId mismatch: Actual: %" PRIu32 ", Expected: TRUE\n",
579 freerdp_settings_get_bool(settings, FreeRDP_Fullscreen));
580 goto fail;
581 }
582
583 if (strcmp(freerdp_settings_get_string(settings, FreeRDP_ServerHostname),
584 "LAB1-W7-DM-01.lab1.awake.global") != 0)
585 {
586 printf("ServerHostname mismatch: Actual: %s, Expected: %s\n",
587 freerdp_settings_get_string(settings, FreeRDP_ServerHostname),
588 "LAB1-W7-DM-01.lab1.awake.global");
589 goto fail;
590 }
591
592 if (strcmp(freerdp_settings_get_string(settings, FreeRDP_GatewayHostname),
593 "LAB1-W2K8R2-GW.lab1.awake.local") != 0)
594 {
595 printf("GatewayHostname mismatch: Actual: %s, Expected: %s\n",
596 freerdp_settings_get_string(settings, FreeRDP_GatewayHostname),
597 "LAB1-W2K8R2-GW.lab1.awake.local");
598 goto fail;
599 }
600
601 {
602 const int iValue = freerdp_client_rdp_file_get_integer_option(file, "dynamic resolution");
603 if (iValue != 1080)
604 {
605 printf("dynamic resolution uses invalid default value %d", iValue);
606 goto fail;
607 }
608 }
609 if (!freerdp_settings_get_bool(settings, FreeRDP_DynamicResolutionUpdate))
610 {
611 printf("FreeRDP_DynamicResolutionUpdate has invalid value");
612 goto fail;
613 }
614 {
615 const int iValue = freerdp_client_rdp_file_get_integer_option(file, "desktopscalefactor");
616 if (iValue != 1080)
617 {
618 printf("desktopscalefactor uses invalid default value %d", iValue);
619 goto fail;
620 }
621 if ((INT64)freerdp_settings_get_uint32(settings, FreeRDP_DesktopScaleFactor) != iValue)
622 {
623 printf("FreeRDP_DesktopScaleFactor has invalid value");
624 goto fail;
625 }
626 }
627
628 /* Check [MS-RDPECAM] related options */
629#if defined(CHANNEL_RDPECAM_CLIENT)
630 {
631 ADDIN_ARGV* args = nullptr;
632 {
633 const int iValue =
634 freerdp_client_rdp_file_get_integer_option(file, "encode redirected video capture");
635 if (iValue != 1)
636 {
637 printf("encode redirected video capture uses invalid default value %d", iValue);
638 goto fail;
639 }
640 }
641
642 {
643 const int iValue = freerdp_client_rdp_file_get_integer_option(
644 file, "redirected video capture encoding quality");
645 if (iValue != 2)
646 {
647 printf("redirected video capture encoding quality uses invalid default value %d",
648 iValue);
649 goto fail;
650 }
651 }
652 args = freerdp_dynamic_channel_collection_find(settings, RDPECAM_DVC_CHANNEL_NAME);
653 if (!args)
654 {
655 printf("rdpecam channel was not loaded");
656 goto fail;
657 }
658 if (args->argc != 6)
659 {
660 printf("rdpecam channel was not loaded");
661 goto fail;
662 }
663
664 for (int x = 0; x < args->argc; x++)
665 {
666 if (strcmp(args->argv[x], camera_args[x]) != 0)
667 {
668 printf("rdpecam invalid argument argv[%d]: %s", x, args->argv[x]);
669 goto fail;
670 }
671 }
672 }
673#endif
674
675 /* Check [URBDRC] related options */
676#if defined(CHANNEL_URBDRC_CLIENT)
677 {
678 ADDIN_ARGV* args = freerdp_dynamic_channel_collection_find(settings, "urbdrc");
679 if (!args)
680 {
681 printf("urbdrc channel was not loaded");
682 goto fail;
683 }
684 if (args->argc != 4)
685 {
686 printf("urbdrc channel was not loaded");
687 goto fail;
688 }
689
690 for (int x = 0; x < args->argc; x++)
691 {
692 if (strcmp(args->argv[x], urbdrc_args[x]) != 0)
693 {
694 printf("urbdrc invalid argument argv[%d]: %s", x, args->argv[x]);
695 goto fail;
696 }
697 }
698 }
699#endif
700
701 /* Validate selectedmonitors:s:3,2,42,23 */
702 const UINT32 uValue = freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds);
703 if (uValue != 4)
704 {
705 printf("FreeRDP_NumMonitorIds has invalid value %" PRIu32, uValue);
706 goto fail;
707 }
708 const UINT32* puValue =
709 (const UINT32*)freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorIds, 0);
710 if (!puValue)
711 {
712 printf("FreeRDP_MonitorIds has invalid value %p", (const void*)puValue);
713 goto fail;
714 }
715 if ((puValue[0] != 3) || (puValue[1] != 2) || (puValue[2] != 42) || (puValue[3] != 23))
716 {
717 printf("FreeRDP_MonitorIds has invalid values: [%" PRIu32 ",%" PRIu32 ",%" PRIu32
718 ",%" PRIu32 "]",
719 puValue[0], puValue[1], puValue[2], puValue[3]);
720 goto fail;
721 }
722
723 {
724 const int iValue = freerdp_client_rdp_file_get_integer_option(file, "videoplaybackmode");
725 if (iValue != 2)
726 {
727 printf("videoplaybackmode uses invalid default value %d", iValue);
728 goto fail;
729 }
730 }
731 if (!freerdp_settings_get_bool(settings, FreeRDP_SupportVideoOptimized))
732 {
733 printf("FreeRDP_SupportVideoOptimized has invalid value");
734 goto fail;
735 }
736 if (!freerdp_settings_get_bool(settings, FreeRDP_SupportGeometryTracking))
737 {
738 printf("FreeRDP_SupportGeometryTracking has invalid value");
739 goto fail;
740 }
741
742 {
743 const int iValue = freerdp_client_rdp_file_get_integer_option(file, "vendor integer");
744 if (iValue != 123)
745 goto fail;
746 }
747
748 if (freerdp_client_rdp_file_set_integer_option(file, "vendor integer", 456) == -1)
749 {
750 printf("failed to set integer: vendor integer");
751 goto fail;
752 }
753
754 {
755 const int iValue = freerdp_client_rdp_file_get_integer_option(file, "vendor integer");
756 if (iValue != 456)
757 return -1;
758 }
759
760 {
761 const char microsoft[] = "microsoft";
762 char* sValue = freerdp_client_rdp_file_get_string_option(file, "vendor string");
763 if (strncmp(sValue, microsoft, sizeof(microsoft)) != 0)
764 goto fail;
765 }
766 {
767 const char apple[] = "apple";
768 if (freerdp_client_rdp_file_set_string_option(file, "vendor string", "apple") == 0)
769 goto fail;
770 const char* sValue = freerdp_client_rdp_file_get_string_option(file, "vendor string");
771 if (strncmp(sValue, apple, sizeof(apple)) != 0)
772 goto fail;
773 }
774 if (freerdp_client_rdp_file_set_string_option(file, "fruits", "banana,oranges") == 0)
775 goto fail;
776
777 if (freerdp_client_rdp_file_set_integer_option(file, "numbers", 123456789) == -1)
778 {
779 printf("failed to set integer: numbers");
780 return -1;
781 }
782
783 rc = TRUE;
784fail:
785 freerdp_client_rdp_file_free(file);
786 return rc;
787}
788
789WINPR_ATTR_NODISCARD
790static BOOL test_foo(const rdpSettings* settings)
791{
792 WINPR_ASSERT(settings);
793
794 BOOL rc = FALSE;
795
796 UINT64 id = 0;
797 if (winpr_RAND(&id, sizeof(id)) < 0)
798 return FALSE;
799
800 rdpFile* file = nullptr;
801 char* base = nullptr;
802 char* utfname = nullptr;
803 char* uniname = nullptr;
804 char* tmp = GetKnownPath(KNOWN_PATH_TEMP);
805 if (!tmp)
806 goto fail;
807
808 base = append("%s/rdp-file-test-%" PRIx64, tmp, id);
809 if (!base)
810 goto fail;
811 if (!CreateDirectoryA(base, nullptr))
812 goto fail;
813 utfname = append("%s/utfname", base);
814 uniname = append("%s/uniname", base);
815 file = freerdp_client_rdp_file_new();
816 if (!file || !utfname || !uniname)
817 goto fail;
818
819 if (!freerdp_client_populate_rdp_file_from_settings(file, settings))
820 goto fail;
821
822 if (!freerdp_client_write_rdp_file(file, utfname, FALSE))
823 goto fail;
824
825 if (!freerdp_client_write_rdp_file(file, uniname, TRUE))
826 goto fail;
827
828 rc = TRUE;
829fail:
830 if (utfname)
831 winpr_DeleteFile(utfname);
832 if (uniname)
833 winpr_DeleteFile(uniname);
834 if (base)
835 winpr_RemoveDirectory(base);
836 free(utfname);
837 free(uniname);
838 free(base);
839 free(tmp);
840 freerdp_client_rdp_file_free(file);
841 return rc;
842}
843
844int TestClientRdpFile(int argc, char* argv[])
845{
846 WINPR_UNUSED(argc);
847 WINPR_UNUSED(argv);
848
849 /* UTF8 */
850#if defined(CHANNEL_URBDRC_CLIENT) && defined(CHANNEL_RDPECAM_CLIENT)
851 if (!test_data("testRdpFileUTF8.json", testRdpFileUTF8, sizeof(testRdpFileUTF8), false))
852 return -1;
853 if (!test_data("testRdpFileUTF8.unchecked.json", testRdpFileUTF8, sizeof(testRdpFileUTF8),
854 true))
855 return -1;
856#endif
857
858 /* Unicode */
859#if defined(CHANNEL_URBDRC_CLIENT)
860 if (!test_data("testRdpFileUTF16.json", testRdpFileUTF16, sizeof(testRdpFileUTF16), false))
861 return -1;
862 if (!test_data("testRdpFileUTF16.unchecked.json", testRdpFileUTF16, sizeof(testRdpFileUTF16),
863 true))
864 return -1;
865#endif
866
867#if defined(CHANNEL_URBDRC_CLIENT) && defined(CHANNEL_RDPECAM_CLIENT)
868 if (!test_rdp_files(argc > 1))
869 return -1;
870#endif
871
872 rdpSettings* settings = freerdp_settings_new(0);
873 if (!settings)
874 return -1;
875
876 int rc = 0;
877 if (!test_ascii(settings))
878 rc = -1;
879 else if (!test_foo(settings))
880 rc = -1;
881 freerdp_settings_free(settings);
882 return rc;
883}
FREERDP_API rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
WINPR_ATTR_NODISCARD FREERDP_API rdpSettings * freerdp_settings_deserialize(const char *jstr, size_t length)
A function that converts a JSON string to a rdpSettings struct.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API char * freerdp_settings_serialize(const rdpSettings *settings, BOOL pretty, size_t *plength)
A function that converts a rdpSettings struct to a JSON serialized string.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_print_diff(wLog *log, DWORD level, const rdpSettings *settings, const rdpSettings *other)
Dumps the difference between two settings structs to a WLog.