Furhter work on UNIverse resource report.
[yaz-moved-to-github.git] / client / client.c
index dfaf147..25c719c 100644 (file)
@@ -4,7 +4,17 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.61  1998-02-10 11:03:06  adam
+ * Revision 1.64  1998-03-31 11:07:44  adam
+ * Furhter work on UNIverse resource report.
+ * Added Extended Services handling in frontend server.
+ *
+ * Revision 1.63  1998/03/05 08:05:10  adam
+ * Added a few casts to make C++ happy.
+ *
+ * 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.
  *
@@ -293,9 +303,9 @@ static Z_ReferenceId *set_refid (ODR out)
     Z_ReferenceId *id;
     if (!refid)
        return 0;
-    id = odr_malloc (out, sizeof(*id));
+    id = (Z_ReferenceId *) odr_malloc (out, sizeof(*id));
     id->size = id->len = strlen(refid);
-    id->buf = odr_malloc (out, id->len);
+    id->buf = (unsigned char *) odr_malloc (out, id->len);
     memcpy (id->buf, refid, id->len);
     return id;
 }   
@@ -313,6 +323,7 @@ static void send_initRequest()
     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->protocolVersion, Z_ProtocolVersion_1);
     ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
@@ -554,7 +565,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));
@@ -568,7 +579,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;
        }
     }
@@ -790,13 +801,260 @@ static int process_searchResponse(Z_SearchResponse *res)
     return 0;
 }
 
+static void print_level(int iLevel)
+{
+    int i;
+    for (i = 0; i < iLevel * 4; i++)
+        printf(" ");
+}
+
+static void print_int(int iLevel, const char *pTag, int *pInt)
+{
+    if (pInt != NULL)
+    {
+        print_level(iLevel);
+        printf("%s: %d\n", pTag, *pInt);
+    }
+}
+
+static void print_string(int iLevel, const char *pTag, const char *pString)
+{
+    if (pString != NULL)
+    {
+        print_level(iLevel);
+        printf("%s: %s\n", pTag, pString);
+    }
+}
+
+static void print_oid(int iLevel, const char *pTag, Odr_oid *pOid)
+{
+    if (pOid != NULL)
+    {
+        int *pInt = pOid;
+
+        print_level(iLevel);
+        printf("%s:", pTag);
+        for (; *pInt != -1; pInt++)
+            printf(" %d", *pInt);
+        printf("\n");
+    }
+}
+
+static void print_referenceId(int iLevel, Z_ReferenceId *referenceId)
+{
+    if (referenceId != NULL)
+    {
+        int i;
+
+        print_level(iLevel);
+        printf("Ref Id (%d, %d): ", referenceId->len, referenceId->size);
+        for (i = 0; i < referenceId->len; i++)
+            printf("%c", referenceId->buf[i]);
+        printf("\n");
+    }
+}
+
+static void print_string_or_numeric(int iLevel, const char *pTag, Z_StringOrNumeric *pStringNumeric)
+{
+    if (pStringNumeric != NULL)
+    {
+        switch (pStringNumeric->which)
+        {
+            case Z_StringOrNumeric_string:
+                print_string(iLevel, pTag, pStringNumeric->u.string);
+                break;
+
+            case Z_StringOrNumeric_numeric:
+                print_int(iLevel, pTag, pStringNumeric->u.numeric);
+                break;
+
+            default:
+                print_level(iLevel);
+                printf("%s: valid type for Z_StringOrNumeric\n", pTag);
+                break;
+        }
+    }
+}
+
+static void print_universe_report_duplicate(int iLevel, Z_UniverseReportDuplicate *pUniverseReportDuplicate)
+{
+    if (pUniverseReportDuplicate != NULL)
+    {
+        print_level(iLevel);
+        printf("Universe Report Duplicate: \n");
+        iLevel++;
+        print_string_or_numeric(iLevel, "Hit No", pUniverseReportDuplicate->hitno);
+    }
+}
+
+static void print_universe_report_hits(int iLevel, Z_UniverseReportHits *pUniverseReportHits)
+{
+    if (pUniverseReportHits != NULL)
+    {
+        print_level(iLevel);
+        printf("Universe Report Hits: \n");
+        iLevel++;
+        print_string_or_numeric(iLevel, "Database", pUniverseReportHits->database);
+        print_string_or_numeric(iLevel, "Hits", pUniverseReportHits->hits);
+    }
+}
+
+static void print_universe_report(int iLevel, Z_UniverseReport *pUniverseReport)
+{
+    if (pUniverseReport != NULL)
+    {
+        print_level(iLevel);
+        printf("Universe Report: \n");
+        iLevel++;
+        print_int(iLevel, "Total Hits", pUniverseReport->totalHits);
+        switch (pUniverseReport->which)
+        {
+            case Z_UniverseReport_databaseHits:
+                print_universe_report_hits(iLevel, pUniverseReport->u.databaseHits);
+                break;
+
+            case Z_UniverseReport_duplicate:
+                print_universe_report_duplicate(iLevel, pUniverseReport->u.duplicate);
+                break;
+
+            default:
+                print_level(iLevel);
+                printf("Type: %d\n", pUniverseReport->which);
+                break;
+        }
+    }
+}
+
+static void print_external(int iLevel, Z_External *pExternal)
+{
+    if (pExternal != NULL)
+    {
+        print_level(iLevel);
+        printf("External: \n");
+        iLevel++;
+        print_oid(iLevel, "Direct Reference", pExternal->direct_reference);
+        print_int(iLevel, "InDirect Reference", pExternal->indirect_reference);
+        print_string(iLevel, "Descriptor", pExternal->descriptor);
+        switch (pExternal->which)
+        {
+            case Z_External_universeReport:
+                print_universe_report(iLevel, pExternal->u.universeReport);
+                break;
+
+            default:
+                print_level(iLevel);
+                printf("Type: %d\n", pExternal->which);
+                break;
+        }
+    }
+}
+
 static int process_resourceControlRequest (Z_ResourceControlRequest *req)
 {
     printf ("Received ResourceControlRequest.\n");
-    print_refid (req->referenceId);
+    print_referenceId(1, req->referenceId);
+    print_int(1, "Suspended Flag", req->suspendedFlag);
+    print_int(1, "Partial Results Available", req->partialResultsAvailable);
+    print_int(1, "Response Required", req->responseRequired);
+    print_int(1, "Triggered Request Flag", req->triggeredRequestFlag);
+    print_external(1, req->resourceReport);
     return 0;
 }
 
