Fidgeting.
[yaz-moved-to-github.git] / client / client.c
index de3740f..90438a6 100644 (file)
@@ -4,7 +4,34 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.21  1995-09-29 17:01:47  quinn
+ * Revision 1.30  1996-02-12 18:18:09  quinn
+ * Fidgeting.
+ *
+ * Revision 1.29  1996/01/02  08:57:25  quinn
+ * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass
+ *
+ * Revision 1.28  1995/12/14  11:09:31  quinn
+ * Added Explain record syntax to the format command.
+ *
+ * Revision 1.27  1995/12/12  16:37:02  quinn
+ * Added destroy element to data1_node.
+ *
+ * Revision 1.26  1995/12/12  14:11:00  quinn
+ * Minimal.
+ *
+ * Revision 1.25  1995/11/13  09:27:22  quinn
+ * Fiddling with the variant stuff.
+ *
+ * Revision 1.24  1995/10/30  12:41:13  quinn
+ * Added hostname lookup for server.
+ *
+ * Revision 1.23  1995/10/18  16:12:30  quinn
+ * Better diagnostics.
+ *
+ * Revision 1.22  1995/10/11  14:49:12  quinn
+ * Smallish.
+ *
+ * Revision 1.21  1995/09/29  17:01:47  quinn
  * More Windows work
  *
  * Revision 1.20  1995/08/29  14:24:13  quinn
@@ -124,6 +151,10 @@ static ODR_MEM session_mem;                /* memory handle for init-response */
 static Z_InitResponse *session = 0;        /* session parameters */
 static char last_scan[512] = "0";
 static char last_cmd[100] = "?";
+static oid_value attributeset = VAL_BIB1;
+static FILE *marcdump = 0;
+static char marcdump_file[512] = "marc.out";
+
 #ifdef RPN_QUERY
 #ifndef PREFIX_QUERY
 static CCL_bibset bibset;               /* CCL bibset handle */
@@ -166,6 +197,8 @@ static void send_initRequest()
     ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
     ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
 
+    *req->maximumRecordSize = 1024*1024;
+
     req->idAuthentication = auth;
 
     send_apdu(apdu);
@@ -289,7 +322,22 @@ int cmd_authentication(char *arg)
 
 /* SEARCH SERVICE ------------------------------ */
 
-void display_grs1(Z_GenericRecord *r, int level)
+static void display_variant(Z_Variant *v, int level)
+{
+    int i;
+
+    for (i = 0; i < v->num_triples; i++)
+    {
+       printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->class,
+           *v->triples[i]->type);
+       if (v->triples[i]->which == Z_Triple_internationalString)
+           printf(",value=%s\n", v->triples[i]->value.internationalString);
+       else
+           printf("\n");
+    }
+}
+
+static void display_grs1(Z_GenericRecord *r, int level)
 {
     int i;
 
@@ -317,12 +365,33 @@ void display_grs1(Z_GenericRecord *r, int level)
         }
         else if (t->content->which == Z_ElementData_string)
             printf("%s\n", t->content->u.string);
-        else
+        else if (t->content->which == Z_ElementData_numeric)
+           printf("%d\n", *t->content->u.numeric);
+       else if (t->content->which == Z_ElementData_noDataRequested)
+           printf("[No data requested]\n");
+       else if (t->content->which == Z_ElementData_elementEmpty)
+           printf("[Element empty]\n");
+       else if (t->content->which == Z_ElementData_elementNotThere)
+           printf("[Element not there]\n");
+       else
             printf("??????\n");
+       if (t->appliedVariant)
+           display_variant(t->appliedVariant, level+1);
+       if (t->metaData && t->metaData->supportedVariants)
+       {
+           int c;
+
+           printf("%*s---- variant list\n", (level+1)*4, "");
+           for (c = 0; c < t->metaData->num_supportedVariants; c++)
+           {
+               printf("%*svariant #%d\n", (level+1)*4, "", c);
+               display_variant(t->metaData->supportedVariants[c], level + 2);
+           }
+       }
     }
 }
 
-void display_record(Z_DatabaseRecord *p)
+static void display_record(Z_DatabaseRecord *p)
 {
     Z_External *r = (Z_External*) p;
     oident *ent = oid_getentbyoid(r->direct_reference);
@@ -339,7 +408,29 @@ void display_record(Z_DatabaseRecord *p)
         }
     }
     if (r->which == Z_External_octet && p->u.octet_aligned->len)
+    {
+#if 0
+       if (marcdump)
+           fwrite(p->u.octet_aligned->buf, p->u.octet_aligned->len, 1,
+               marcdump);
+#endif
+        static count = 0;
+        FILE *f;
+        char buf[256];
+
+        sprintf(buf, "marc.%d", count++);
+        if (!(f = fopen(buf, "w")))
+        {
+            perror(buf);
+            exit(1);
+
+        }
+        fwrite(p->u.octet_aligned->buf, p->u.octet_aligned->len, 1, f);
+        fclose(f);
+
+
         marc_display ((char*)p->u.octet_aligned->buf, stdout);
+    }
     else if (ent->value == VAL_SUTRS)
     {
         if (r->which != Z_External_sutrs)
@@ -389,7 +480,7 @@ static void display_diagrec(Z_DiagRec *p)
         r = p->u.defaultFormat;
 #endif
     if (!(ent = oid_getentbyoid(r->diagnosticSetId)) ||
-        ent->class != CLASS_DIAGSET || ent->value != VAL_BIB1)
+        ent->oclass != CLASS_DIAGSET || ent->value != VAL_BIB1)
         printf("Missing or unknown diagset\n");
     printf("    [%d] %s", *r->condition, diagbib1_str(*r->condition));
     if (r->addinfo && *r->addinfo)
