X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsrw.c;h=54aa7ba24372bc5029de7600e822467db2ecfd36;hb=87c5b79ec9ced76de948e833ef2f8eb561d2f77a;hp=531c82d43de3e591b4dd9e7e253720cc5b23d63b;hpb=6ac2cbf8b4f34a3e3d2bd0687d11d63579786dea;p=yaz-moved-to-github.git diff --git a/src/srw.c b/src/srw.c index 531c82d..54aa7ba 100644 --- a/src/srw.c +++ b/src/srw.c @@ -1,8 +1,8 @@ /* - * Copyright (C) 1995-2006, Index Data ApS + * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: srw.c,v 1.53 2006-12-07 19:06:11 adam Exp $ + * $Id: srw.c,v 1.57 2007-08-23 14:23:23 adam Exp $ */ /** * \file srw.c @@ -130,27 +130,31 @@ static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o, char **val, int *len) { xmlBufferPtr buf; - xmlNode *tmp; if (!match_element(ptr, elem)) return 0; - ptr = ptr->children; - while (ptr && (ptr->type == XML_TEXT_NODE || ptr->type == XML_COMMENT_NODE)) - ptr = ptr->next; - if (!ptr) - return 0; - - /* copy node to get NS right (bug #740). */ - tmp = xmlCopyNode(ptr, 1); - buf = xmlBufferCreate(); + + /* Copy each element nodes at top. + In most cases there is only one root node.. At least one server + http://www.theeuropeanlibrary.org/sru/sru.pl + has multiple root nodes in recordData. + */ + for (ptr = ptr->children; ptr; ptr = ptr->next) + { + if (ptr->type == XML_ELEMENT_NODE) + { + /* copy node to get NS right (bug #740). */ + xmlNode *tmp = xmlCopyNode(ptr, 1); + + xmlNodeDump(buf, tmp->doc, tmp, 0, 0); + + xmlFreeNode(tmp); + } + } - xmlNodeDump(buf, tmp->doc, tmp, 0, 0); - - xmlFreeNode(tmp); - - *val = odr_malloc(o, buf->use+1); + *val = (char *) odr_malloc(o, buf->use+1); memcpy (*val, buf->content, buf->use); (*val)[buf->use] = '\0'; @@ -192,6 +196,16 @@ static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, int **val) return 1; } +char *yaz_negotiate_sru_version(char *input_ver) +{ + if (!input_ver) + input_ver = "1.1"; + + if (!strcmp(input_ver, "1.1")) + return "1.1"; + return "1.2"; /* our latest supported version */ +} + static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, Z_SRW_extra_record **extra, void *client_data, const char *ns) @@ -222,12 +236,8 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, ; else if (match_xsd_string(ptr, "recordPacking", o, &spack)) { - if (spack && !strcmp(spack, "xml")) - pack = Z_SRW_recordPacking_XML; - if (spack && !strcmp(spack, "url")) - pack = Z_SRW_recordPacking_URL; - if (spack && !strcmp(spack, "string")) - pack = Z_SRW_recordPacking_string; + if (spack) + pack = yaz_srw_str_to_pack(spack); } else if (match_xsd_integer(ptr, "recordPosition", o, &rec->recordPosition)) @@ -281,22 +291,22 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, { xmlNodePtr ptr = pptr; int pack = rec->recordPacking; - add_xsd_string(ptr, "recordSchema", rec->recordSchema); + const char *spack = yaz_srw_pack_to_str(pack); + add_xsd_string(ptr, "recordSchema", rec->recordSchema); + if (spack) + add_xsd_string(ptr, "recordPacking", spack); switch(pack) { case Z_SRW_recordPacking_string: - add_xsd_string(ptr, "recordPacking", "string"); add_xsd_string_n(ptr, "recordData", rec->recordData_buf, rec->recordData_len); break; case Z_SRW_recordPacking_XML: - add_xsd_string(ptr, "recordPacking", "xml"); add_XML_n(ptr, "recordData", rec->recordData_buf, rec->recordData_len, 0); break; case Z_SRW_recordPacking_URL: - add_xsd_string(ptr, "recordPacking", "url"); add_xsd_string_n(ptr, "recordData", rec->recordData_buf, rec->recordData_len); break; @@ -594,6 +604,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, { Z_SRW_PDU **p = handler_data; xmlNodePtr method = pptr->children; + char *neg_version; while (method && method->type == XML_TEXT_NODE) method = method->next; @@ -851,6 +862,9 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, *p = 0; return -1; } + neg_version = yaz_negotiate_sru_version((*p)->srw_version); + if (neg_version) + (*p)->srw_version = neg_version; } else if (o->direction == ODR_ENCODE) {