Fixed wait_response handling so to deal with proper number of
[yaz-moved-to-github.git] / client / client.c
index 3c5ce74..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.281 2005-05-09 11:01:07 adam Exp $
+ * $Id: client.c,v 1.286 2005-06-08 09:11:03 adam Exp $
  */
 
 #include <stdio.h>
@@ -126,6 +126,7 @@ static FILE *marc_file = 0;
 static char *refid = NULL;
 static char *last_open_command = NULL;
 static int auto_reconnect = 0;
+static int auto_wait = 1;
 static Odr_bitmask z3950_options;
 static int z3950_version = 3;
 static int scan_stepSize = 0;
@@ -1840,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)
@@ -2245,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];
@@ -2282,6 +2311,8 @@ static int cmd_options(const char *arg)
        int r;
        int pos;
        r = yaz_init_opt_encode(&z3950_options, arg, &pos);
+       if (r == -1)
+           printf("Unknown option(s) near %s\n", arg+pos);
     }
     else
     {
@@ -3363,6 +3394,28 @@ int cmd_set_auto_reconnect(const char* arg)
     return 0;
 }
 
+
+int cmd_set_auto_wait(const char* arg)
+{  
+    if(strlen(arg)==0) {
+        auto_wait = ! auto_wait;
+    } else if(strcmp(arg,"on")==0) {
+        auto_wait = 1;
+    } else if(strcmp(arg,"off")==0) {
+        auto_wait = 0;         
+    } else {
+        printf("Error use on or off\n");
+        return 1;
+    }
+    
+    if (auto_wait)
+        printf("Set auto wait enabled.\n");
+    else
+        printf("Set auto wait disabled.\n");
+    
+    return 0;
+}
+
 int cmd_set_marcdump(const char* arg)
 {
     if(marc_file && marc_file != stderr) { /* don't close stdout*/
@@ -3713,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;
@@ -3847,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;
     }
@@ -4003,6 +4058,7 @@ int cmd_list_all(const char* args) {
     if(yazProxy) printf("using proxy          : %s\n",yazProxy);               
     
     printf("auto_reconnect       : %s\n",auto_reconnect?"on":"off");
+    printf("auto_wait            : %s\n",auto_wait?"on":"off");
     
     if (!auth) {
         printf("Authentication       : none\n");
@@ -4084,6 +4140,20 @@ int cmd_clear_otherinfo(const char* args)
     return 0;
 }
 
+int cmd_wait_response(const char *arg)
+{
+    int wait_for = atoi(arg);
+    int i=0;
+    if( wait_for < 1 ) {
+       wait_for = 1;
+    };
+    
+    for( i=0 ; i < wait_for ; ++i ) {
+       wait_and_handle_response(1);
+    };
+    return 0;
+}
+
 static int cmd_help (const char *line);
 
 typedef char *(*completerFunctionType)(const char *text, int state);
@@ -4126,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},
@@ -4141,6 +4212,7 @@ static struct {
     {"set_cclfile", cmd_set_cclfile," <filename>",NULL,1,NULL},
     {"set_cqlfile", cmd_set_cqlfile," <filename>",NULL,1,NULL},
     {"set_auto_reconnect", cmd_set_auto_reconnect," on|off",complete_auto_reconnect,1,NULL},
+    {"set_auto_wait", cmd_set_auto_wait," on|off",complete_auto_reconnect,1,NULL},
     {"set_otherinfo", cmd_set_otherinfo,"<otherinfoinddex> <oid> <string>",NULL,0,NULL},
     {"sleep", cmd_sleep,"<seconds>",NULL,0,NULL},
     {"register_oid", cmd_register_oid,"<name> <class> <oid>",NULL,0,NULL},
@@ -4150,6 +4222,7 @@ static struct {
     {"list_otherinfo",cmd_list_otherinfo,"[otherinfoinddex]",NULL,0,NULL},
     {"list_all",cmd_list_all,"",NULL,0,NULL},
     {"clear_otherinfo",cmd_clear_otherinfo,"",NULL,0,NULL},
+    {"wait_response",cmd_wait_response,"<number>",NULL,0,NULL},
     /* Server Admin Functions */
     {"adm-reindex", cmd_adm_reindex, "<database-name>",NULL,0,NULL},
     {"adm-truncate", cmd_adm_truncate, "('database'|'index')<object-name>",NULL,0,NULL},
@@ -4318,8 +4391,8 @@ void process_cmd_line(char* line)
     
     if(apdu_file) fflush(apdu_file);
     
-    if (res >= 2)
-        wait_and_handle_response();
+    if (res >= 2 && auto_wait)
+        wait_and_handle_response(0);
     
     if(apdu_file)
         fflush(apdu_file);