--=-iNgj46R6siZP/InxV0Si Content-Type: text/plain Content-Transfer-Encoding: 7bit
Hi, finally I have made a new function in sane-desc to get an xml output. I think that only have to send the patch, if there is any problem please email me, this is the first time that I make something similar.. Bye, --=-iNgj46R6siZP/InxV0Si Content-Disposition: attachment; filename=sane-desc-xml.patch Content-Type: text/plain; name=sane-desc-xml.patch; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit --- sane-desc.c Thu Jun 24 13:43:48 2004 +++ sane-desc.c.new Thu Jun 24 11:55:34 2004 @@ -65,6 +65,7 @@ typedef enum output_mode { output_mode_ascii = 0, + output_mode_xml, output_mode_html_backends, output_mode_html_backends_split, output_mode_html_mfgs @@ -308,6 +309,11 @@ DBG_INFO ("Output mode: ascii\n"); mode = output_mode_ascii; } + else if (strcmp (optarg, "xml") ==0) + { + DBG_INFO ("Output mode: xml\n"); + mode = output_mode_xml; + } else if (strcmp (optarg, "html-backends-split") == 0) { DBG_INFO ("Output mode: html-backends-split\n"); @@ -1609,6 +1615,193 @@ } /* while (be) */ } +/* Print an XML list with all the information we have */ +static void +xml_print_backends (void) +{ + backend_entry *be; + + be = first_backend; + while (be) + { + url_entry *url = be->url; + type_entry *type = be->type; + + if (be->name) + printf ("<backend name=\"%s\">\n",be->name); + else + printf ("<backend name=\"*none\">\n"); + + if (be->version) + printf ("<version>%s</version> \n", be->version); + else + printf ("<version>*none*</version>\n"); + + if (be->new) + printf (" NEW!\n"); + + if (be->manpage) + printf (" <manpage>%s</manpage>\n", be->manpage); + else + printf (" <manpage>*none*</manpage>\n"); + + if (url) + while (url) + { + printf (" <url>%s</url>\n", url->name); + url = url->next; + } + else + printf (" <url>*none*</url>\n"); + + if (be->comment) + printf (" <comment>%s</comment>\n", be->comment); + else + printf (" <comment>*none*</comment>\n"); + + if (type) + while (type) + { + switch (type->type) + { + case type_scanner: + printf (" <type>scanner</type>\n"); + break; + case type_stillcam: + printf (" <type>stillcam</type>\n"); + break; + case type_vidcam: + printf (" <type>vidcam </type>\n"); + break; + case type_meta: + printf (" <type>meta</type>\n"); + break; + case type_api: + printf (" <type>api</type>\n"); + break; + default: + printf (" <type> *unknown* </type>\n"); + break; + } + if (type->desc) + { + url_entry *url = type->desc->url; + printf (" <desc>%s</desc>\n", type->desc->desc); + if (url) + while (url) + { + printf (" <url>%s</url>\n", url->name); + url = url->next; + } + else + printf (" <url>*none*</url>\n"); + + if (type->desc->comment) + printf (" <comment>%s</comment>\n", type->desc->comment); + else + printf (" <comment>*none*</comment>\n"); + } + else if (type->type >= type_meta) + printf (" <desc>*none*</desc>\n"); + + if (type->mfg) + { + mfg_entry *mfg = type->mfg; + while (mfg) + { + model_entry *model = mfg->model; + url_entry *url = mfg->url; + + printf (" <mfg name=\"%s\">\n", mfg->name); + if (url) + while (url) + { + printf (" <url>`%s'</url>\n", url->name); + url = url->next; + } + else + printf (" <url>*none*</url>\n"); + + if (mfg->comment) + printf (" <comment>%s</comment>\n", mfg->comment); + else + printf (" <comment>*none*</comment>\n"); + + if (model) + while (model) + { + url_entry *url = model->url; + printf (" <model name=\"%s\">\n", model->name); + if (model->interface) + printf (" <interface>%s</interface>\n", model->interface); + else + printf (" <interface>*none*</interface>\n"); + + if (model->status == status_unknown) + model->status = be->status; + switch (model->status) + { + case status_minimal: + printf (" <status>minimal</status>\n"); + break; + case status_basic: + printf (" <status>basic</status>\n"); + break; + case status_good: + printf (" <status>good</status>\n"); + break; + case status_complete: + printf (" <status>complete</status>\n"); + break; + case status_untested: + printf (" <status>untested</status>\n"); + break; + case status_unsupported: + printf (" <status>unsupported</status>\n"); + break; + default: + printf (" <status>*unknown*</status>\n"); + break; + } + + if (url) + while (url) + { + printf (" <url>%s</url>\n", url->name); + url = url->next; + } + else + printf (" <url>*none*</url>\n"); + + if (model->comment) + printf (" <comment>%s</comment>\n", model->comment); + else + printf (" <comment>*none*</comment>\n"); + + model = model->next; + printf(" </model>\n"); + } /* while (model) */ + else + printf (" <model name=\"*none*\" />\n"); + + printf(" </mfg>\n"); + mfg = mfg->next; + } /* while (mfg) */ + } + else if (type->type < type_meta) + printf (" <mfg>*none*</mfg>\n"); + type = type->next; + } /* while (type) */ + else + printf (" <type>*none*</type>\n"); + printf("</backend>\n"); + be = be->next; + + } /* while (be) */ +} + + + /* Generate a name used for <a name=...> HTML tags */ static char * html_generate_anchor_name (device_type dev_type, char *manufacturer_name) @@ -2296,6 +2489,9 @@ { case output_mode_ascii: ascii_print_backends (); + break; + case output_mode_xml: + xml_print_backends(); break; case output_mode_html_backends_split: html_print_backends_split (); --=-iNgj46R6siZP/InxV0Si--