X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=b48fabe70b0f0096ccc9a8d0a143383ab8213189;hb=2fdf1cc871e6342d03460e703c8c3bb67b7f5267;hp=a224fcd25b63c5d05f072853ced2c88186ccf3b4;hpb=fc2093cfd23eda0ee8384b18dc7e7b8adffd073a;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index a224fcd..b48fabe 100644 --- a/client/client.c +++ b/client/client.c @@ -1,10 +1,18 @@ /* - * Copyright (c) 1995-1999, Index Data + * Copyright (c) 1995-2000, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: client.c,v $ - * Revision 1.92 1999-12-21 16:24:48 adam + * Revision 1.94 2000-01-31 13:15:21 adam + * Removed uses of assert(3). Cleanup of ODR. CCL parser update so + * that some characters are not surrounded by spaces in resulting term. + * ILL-code updates. + * + * Revision 1.93 2000/01/15 09:39:50 adam + * Implemented ill_get_ILLRequest. More ILL testing for client. + * + * Revision 1.92 1999/12/21 16:24:48 adam * More robust ISO2709 handling (in case of real bad formats). * * Revision 1.91 1999/12/16 23:36:19 adam @@ -305,7 +313,6 @@ #include #include #include -#include #include @@ -389,6 +396,7 @@ static void send_apdu(Z_APDU *a) odr_reset(print); } buf = odr_getbuf(out, &len, 0); + /* printf ("sending APDU of size %d\n", len); */ if (cs_put(conn, buf, len) < 0) { fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn))); @@ -997,7 +1005,11 @@ static int send_searchRequest(char *arg) case QueryType_CCL2RPN: query.which = Z_Query_type_1; RPNquery = ccl_rpn_query(out, rpn); - assert(RPNquery); + if (!RPNquery) + { + printf ("Couldn't convert from CCL to RPN\n"); + return 0; + } bib1.proto = protocol; bib1.oclass = CLASS_ATTSET; bib1.value = VAL_BIB1; @@ -1213,19 +1225,49 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) } #ifdef ASN_COMPILED + +const char *get_ill_element (void *clientData, const char *element) +{ + /* printf ("asking for %s\n", element); */ + if (!strcmp (element, "ill,transaction-id,transaction-group-qualifier")) + return "1"; + if (!strcmp (element, "ill,transaction-id,transaction-qualifier")) + return "1"; + return 0; +} + static Z_External *create_external_itemRequest() { - ILL_ItemRequest *req = ill_get_ItemRequest(out); + struct ill_get_ctl ctl; + ILL_ItemRequest *req; Z_External *r = 0; + int item_request_size = 0; + char *item_request_buf = 0; + + ctl.odr = out; + ctl.clientData = 0; + ctl.f = get_ill_element; + + req = ill_get_ItemRequest(&ctl, "ill", 0); if (!ill_ItemRequest (out, &req, 0, 0)) + { + if (apdu_file) + { + ill_ItemRequest(print, &req, 0, 0); + odr_reset(print); + } + item_request_buf = odr_getbuf (out, &item_request_size, 0); + if (item_request_buf) + odr_setbuf (out, item_request_buf, item_request_size, 1); + printf ("Couldn't encode ItemRequest, size %d\n", item_request_size); return 0; + } else { oident oid; - int itemRequest_size = 0; - char *itemRequest_buf = odr_getbuf (out, &itemRequest_size, 0); + item_request_buf = odr_getbuf (out, &item_request_size, 0); oid.proto = PROTO_GENERAL; oid.oclass = CLASS_GENERAL; oid.value = VAL_ISO_ILL_1; @@ -1238,11 +1280,12 @@ static Z_External *create_external_itemRequest() r->u.single_ASN1_type = (Odr_oct *) odr_malloc (out, sizeof(*r->u.single_ASN1_type)); - r->u.single_ASN1_type->buf = odr_malloc (out, itemRequest_size); - r->u.single_ASN1_type->len = itemRequest_size; - r->u.single_ASN1_type->size = itemRequest_size; - memcpy (r->u.single_ASN1_type->buf, itemRequest_buf, itemRequest_size); - printf ("len = %d\n", itemRequest_size); + r->u.single_ASN1_type->buf = odr_malloc (out, item_request_size); + r->u.single_ASN1_type->len = item_request_size; + r->u.single_ASN1_type->size = item_request_size; + memcpy (r->u.single_ASN1_type->buf, item_request_buf, + item_request_size); + printf ("len = %d\n", item_request_size); } return r; } @@ -1252,7 +1295,71 @@ static Z_External *create_external_itemRequest() return 0; } #endif -static Z_External *CreateItemOrderExternal(int itemno) + +#ifdef ASN_COMPILED +static Z_External *create_external_ILLRequest() +{ + struct ill_get_ctl ctl; + ILL_Request *req; + Z_External *r = 0; + int ill_request_size = 0; + char *ill_request_buf = 0; + + ctl.odr = out; + ctl.clientData = 0; + ctl.f = get_ill_element; + + req = ill_get_ILLRequest(&ctl, "ill", 0); + + if (!ill_Request (out, &req, 0, 0)) + { + if (apdu_file) + { + printf ("-------------------\n"); + ill_Request(print, &req, 0, 0); + odr_reset(print); + printf ("-------------------\n"); + } + ill_request_buf = odr_getbuf (out, &ill_request_size, 0); + if (ill_request_buf) + odr_setbuf (out, ill_request_buf, ill_request_size, 1); + printf ("Couldn't encode ILL-Request, size %d\n", ill_request_size); + return 0; + } + else + { + oident oid; + ill_request_buf = odr_getbuf (out, &ill_request_size, 0); + + oid.proto = PROTO_GENERAL; + oid.oclass = CLASS_GENERAL; + oid.value = VAL_ISO_ILL_1; + + r = (Z_External *) odr_malloc (out, sizeof(*r)); + r->direct_reference = odr_oiddup(out,oid_getoidbyent(&oid)); + r->indirect_reference = 0; + r->descriptor = 0; + r->which = Z_External_single; + + r->u.single_ASN1_type = (Odr_oct *) + odr_malloc (out, sizeof(*r->u.single_ASN1_type)); + r->u.single_ASN1_type->buf = odr_malloc (out, ill_request_size); + r->u.single_ASN1_type->len = ill_request_size; + r->u.single_ASN1_type->size = ill_request_size; + memcpy (r->u.single_ASN1_type->buf, ill_request_buf, ill_request_size); + printf ("len = %d\n", ill_request_size); + } + return r; +} +#else +static Z_External *create_external_ILLRequest() +{ + return 0; +} +#endif + + +static Z_External *create_ItemOrderExternal(const char *type, int itemno) { Z_External *r = (Z_External *) odr_malloc(out, sizeof(Z_External)); oident ItemOrderRequest; @@ -1299,34 +1406,37 @@ static Z_External *CreateItemOrderExternal(int itemno) (int *) odr_malloc(out, sizeof(int)); *r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item = itemno; - r->u.itemOrder->u.esRequest->notToKeep->itemRequest = - create_external_itemRequest(); + switch (*type) + { + case '2': + printf ("using item-request\n"); + r->u.itemOrder->u.esRequest->notToKeep->itemRequest = + create_external_itemRequest(); + break; + case '1': + printf ("using ILL-request\n"); + r->u.itemOrder->u.esRequest->notToKeep->itemRequest = + create_external_ILLRequest(); + break; + default: + r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0; + } return r; } -/* II : Added to do DALI Item Order Extended services request */ -static int send_itemorder(char *arg) +static int send_itemorder(const char *type, int itemno) { - 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 */ - - /* 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); + req->taskSpecificParameters = create_ItemOrderExternal(type, itemno); send_apdu(apdu); return 0; @@ -1392,10 +1502,15 @@ static int cmd_update(char *arg) /* II : Added to do DALI Item Order Extended services request */ static int cmd_itemorder(char *arg) { + char type[12]; + int itemno; + + if (sscanf (arg, "%10s %d", type, &itemno) != 2) + return 0; + printf("Item order request\n"); fflush(stdout); - - send_itemorder(arg); + send_itemorder(type, itemno); return(2); } @@ -2129,7 +2244,7 @@ static int client(int wait) {"attributeset", cmd_attributeset, ""}, {"querytype", cmd_querytype, ""}, {"refid", cmd_refid, ""}, - {"itemorder", cmd_itemorder, ""}, + {"itemorder", cmd_itemorder, "1|2 "}, {"update", cmd_update, ""}, {0,0} }; @@ -2237,6 +2352,8 @@ static int client(int wait) fprintf(stderr, "Packet dump:\n---------\n"); odr_dumpBER(stderr, netbuffer, res); fprintf(stderr, "---------\n"); + if (apdu_file) + z_APDU(print, &apdu, 0, 0); exit(1); } if (apdu_file && !z_APDU(print, &apdu, 0, 0))