/* Expand a buffer into a gs_param_list (including sub-dicts) */ int /* ret -ve err, +ve # of chars read from buffer */ gs_param_list_unserialize( gs_param_list * list, /* root of list to expand to */ /* list MUST BE IN WRITE MODE */ const byte * buf /* source buffer */ ) { int code = 0; const byte *orig_buf = buf; do { gs_param_typed_value typed; gs_param_name key; unsigned key_sizeof; int value_top_sizeof; int value_base_sizeof; int temp_code; gs_param_type type; /* key length, 0 indicates end of data */ key_sizeof = buf_get_word(&buf); if (key_sizeof == 0) /* end of data */ break; /* data type */ type = (gs_param_type) buf_get_word(&buf); /* key */ key = (gs_param_name) buf; buf += key_sizeof; /* Data values */ value_top_sizeof = gs_param_type_sizes[type]; value_base_sizeof = gs_param_type_base_sizes[type]; typed.type = type; if (type != gs_param_type_dict && type != gs_param_type_dict_int_keys) { memcpy(&typed.value, buf, value_top_sizeof); buf += value_top_sizeof; } switch (type) { case gs_param_type_null: case gs_param_type_bool: case gs_param_type_int: case gs_param_type_long: case gs_param_type_float: break; case gs_param_type_string: case gs_param_type_name: case gs_param_type_int_array: case gs_param_type_float_array: ptr_align_to(&buf, value_base_sizeof); typed.value.s.data = buf; typed.value.s.persistent = false; buf += typed.value.s.size * value_base_sizeof; break; case gs_param_type_string_array: case gs_param_type_name_array: ptr_align_to(&buf, sizeof(void *)); typed.value.sa.data = (const gs_param_string *)buf; typed.value.sa.persistent = false; buf += typed.value.s.size * value_base_sizeof; { int str_count; gs_param_string *sa; for (str_count = typed.value.sa.size, sa = (gs_param_string *) typed.value.sa.data; str_count-- > 0; ++sa) { sa->data = buf; sa->persistent = false; buf += sa->size; } } break; case gs_param_type_dict: case gs_param_type_dict_int_keys: typed.value.d.size = buf_get_word(&buf); code = param_begin_write_dict (list, key, &typed.value.d, type == gs_param_type_dict_int_keys); if (code < 0) break; ptr_align_to(&buf, sizeof(void *)); code = gs_param_list_unserialize(typed.value.d.list, buf); temp_code = param_end_write_dict(list, key, &typed.value.d); if (code >= 0) { buf += code; code = temp_code; } break; default: code = gs_note_error(gs_error_unknownerror); break; } if (code < 0) break; if (typed.type != gs_param_type_dict && typed.type != gs_param_type_dict_int_keys) code = param_write_typed(list, key, &typed); } while (code >= 0); return code >= 0 ? buf - orig_buf : code; }
static int win_pr2_write_user_settings(gx_device_win_pr2 * wdev, gs_param_list * plist) { gs_param_dict dict; gs_param_int_array range; gs_param_float_array box; gs_param_string docn; gs_param_string papn; int array[2]; const char* pname = "UserSettings"; int code; dict.size = 12; code = param_begin_write_dict(plist, pname, &dict, false); if (code < 0) return code; array[0] = wdev->doc_page_begin; array[1] = wdev->doc_page_end; range.data = array; range.size = 2; range.persistent = false; code = param_write_int_array(dict.list, "DocumentRange", &range); if (code < 0) goto error; array[0] = wdev->user_page_begin; array[1] = wdev->user_page_end; range.data = array; range.size = 2; range.persistent = false; code = param_write_int_array(dict.list, "SelectedRange", &range); if (code < 0) goto error; box.data = wdev->user_media_size; box.size = 2; box.persistent = false; code = param_write_float_array(dict.list, "MediaSize", &box); if (code < 0) goto error; code = param_write_int(dict.list, "Copies", &wdev->user_copies); if (code < 0) goto error; code = param_write_int(dict.list, "Paper", &wdev->user_paper); if (code < 0) goto error; code = param_write_int(dict.list, "Orientation", &wdev->user_orient); if (code < 0) goto error; code = param_write_int(dict.list, "Color", &wdev->user_color); if (code < 0) goto error; code = param_write_int(dict.list, "MaxResolution", &wdev->max_dpi); if (code < 0) goto error; code = param_write_int(dict.list, "PrintCopies", &wdev->print_copies); if (code < 0) goto error; docn.data = (const byte*)wdev->doc_name; docn.size = strlen(wdev->doc_name); docn.persistent = false; code = param_write_string(dict.list, "DocumentName", &docn); if (code < 0) goto error; papn.data = (const byte*)wdev->paper_name; papn.size = strlen(wdev->paper_name); papn.persistent = false; code = param_write_string(dict.list, "PaperName", &papn); if (code < 0) goto error; code = param_write_bool(dict.list, "UserChangedSettings", &wdev->user_changed_settings); error: param_end_write_dict(plist, pname, &dict); return code; }