Minor changes.
[yaz-moved-to-github.git] / client / client.c
index 25c719c..9189e97 100644 (file)
@@ -4,7 +4,18 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.64  1998-03-31 11:07:44  adam
+ * Revision 1.67  1998-06-09 13:55:06  adam
+ * Minor changes.
+ *
+ * Revision 1.66  1998/05/18 13:06:53  adam
+ * Changed the way attribute sets are handled by the retriaval module.
+ * Extended Explain conversion / schema.
+ * Modified server and client to work with ASN.1 compiled protocol handlers.
+ *
+ * Revision 1.65  1998/03/31 15:13:19  adam
+ * Development towards compiled ASN.1.
+ *
+ * Revision 1.64  1998/03/31 11:07:44  adam
  * Furhter work on UNIverse resource report.
  * Added Extended Services handling in frontend server.
  *
@@ -249,8 +260,8 @@ static int largeSetLowerBound = 1;
 static int mediumSetPresentNumber = 0;
 static Z_ElementSetNames *elementSetNames = 0; 
 static int setno = 1;                   /* current set offset */
-static int protocol = PROTO_Z3950;      /* current app protocol */
-static int recordsyntax = VAL_USMARC;
+static enum oid_proto protocol = PROTO_Z3950;      /* current app protocol */
+static enum oid_value recordsyntax = VAL_USMARC;
 static int sent_close = 0;
 static ODR_MEM session_mem;             /* memory handle for init-response */
 static Z_InitResponse *session = 0;     /* session parameters */
@@ -371,10 +382,40 @@ static int process_initResponse(Z_InitResponse *res)
     return 0;
 }
 
+static int cmd_base(char *arg)
+{
+    int i;
+    char *cp;
+
+    if (!*arg)
+    {
+        printf("Usage: base <database> <database> ...\n");
+        return 0;
+    }
+    for (i = 0; i<num_databaseNames; i++)
+        xfree (databaseNames[i]);
+    num_databaseNames = 0;
+    while (1)
+    {
+        if (!(cp = strchr(arg, ' ')))
+            cp = arg + strlen(arg);
+        if (cp - arg < 1)
+            break;
+        databaseNames[num_databaseNames] = (char *)xmalloc (1 + cp - arg);
+        memcpy (databaseNames[num_databaseNames], arg, cp - arg);
+        databaseNames[num_databaseNames++][cp - arg] = '\0';
+        if (!*cp)
+            break;
+        arg = cp+1;
+    }
+    return 1;
+}
+
+
 int cmd_open(char *arg)
 {
     void *add;
-    char type[100], addr[100];
+    char type[100], addr[100], base[100];
     CS_TYPE t;
 
     if (conn)
@@ -382,11 +423,14 @@ int cmd_open(char *arg)
         printf("Already connected.\n");
         return 0;
     }
-    if (!*arg || sscanf(arg, "%[^:]:%s", type, addr) < 2)
+    base[0] = '\0';
+    if (!*arg || sscanf(arg, "%[^:]:%[^/]/%s", type, addr, base) < 2)
     {
         fprintf(stderr, "Usage: open (osi|tcp) ':' [tsel '/']host[':'port]\n");
         return 0;
     }
+    if (*base)
+        cmd_base (base);
     if (!strcmp(type, "tcp"))
     {
        t = tcpip_type;
@@ -579,7 +623,7 @@ static void display_record(Z_DatabaseRecord *p)
             * Note: we throw away the original, BER-encoded record here.
             * Do something else with it if you want to keep it.
             */
-           r->u.sutrs = (Odr_oct *)rr;    /* we don't actually check the type here. */
+           r->u.sutrs = (Z_SUTRS *) rr; /* we don't actually check the type here. */
            r->which = type->what;
        }
     }
@@ -643,10 +687,22 @@ static void display_diagrecs(Z_DiagRec **pp, int num)
            ent->oclass != CLASS_DIAGSET || ent->value != VAL_BIB1)
            printf("Missing or unknown diagset\n");
        printf("    [%d] %s", *r->condition, diagbib1_str(*r->condition));
