Use oid_class rather than int for OID class.
[yaz-moved-to-github.git] / src / srwutil.c
index b115ffc..ca6ecfb 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: srwutil.c,v 1.59 2007-05-24 10:18:36 adam Exp $
+ * $Id: srwutil.c,v 1.64 2007-09-07 17:41:47 mike Exp $
  */
 /**
  * \file srwutil.c
@@ -594,9 +594,16 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
                     YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "version");
             version = "1.1";
         }
-        if (strcmp(version, "1.1"))
+
+        version = yaz_negotiate_sru_version(version);
+
+        if (!version)
+        {   /* negotiation failed. */
             yaz_add_srw_diagnostic(decode, diag, num_diag,
-                                   YAZ_SRW_UNSUPP_VERSION, "1.1");
+                                   YAZ_SRW_UNSUPP_VERSION, "1.2");
+            version = "1.2";
+        }
+        
         if (!operation)
         {
             if (uri_name)
@@ -814,19 +821,30 @@ Z_SRW_record *yaz_srw_get_record(ODR o)
     return yaz_srw_get_records(o, 1);
 }
 
-Z_SRW_PDU *yaz_srw_get_core_v_1_1(ODR o)
+static Z_SRW_PDU *yaz_srw_get_core_ver(ODR o, const char *version)
 {
     Z_SRW_PDU *p = (Z_SRW_PDU *) odr_malloc(o, sizeof(*p));
-    p->srw_version = odr_strdup(o, "1.1");
+    p->srw_version = odr_strdup(o, version);
     p->username = 0;
     p->password = 0;
     p->extra_args = 0;
     return p;
 }
 
+Z_SRW_PDU *yaz_srw_get_core_v_1_1(ODR o)
+{
+    return yaz_srw_get_core_ver(o, "1.1");
+}
+
 Z_SRW_PDU *yaz_srw_get(ODR o, int which)
 {
-    Z_SRW_PDU *sr = yaz_srw_get_core_v_1_1(o);
+    return yaz_srw_get_pdu(o, which, "1.1");
+}
+
+Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version)
+{
+    Z_SRW_PDU *sr = yaz_srw_get_core_ver(o, version);
+
     sr->which = which;
     switch(which)
     {
@@ -929,7 +947,7 @@ Z_SRW_PDU *yaz_srw_get(ODR o, int which)
 }
 
 /* bib1:srw */
-static int srw_bib1_map[] = {
+static int bib1_srw_map[] = {
     1, 1,
     2, 2,
     3, 11,
@@ -1098,9 +1116,21 @@ static int srw_bib1_map[] = {
     0
 };
 
+/*
+ * This array contains overrides for when the first occurrence of a
+ * particular SRW error in the array above does not correspond with
+ * the best back-translation of that SRW error.
+ */
+static int srw_bib1_map[] = {
+    66, 238,
+    /* No doubt there are many more */
+    0
+};
+
+
 int yaz_diag_bib1_to_srw (int code)
 {
-    const int *p = srw_bib1_map;
+    const int *p = bib1_srw_map;
     while (*p)
     {
         if (code == p[0])
@@ -1112,9 +1142,19 @@ int yaz_diag_bib1_to_srw (int code)
 
 int yaz_diag_srw_to_bib1(int code)
 {
+    /* Check explicit reverse-map first */
     const int *p = srw_bib1_map;
     while (*p)
     {
+        if (code == p[0])
+            return p[1];
+        p += 2;
+    }
+
+    /* Fall back on reverse lookup in main map */
+    p = bib1_srw_map;
+    while (*p)
+    {
         if (code == p[1])
             return p[0];
         p += 2;
@@ -1241,6 +1281,8 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
     char *uri_args;
     char *path;
 
+    z_HTTP_header_add_basic_auth(encode, &hreq->headers, 
+                                 srw_pdu->username, srw_pdu->password);
     if (yaz_get_sru_parms(srw_pdu, encode, name, value))
         return -1;
     yaz_array_to_uri_ex(&uri_args, encode, name, value, srw_pdu->extra_args);
@@ -1265,6 +1307,8 @@ int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
     char *name[30], *value[30]; /* definite upper limit for SRU params */
     char *uri_args;
 
+    z_HTTP_header_add_basic_auth(encode, &hreq->headers, 
+                                 srw_pdu->username, srw_pdu->password);
     if (yaz_get_sru_parms(srw_pdu, encode, name, value))
         return -1;
 
@@ -1293,6 +1337,8 @@ int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
     };
     Z_SOAP *p = (Z_SOAP*) odr_malloc(odr, sizeof(*p));
 
+    z_HTTP_header_add_basic_auth(odr, &hreq->headers, 
+                                 srw_pdu->username, srw_pdu->password);
     z_HTTP_header_add_content_type(odr,
                                    &hreq->headers,
                                    "text/xml", charset);