static void load_inklist(stp_mxml_node_t *node, stp_mxml_node_t *root, inklist_t *ikl) { const char *name; stp_mxml_node_t *child = node->child; int count = 0; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "InkName")) count++; else if (!strcmp(child->value.element.name, "initSequence") && child->child && child->child->type == STP_MXML_TEXT) ikl->init_sequence = stp_xmlstrtoraw(child->child->value.text.string); else if (!strcmp(child->value.element.name, "deinitSequence") && child->child && child->child->type == STP_MXML_TEXT) ikl->deinit_sequence = stp_xmlstrtoraw(child->child->value.text.string); } child = child->next; } name = stp_mxmlElementGetAttr(node, "name"); if (name) ikl->name = stp_strdup(name); name = stp_mxmlElementGetAttr(node, "text"); if (name) ikl->text = stp_strdup(name); ikl->n_inks = count; ikl->inknames = stp_zalloc(sizeof(inkname_t) * count); count = 0; child = node->child; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "InkName")) { inkname_t *inl = &(ikl->inknames[count++]); inl->init_sequence = ikl->init_sequence; inl->deinit_sequence = ikl->deinit_sequence; load_inkname(child, root, inl, ikl); } else if (!strcmp(child->value.element.name, "Shades")) load_shades(child, root, ikl); } child = child->next; } }
static void load_inkname(stp_mxml_node_t *node, stp_mxml_node_t *root, inkname_t *inl, inklist_t *ikl) { const char *name; stp_mxml_node_t *child = node->child; int channel_count = 0; int aux_channel_count = 0; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "Channels")) { stp_mxml_node_t *cchild = child->child; while (cchild) { if (cchild->type == STP_MXML_ELEMENT && !strcmp(cchild->value.element.name, "channel")) { name = stp_mxmlElementGetAttr(cchild, "index"); if (name) { unsigned idx = stp_xmlstrtoul(name); if (idx + 1 > channel_count) channel_count = idx + 1; } } cchild = cchild->next; } } else if (!strcmp(child->value.element.name, "AuxChannels")) { stp_mxml_node_t *cchild = child->child; while (cchild) { if (cchild->type == STP_MXML_ELEMENT && !strcmp(cchild->value.element.name, "channel")) { name = stp_mxmlElementGetAttr(cchild, "index"); if (name) { unsigned idx = stp_xmlstrtoul(name); if (idx + 1 > aux_channel_count) aux_channel_count = idx + 1; } } cchild = cchild->next; } } } child = child->next; } inl->channel_count = channel_count; if (channel_count > 0) inl->channels = stp_zalloc(sizeof(ink_channel_t) * channel_count); inl->aux_channel_count = aux_channel_count; if (aux_channel_count > 0) inl->aux_channels = stp_zalloc(sizeof(ink_channel_t) * aux_channel_count); name = stp_mxmlElementGetAttr(node, "name"); if (name) inl->name = stp_strdup(name); name = stp_mxmlElementGetAttr(node, "text"); if (name) inl->text = stp_strdup(name); name = stp_mxmlElementGetAttr(node, "InkID"); if (name) { if (!strcmp(name, "CMYK")) inl->inkset = INKSET_CMYK; else if (!strcmp(name, "CcMmYK")) inl->inkset = INKSET_CcMmYK; else if (!strcmp(name, "CcMmYyK")) inl->inkset = INKSET_CcMmYyK; else if (!strcmp(name, "CcMmYKk")) inl->inkset = INKSET_CcMmYKk; else if (!strcmp(name, "Quadtone")) inl->inkset = INKSET_QUADTONE; else if (!strcmp(name, "Hextone")) inl->inkset = INKSET_HEXTONE; else if (!strcmp(name, "OTHER")) inl->inkset = INKSET_OTHER; else if (!strcmp(name, "Extended")) inl->inkset = INKSET_EXTENDED; } channel_count = 0; aux_channel_count = 0; child = node->child; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "Channels")) { stp_mxml_node_t *cchild = child->child; while (cchild) { if (cchild->type == STP_MXML_ELEMENT && !strcmp(cchild->value.element.name, "channel")) { name = stp_mxmlElementGetAttr(cchild, "index"); if (name) { unsigned idx = stp_xmlstrtoul(name); load_channel(cchild, root, &(inl->channels[idx])); } } cchild = cchild->next; } } else if (!strcmp(child->value.element.name, "AuxChannels")) { stp_mxml_node_t *cchild = child->child; while (cchild) { if (cchild->type == STP_MXML_ELEMENT && !strcmp(cchild->value.element.name, "channel")) { name = stp_mxmlElementGetAttr(cchild, "index"); if (name) { unsigned idx = stp_xmlstrtoul(name); load_channel(cchild, root, &(inl->aux_channels[idx])); } } cchild = cchild->next; } } else if (!strcmp(child->value.element.name, "initSequence") && child->child && child->child->type == STP_MXML_TEXT) ikl->init_sequence = stp_xmlstrtoraw(child->child->value.text.string); else if (!strcmp(child->value.element.name, "deinitSequence") && child->child && child->child->type == STP_MXML_TEXT) ikl->deinit_sequence = stp_xmlstrtoraw(child->child->value.text.string); } child = child->next; } }
static void load_model_from_file(const stp_vars_t *v, stp_mxml_node_t *xmod, int model) { stp_mxml_node_t *tmp = xmod->child; stpi_escp2_printer_t *p = stp_escp2_get_printer(v); int found_black_head_config = 0; int found_fast_head_config = 0; p->max_black_resolution = -1; p->cd_x_offset = -1; p->cd_y_offset = -1; p->duplex_left_margin = SHRT_MIN; p->duplex_right_margin = SHRT_MIN; p->duplex_top_margin = SHRT_MIN; p->duplex_bottom_margin = SHRT_MIN; while (tmp) { if (tmp->type == STP_MXML_ELEMENT) { const char *name = tmp->value.element.name; const char *target = stp_mxmlElementGetAttr(tmp, "src"); if (target) { if (!strcmp(name, "media")) stp_escp2_load_media(v, target); else if (!strcmp(name, "inputSlots")) stp_escp2_load_input_slots(v, target); else if (!strcmp(name, "mediaSizes")) stp_escp2_load_media_sizes(v, target); else if (!strcmp(name, "printerWeaves")) stp_escp2_load_printer_weaves(v, target); else if (!strcmp(name, "qualityPresets")) stp_escp2_load_quality_presets(v, target); else if (!strcmp(name, "resolutions")) stp_escp2_load_resolutions(v, target); else if (!strcmp(name, "inkGroup")) stp_escp2_load_inkgroup(v, target); } else if (tmp->child && tmp->child->type == STP_MXML_TEXT) { stp_mxml_node_t *child = tmp->child; const char *val = child->value.text.string; if (!strcmp(name, "verticalBorderlessSequence")) { STPI_ASSERT(!p->vertical_borderless_sequence, NULL); p->vertical_borderless_sequence = stp_xmlstrtoraw(val); } else if (!strcmp(name, "preinitSequence")) { STPI_ASSERT(!p->preinit_sequence, NULL); p->preinit_sequence = stp_xmlstrtoraw(val); } else if (!strcmp(name, "preinitRemoteSequence")) { STPI_ASSERT(!p->preinit_remote_sequence, NULL); p->preinit_remote_sequence = stp_xmlstrtoraw(val); } else if (!strcmp(name, "postinitRemoteSequence")) { STPI_ASSERT(!p->postinit_remote_sequence, NULL); p->postinit_remote_sequence = stp_xmlstrtoraw(val); } else if (!strcmp(name, "commandSet")) { if (!strcmp(val, "1998")) p->flags |= MODEL_COMMAND_1998; else if (!strcmp(val, "1999")) p->flags |= MODEL_COMMAND_1999; else if (!strcmp(val, "2000")) p->flags |= MODEL_COMMAND_2000; else if (!strcmp(val, "Pro")) p->flags |= MODEL_COMMAND_PRO; } else if (!strcmp(name, "borderless")) { if (!strcmp(val, "No")) p->flags |= MODEL_ZEROMARGIN_NO; else if (!strcmp(val, "Yes")) p->flags |= MODEL_ZEROMARGIN_YES; else if (!strcmp(val, "Full")) p->flags |= MODEL_ZEROMARGIN_FULL; else if (!strcmp(val, "VerticalRestricted")) p->flags |= MODEL_ZEROMARGIN_RESTR; else if (!strcmp(val, "HorizontalOnly")) p->flags |= MODEL_ZEROMARGIN_H_ONLY; } else if (!strcmp(name, "preferredEnvelopeOrientation") && !strcmp(val, "Landscape")) p->flags |= MODEL_ENVELOPE_LANDSCAPE_YES; else if (!strcmp(name, "headConfiguration")) { const char *htype = stp_mxmlElementGetAttr(tmp, "type"); unsigned long data[4] = { 0, 0, 0, 0 }; while (child) { if (child->type == STP_MXML_ELEMENT && child->child && child->child->type == STP_MXML_TEXT) { const char *cname = child->value.element.name; const char *cval = child->child->value.text.string; if (!strcmp(cname, "Nozzles")) data[0] = stp_xmlstrtoul(cval); else if (!strcmp(cname, "MinNozzles")) data[1] = stp_xmlstrtoul(cval); else if (!strcmp(cname, "FirstNozzle")) data[2] = stp_xmlstrtoul(cval); else if (!strcmp(cname, "NozzleSeparation")) data[3] = stp_xmlstrtoul(cval); } child = child->next; } if (!strcmp(htype, "default")) { p->nozzles = data[0]; p->min_nozzles = data[1]; p->nozzle_start = data[2]; p->nozzle_separation = data[3]; if (!found_black_head_config) { p->black_nozzles = data[0]; p->min_black_nozzles = data[1]; p->black_nozzle_start = data[2]; p->black_nozzle_separation = data[3]; } if (!found_fast_head_config) { p->fast_nozzles = data[0]; p->min_fast_nozzles = data[1]; p->fast_nozzle_start = data[2]; p->fast_nozzle_separation = data[3]; } } else if (!strcmp(htype, "black")) { p->black_nozzles = data[0]; p->min_black_nozzles = data[1]; p->black_nozzle_start = data[2]; p->black_nozzle_separation = data[3]; found_black_head_config = 1; } else if (!strcmp(htype, "fast")) { p->fast_nozzles = data[0]; p->min_fast_nozzles = data[1]; p->fast_nozzle_start = data[2]; p->fast_nozzle_separation = data[3]; found_fast_head_config = 1; } } else if (!strcmp(name, "margins")) { const char *itype = stp_mxmlElementGetAttr(tmp, "interleave"); const char *mtype = stp_mxmlElementGetAttr(tmp, "media"); const char *dtype = stp_mxmlElementGetAttr(tmp, "duplex"); unsigned long data[4]; int i = 0; while (child && i < 4) { if (child->type == STP_MXML_TEXT) data[i++] = stp_xmlstrtoul(child->value.text.string); child = child->next; } if (dtype && !strcmp(dtype, "duplex")) { p->duplex_left_margin = data[0]; p->duplex_right_margin = data[1]; p->duplex_top_margin = data[2]; p->duplex_bottom_margin = data[3]; } else if (itype && !strcmp(itype, "soft") && mtype && !strcmp(mtype, "sheet")) { p->left_margin = data[0]; p->right_margin = data[1]; p->top_margin = data[2]; p->bottom_margin = data[3]; } else if (itype && !strcmp(itype, "printer") && mtype && !strcmp(mtype, "sheet")) { p->m_left_margin = data[0]; p->m_right_margin = data[1]; p->m_top_margin = data[2]; p->m_bottom_margin = data[3]; } else if (itype && !strcmp(itype, "soft") && mtype && !strcmp(mtype, "roll")) { p->roll_left_margin = data[0]; p->roll_right_margin = data[1]; p->roll_top_margin = data[2]; p->roll_bottom_margin = data[3]; } else if (itype && !strcmp(itype, "printer") && mtype && !strcmp(mtype, "roll")) { p->m_roll_left_margin = data[0]; p->m_roll_right_margin = data[1]; p->m_roll_top_margin = data[2]; p->m_roll_bottom_margin = data[3]; } } else if (!strcmp(name, "physicalChannels")) p->physical_channels = stp_xmlstrtoul(val); else if (!strcmp(name, "baseSeparation")) p->base_separation = stp_xmlstrtoul(val); else if (!strcmp(name, "resolutionScale")) p->resolution_scale = stp_xmlstrtoul(val); else if (!strcmp(name, "maxBlackResolution")) p->max_black_resolution = stp_xmlstrtoul(val); else if (!strcmp(name, "minimumResolution")) { p->min_hres = stp_xmlstrtoul(child->value.text.string); child = child->next; p->min_vres = stp_xmlstrtoul(child->value.text.string); } else if (!strcmp(name, "maximumResolution")) { p->max_hres = stp_xmlstrtoul(child->value.text.string); child = child->next; p->max_vres = stp_xmlstrtoul(child->value.text.string); } else if (!strcmp(name, "extraVerticalFeed")) p->extra_feed = stp_xmlstrtoul(val); else if (!strcmp(name, "separationRows")) p->separation_rows = stp_xmlstrtoul(val); else if (!strcmp(name, "pseudoSeparationRows")) p->pseudo_separation_rows = stp_xmlstrtoul(val); else if (!strcmp(name, "zeroMarginOffset")) p->zero_margin_offset = stp_xmlstrtoul(val); else if (!strcmp(name, "microLeftMargin")) p->micro_left_margin = stp_xmlstrtoul(val); else if (!strcmp(name, "initialVerticalOffset")) p->initial_vertical_offset = stp_xmlstrtoul(val); else if (!strcmp(name, "blackInitialVerticalOffset")) p->black_initial_vertical_offset = stp_xmlstrtoul(val); else if (!strcmp(name, "extra720DPISeparation")) p->extra_720dpi_separation = stp_xmlstrtoul(val); else if (!strcmp(name, "minHorizontalAlignment")) p->min_horizontal_position_alignment = stp_xmlstrtoul(val); else if (!strcmp(name, "baseHorizontalAlignment")) p->base_horizontal_position_alignment = stp_xmlstrtoul(val); else if (!strcmp(name, "bidirectionalAutoUpperLimit")) p->bidirectional_upper_limit = stp_xmlstrtoul(val); else if (!strcmp(name, "minimumMediaSize")) { p->min_paper_width = stp_xmlstrtoul(child->value.text.string); child = child->next; p->min_paper_height = stp_xmlstrtoul(child->value.text.string); } else if (!strcmp(name, "maximumMediaSize")) { p->max_paper_width = stp_xmlstrtoul(child->value.text.string); child = child->next; p->max_paper_height = stp_xmlstrtoul(child->value.text.string); } else if (!strcmp(name, "maximumImageableArea")) { p->max_imageable_width = stp_xmlstrtoul(child->value.text.string); child = child->next; p->max_imageable_height = stp_xmlstrtoul(child->value.text.string); } else if (!strcmp(name, "CDOffset")) { p->cd_x_offset = stp_xmlstrtoul(child->value.text.string); child = child->next; p->cd_y_offset = stp_xmlstrtoul(child->value.text.string); } else if (!strcmp(name, "CDMediaSize")) { p->cd_page_width = stp_xmlstrtoul(child->value.text.string); child = child->next; p->cd_page_height = stp_xmlstrtoul(child->value.text.string); } else if (!strcmp(name, "extraBottom")) p->paper_extra_bottom = stp_xmlstrtoul(val); else if (!strcmp(name, "AlignmentChoices")) { p->alignment_passes = stp_xmlstrtoul(child->value.text.string); child = child->next; p->alignment_choices = stp_xmlstrtoul(child->value.text.string); child = child->next; p->alternate_alignment_passes = stp_xmlstrtoul(child->value.text.string); child = child->next; p->alternate_alignment_choices = stp_xmlstrtoul(child->value.text.string); } else if (!strcmp(name, "ChannelNames")) { p->channel_names = stp_string_list_create(); while (child) { if (child->type == STP_MXML_ELEMENT && !strcmp(child->value.element.name, "ChannelName")) { const char *cname = stp_mxmlElementGetAttr(child, "name"); stp_string_list_add_string(p->channel_names, cname, cname); } child = child->next; } } else if (!strcmp(name, "resolutions")) stp_escp2_load_resolutions_from_xml(v, tmp); } else { if (!strcmp(name, "supportsVariableDropsizes")) p->flags |= MODEL_VARIABLE_YES; else if (!strcmp(name, "hasFastGraymode")) p->flags |= MODEL_GRAYMODE_YES; else if (!strcmp(name, "hasFast360DPI")) p->flags |= MODEL_FAST_360_YES; else if (!strcmp(name, "sendZeroAdvance")) p->flags |= MODEL_SEND_ZERO_ADVANCE_YES; else if (!strcmp(name, "supportsInkChange")) p->flags |= MODEL_SUPPORTS_INK_CHANGE_YES; else if (!strcmp(name, "supportsD4Mode")) p->flags |= MODEL_PACKET_MODE_YES; else if (!strcmp(name, "hasInterchangeableInkCartridges")) p->flags |= MODEL_INTERCHANGEABLE_INK_YES; else if (!strcmp(name, "resolutions")) stp_escp2_load_resolutions_from_xml(v, tmp); } } tmp = tmp->next; } }