X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=5789d7c0ee5c23a0ee559b988d0dd1a460b21412;hb=62bcf7a811cd3151ac10f93317c9ddfa6b16f539;hp=4262079837761f2a4ed61449ae897b9fc840cece;hpb=d9ee01635f03f9095a66f71b73580560d48798e8;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 4262079..5789d7c 100644 --- a/client/client.c +++ b/client/client.c @@ -4,7 +4,16 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: client.c,v $ - * Revision 1.90 1999-11-30 13:47:11 adam + * 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 + * Implemented ILL protocol. Minor updates ASN.1 compiler. + * + * Revision 1.90 1999/11/30 13:47:11 adam * Improved installation. Moved header files to include/yaz. * * Revision 1.89 1999/11/04 14:58:44 adam @@ -314,6 +323,10 @@ #include +#ifdef ASN_COMPILED +#include +#endif + #if CCL2RPN #include #endif @@ -746,7 +759,13 @@ static void display_record(Z_DatabaseRecord *p) ent->value == VAL_HTML) print_record(octet_buf, p->u.octet_aligned->len); else - marc_display (octet_buf, NULL); + { + if (marc_display (octet_buf, NULL) <= 0) + { + printf ("ISO2709 decoding failed, dumping record as is:\n"); + print_record(octet_buf, p->u.octet_aligned->len); + } + } if (marcdump) fwrite (octet_buf, 1, p->u.octet_aligned->len, marcdump); } @@ -1196,7 +1215,90 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) } } -static Z_External *CreateItemOrderExternal(int itemno) +#ifdef ASN_COMPILED +static Z_External *create_external_itemRequest() +{ + ILL_ItemRequest *req = ill_get_ItemRequest(out); + Z_External *r = 0; + + if (!ill_ItemRequest (out, &req, 0, 0)) + return 0; + else + { + oident oid; + int itemRequest_size = 0; + char *itemRequest_buf = odr_getbuf (out, &itemRequest_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, 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); + } + return r; +} +#else +static Z_External *create_external_itemRequest() +{ + return 0; +} +#endif + +#ifdef ASN_COMPILED +static Z_External *create_external_ILLRequest() +{ + ILL_Request *req = ill_get_ILLRequest(out); + Z_External *r = 0; + + if (!ill_Request (out, &req, 0, 0)) + return 0; + else + { + oident oid; + int ill_request_size = 0; + char *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; @@ -1243,33 +1345,35 @@ 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 = NULL; + switch (*type) + { + case '2': + r->u.itemOrder->u.esRequest->notToKeep->itemRequest = + create_external_itemRequest(); + break; + case '1': + 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; @@ -1335,10 +1439,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; printf("Item order request\n"); fflush(stdout); - send_itemorder(arg); + if (sscanf (arg, "%10s %d", type, &itemno) != 2) + return 0; + + send_itemorder(type, itemno); return(2); } @@ -2072,7 +2181,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} };