Fix type cast warning issued by GCC 3.3.3
[yaz-moved-to-github.git] / client / client.c
index 16f53c9..f009640 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1995-2004, Index Data
  * See the file LICENSE for details.
  *
- * $Id: client.c,v 1.220 2004-01-06 09:09:13 adam Exp $
+ * $Id: client.c,v 1.231 2004-02-16 21:40:39 adam Exp $
  */
 
 #include <stdio.h>
@@ -103,6 +103,8 @@ static FILE *marc_file = 0;
 static char *refid = NULL;
 static char *last_open_command = NULL;
 static int auto_reconnect = 0;
+static Odr_bitmask z3950_options;
+static int z3950_version = 3;
 
 static char cur_host[200];
 
@@ -279,19 +281,13 @@ static void send_initRequest(const char* type_and_host)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_initRequest);
     Z_InitRequest *req = apdu->u.initRequest;
+    int i;
 
-    ODR_MASK_SET(req->options, Z_Options_search);
-    ODR_MASK_SET(req->options, Z_Options_present);
-    ODR_MASK_SET(req->options, Z_Options_namedResultSets);
-    ODR_MASK_SET(req->options, Z_Options_triggerResourceCtrl);
-    ODR_MASK_SET(req->options, Z_Options_scan);
-    ODR_MASK_SET(req->options, Z_Options_sort);
-    ODR_MASK_SET(req->options, Z_Options_extendedServices);
-    ODR_MASK_SET(req->options, Z_Options_delSet);
+    req->options = &z3950_options;
 
-    ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1);
-    ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
-    ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
+    ODR_MASK_ZERO(req->protocolVersion);
+    for (i = 0; i<z3950_version; i++)
+       ODR_MASK_SET(req->protocolVersion, i);
 
     *req->maximumRecordSize = 1024*kilobytes;
     *req->preferredMessageSize = 1024*kilobytes;
@@ -300,7 +296,7 @@ static void send_initRequest(const char* type_and_host)
 
     req->referenceId = set_refid (out);
 
-    if (yazProxy) 
+    if (yazProxy && type_and_host) 
         yaz_oi_set_string_oidval(&req->otherInfo, out, VAL_PROXY,
         1, type_and_host);
     
@@ -332,6 +328,11 @@ static void send_initRequest(const char* type_and_host)
 static void render_initUserInfo(Z_OtherInformation *ui1);
 static void render_diag(Z_DiagnosticFormat *diag);
 
+static void pr_opt(const char *opt, void *clientData)
+{
+    printf (" %s", opt);
+}
+
 static int process_initResponse(Z_InitResponse *res)
 {
     int ver = 0;
@@ -339,7 +340,7 @@ static int process_initResponse(Z_InitResponse *res)
     session_mem = odr_extract_mem(in);
     session = res;
 
-    for (ver = 0; ver<5; ver++)
+    for (ver = 0; ver < 8; ver++)
         if (!ODR_MASK_GET(res->protocolVersion, ver))
             break;
 
@@ -376,46 +377,11 @@ static int process_initResponse(Z_InitResponse *res)
        }
     }
     printf ("Options:");
-    if (ODR_MASK_GET(res->options, Z_Options_search))
-        printf (" search");
-    if (ODR_MASK_GET(res->options, Z_Options_present))
-        printf (" present");
-    if (ODR_MASK_GET(res->options, Z_Options_delSet))
-        printf (" delSet");
-    if (ODR_MASK_GET(res->options, Z_Options_resourceReport))
-        printf (" resourceReport");
-    if (ODR_MASK_GET(res->options, Z_Options_resourceCtrl))
-        printf (" resourceCtrl");
-    if (ODR_MASK_GET(res->options, Z_Options_accessCtrl))
-        printf (" accessCtrl");
-    if (ODR_MASK_GET(res->options, Z_Options_scan))
-        printf (" scan");
-    if (ODR_MASK_GET(res->options, Z_Options_sort))
-        printf (" sort");
-    if (ODR_MASK_GET(res->options, Z_Options_extendedServices))
-        printf (" extendedServices");
-    if (ODR_MASK_GET(res->options, Z_Options_level_1Segmentation))
-        printf (" level1Segmentation");
-    if (ODR_MASK_GET(res->options, Z_Options_level_2Segmentation))
-        printf (" level2Segmentation");
-    if (ODR_MASK_GET(res->options, Z_Options_concurrentOperations))
-        printf (" concurrentOperations");
+    yaz_init_opt_decode(res->options, pr_opt, 0);
+    printf ("\n");
+
     if (ODR_MASK_GET(res->options, Z_Options_namedResultSets))
