* 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.
*
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;
}
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);
*/
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));
* 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;
}
}
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)
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)
{
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;
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;
{
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;
refid = NULL;
if (*arg)
{
- refid = xmalloc (strlen(arg)+1);
+ refid = (char *) xmalloc (strlen(arg)+1);
strcpy (refid, arg);
}
return 1;
{"attributeset", cmd_attributeset, "<attrset>"},
{"querytype", cmd_querytype, "<type>"},
{"refid", cmd_refid, "<id>"},
+ {"itemorder", cmd_itemorder, "<item>"},
{0,0}
};
char *netbuffer= 0;
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);
printf (C_PROMPT);
return client (opened);
}
+
+