+ 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_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 status=");
+ switch (*res->operationStatus)
+ {
+ case Z_ExtendedServicesResponse_done:
+ printf ("done\n");
+ break;
+ case Z_ExtendedServicesResponse_accepted:
+ printf ("accepted\n");
+ break;
+ case Z_ExtendedServicesResponse_failure:
+ printf ("failure\n");
+ display_diagrecs(res->diagnostics, res->num_diagnostics);
+ break;
+ }
+}
+
+#if YAZ_MODULE_ill
+
+const char *get_ill_element (void *clientData, const char *element)
+{
+ printf ("%s\n", element);
+ return 0;
+}
+
+static Z_External *create_external_itemRequest()
+{
+ 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 (!req)
+ printf ("ill_get_ItemRequest failed\n");
+
+ 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;
+
+ item_request_buf = odr_getbuf (out, &item_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 = (unsigned char *)
+ 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;
+}
+#endif
+
+#ifdef YAZ_MODULE_ill
+static Z_External *create_external_ILL_APDU(int which)
+{
+ struct ill_get_ctl ctl;
+ ILL_APDU *ill_apdu;
+ 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;
+
+ ill_apdu = ill_get_APDU(&ctl, "ill", 0);
+
+ if (!ill_APDU (out, &ill_apdu, 0, 0))
+ {
+ if (apdu_file)
+ {
+ printf ("-------------------\n");
+ ill_APDU(print, &ill_apdu, 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 = (unsigned char *)
+ 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;
+}
+#endif
+
+
+static Z_External *create_ItemOrderExternal(const char *type, int itemno)
+{
+ Z_External *r = (Z_External *) 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 = 0;
+ r->descriptor = 0;
+
+ r->which = Z_External_itemOrder;
+
+ r->u.itemOrder = (Z_ItemOrder *) odr_malloc(out,sizeof(Z_ItemOrder));
+ memset(r->u.itemOrder, 0, sizeof(Z_ItemOrder));
+#ifdef ASN_COMPILED
+ r->u.itemOrder->which=Z_IOItemOrder_esRequest;
+#else
+ r->u.itemOrder->which=Z_ItemOrder_esRequest;
+#endif
+
+ r->u.itemOrder->u.esRequest = (Z_IORequest *)
+ odr_malloc(out,sizeof(Z_IORequest));
+ memset(r->u.itemOrder->u.esRequest, 0, sizeof(Z_IORequest));
+
+ r->u.itemOrder->u.esRequest->toKeep = (Z_IOOriginPartToKeep *)
+ odr_malloc(out,sizeof(Z_IOOriginPartToKeep));
+ memset(r->u.itemOrder->u.esRequest->toKeep, 0, sizeof(Z_IOOriginPartToKeep));
+ r->u.itemOrder->u.esRequest->notToKeep = (Z_IOOriginPartNotToKeep *)
+ 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 =
+ (Z_IOResultSetItem *) 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 =
+ (int *) odr_malloc(out, sizeof(int));
+ *r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item = itemno;
+
+#if YAZ_MODULE_ill
+ if (!strcmp (type, "item") || !strcmp(type, "2"))
+ {
+ printf ("using item-request\n");
+ r->u.itemOrder->u.esRequest->notToKeep->itemRequest =
+ create_external_itemRequest();
+ }
+ else if (!strcmp(type, "ill") || !strcmp(type, "1"))
+ {
+ printf ("using ILL-request\n");
+ r->u.itemOrder->u.esRequest->notToKeep->itemRequest =
+ create_external_ILL_APDU(ILL_APDU_ILL_Request);
+ }
+ else if (!strcmp(type, "xml") || !strcmp(type, "3"))
+ {
+ const char *xml_buf =
+ "<itemorder>\n"
+ " <type>request</type>\n"
+ " <libraryNo>000200</libraryNo>\n"
+ " <borrowerTicketNo> 1212 </borrowerTicketNo>\n"
+ "</itemorder>";
+ r->u.itemOrder->u.esRequest->notToKeep->itemRequest =
+ z_ext_record (out, VAL_TEXT_XML, xml_buf, strlen(xml_buf));
+ }
+ else
+ r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0;
+
+#else
+ r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0;
+#endif
+ return r;
+}
+
+static int send_itemorder(const char *type, int itemno)
+{
+ Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest);
+ Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
+ oident ItemOrderRequest;
+
+ ItemOrderRequest.proto = PROTO_Z3950;
+ ItemOrderRequest.oclass = CLASS_EXTSERV;
+ ItemOrderRequest.value = VAL_ITEMORDER;
+ req->packageType = odr_oiddup(out,oid_getoidbyent(&ItemOrderRequest));
+ req->packageName = esPackageName;
+
+ req->taskSpecificParameters = create_ItemOrderExternal(type, itemno);
+
+ send_apdu(apdu);
+ return 0;
+}
+
+static int cmd_update(char *arg)
+{
+ Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest );
+ Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
+ Z_External *r;
+ int oid[OID_SIZE];
+ Z_IUOriginPartToKeep *toKeep;
+ Z_IUSuppliedRecords *notToKeep;
+ oident update_oid;
+ printf ("Update request\n");
+ fflush(stdout);
+
+ if (!record_last)
+ return 0;
+ update_oid.proto = PROTO_Z3950;
+ update_oid.oclass = CLASS_EXTSERV;
+ update_oid.value = VAL_DBUPDATE;
+ oid_ent_to_oid (&update_oid, oid);
+ req->packageType = odr_oiddup(out,oid);
+ req->packageName = esPackageName;
+
+ req->referenceId = set_refid (out);
+
+ r = req->taskSpecificParameters = (Z_External *)
+ odr_malloc (out, sizeof(*r));
+ r->direct_reference = odr_oiddup(out,oid);
+ r->indirect_reference = 0;
+ r->descriptor = 0;
+ r->which = Z_External_update;
+ r->u.update = (Z_IUUpdate *) odr_malloc(out, sizeof(*r->u.update));
+ r->u.update->which = Z_IUUpdate_esRequest;
+ r->u.update->u.esRequest = (Z_IUUpdateEsRequest *)
+ odr_malloc(out, sizeof(*r->u.update->u.esRequest));
+ toKeep = r->u.update->u.esRequest->toKeep = (Z_IUOriginPartToKeep *)
+ odr_malloc(out, sizeof(*r->u.update->u.esRequest->toKeep));
+ toKeep->databaseName = databaseNames[0];
+ toKeep->schema = 0;
+ toKeep->elementSetName = 0;
+ toKeep->actionQualifier = 0;
+ toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action));
+ *toKeep->action = Z_IUOriginPartToKeep_recordInsert;
+
+ notToKeep = r->u.update->u.esRequest->notToKeep = (Z_IUSuppliedRecords *)
+ odr_malloc(out, sizeof(*r->u.update->u.esRequest->notToKeep));
+ notToKeep->num = 1;
+ notToKeep->elements = (Z_IUSuppliedRecords_elem **)
+ odr_malloc(out, sizeof(*notToKeep->elements));
+ notToKeep->elements[0] = (Z_IUSuppliedRecords_elem *)
+ odr_malloc(out, sizeof(**notToKeep->elements));
+ notToKeep->elements[0]->u.number = 0;
+ notToKeep->elements[0]->supplementalId = 0;
+ notToKeep->elements[0]->correlationInfo = 0;
+ notToKeep->elements[0]->record = record_last;
+
+ send_apdu(apdu);
+
+ return 2;
+}
+
+/* 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(type, itemno);
+ return(2);
+}
+
+static int cmd_find(char *arg)
+{
+ if (!*arg)
+ {
+ printf("Find what?\n");
+ return 0;
+ }
+ if (!conn)
+ {
+ printf("Not connected yet\n");
+ return 0;