-    {
-        printf (" namedResultSets");
         setnumber = 0;
-    }
-    if (ODR_MASK_GET(res->options, Z_Options_encapsulation))
-        printf (" encapsulation");
-    if (ODR_MASK_GET(res->options, Z_Options_resultCount))
-        printf (" resultCount");
-    if (ODR_MASK_GET(res->options, Z_Options_negotiationModel))
-        printf (" negotiationModel");
-    if (ODR_MASK_GET(res->options, Z_Options_duplicateDetection))
-        printf (" duplicateDetection");
-    if (ODR_MASK_GET(res->options, Z_Options_queryType104))
-        printf (" queryType104");
-    printf ("\n");
     
     if (ODR_MASK_GET(res->options, Z_Options_negotiationModel)) {
     
@@ -745,7 +711,7 @@ static void display_record(Z_External *r)
     if (ent && r->which == Z_External_octet)
     {
         Z_ext_typeent *type = z_ext_getentbyref(ent->value);
-        void *rr;
+        char *rr;
 
         if (type)
         {
@@ -754,7 +720,7 @@ static void display_record(Z_External *r)
              */
             odr_setbuf(in, (char*)r->u.octet_aligned->buf,
                 r->u.octet_aligned->len, 0);
-            if (!(*type->fun)(in, (char **)&rr, 0, 0))
+            if (!(*type->fun)(in, &rr, 0, 0))
             {
                 odr_perror(in, "Decoding constructed record.");
                 fprintf(stdout, "[Near %d]\n", odr_offset(in));
@@ -1242,6 +1208,9 @@ static int send_SRW_searchRequest(const char *arg)
     sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request);
     sr->u.request->query_type = Z_SRW_query_type_cql;
     sr->u.request->query.cql = odr_strdup(out, arg);
+
+    sr->u.request->maximumRecords = odr_intdup(out, 0);
+
     if (record_schema)
         sr->u.request->recordSchema = record_schema;
     return send_srw(sr);
@@ -2137,6 +2106,36 @@ static int cmd_itemorder(const char *arg)
     return 2;
 }
 
+static void show_opt(const char *arg, void *clientData)
+{
+    printf ("%s ", arg);
+}
+
+static int cmd_zversion(const char *arg)
+{
+    if (*arg && arg)
+       z3950_version = atoi(arg);
+    else
+       printf ("version is %d\n", z3950_version);
+    return 0;
+}
+
+static int cmd_options(const char *arg)
+{
+    if (*arg)
+    {
+       int r;
+       int pos;
+       r = yaz_init_opt_encode(&z3950_options, arg, &pos);
+    }
+    else
+    {
+       yaz_init_opt_decode(&z3950_options, show_opt, 0);
+       printf ("\n");
+    }
+    return 0;
+}
+
 static int cmd_explain(const char *arg)
 {
     if (protocol != PROTO_HTTP)
@@ -2158,7 +2157,15 @@ static int cmd_explain(const char *arg)
 #endif
     return 0;
 }
-    
+
+static int cmd_init(const char *arg)
+{
+    if (!conn || protocol != PROTO_Z3950)
+       return 0;
+    send_initRequest(0);
+    return 2;
+}
+
 static int cmd_find(const char *arg)
 {
     if (!*arg)
@@ -3289,10 +3296,10 @@ static void handle_srw_record(Z_SRW_record *rec)
        printf (" schema=%s", rec->recordSchema);
     printf ("\n");
     if (rec->recordData_buf && rec->recordData_len)
-    {
        fwrite(rec->recordData_buf, 1, rec->recordData_len, stdout);
-       printf ("\n");
-    }
+    else
+       printf ("No data!");
+    printf("\n");
 }
 
 static void handle_srw_explain_response(Z_SRW_explainResponse *res)
@@ -3308,10 +3315,13 @@ static void handle_srw_response(Z_SRW_searchRetrieveResponse *res)
     
     for (i = 0; i<res->num_diagnostics; i++)
     {
-        printf ("SRW diagnostic %d %s\n",
-                *res->diagnostics[i].code,
-                yaz_diag_srw_str(*res->diagnostics[i].code));
-
+       if (res->diagnostics[i].uri)
+           printf ("SRW diagnostic %s\n",
+                   res->diagnostics[i].uri);
+       else
+           printf ("SRW diagnostic missing or could not be decoded\n");
+       if (res->diagnostics[i].message)
+            printf ("Message: %s\n", res->diagnostics[i].message);
        if (res->diagnostics[i].details)
             printf ("Details: %s\n", res->diagnostics[i].details);
     }
@@ -3813,7 +3823,10 @@ static struct {
     {"adm-shutdown", cmd_adm_shutdown, "",NULL,0,NULL},
     {"adm-startup", cmd_adm_startup, "",NULL,0,NULL},
     {"explain", cmd_explain, "", NULL, 0, NULL},
+    {"options", cmd_options, "", NULL, 0, NULL},
+    {"zversion", cmd_zversion, "", NULL, 0, NULL},
     {"help", cmd_help, "", NULL,0,NULL},
+    {"init", cmd_init, "", NULL,0,NULL},
     {0,0,0,0,0,0}
 };
 
@@ -4111,6 +4124,15 @@ int main(int argc, char **argv)
 #endif
     if (codeset)
        outputCharset = xstrdup(codeset);
+    
+    ODR_MASK_SET(&z3950_options, Z_Options_search);
+    ODR_MASK_SET(&z3950_options, Z_Options_present);
+    ODR_MASK_SET(&z3950_options, Z_Options_namedResultSets);
+    ODR_MASK_SET(&z3950_options, Z_Options_triggerResourceCtrl);
+    ODR_MASK_SET(&z3950_options, Z_Options_scan);
+    ODR_MASK_SET(&z3950_options, Z_Options_sort);
+    ODR_MASK_SET(&z3950_options, Z_Options_extendedServices);
+    ODR_MASK_SET(&z3950_options, Z_Options_delSet);
 
     while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:", argv, argc, &arg)) != -2)
     {