X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=a224fcd25b63c5d05f072853ced2c88186ccf3b4;hb=fc2093cfd23eda0ee8384b18dc7e7b8adffd073a;hp=4d86ecae43873043d0193906e89bf07501b3cb46;hpb=b440dce0831a72bebe4f4821ab7771cc05e8facb;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 4d86eca..a224fcd 100644 --- a/client/client.c +++ b/client/client.c @@ -4,7 +4,23 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: client.c,v $ - * Revision 1.87 1999-08-27 09:40:32 adam + * 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 + * Added status elements for backend delete result set handler. + * Updated delete result result set command for client. + * + * Revision 1.88 1999/10/11 10:00:29 adam + * Modified printing of records. + * + * Revision 1.87 1999/08/27 09:40:32 adam * Renamed logf function to yaz_log. Removed VC++ project files. * * Revision 1.86 1999/07/06 12:13:35 adam @@ -291,21 +307,25 @@ #include #include -#include +#include -#include +#include #ifdef USE_XTIMOSI -#include +#include #endif -#include -#include -#include +#include +#include +#include + +#include -#include +#ifdef ASN_COMPILED +#include +#endif #if CCL2RPN -#include +#include #endif #if HAVE_READLINE_READLINE_H @@ -663,6 +683,19 @@ static void display_grs1(Z_GenericRecord *r, int level) } } +static void print_record(const unsigned char *buf, size_t len) +{ + size_t i; + for (i = 0; i= 32) || strchr ("\n\r\t\f", buf[i])) + fputc (buf[i], stdout); + else + printf ("\\X%02X", buf[i]); + /* add newline if not already added ... */ + if (i <= 0 || buf[i-1] != '\n') + fputc ('\n', stdout); +} + static void display_record(Z_DatabaseRecord *p) { Z_External *r = (Z_External*) p; @@ -715,23 +748,21 @@ static void display_record(Z_DatabaseRecord *p) } } if (ent && ent->value == VAL_SOIF) - printf("%.*s", r->u.octet_aligned->len, r->u.octet_aligned->buf); + print_record(r->u.octet_aligned->buf, r->u.octet_aligned->len); else if (r->which == Z_External_octet && p->u.octet_aligned->len) { const char *octet_buf = (char*)p->u.octet_aligned->buf; if (ent->value == VAL_TEXT_XML || ent->value == VAL_APPLICATION_XML || ent->value == VAL_HTML) - { - int i; - for (i = 0; iu.octet_aligned->len; i++) - if (octet_buf[i] > 126 || octet_buf[i] < 7) - printf ("<%02X>", octet_buf[i]); - else - fputc (octet_buf[i], stdout); - printf ("\n"); - } + 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); } @@ -742,7 +773,7 @@ static void display_record(Z_DatabaseRecord *p) printf("Expecting single SUTRS type for SUTRS.\n"); return; } - printf("%.*s", r->u.sutrs->len, r->u.sutrs->buf); + print_record(r->u.sutrs->buf, r->u.sutrs->len); } else if (ent && ent->value == VAL_GRS1) { @@ -844,18 +875,35 @@ static void display_records(Z_Records *p) static int send_deleteResultSetRequest(char *arg) { + char names[8][32]; + int i; + Z_APDU *apdu = zget_APDU(out, Z_APDU_deleteResultSetRequest); Z_DeleteResultSetRequest *req = apdu->u.deleteResultSetRequest; req->referenceId = set_refid (out); - req->num_resultSetList = 1; - req->resultSetList = (char **) - odr_malloc (out, sizeof(*req->resultSetList)); - *req->resultSetList = arg; + req->num_resultSetList = + sscanf (arg, "%30s %30s %30s %30s %30s %30s %30s %30s", + names[0], names[1], names[2], names[3], + names[4], names[5], names[6], names[7]); + req->deleteFunction = (int *) odr_malloc (out, sizeof(*req->deleteFunction)); - *req->deleteFunction = Z_DeleteRequest_list; + if (req->num_resultSetList > 0) + { + *req->deleteFunction = Z_DeleteRequest_list; + req->resultSetList = (char **) + odr_malloc (out, sizeof(*req->resultSetList)* + req->num_resultSetList); + for (i = 0; inum_resultSetList; i++) + req->resultSetList[i] = names[i]; + } + else + { + *req->deleteFunction = Z_DeleteRequest_all; + req->resultSetList = 0; + } send_apdu(apdu); printf("Sent deleteResultSetRequest.\n"); @@ -1164,6 +1212,46 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) } } +#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 static Z_External *CreateItemOrderExternal(int itemno) { Z_External *r = (Z_External *) odr_malloc(out, sizeof(Z_External)); @@ -1211,7 +1299,8 @@ 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; + r->u.itemOrder->u.esRequest->notToKeep->itemRequest = + create_external_itemRequest(); return r; } @@ -1329,11 +1418,6 @@ static int cmd_find(char *arg) static int cmd_delete(char *arg) { - if (!*arg) - { - printf("Delete what?\n"); - return 0; - } if (!conn) { printf("Not connected yet\n"); @@ -1799,6 +1883,21 @@ void process_sortResponse(Z_SortResponse *res) #endif } +void process_deleteResultSetResponse (Z_DeleteResultSetResponse *res) +{ + printf("Got deleteResultSetResponse status=%d\n", + *res->deleteOperationStatus); + if (res->deleteListStatuses) + { + int i; + for (i = 0; i < res->deleteListStatuses->num; i++) + { + printf ("%s status=%d\n", res->deleteListStatuses->elements[i]->id, + *res->deleteListStatuses->elements[i]->status); + } + } +} + int cmd_sort_generic(char *arg, int newset) { if (!conn) @@ -2184,9 +2283,8 @@ static int client(int wait) (apdu->u.resourceControlRequest); break; case Z_APDU_deleteResultSetResponse: - printf("Got deleteResultSetResponse status=%d\n", - *apdu->u.deleteResultSetResponse-> - deleteOperationStatus); + process_deleteResultSetResponse(apdu->u. + deleteResultSetResponse); break; default: printf("Received unknown APDU type (%d).\n",