@@ -479,7 +570,7 @@ static int send_searchRequest(char *arg)
         oident prefsyn;
 
         prefsyn.proto = protocol;
-        prefsyn.class = CLASS_RECSYN;
+        prefsyn.oclass = CLASS_RECSYN;
         prefsyn.value = recordsyntax;
         req->preferredRecordSyntax = odr_oiddup(out, oid_getoidbyent(&prefsyn));
         req->smallSetElementSetNames =
@@ -504,7 +595,7 @@ static int send_searchRequest(char *arg)
     }
 #endif
     bib1.proto = protocol;
-    bib1.class = CLASS_ATTSET;
+    bib1.oclass = CLASS_ATTSET;
     bib1.value = VAL_BIB1;
     RPNquery->attributeSetId = oid_getoidbyent(&bib1);
     query.u.type_1 = RPNquery;
@@ -637,7 +728,7 @@ static int send_presentRequest(char *arg)
     req->resultSetStartPoint = &setno;
     req->numberOfRecordsRequested = &nos;
     prefsyn.proto = protocol;
-    prefsyn.class = CLASS_RECSYN;
+    prefsyn.oclass = CLASS_RECSYN;
     prefsyn.value = recordsyntax;
     req->preferredRecordSyntax = oid_getoidbyent(&prefsyn);
     if (elementSetNames)
@@ -660,13 +751,13 @@ void process_close(Z_Close *req)
     {
         "finished",
         "shutdown",
-        "systemProblem",
-        "costLimit",
+        "system problem",
+        "cost limit reached",
         "resources",
-        "securityViolation",
+        "security violation",
         "protocolError",
-        "lackOfActivity",
-        "peerAbort",
+        "lack of activity",
+        "peer abort",
         "unspecified"
     };
 
@@ -731,7 +822,7 @@ int send_scanrequest(char *string, int pp, int num)
     req->num_databaseNames = 1;
     req->databaseNames = &db;
     attset.proto = protocol;
-    attset.class = CLASS_ATTSET;
+    attset.oclass = CLASS_ATTSET;
     attset.value = VAL_BIB1;
     req->attributeSet = oid_getoidbyent(&attset);
     req->termListAndStartPoint = p_query_scan(out, string);
@@ -835,6 +926,12 @@ int cmd_format(char *arg)
         recordsyntax = VAL_GRS1;
         return 1;
     }
+    else if (!strcmp(arg, "explain"))
+    {
+        printf("Preferred format is Explain\n");
+        recordsyntax = VAL_EXPLAIN;
+        return 1;
+    }
     else
     {
         printf("Specify one of {sutrs,usmarc,danmarc,grs1}.\n");
@@ -859,6 +956,26 @@ int cmd_elements(char *arg)
     return 1;
 }
 
+int cmd_attributeset(char *arg)
+{
+    char what[100];
+    oid_value v;
+
+    if (!arg || !*arg)
+    {
+       printf("Usage: attributeset <setname>\n");
+       return 0;
+    }
+    sscanf(arg, "%s", what);
+    if ((v = oid_getvalbyname(what)) == VAL_NONE)
+    {
+       printf("Unknown attribute set name\n");
+       return 0;
+    }
+    attributeset = v;
+    return 1;
+}
+
 int cmd_close(char *arg)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_close);
@@ -924,6 +1041,7 @@ static int client(void)
         {"format", cmd_format, "<recordsyntax>"},
         {"elements", cmd_elements, "<elementSetName>"},
         {"close", cmd_close, ""},
+       {"attributeset", cmd_attributeset, "<attrset>"},
         {0,0}
     };
     char *netbuffer= 0;
@@ -997,6 +1115,7 @@ static int client(void)
                 if (!z_APDU(in, &apdu, 0))
                 {
                     odr_perror(in, "Decoding incoming APDU");
+                   fprintf(stderr, "[Near %d]\n", odr_offset(in));
                     fprintf(stderr, "Packet dump:\n---------\n");
                     odr_dumpBER(stderr, netbuffer, res);
                     fprintf(stderr, "---------\n");
@@ -1039,7 +1158,7 @@ static int client(void)
                             apdu->which);
                         exit(1);
                 }
-                printf("Z> ");
+                printf(C_PROMPT);
                 fflush(stdout);
             }
             while (cs_more(conn));
@@ -1055,5 +1174,10 @@ int main(int argc, char **argv)
         cmd_open(argv[1]);
     else
         printf(C_PROMPT);
+    if (*marcdump_file && !(marcdump = fopen(marcdump_file, "a")))
+    {
+       perror(marcdump_file);
+       exit(1);
+    }
     return client();
 }