Changed code so that it compiles as C++.
[yaz-moved-to-github.git] / client / client.c
index 830ac8f..dc06c98 100644 (file)
@@ -4,7 +4,14 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.60  1998-01-29 14:08:52  adam
+ * Revision 1.62  1998-02-11 11:53:33  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.61  1998/02/10 11:03:06  adam
+ * Implemented command refid. Client prints reference-ID's, when present,
+ * in responses.
+ *
+ * Revision 1.60  1998/01/29 14:08:52  adam
  * Better sort diagnostics.
  *
  * Revision 1.59  1998/01/29 13:17:56  adam
@@ -243,6 +250,7 @@ static Z_InitResponse *session = 0;     /* session parameters */
 static char last_scan[512] = "0";
 static char last_cmd[100] = "?";
 static FILE *marcdump = 0;
+static char *refid = NULL;
 
 typedef enum {
     QueryType_Prefix,
@@ -267,14 +275,34 @@ static void send_apdu(Z_APDU *a)
         exit(1);
     }
     buf = odr_getbuf(out, &len, 0);
-    odr_reset(out); /* release the APDU structure  */
     if (cs_put(conn, buf, len) < 0)
     {
         fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn)));
         exit(1);
     }
+    odr_reset(out); /* release the APDU structure  */
+}
+
+static void print_refid (Z_ReferenceId *id)
+{
+    if (id)
+    {
+       printf ("ReferenceId: '%.*s'\n", id->len, id->buf);
+    }
 }
 
+static Z_ReferenceId *set_refid (ODR out)
+{
+    Z_ReferenceId *id;
+    if (!refid)
+       return 0;
+    id = odr_malloc (out, sizeof(*id));
+    id->size = id->len = strlen(refid);
+    id->buf = odr_malloc (out, id->len);
+    memcpy (id->buf, refid, id->len);
+    return id;
+}   
+
 /* INIT SERVICE ------------------------------- */
 
 static void send_initRequest()
@@ -529,7 +557,7 @@ static void display_record(Z_DatabaseRecord *p)
             */
            odr_setbuf(in, (char*)p->u.octet_aligned->buf,
                p->u.octet_aligned->len, 0);
-           if (!(*type->fun)(in, &rr, 0))
+           if (!(*type->fun)(in, (char **)&rr, 0))
            {
                odr_perror(in, "Decoding constructed record.");
                fprintf(stderr, "[Near %d]\n", odr_offset(in));
@@ -543,7 +571,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 = rr;    /* we don't actually check the type here. */
+           r->u.sutrs = (Odr_oct *)rr;    /* we don't actually check the type here. */
            r->which = type->what;
        }
     }
@@ -668,7 +696,7 @@ static int send_searchRequest(char *arg)
         }
     }
 #endif
-
+    req->referenceId = set_refid (out);
     if (!strcmp(arg, "@big")) /* strictly for troublemaking */
     {
         static unsigned char big[2100];
@@ -680,7 +708,7 @@ static int send_searchRequest(char *arg)
         bigo.buf = big;
         req->referenceId = &bigo;
     }
