yaz-client: display MAB records YAZ-689
[yaz-moved-to-github.git] / client / client.c
index 5e7f270..18c763a 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2012 Index Data
+ * Copyright (C) 1995-2013 Index Data
  * See the file LICENSE for details.
  */
 /** \file client.c
@@ -702,10 +702,7 @@ static int session_connect_base(const char *arg, const char **basep)
     strncpy(type_and_host, arg, sizeof(type_and_host)-1);
     type_and_host[sizeof(type_and_host)-1] = '\0';
 
-    if (yazProxy)
-        conn = cs_create_host(yazProxy, 1, &add);
-    else
-        conn = cs_create_host(arg, 1, &add);
+    conn = cs_create_host_proxy(arg, 1, &add, yazProxy);
     if (!conn)
     {
         printf("Could not resolve address %s\n", arg);
@@ -845,6 +842,50 @@ static void print_record(const char *buf, size_t len)
         printf("\n");
 }
 
+static void print_mab_record(const char *buf, size_t len)
+{
+    size_t i;
+    size_t last_linebreak = 0;
+    size_t last_subfield  = 0;
+    for (i = 0; i < len; i++)
+    {
+        // line break after header
+        if ( i == 24 )
+        {
+            printf("\n");
+            last_linebreak = i - 1;
+        }
+
+        // space between field and content
+        if ( i > 24 && i - last_linebreak == 5 )
+            printf(" ");
+
+        // space after subfield
+        if ( last_subfield != 0 && i - last_subfield == 2 )
+            printf(" ");
+
+        if ((buf[i] <= 126 && buf[i] >= 32) || strchr("\n\r\t\f", buf[i]))
+            printf("%c", buf[i]);
+        else if ( buf[i] == 29 ) // record separator
+            printf("\n");
+        else if ( buf[i] == 30 ) // field separator
+        {
+            printf("\n");
+            last_linebreak = i;
+        }
+        else if ( buf[i] == 31 ) // subfield
+        {
+            // space before subfields; except first one
+            if ( i > 24 && i - last_linebreak > 5 )
+                printf(" ");
+            printf("$");
+            last_subfield = i;
+        }
+        else
+            printf("\\X%02X", ((const unsigned char *)buf)[i]);
+    }
+}
+
 static void print_xml_record(const char *buf, size_t len)
 {
     int has_printed = 0;
@@ -926,13 +967,16 @@ static void display_record(Z_External *r)
         const char *octet_buf = (const char*)r->u.octet_aligned->buf;
         size_t octet_len = r->u.octet_aligned->len;
         if (!oid_oidcmp(oid, yaz_oid_recsyn_xml)
-            || !oid_oidcmp(oid, yaz_oid_recsyn_xml)
+            || !oid_oidcmp(oid, yaz_oid_recsyn_application_xml)
             || !oid_oidcmp(oid, yaz_oid_recsyn_html))
         {
             print_xml_record(octet_buf, octet_len);
-
         }
-        else if (yaz_oid_is_iso2709(oid))
+        else if (!oid_oidcmp(oid, yaz_oid_recsyn_mab))
+        {
+            print_mab_record(octet_buf, octet_len);
+        }
+        else
         {
             const char *result;
             size_t rlen;
@@ -978,17 +1022,14 @@ static void display_record(Z_External *r)
             }
             else
             {
-                printf("bad MARC. Dumping as it is:\n");
+                if (yaz_oid_is_iso2709(oid))
+                     printf("bad MARC. Dumping as it is:\n");
                 print_record(octet_buf, octet_len);
             }
             yaz_marc_destroy(mt);
             if (cd)
                 yaz_iconv_close(cd);
         }
-        else
-        {
-            print_record(octet_buf, octet_len);
-        }
         marc_file_write(octet_buf, r->u.octet_aligned->len);
     }
     else if (oid && !oid_oidcmp(oid, yaz_oid_recsyn_sutrs))
@@ -4444,9 +4485,11 @@ static void http_response(Z_HTTP_Response *hres)
 
             if (ret == 0 && sr->which == Z_SRW_searchRetrieve_response)
                 handle_srw_response(sr->u.response);
+            else if (ret == 0 && sr->which == Z_SRW_scan_response)
+                handle_srw_scan_response(sr->u.scan_response);
             else
             {
-                printf("Decoding of SOLR package failed\n");
+                printf("Decoding of Solr package failed\n");
                 ret = -1;
             }
             odr_destroy(o);