5 def get_values(entry_dict, entry_type):
8 for key in list(entry_dict.keys()):
10 values += entry_dict[key]
11 entry_dict.pop(key, None)
12 elif entry_type in dict(entry_dict):
13 values = entry_dict[entry_type]
14 entry_dict.pop(entry_type, None)
19 def write_entry(f, entry_dict, entry_type, entry_name):
20 values = get_values(entry_dict, entry_type)
24 f.write('#define have_' + entry_name.lower() + '_list_indices\n')
25 f.write('static const size_t ' + entry_name.lower() + '_list_indices[] =\n')
29 f.write('\tFreeRDP_' + val + ',\n')
33 def write_str_case(f, entry_type, val):
34 f.write('\t\t{FreeRDP_' + val + ', ' + str(entry_type) + ', "FreeRDP_' + val + '"},\n')
36 def write_str(f, entry_dict):
37 f.write('struct settings_str_entry {\n')
38 f.write('\tsize_t id;\n')
39 f.write('\tsize_t type;\n')
40 f.write('\tconst char* str;\n')
42 f.write('static const struct settings_str_entry settings_map[] =\n')
45 entry_types = ['BOOL', 'UINT16', 'INT16', 'UINT32', 'INT32', 'UINT64', 'INT64', 'char*', '*']
46 for entry_type in entry_types:
47 values = get_values(entry_dict, entry_type)
50 write_str_case(f, entry_types.index(entry_type), val)
53 f.write('BOOL freerdp_settings_clone_keys(rdpSettings* dst, const rdpSettings* src)\n')
55 f.write('\tsize_t x;\n')
56 f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n')
58 f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n')
59 f.write('\t\tswitch(cur->type)\n')
61 f.write('\t\t\tcase 0: /* bool */\n')
63 f.write('\t\t\t\tBOOL sval = freerdp_settings_get_bool(src, cur->id);\n')
64 f.write('\t\t\t\tif (!freerdp_settings_set_bool(dst, cur->id, sval))\n')
65 f.write('\t\t\t\t\treturn FALSE;\n')
67 f.write('\t\t\tbreak;\n')
68 f.write('\t\t\tcase 1: /* UINT16 */\n')
70 f.write('\t\t\t\tUINT16 sval = freerdp_settings_get_uint16(src, cur->id);\n')
71 f.write('\t\t\t\tif (!freerdp_settings_set_uint16(dst, cur->id, sval))\n')
72 f.write('\t\t\t\t\treturn FALSE;\n')
74 f.write('\t\t\tbreak;\n')
75 f.write('\t\t\tcase 2: /* INT16 */\n')
77 f.write('\t\t\t\tINT16 sval = freerdp_settings_get_int16(src, cur->id);\n')
78 f.write('\t\t\t\tif (!freerdp_settings_set_int16(dst, cur->id, sval))\n')
79 f.write('\t\t\t\t\treturn FALSE;\n')
81 f.write('\t\t\tbreak;\n')
82 f.write('\t\t\tcase 3: /* UINT32 */\n')
84 f.write('\t\t\t\tUINT32 sval = freerdp_settings_get_uint32(src, cur->id);\n')
85 f.write('\t\t\t\tif (!freerdp_settings_set_uint32(dst, cur->id, sval))\n')
86 f.write('\t\t\t\t\treturn FALSE;\n')
88 f.write('\t\t\tbreak;\n')
89 f.write('\t\t\tcase 4: /* INT32 */\n')
91 f.write('\t\t\t\tINT32 sval = freerdp_settings_get_int32(src, cur->id);\n')
92 f.write('\t\t\t\tif (!freerdp_settings_set_int32(dst, cur->id, sval))\n')
93 f.write('\t\t\t\t\treturn FALSE;\n')
95 f.write('\t\t\tbreak;\n')
96 f.write('\t\t\tcase 5: /* UINT64 */\n')
98 f.write('\t\t\t\tUINT64 sval = freerdp_settings_get_uint64(src, cur->id);\n')
99 f.write('\t\t\t\tif (!freerdp_settings_set_uint64(dst, cur->id, sval))\n')
100 f.write('\t\t\t\t\treturn FALSE;\n')
102 f.write('\t\t\tbreak;\n')
103 f.write('\t\t\tcase 6: /* INT64 */\n')
105 f.write('\t\t\t\tINT64 sval = freerdp_settings_get_int64(src, cur->id);\n')
106 f.write('\t\t\t\tif (!freerdp_settings_set_int64(dst, cur->id, sval))\n')
107 f.write('\t\t\t\t\treturn FALSE;\n')
109 f.write('\t\t\tbreak;\n')
110 f.write('\t\t\tcase 7: /* strings */\n')
112 f.write('\t\t\t\tconst char* sval = freerdp_settings_get_string(src, cur->id);\n')
113 f.write('\t\t\t\tif (!freerdp_settings_set_string_(dst, cur->id, sval, FALSE))\n')
114 f.write('\t\t\t\t\treturn FALSE;\n')
116 f.write('\t\t\tbreak;\n')
117 f.write('\t\t\tcase 8: /* pointer */\n')
119 f.write('\t\t\t\tconst void* sval = freerdp_settings_get_pointer(src, cur->id);\n')
120 f.write('\t\t\t\tif (!freerdp_settings_set_pointer(dst, cur->id, sval))\n')
121 f.write('\t\t\t\t\treturn FALSE;\n')
123 f.write('\t\t\tbreak;\n')
127 f.write('\treturn TRUE;\n')
130 f.write('void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup)\n')
132 f.write('\tsize_t x;\n')
133 f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n')
135 f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n')
136 f.write('\t\tswitch(cur->type)\n')
138 f.write('\t\t\tcase 7: /* strings */\n')
139 f.write('\t\t\t\tfreerdp_settings_set_string_(dst, cur->id, NULL, cleanup);\n')
140 f.write('\t\t\tbreak;\n')
141 f.write('\t\t\tcase 8: /* pointer */\n')
142 f.write('\t\t\t\tfreerdp_settings_set_pointer(dst, cur->id, NULL);\n')
143 f.write('\t\t\tbreak;\n')
149 f.write('SSIZE_T freerdp_settings_get_key_for_name(const char* value)\n')
151 f.write('\tsize_t x;\n')
152 f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n')
154 f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n')
155 f.write('\t\tif (strcmp(value, cur->str) == 0)\n')
156 f.write('\t\t\treturn cur->id;\n')
158 f.write('\treturn -1;\n')
161 f.write('SSIZE_T freerdp_settings_get_type_for_name(const char* value)\n')
163 f.write('\tsize_t x;\n')
164 f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n')
166 f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n')
167 f.write('\t\tif (strcmp(value, cur->str) == 0)\n')
168 f.write('\t\t\treturn cur->type;\n')
170 f.write('\treturn -1;\n')
173 f.write('SSIZE_T freerdp_settings_get_type_for_key(size_t key)\n')
175 f.write('\tsize_t x;\n')
176 f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n')
178 f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n')
179 f.write('\t\tif (cur->id == key)\n')
180 f.write('\t\t\treturn cur->type;\n')
182 f.write('\treturn -1;\n')
185 f.write('const char* freerdp_settings_get_name_for_key(size_t key)\n')
187 f.write('\tsize_t x;\n')
188 f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n')
190 f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n')
191 f.write('\t\tif (cur->id == key)\n')
192 f.write('\t\t\treturn cur->str;\n')
194 f.write('\treturn NULL;\n')
198 def write_getter_case(f, val):
199 f.write('\t\tcase FreeRDP_' + val + ':\n')
200 f.write('\t\t\treturn settings->' + val + ';\n\n')
202 def write_getter(f, entry_dict, entry_type, entry_name):
203 isString = 'string' in entry_name
204 isPointer = 'pointer' in entry_name
205 values = get_values(entry_dict, entry_type)
208 f.write('const void*')
210 f.write('const ' + entry_type)
213 f.write(' freerdp_settings_get_' + entry_name.lower() + '(const rdpSettings* settings, size_t id)\n')
215 f.write('\tif (!settings)\n')
216 f.write('\t\treturn FALSE;\n\n')
217 f.write('\tswitch (id)\n')
221 write_getter_case(f, val)
222 f.write('\t\tdefault:\n')
223 f.write('\t\t\tWLog_ERR(TAG, "[%s] Invalid key index %"PRIuz, __FUNCTION__, id);\n')
224 f.write('\t\t\treturn FALSE;\n')
228 def write_setter_case(f, val, isString, isPointer):
229 f.write('\t\tcase FreeRDP_' + val + ':\n')
231 f.write('\t\t\tsettings->' + val + ' = (void*)val;\n')
232 f.write('\t\t\tbreak;\n\n')
234 f.write('\t\t\tsettings->' + val + ' = val;\n')
235 f.write('\t\t\tbreak;\n\n')
237 f.write('\t\t\tif (cleanup)\n')
238 f.write('\t\t\t\tfree(settings->' + val + ');\n')
239 f.write('\t\t\tsettings->' + val + ' = (val ? _strdup(val) : NULL);\n')
240 f.write('\t\t\treturn (!val || settings->' + val + ' != NULL);\n\n')
242 def write_setter(f, entry_dict, entry_type, entry_name):
243 isString = 'string' in entry_name
244 isPointer = 'pointer' in entry_name
245 values = get_values(entry_dict, entry_type)
247 f.write('BOOL freerdp_settings_set_' + entry_name.lower())
250 f.write('(rdpSettings* settings, size_t id, ')
251 if isString or isPointer:
254 f.write(entry_type + ' val')
258 f.write(', BOOL cleanup)\n')
262 f.write('\tif (!settings)\n')
263 f.write('\t\treturn FALSE;\n\n')
264 f.write('\tswitch (id)\n')
268 write_setter_case(f, val, isString, isPointer)
269 f.write('\t\tdefault:\n')
270 f.write('\t\t\tWLog_ERR(TAG, "[%s] Invalid key index %"PRIuz, __FUNCTION__, id);\n')
271 f.write('\t\t\treturn FALSE;\n')
273 f.write('\treturn TRUE;\n')
277 f.write('BOOL freerdp_settings_set_' + entry_name.lower() + '(rdpSettings* settings, size_t id, ')
278 if isString or isPointer:
281 f.write(entry_type + ' val')
286 f.write('\treturn freerdp_settings_set_' + entry_name.lower() + '_(settings, id, val, TRUE);\n')
290 name = os.path.dirname(os.path.realpath(__file__))
291 begin = "WARNING: this data structure is carefully padded for ABI stability!"
292 end = "WARNING: End of ABI stable zone!"
294 print('begin parsing settings header')
298 with open(name + "/../include/freerdp/settings.h", "r") as f:
299 lines = f.readlines()
313 if sline.startswith('/'):
315 if sline.startswith('*'):
317 if 'padding' in sline:
320 if sline.startswith('ALIGN64'):
321 sline = sline[7:].strip()
323 sline = sline[:sline.find(';')]
325 if pair[0] in type_list:
326 type_list[pair[0]].append(pair[1])
328 type_list[pair[0]] = [pair[1]]
330 with open(name + '/../libfreerdp/common/settings_getters.c', 'w+') as f:
331 f.write('/* Generated by ' + '' + ' */\n\n')
332 f.write('#include <freerdp/settings.h>\n')
333 f.write('#include <freerdp/log.h>\n\n')
334 f.write('#define TAG FREERDP_TAG("common.settings")\n\n')
336 getter_list = dict(type_list)
337 setter_list = dict(type_list)
338 write_getter(f, getter_list, 'BOOL', 'bool')
339 write_setter(f, setter_list, 'BOOL', 'bool')
340 write_getter(f, getter_list, 'UINT16', 'uint16')
341 write_setter(f, setter_list, 'UINT16', 'uint16')
342 write_getter(f, getter_list, 'INT16', 'int16')
343 write_setter(f, setter_list, 'INT16', 'int16')
344 write_getter(f, getter_list, 'UINT32', 'uint32')
345 write_setter(f, setter_list, 'UINT32', 'uint32')
346 write_getter(f, getter_list, 'INT32', 'int32')
347 write_setter(f, setter_list, 'INT32', 'int32')
348 write_getter(f, getter_list, 'UINT64', 'uint64')
349 write_setter(f, setter_list, 'UINT64', 'uint64')
350 write_getter(f, getter_list, 'INT64', 'int64')
351 write_setter(f, setter_list, 'INT64', 'int64')
352 write_getter(f, getter_list, 'char*', 'string')
353 write_setter(f, setter_list, 'char*', 'string')
354 write_getter(f, getter_list, '*', 'pointer')
355 write_setter(f, setter_list, '*', 'pointer')
359 with open(name + '/../libfreerdp/common/settings_str.c', 'w+') as f:
360 f.write('/* Generated by ' + '' + ' */\n\n')
361 f.write('#include <freerdp/settings.h>\n')
362 f.write('#include <freerdp/log.h>\n\n')
363 f.write('#include "../core/settings.h"\n\n')
364 f.write('#define TAG FREERDP_TAG("common.settings")\n\n')
366 getter_list = dict(type_list)
367 write_str(f, getter_list)
371 with open(name + '/../libfreerdp/core/test/settings_property_lists.h', 'w+') as f:
372 f.write('#ifndef TEST_SETTINGS_PROPERTY_LISTS\n')
373 f.write('#define TEST_SETTINGS_PROPERTY_LISTS\n\n')
375 write_entry(f, type_list, 'BOOL', 'bool')
376 write_entry(f, type_list, 'UINT16', 'uint16')
377 write_entry(f, type_list, 'INT16', 'int16')
378 write_entry(f, type_list, 'UINT32', 'uint32')
379 write_entry(f, type_list, 'INT32', 'int32')
380 write_entry(f, type_list, 'UINT64', 'uint64')
381 write_entry(f, type_list, 'INT64', 'int64')
382 write_entry(f, type_list, 'char*', 'string')
383 write_entry(f, type_list, '*', 'pointer')
385 f.write('#endif /* TEST_SETTINGS_PROPERTY_LISTS */\n\n')
387 print('remaining:\n' + str(type_list))
389 print('failed to parse settings header ' + str(e))
391 print('ended parsing settings header')