-
+    
     if (setnumber >= 0)
     {
         sprintf(setstring, "%d", ++setnumber);
@@ -749,6 +777,8 @@ static int send_searchRequest(char *arg)
 
 static int process_searchResponse(Z_SearchResponse *res)
 {
+    printf ("Received SearchResponse.\n");
+    print_refid (res->referenceId);
     if (*res->searchStatus)
         printf("Search was a success.\n");
     else
@@ -763,6 +793,13 @@ static int process_searchResponse(Z_SearchResponse *res)
     return 0;
 }
 
+static int process_resourceControlRequest (Z_ResourceControlRequest *req)
+{
+    printf ("Received ResourceControlRequest.\n");
+    print_refid (req->referenceId);
+    return 0;
+}
+
 static int cmd_find(char *arg)
 {
     if (!*arg)
@@ -828,7 +865,7 @@ static int cmd_base(char *arg)
             cp = arg + strlen(arg);
         if (cp - arg < 1)
             break;
-        databaseNames[num_databaseNames] = xmalloc (1 + cp - arg);
+        databaseNames[num_databaseNames] = (char *)xmalloc (1 + cp - arg);
         memcpy (databaseNames[num_databaseNames], arg, cp - arg);
         databaseNames[num_databaseNames++][cp - arg] = '\0';
         if (!*cp)
@@ -866,6 +903,7 @@ static int send_presentRequest(char *arg)
     char *p;
     char setstring[100];
 
+    req->referenceId = set_refid (out);
     if ((p = strchr(arg, '+')))
     {
         nos = atoi(p + 1);
@@ -984,6 +1022,7 @@ int send_scanrequest(char *string, int pp, int num)
     Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest);
     Z_ScanRequest *req = apdu->u.scanRequest;
 
+    req->referenceId = set_refid (out);
     req->num_databaseNames = num_databaseNames;
     req->databaseNames = databaseNames;
     req->termListAndStartPoint = p_query_scan(out, protocol,
@@ -998,7 +1037,7 @@ int send_sortrequest(char *arg, int newset)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_sortRequest);
     Z_SortRequest *req = apdu->u.sortRequest;
-    Z_SortKeySpecList *sksl = odr_malloc (out, sizeof(*sksl));
+    Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)odr_malloc (out, sizeof(*sksl));
     char setstring[32];
     char sort_string[32], sort_flags[32];
     int off;
@@ -1010,24 +1049,26 @@ int send_sortrequest(char *arg, int newset)
     else
        sprintf (setstring, "default");
 
+    req->referenceId = set_refid (out);
+
     req->inputResultSetNames =
-       odr_malloc (out, sizeof(*req->inputResultSetNames));
+       (Z_StringList *)odr_malloc (out, sizeof(*req->inputResultSetNames));
     req->inputResultSetNames->num_strings = 1;
     req->inputResultSetNames->strings =
-       odr_malloc (out, sizeof(*req->inputResultSetNames->strings));
+       (char **)odr_malloc (out, sizeof(*req->inputResultSetNames->strings));
     req->inputResultSetNames->strings[0] =
-       odr_malloc (out, strlen(setstring)+1);
+       (char *)odr_malloc (out, strlen(setstring)+1);
     strcpy (req->inputResultSetNames->strings[0], setstring);
 
     if (newset && setnumber >= 0)
        sprintf (setstring, "%d", ++setnumber);
 
-    req->sortedResultSetName = odr_malloc (out, strlen(setstring)+1);
+    req->sortedResultSetName = (char *)odr_malloc (out, strlen(setstring)+1);
     strcpy (req->sortedResultSetName, setstring);
 
     req->sortSequence = sksl;
     sksl->num_specs = 0;
-    sksl->specs = odr_malloc (out, sizeof(sksl->specs) * 20);
+    sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20);
     
     bib1.proto = protocol;
     bib1.oclass = CLASS_ATTSET;
@@ -1037,45 +1078,45 @@ int send_sortrequest(char *arg, int newset)
     {
        int i;
        char *sort_string_sep;
-       Z_SortKeySpec *sks = odr_malloc (out, sizeof(*sks));
-       Z_SortKey *sk = odr_malloc (out, sizeof(*sk));
+       Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks));
+       Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk));
 
        arg += off;
        sksl->specs[sksl->num_specs++] = sks;