+#ifdef ASN_COMPILED
+       switch (r->which)
+       {
+       case Z_DefaultDiagFormat_v2Addinfo:
+           printf (" -- v2 addinfo '%s'\n", r->u.v2Addinfo);
+           break;
+       case Z_DefaultDiagFormat_v3Addinfo:
+           printf (" -- v3 addinfo '%s'\n", r->u.v3Addinfo);
+           break;
+       }
+#else
        if (r->addinfo && *r->addinfo)
            printf(" -- '%s'\n", r->addinfo);
        else
            printf("\n");
+#endif
     }
 }
 
@@ -666,7 +722,16 @@ static void display_records(Z_Records *p)
     int i;
 
     if (p->which == Z_Records_NSD)
+    {
+#ifdef ASN_COMPILED
+       Z_DiagRec dr, *dr_p = &dr;
+       dr.which = Z_DiagRec_defaultFormat;
+       dr.u.defaultFormat = p->u.nonSurrogateDiagnostic;
+       display_diagrecs (&dr_p, 1);
+#else
        display_diagrecs (&p->u.nonSurrogateDiagnostic, 1);
+#endif
+    }
     else if (p->which == Z_Records_multipleNSD)
        display_diagrecs (p->u.multipleNonSurDiagnostics->diagRecs,
                          p->u.multipleNonSurDiagnostics->num_diagRecs);
@@ -685,7 +750,7 @@ static int send_searchRequest(char *arg)
     Z_Query query;
     int oid[OID_SIZE];
 #if CCL2RPN
-    struct ccl_rpn_node *rpn;
+    struct ccl_rpn_node *rpn = NULL;
     int error, pos;
     oident bib1;
 #endif
@@ -764,7 +829,8 @@ static int send_searchRequest(char *arg)
 #if CCL2RPN
     case QueryType_CCL2RPN:
         query.which = Z_Query_type_1;
-        assert((RPNquery = ccl_rpn_query(out, rpn)));
+        RPNquery = ccl_rpn_query(out, rpn);
+        assert(RPNquery);
         bib1.proto = protocol;
         bib1.oclass = CLASS_ATTSET;
         bib1.value = VAL_BIB1;
@@ -968,7 +1034,7 @@ void process_ESResponse(Z_ExtendedServicesResponse *res)
 
 static Z_External *CreateItemOrderExternal(int itemno)
 {
-    Z_External *r = odr_malloc(out, sizeof(Z_External));
+    Z_External *r = (Z_External *) odr_malloc(out, sizeof(Z_External));
     oident ItemOrderRequest;
   
     ItemOrderRequest.proto = PROTO_Z3950;
@@ -976,34 +1042,43 @@ static Z_External *CreateItemOrderExternal(int itemno)
     ItemOrderRequest.value = VAL_ITEMORDER;
  
     r->direct_reference = odr_oiddup(out,oid_getoidbyent(&ItemOrderRequest)); 
-    r->indirect_reference = odr_malloc(out,sizeof(int));
+    r->indirect_reference = (int *) odr_malloc(out,sizeof(int));
     *r->indirect_reference = 0;
 
     r->descriptor = "Extended services item order";
 
     r->which = Z_External_itemOrder;
 
-    r->u.itemOrder = odr_malloc(out,sizeof(Z_ItemOrder));
+    r->u.itemOrder = (Z_ItemOrder *) odr_malloc(out,sizeof(Z_ItemOrder));
     memset(r->u.itemOrder, 0, sizeof(Z_ItemOrder));
+#ifdef ASN_COMPILED
+    r->u.itemOrder->which=Z_IOItemOrder_esRequest;
+#else
     r->u.itemOrder->which=Z_ItemOrder_esRequest;
+#endif
 
-    r->u.itemOrder->u.esRequest = odr_malloc(out,sizeof(Z_IORequest));
+    r->u.itemOrder->u.esRequest = (Z_IORequest *) 
+       odr_malloc(out,sizeof(Z_IORequest));
     memset(r->u.itemOrder->u.esRequest, 0, sizeof(Z_IORequest));
 
-    r->u.itemOrder->u.esRequest->toKeep = odr_malloc(out,sizeof(Z_IOOriginPartToKeep));
+    r->u.itemOrder->u.esRequest->toKeep = (Z_IOOriginPartToKeep *)
+       odr_malloc(out,sizeof(Z_IOOriginPartToKeep));
     memset(r->u.itemOrder->u.esRequest->toKeep, 0, sizeof(Z_IOOriginPartToKeep));
-    r->u.itemOrder->u.esRequest->notToKeep = odr_malloc(out,sizeof(Z_IOOriginPartNotToKeep));
+    r->u.itemOrder->u.esRequest->notToKeep = (Z_IOOriginPartNotToKeep *)
+       odr_malloc(out,sizeof(Z_IOOriginPartNotToKeep));
     memset(r->u.itemOrder->u.esRequest->notToKeep, 0, sizeof(Z_IOOriginPartNotToKeep));
 
     r->u.itemOrder->u.esRequest->toKeep->supplDescription = NULL;
     r->u.itemOrder->u.esRequest->toKeep->contact = NULL;
     r->u.itemOrder->u.esRequest->toKeep->addlBilling = NULL;
 
-    r->u.itemOrder->u.esRequest->notToKeep->resultSetItem = odr_malloc(out, sizeof(Z_IOResultSetItem));
+    r->u.itemOrder->u.esRequest->notToKeep->resultSetItem =
+       (Z_IOResultSetItem *) odr_malloc(out, sizeof(Z_IOResultSetItem));
     memset(r->u.itemOrder->u.esRequest->notToKeep->resultSetItem, 0, sizeof(Z_IOResultSetItem));
     r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->resultSetId = "1";
 
-    r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item = odr_malloc(out, sizeof(int));
+    r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item =
+       (int *) odr_malloc(out, sizeof(int));
     *r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item = itemno;
 
     r->u.itemOrder->u.esRequest->notToKeep->itemRequest = NULL;
@@ -1024,7 +1099,7 @@ static int send_itemorder(char *arg)
     /* Set up item order request */
 
     /* Function being performed by this extended services request */
-    req->function = odr_malloc(out, sizeof(int));
+    req->function = (int *) odr_malloc(out, sizeof(int));
     *req->function = Z_ExtendedServicesRequest_create;
 
     /* Package type, Using protocol ILL ( But that's not in the oid.h file yet */
@@ -1101,35 +1176,6 @@ static int cmd_status(char *arg)
     return 1;
 }
 
