Fixed wait_response handling so to deal with proper number of
[yaz-moved-to-github.git] / client / client.c
index b5a11eb..5c05eba 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: client.c,v 1.283 2005-06-06 07:25:47 adam Exp $
+ * $Id: client.c,v 1.286 2005-06-08 09:11:03 adam Exp $
  */
 
 #include <stdio.h>
@@ -1841,6 +1841,11 @@ void process_ESResponse(Z_ExtendedServicesResponse *res)
             }
         }
     }
+    if (res->taskPackage && res->taskPackage->which == Z_External_octet)
+    {
+       Odr_oct *doc = res->taskPackage->u.octet_aligned;
+       printf("%.*s\n", doc->len, doc->buf);
+    }
 }
 
 const char *get_ill_element (void *clientData, const char *element)
@@ -2246,6 +2251,29 @@ static int cmd_update_common(const char *arg, int version)
     return 2;
 }
 
+static int cmd_xmlupdate(const char *arg)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest);
+    Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
+
+    Z_External *ext = (Z_External *) odr_malloc(out, sizeof(*ext));
+    req->taskSpecificParameters = ext;
+    req->packageType = yaz_oidval_to_z3950oid(out, CLASS_EXTSERV,
+                                              VAL_XMLUPDATE);
+    ext->direct_reference = req->packageType;
+    ext->descriptor = 0;
+    ext->indirect_reference = 0;
+    
+    ext->which = Z_External_octet;
+    ext->u.single_ASN1_type = (Odr_oct *) odr_malloc (out, sizeof(Odr_oct));
+    
+    ext->u.single_ASN1_type->buf = (unsigned char*) odr_strdup(out, arg);
+    ext->u.single_ASN1_type->size = ext->u.single_ASN1_type->len = strlen(arg);
+    send_apdu(apdu);
+
+    return 2;
+}
+
 static int cmd_itemorder(const char *arg)
 {
     char type[12];
@@ -3738,7 +3766,7 @@ static void http_response(Z_HTTP_Response *hres)
 }
 #endif
 
-void wait_and_handle_response() 
+void wait_and_handle_response(int one_response_only) 
 {
     int reconnect_ok = 1;
     int res;
@@ -3872,6 +3900,8 @@ void wait_and_handle_response()
             http_response(gdu->u.HTTP_Response);
         }
 #endif
+       if (one_response_only)
+           break;
         if (conn && !cs_more(conn))
             break;
     }
@@ -4119,7 +4149,7 @@ int cmd_wait_response(const char *arg)
     };
     
     for( i=0 ; i < wait_for ; ++i ) {
-       wait_and_handle_response( );
+       wait_and_handle_response(1);
     };
     return 0;
 }
@@ -4166,6 +4196,7 @@ static struct {
     {"itemorder", cmd_itemorder, "ill|item <itemno>",NULL,0,NULL},
     {"update", cmd_update, "<action> <recid> [<file>]",NULL,0,NULL},
     {"update0", cmd_update0, "<action> <recid> [<file>]",NULL,0,NULL},
+    {"xmlupdate", cmd_xmlupdate, "<action> <doc>",NULL,0,NULL},
     {"packagename", cmd_packagename, "<packagename>",NULL,0,NULL},
     {"proxy", cmd_proxy, "[('tcp'|'ssl')]<host>[':'<port>]",NULL,0,NULL},
     {"charset", cmd_charset, "<nego_charset> <output_charset>",NULL,0,NULL},
@@ -4361,7 +4392,7 @@ void process_cmd_line(char* line)
     if(apdu_file) fflush(apdu_file);
     
     if (res >= 2 && auto_wait)
-        wait_and_handle_response();
+        wait_and_handle_response(0);
     
     if(apdu_file)
         fflush(apdu_file);