-       sks->sortElement = odr_malloc (out, sizeof(*sks->sortElement));
+       sks->sortElement = (Z_SortElement *)odr_malloc (out, sizeof(*sks->sortElement));
        sks->sortElement->which = Z_SortElement_generic;
        sks->sortElement->u.generic = sk;
        
        if ((sort_string_sep = strchr (sort_string, '=')))
        {
-           Z_AttributeElement *el = odr_malloc (out, sizeof(*el));
+           Z_AttributeElement *el = (Z_AttributeElement *)odr_malloc (out, sizeof(*el));
            sk->which = Z_SortKey_sortAttributes;
            sk->u.sortAttributes =
-               odr_malloc (out, sizeof(*sk->u.sortAttributes));
+               (Z_SortAttributes *)odr_malloc (out, sizeof(*sk->u.sortAttributes));
            sk->u.sortAttributes->id = oid_ent_to_oid(&bib1, oid);
            sk->u.sortAttributes->list =
-               odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
+               (Z_AttributeList *)odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
            sk->u.sortAttributes->list->num_attributes = 1;
            sk->u.sortAttributes->list->attributes =
-               odr_malloc (out,
+               (Z_AttributeElement **)odr_malloc (out,
                            sizeof(*sk->u.sortAttributes->list->attributes));
            sk->u.sortAttributes->list->attributes[0] = el;
            el->attributeSet = 0;
-           el->attributeType = odr_malloc (out, sizeof(*el->attributeType));
+           el->attributeType = (int *)odr_malloc (out, sizeof(*el->attributeType));
            *el->attributeType = atoi (sort_string);
            el->which = Z_AttributeValue_numeric;
-           el->value.numeric = odr_malloc (out, sizeof(*el->value.numeric));
+           el->value.numeric = (int *)odr_malloc (out, sizeof(*el->value.numeric));
            *el->value.numeric = atoi (sort_string_sep + 1);
        }
        else
        {
            sk->which = Z_SortKey_sortField;
-           sk->u.sortField = odr_malloc (out, strlen(sort_string)+1);
+           sk->u.sortField = (char *)odr_malloc (out, strlen(sort_string)+1);
            strcpy (sk->u.sortField, sort_string);
        }
-       sks->sortRelation = odr_malloc (out, sizeof(*sks->sortRelation));
+       sks->sortRelation = (int *)odr_malloc (out, sizeof(*sks->sortRelation));
        *sks->sortRelation = Z_SortRelation_ascending;
-       sks->caseSensitivity = odr_malloc (out, sizeof(*sks->caseSensitivity));
+       sks->caseSensitivity = (int *)odr_malloc (out, sizeof(*sks->caseSensitivity));
        *sks->caseSensitivity = Z_SortCase_caseSensitive;
 
        sks->missingValueAction = NULL;
@@ -1130,9 +1171,13 @@ void display_term(Z_TermInfo *t)
 void process_scanResponse(Z_ScanResponse *res)
 {
     int i;
-
-    printf("SCAN: %d entries, position=%d\n", *res->numberOfEntriesReturned,
-        *res->positionOfTerm);
+   
+    printf("Received ScanResponse\n"); 
+    print_refid (res->referenceId);
+    printf("%d entries", *res->numberOfEntriesReturned);
+    if (res->positionOfTerm)
+       printf (", position=%d", *res->positionOfTerm); 
+    printf ("\n");
     if (*res->scanStatus != Z_Scan_success)
         printf("Scan returned code %d\n", *res->scanStatus);
     if (!res->entries)
@@ -1157,7 +1202,7 @@ void process_scanResponse(Z_ScanResponse *res)
 
 void process_sortResponse(Z_SortResponse *res)
 {
-    printf("Sort: status=");
+    printf("Received SortResponse: status=");
     switch (*res->sortStatus)
     {
     case Z_SortStatus_success:
@@ -1170,6 +1215,7 @@ void process_sortResponse(Z_SortResponse *res)
        printf ("unknown (%d)", *res->sortStatus);
     }
     printf ("\n");
+    print_refid (res->referenceId);
     if (res->diagnostics)
         display_diagrecs(res->diagnostics->diagRecs,
                         res->diagnostics->num_diagRecs);
@@ -1303,6 +1349,18 @@ int cmd_querytype (char *arg)
     return 1;
 }
 
+int cmd_refid (char *arg)
+{
+    xfree (refid);
+    refid = NULL;
+    if (*arg)
+    {
+       refid = xmalloc (strlen(arg)+1);
+       strcpy (refid, arg);
+    }
+    return 1;
+}
+
 int cmd_close(char *arg)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_close);
@@ -1368,6 +1426,7 @@ static int client(int wait)
         {"close", cmd_close, ""},
        {"attributeset", cmd_attributeset, "<attrset>"},
         {"querytype", cmd_querytype, "<type>"},
+       {"refid", cmd_refid, "<id>"},
         {0,0}
     };
     char *netbuffer= 0;
@@ -1434,6 +1493,7 @@ static int client(int wait)
                continue;
            }
         }
+       wait = 0;
 #ifdef USE_SELECT
         if (conn && FD_ISSET(cs_fileno(conn), &input))
 #endif
@@ -1481,6 +1541,7 @@ static int client(int wait)
                    process_scanResponse(apdu->u.scanResponse);
                    break;
                case Z_APDU_presentResponse:
+                    print_refid (apdu->u.presentResponse->referenceId);
                    setno +=
                        *apdu->u.presentResponse->numberOfRecordsReturned;
                    if (apdu->u.presentResponse->records)
@@ -1495,17 +1556,20 @@ static int client(int wait)
                    printf("Target has closed the association.\n");
                    process_close(apdu->u.close);
                    break;
+               case Z_APDU_resourceControlRequest:
+                   process_resourceControlRequest
+                       (apdu->u.resourceControlRequest);
+                   break;
                default:
                    printf("Received unknown APDU type (%d).\n", 
                           apdu->which);
                    exit(1);
                 }
-                printf(C_PROMPT);
-                fflush(stdout);
             }
             while (cs_more(conn));
+           printf(C_PROMPT);
+           fflush(stdout);
         }
-       wait = 0;
     }
     return 0;
 }