-static int cmd_base(char *arg)
-{
-    int i;
-    char *cp;
-
-    if (!*arg)
-    {
-        printf("Usage: base <database> <database> ...\n");
-        return 0;
-    }
-    for (i = 0; i<num_databaseNames; i++)
-        xfree (databaseNames[i]);
-    num_databaseNames = 0;
-    while (1)
-    {
-        if (!(cp = strchr(arg, ' ')))
-            cp = arg + strlen(arg);
-        if (cp - arg < 1)
-            break;
-        databaseNames[num_databaseNames] = (char *)xmalloc (1 + cp - arg);
-        memcpy (databaseNames[num_databaseNames], arg, cp - arg);
-        databaseNames[num_databaseNames++][cp - arg] = '\0';
-        if (!*cp)
-            break;
-        arg = cp+1;
-    }
-    return 1;
-}
-
 static int cmd_setnames(char *arg)
 {
     if (setnumber < 0)
@@ -1276,12 +1322,16 @@ int send_scanrequest(char *string, int pp, int num)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest);
     Z_ScanRequest *req = apdu->u.scanRequest;
-
+    
+    if (!(req->termListAndStartPoint =
+         p_query_scan(out, protocol, &req->attributeSet, string)))
+    {
+       printf("Prefix query error\n");
+       return -1;
+    }
     req->referenceId = set_refid (out);
     req->num_databaseNames = num_databaseNames;
     req->databaseNames = databaseNames;
-    req->termListAndStartPoint = p_query_scan(out, protocol,
-                                              &req->attributeSet, string);
     req->numberOfTermsRequested = &num;
     req->preferredPositionInResponse = &pp;
     send_apdu(apdu);
@@ -1306,6 +1356,14 @@ int send_sortrequest(char *arg, int newset)
 
     req->referenceId = set_refid (out);
 
+#ifdef ASN_COMPILED
+    req->num_inputResultSetNames = 1;
+    req->inputResultSetNames = (Z_InternationalString **)
+       odr_malloc (out, sizeof(*req->inputResultSetNames));
+    req->inputResultSetNames[0] = (char *)
+       odr_malloc (out, strlen(setstring)+1);
+    strcpy (req->inputResultSetNames[0], setstring);
+#else
     req->inputResultSetNames =
        (Z_StringList *)odr_malloc (out, sizeof(*req->inputResultSetNames));
     req->inputResultSetNames->num_strings = 1;