+void process_ESResponse(Z_ExtendedServicesResponse *res)
+{
+    printf("process_ESResponse\n");
+}
+
+static Z_External *CreateItemOrderExternal(int itemno)
+{
+    Z_External *r = odr_malloc(out, sizeof(Z_External));
+    oident ItemOrderRequest;
+  
+    ItemOrderRequest.proto = PROTO_Z3950;
+    ItemOrderRequest.oclass = CLASS_EXTSERV;
+    ItemOrderRequest.value = VAL_ITEMORDER;
+    r->direct_reference = odr_oiddup(out,oid_getoidbyent(&ItemOrderRequest)); 
+    r->indirect_reference = 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));
+    memset(r->u.itemOrder, 0, sizeof(Z_ItemOrder));
+    r->u.itemOrder->which=Z_ItemOrder_esRequest;
+
+    r->u.itemOrder->u.esRequest = 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));
+    memset(r->u.itemOrder->u.esRequest->toKeep, 0, sizeof(Z_IOOriginPartToKeep));
+    r->u.itemOrder->u.esRequest->notToKeep = 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));
+    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 = itemno;
+
+    r->u.itemOrder->u.esRequest->notToKeep->itemRequest = NULL;
+    return r;
+}
+
+/* II : Added to do DALI Item Order Extended services request */
+static int send_itemorder(char *arg)
+{
+    int itemno = -1;
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest );
+    Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
+    oident ItemOrderRequest;
+
+    if (*arg)
+        itemno = atoi(arg);
+
+    /* Set up item order request */
+
+    /* Function being performed by this extended services request */
+    req->function = 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 */
+    /* create an object of class Extended Service, value Item Order            */
+    ItemOrderRequest.proto = PROTO_Z3950;
+    ItemOrderRequest.oclass = CLASS_EXTSERV;
+    ItemOrderRequest.value = VAL_ITEMORDER;
+    req->packageType = odr_oiddup(out,oid_getoidbyent(&ItemOrderRequest));
+    req->packageName = "1.Extendedserveq";
+
+    /* ** taskSpecificParameters ** */
+    req->taskSpecificParameters = CreateItemOrderExternal(itemno);
+
+    /* waitAction - Create the ILL request and that's it */
+    *req->waitAction = Z_ExtendedServicesRequest_wait;
+
+    send_apdu(apdu);
+    return 0;
+}
+
+/* II : Added to do DALI Item Order Extended services request */
+static int cmd_itemorder(char *arg)
+{
+    printf("Item order request\n");
+    fflush(stdout);
+
+    send_itemorder(arg);
+    return(1);
+}
+
 static int cmd_find(char *arg)
 {
     if (!*arg)
@@ -862,7 +1120,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)
@@ -1034,7 +1292,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;
@@ -1049,23 +1307,23 @@ int send_sortrequest(char *arg, int newset)
     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;
@@ -1075,45 +1333,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;
@@ -1352,7 +1610,7 @@ int cmd_refid (char *arg)
     refid = NULL;
     if (*arg)
     {
-       refid = xmalloc (strlen(arg)+1);
+       refid = (char *) xmalloc (strlen(arg)+1);
        strcpy (refid, arg);
     }
     return 1;
@@ -1424,6 +1682,7 @@ static int client(int wait)
        {"attributeset", cmd_attributeset, "<attrset>"},
         {"querytype", cmd_querytype, "<type>"},
        {"refid", cmd_refid, "<id>"},
+       {"itemorder", cmd_itemorder, "<item>"},
         {0,0}
     };
     char *netbuffer= 0;
@@ -1549,6 +1808,10 @@ static int client(int wait)
                case Z_APDU_sortResponse:
                    process_sortResponse(apdu->u.sortResponse);
                    break;
+                case Z_APDU_extendedServicesResponse:
+                    printf("Got extended services response\n");
+                    process_ESResponse(apdu->u.extendedServicesResponse);
+                    break;
                case Z_APDU_close:
                    printf("Target has closed the association.\n");
                    process_close(apdu->u.close);
@@ -1606,3 +1869,5 @@ int main(int argc, char **argv)
         printf (C_PROMPT);
     return client (opened);
 }
+
+