@@ -1314,6 +1372,7 @@ int send_sortrequest(char *arg, int newset)
     req->inputResultSetNames->strings[0] =
        (char *)odr_malloc (out, strlen(setstring)+1);
     strcpy (req->inputResultSetNames->strings[0], setstring);
+#endif
 
     if (newset && setnumber >= 0)
        sprintf (setstring, "%d", ++setnumber);
@@ -1374,7 +1433,12 @@ int send_sortrequest(char *arg, int newset)
        sks->caseSensitivity = (int *)odr_malloc (out, sizeof(*sks->caseSensitivity));
        *sks->caseSensitivity = Z_SortCase_caseSensitive;
 
+#ifdef ASN_COMPILED
+       sks->which = Z_SortKeySpec_null;
+       sks->u.null = odr_nullval ();
+#else
        sks->missingValueAction = NULL;
+#endif
 
        for (i = 0; sort_flags[i]; i++)
        {
@@ -1426,6 +1490,8 @@ void display_term(Z_TermInfo *t)
 void process_scanResponse(Z_ScanResponse *res)
 {
     int i;
+    Z_Entry **entries = NULL;
+    int num_entries = 0;
    
     printf("Received ScanResponse\n"); 
     print_refid (res->referenceId);
@@ -1437,22 +1503,33 @@ void process_scanResponse(Z_ScanResponse *res)
         printf("Scan returned code %d\n", *res->scanStatus);
     if (!res->entries)
         return;
+#ifdef ASN_COMPILED
+    if ((entries = res->entries->entries))
+       num_entries = res->entries->num_entries;
+#else
     if (res->entries->which == Z_ListEntries_entries)
     {
-        Z_Entries *ent = res->entries->u.entries;
-
-        for (i = 0; i < ent->num_entries; i++)
-            if (ent->entries[i]->which == Z_Entry_termInfo)
-            {
-                printf("%c ", i + 1 == *res->positionOfTerm ? '*' : ' ');
-                display_term(ent->entries[i]->u.termInfo);
-            }
-            else
-                display_diagrecs(&ent->entries[i]->u.surrogateDiagnostic, 1);
+        entries = res->entries->u.entries->entries;
+       num_entries = res->entries->u.entries->num_entries;
     }
-    else
+#endif
+    for (i = 0; i < num_entries; i++)
+       if (entries[i]->which == Z_Entry_termInfo)
+       {
+           printf("%c ", i + 1 == *res->positionOfTerm ? '*' : ' ');
+           display_term(entries[i]->u.termInfo);
+       }
+       else
+           display_diagrecs(&entries[i]->u.surrogateDiagnostic, 1);
+#ifdef ASN_COMPILED
+    if (res->entries->nonsurrogateDiagnostics)
+       display_diagrecs (res->entries->nonsurrogateDiagnostics,
+                         res->entries->num_nonsurrogateDiagnostics);
+#else
+    if (res->entries->which == Z_ListEntries_nonSurrogateDiagnostics)
         display_diagrecs(&res->entries->
                         u.nonSurrogateDiagnostics->diagRecs[0], 1);
+#endif
 }
 
 void process_sortResponse(Z_SortResponse *res)
@@ -1471,9 +1548,15 @@ void process_sortResponse(Z_SortResponse *res)
     }
     printf ("\n");
     print_refid (res->referenceId);
+#ifdef ASN_COMPILED
+    if (res->diagnostics)
+        display_diagrecs(res->diagnostics,
+                        res->num_diagnostics);
+#else
     if (res->diagnostics)
         display_diagrecs(res->diagnostics->diagRecs,
                         res->diagnostics->num_diagRecs);
+#endif
 }
 
 int cmd_sort_generic(char *arg, int newset)
@@ -1804,6 +1887,8 @@ static int client(int wait)
                        display_records(apdu->u.presentResponse->records);
                    else
                        printf("No records.\n");
+                    printf ("nextResultSetPosition = %d\n",
+                       *apdu->u.presentResponse->nextResultSetPosition);
                    break;
                case Z_APDU_sortResponse:
                    process_sortResponse(apdu->u.sortResponse);