2 * Copyright (c) 1999-2001, Index Data.
3 * See the file LICENSE for details.
6 * Revision 1.9 2001-03-25 21:55:12 adam
7 * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate.
9 * Revision 1.8 2001/02/21 13:46:53 adam
12 * Revision 1.7 2001/02/20 11:25:32 adam
13 * Added ill_get_APDU and ill_get_Cancel.
15 * Revision 1.6 2000/08/10 08:41:26 adam
18 * Revision 1.5 2000/02/24 08:52:01 adam
21 * Revision 1.4 2000/02/04 11:01:15 adam
22 * Added more elements.
24 * Revision 1.3 2000/01/31 13:15:21 adam
25 * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
26 * that some characters are not surrounded by spaces in resulting term.
29 * Revision 1.2 2000/01/15 09:38:51 adam
30 * Implemented ill_get_ILLRequest. Added some type mappings for ILL protocol.
32 * Revision 1.1 1999/12/16 23:36:19 adam
33 * Implemented ILL protocol. Minor updates ASN.1 compiler.
39 bool_t *ill_get_bool (struct ill_get_ctl *gc, const char *name,
40 const char *sub, int val)
45 bool_t *r = (bool_t *) odr_malloc (o, sizeof(*r));
47 strcpy(element, name);
50 strcat (element, ",");
51 strcat (element, sub);
54 v = (gc->f)(gc->clientData, element);
63 int *ill_get_int (struct ill_get_ctl *gc, const char *name,
64 const char *sub, int val)
70 strcpy(element, name);
73 strcat (element, ",");
74 strcat (element, sub);
76 v = (gc->f)(gc->clientData, element);
79 return odr_intdup(o, val);
82 int *ill_get_enumerated (struct ill_get_ctl *gc, const char *name,
83 const char *sub, int val)
85 return ill_get_int(gc, name, sub, val);
88 ILL_String *ill_get_ILL_String_x (struct ill_get_ctl *gc, const char *name,
89 const char *sub, const char *vdefault)
91 ILL_String *r = (ILL_String *) odr_malloc (gc->odr, sizeof(*r));
95 strcpy(element, name);
98 strcat (element, ",");
99 strcat (element, sub);
101 v = (gc->f)(gc->clientData, element);
106 r->which = ILL_String_GeneralString;
107 r->u.GeneralString = odr_strdup (gc->odr, v);
111 ILL_String *ill_get_ILL_String(struct ill_get_ctl *gc, const char *name,
114 return ill_get_ILL_String_x (gc, name, sub, 0);
117 ILL_ISO_Date *ill_get_ILL_ISO_Date (struct ill_get_ctl *gc, const char *name,
118 const char *sub, const char *val)
123 strcpy(element, name);
126 strcat (element, ",");
127 strcat (element, sub);
129 v = (gc->f)(gc->clientData, element);
134 return odr_strdup (gc->odr, v);
137 ILL_ISO_Time *ill_get_ILL_ISO_Time (struct ill_get_ctl *gc, const char *name,
138 const char *sub, const char *val)
143 strcpy(element, name);
146 strcat (element, ",");
147 strcat (element, sub);
149 v = (gc->f)(gc->clientData, element);
154 return odr_strdup (gc->odr, v);
157 ILL_Person_Or_Institution_Symbol *ill_get_Person_Or_Insitution_Symbol (
158 struct ill_get_ctl *gc, const char *name, const char *sub)
162 ILL_Person_Or_Institution_Symbol *p =
163 (ILL_Person_Or_Institution_Symbol *) odr_malloc (o, sizeof(*p));
165 strcpy(element, name);
168 strcat (element, ",");
169 strcat (element, sub);
171 p->which = ILL_Person_Or_Institution_Symbol_person_symbol;
172 if ((p->u.person_symbol = ill_get_ILL_String (gc, element, "person")))
175 p->which = ILL_Person_Or_Institution_Symbol_institution_symbol;
176 if ((p->u.institution_symbol =
177 ill_get_ILL_String (gc, element, "institution")))
182 static ILL_Name_Of_Person_Or_Institution *ill_get_Name_Of_Person_Or_Institution(
183 struct ill_get_ctl *gc, const char *name, const char *sub)
187 ILL_Name_Of_Person_Or_Institution *p =
188 (ILL_Name_Of_Person_Or_Institution *) odr_malloc (o, sizeof(*p));
190 strcpy(element, name);
193 strcat (element, ",");
194 strcat (element, sub);
196 p->which = ILL_Name_Of_Person_Or_Institution_name_of_person;
197 if ((p->u.name_of_person =
198 ill_get_ILL_String (gc, element, "name-of-person")))
201 p->which = ILL_Name_Of_Person_Or_Institution_name_of_institution;
202 if ((p->u.name_of_institution =
203 ill_get_ILL_String (gc, element, "name-of-institution")))
208 ILL_System_Id *ill_get_System_Id(struct ill_get_ctl *gc,
209 const char *name, const char *sub)
215 strcpy(element, name);
218 strcat (element, ",");
219 strcat (element, sub);
221 p = (ILL_System_Id *) odr_malloc (o, sizeof(*p));
222 p->person_or_institution_symbol = ill_get_Person_Or_Insitution_Symbol (
223 gc, element, "person-or-institution-symbol");
224 p->name_of_person_or_institution = ill_get_Name_Of_Person_Or_Institution (
225 gc, element, "name-of-person-or-institution");
229 ILL_Transaction_Id *ill_get_Transaction_Id (struct ill_get_ctl *gc,
230 const char *name, const char *sub)
233 ILL_Transaction_Id *r = (ILL_Transaction_Id *) odr_malloc (o, sizeof(*r));
236 strcpy(element, name);
239 strcat (element, ",");
240 strcat (element, sub);
242 r->initial_requester_id =
243 ill_get_System_Id (gc, element, "initial-requester-id");
244 r->transaction_group_qualifier =
245 ill_get_ILL_String_x (gc, element, "transaction-group-qualifier", "");
246 r->transaction_qualifier =
247 ill_get_ILL_String_x (gc, element, "transaction-qualifier", "");
248 r->sub_transaction_qualifier =
249 ill_get_ILL_String (gc, element, "sub-transaction-qualifier");
254 ILL_Service_Date_this *ill_get_Service_Date_this (
255 struct ill_get_ctl *gc, const char *name, const char *sub)
258 ILL_Service_Date_this *r =
259 (ILL_Service_Date_this *) odr_malloc (o, sizeof(*r));
262 strcpy(element, name);
265 strcat (element, ",");
266 strcat (element, sub);
268 r->date = ill_get_ILL_ISO_Date (gc, element, "date", "20000101");
269 r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
273 ILL_Service_Date_original *ill_get_Service_Date_original (
274 struct ill_get_ctl *gc, const char *name, const char *sub)
277 ILL_Service_Date_original *r =
278 (ILL_Service_Date_original *) odr_malloc (o, sizeof(*r));
281 strcpy(element, name);
284 strcat (element, ",");
285 strcat (element, sub);
287 r->date = ill_get_ILL_ISO_Date (gc, element, "date", 0);
288 r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
289 if (!r->date && !r->time)
294 ILL_Service_Date_Time *ill_get_Service_Date_Time (
295 struct ill_get_ctl *gc, const char *name, const char *sub)
298 ILL_Service_Date_Time *r =
299 (ILL_Service_Date_Time *) odr_malloc (o, sizeof(*r));
302 strcpy(element, name);
305 strcat (element, ",");
306 strcat (element, sub);
308 r->date_time_of_this_service = ill_get_Service_Date_this (
309 gc, element, "this");
310 r->date_time_of_original_service = ill_get_Service_Date_original (
311 gc, element, "original");
315 ILL_Requester_Optional_Messages_Type *ill_get_Requester_Optional_Messages_Type (
316 struct ill_get_ctl *gc, const char *name, const char *sub)
319 ILL_Requester_Optional_Messages_Type *r =
320 (ILL_Requester_Optional_Messages_Type *) odr_malloc (o, sizeof(*r));
323 strcpy(element, name);
326 strcat (element, ",");
327 strcat (element, sub);
329 r->can_send_RECEIVED = ill_get_bool (gc, element, "can-send-RECEIVED", 0);
330 r->can_send_RETURNED = ill_get_bool (gc, element, "can-send-RETURNED", 0);
331 r->requester_SHIPPED =
332 ill_get_enumerated (gc, element, "requester-SHIPPED", 1);
333 r->requester_CHECKED_IN =
334 ill_get_enumerated (gc, element, "requester-CHECKED-IN", 1);
338 ILL_Item_Id *ill_get_Item_Id (
339 struct ill_get_ctl *gc, const char *name, const char *sub)
342 ILL_Item_Id *r = (ILL_Item_Id *) odr_malloc (o, sizeof(*r));
345 strcpy(element, name);
348 strcat (element, ",");
349 strcat (element, sub);
351 r->item_type = ill_get_enumerated (gc, element, "item-type",
352 ILL_Item_Id_monograph);
353 r->held_medium_type = 0;
354 r->call_number = ill_get_ILL_String(gc, element, "call-number");
355 r->author = ill_get_ILL_String(gc, element, "author");
356 r->title = ill_get_ILL_String(gc, element, "title");
357 r->sub_title = ill_get_ILL_String(gc, element, "sub-title");
358 r->sponsoring_body = ill_get_ILL_String(gc, element, "sponsoring-body");
359 r->place_of_publication =
360 ill_get_ILL_String(gc, element, "place-of-publication");
361 r->publisher = ill_get_ILL_String(gc, element, "publisher");
362 r->series_title_number =
363 ill_get_ILL_String(gc, element, "series-title-number");
364 r->volume_issue = ill_get_ILL_String(gc, element, "volume-issue");
365 r->edition = ill_get_ILL_String(gc, element, "edition");
366 r->publication_date = ill_get_ILL_String(gc, element, "publication-date");
367 r->publication_date_of_component =
368 ill_get_ILL_String(gc, element, "publication-date-of-component");
369 r->author_of_article = ill_get_ILL_String(gc, element,
370 "author-of-article");
371 r->title_of_article = ill_get_ILL_String(gc, element, "title-of-article");
372 r->pagination = ill_get_ILL_String(gc, element, "pagination");
373 r->national_bibliography_no = 0;
374 r->iSBN = ill_get_ILL_String(gc, element, "ISBN");
375 r->iSSN = ill_get_ILL_String(gc, element, "ISSN");
377 r->additional_no_letters =
378 ill_get_ILL_String(gc, element, "additional-no-letters");
379 r->verification_reference_source =
380 ill_get_ILL_String(gc, element, "verification-reference-source");
385 ILL_Client_Id *ill_get_Client_Id (
386 struct ill_get_ctl *gc, const char *name, const char *sub)
390 ILL_Client_Id *r = (ILL_Client_Id *) odr_malloc(o, sizeof(*r));
392 strcpy(element, name);
395 strcat (element, ",");
396 strcat (element, sub);
398 r->client_name = ill_get_ILL_String (gc, element, "client-name");
399 r->client_status = ill_get_ILL_String (gc, element, "client-status");
400 r->client_identifier = ill_get_ILL_String (gc, element,
401 "client-identifier");
405 ILL_Postal_Address *ill_get_Postal_Address (
406 struct ill_get_ctl *gc, const char *name, const char *sub)
409 ILL_Postal_Address *r =
410 (ILL_Postal_Address *) odr_malloc(o, sizeof(*r));
413 strcpy(element, name);
416 strcat (element, ",");
417 strcat (element, sub);
419 r->name_of_person_or_institution =
420 ill_get_Name_Of_Person_Or_Institution (
421 gc, element, "name-of-person-or-institution");
422 r->extended_postal_delivery_address =
424 gc, element, "extended-postal-delivery-address");
425 r->street_and_number =
426 ill_get_ILL_String (gc, element, "street-and-number");
428 ill_get_ILL_String (gc, element, "post-office-box");
429 r->city = ill_get_ILL_String (gc, element, "city");
430 r->region = ill_get_ILL_String (gc, element, "region");
431 r->country = ill_get_ILL_String (gc, element, "country");
432 r->postal_code = ill_get_ILL_String (gc, element, "postal-code");
436 ILL_System_Address *ill_get_System_Address (
437 struct ill_get_ctl *gc, const char *name, const char *sub)
440 ILL_System_Address *r =
441 (ILL_System_Address *) odr_malloc(o, sizeof(*r));
444 strcpy(element, name);
447 strcat (element, ",");
448 strcat (element, sub);
450 r->telecom_service_identifier =
451 ill_get_ILL_String (gc, element, "telecom-service-identifier");
452 r->telecom_service_address =
453 ill_get_ILL_String (gc, element, "telecom-service-addreess");
457 ILL_Delivery_Address *ill_get_Delivery_Address (
458 struct ill_get_ctl *gc, const char *name, const char *sub)
461 ILL_Delivery_Address *r =
462 (ILL_Delivery_Address *) odr_malloc(o, sizeof(*r));
465 strcpy(element, name);
468 strcat (element, ",");
469 strcat (element, sub);
472 ill_get_Postal_Address (gc, element, "postal-address");
473 r->electronic_address =
474 ill_get_System_Address (gc, element, "electronic-address");
478 ILL_Search_Type *ill_get_Search_Type (
479 struct ill_get_ctl *gc, const char *name, const char *sub)
482 ILL_Search_Type *r = (ILL_Search_Type *) odr_malloc(o, sizeof(*r));
485 strcpy(element, name);
488 strcat (element, ",");
489 strcat (element, sub);
491 r->level_of_service = ill_get_ILL_String (gc, element, "level-of-service");
492 r->need_before_date = ill_get_ILL_ISO_Date (gc, element,
493 "need-before-date", 0);
494 r->expiry_date = ill_get_ILL_ISO_Date (gc, element, "expiry-date", 0);
495 r->expiry_flag = ill_get_enumerated (gc, element, "expiry-flag", 3);
500 ILL_Request *ill_get_ILLRequest (
501 struct ill_get_ctl *gc, const char *name, const char *sub)
504 ILL_Request *r = (ILL_Request *) odr_malloc(o, sizeof(*r));
507 strcpy(element, name);
510 strcat (element, ",");
511 strcat (element, sub);
513 r->protocol_version_num =
514 ill_get_enumerated (gc, element, "protocol-version-num",
515 ILL_Request_version_2);
517 r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
518 r->service_date_time =
519 ill_get_Service_Date_Time (gc, element, "service-date-time");
520 r->requester_id = ill_get_System_Id (gc, element, "requester-id");
521 r->responder_id = ill_get_System_Id (gc, element, "responder-id");
522 r->transaction_type =
523 ill_get_enumerated(gc, element, "transaction-type", 1);
525 r->delivery_address =
526 ill_get_Delivery_Address (gc, element, "delivery-address");
527 r->delivery_service = 0; /* TODO */
528 /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
530 ill_get_Delivery_Address (gc, element, "billing-address");
532 r->num_iLL_service_type = 1;
533 r->iLL_service_type = (ILL_Service_Type **)
534 odr_malloc (o, sizeof(*r->iLL_service_type));
535 *r->iLL_service_type =
536 ill_get_enumerated (gc, element, "ill-service-type",
537 ILL_Service_Type_copy_non_returnable);
539 r->responder_specific_service = 0;
540 r->requester_optional_messages =
541 ill_get_Requester_Optional_Messages_Type (
542 gc, element,"requester-optional-messages");
543 r->search_type = ill_get_Search_Type(gc, element, "search-type");
544 r->num_supply_medium_info_type = 0;
545 r->supply_medium_info_type = 0;
547 r->place_on_hold = ill_get_enumerated (
548 gc, element, "place-on-hold",
549 ILL_Place_On_Hold_Type_according_to_responder_policy);
550 r->client_id = ill_get_Client_Id (gc, element, "client-id");
552 r->item_id = ill_get_Item_Id (gc, element, "item-id");
553 r->supplemental_item_description = 0;
554 r->cost_info_type = 0;
555 r->copyright_compliance =
556 ill_get_ILL_String(gc, element, "copyright-complicance");
557 r->third_party_info_type = 0;
558 r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
559 r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
560 r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
561 r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
562 r->num_iLL_request_extensions = 0;
563 r->iLL_request_extensions = 0;
567 ILL_ItemRequest *ill_get_ItemRequest (
568 struct ill_get_ctl *gc, const char *name, const char *sub)
571 ILL_ItemRequest *r = (ILL_ItemRequest *)odr_malloc(o, sizeof(*r));
574 strcpy(element, name);
577 strcat (element, ",");
578 strcat (element, sub);
580 r->protocol_version_num =
581 ill_get_enumerated (gc, element, "protocol-version-num",
582 ILL_Request_version_2);
584 r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
585 r->service_date_time =
586 ill_get_Service_Date_Time (gc, element, "service-date-time");
587 r->requester_id = ill_get_System_Id (gc, element, "requester-id");
588 r->responder_id = ill_get_System_Id (gc, element, "responder-id");
589 r->transaction_type =
590 ill_get_enumerated(gc, element, "transaction-type", 1);
592 r->delivery_address =
593 ill_get_Delivery_Address (gc, element, "delivery-address");
594 r->delivery_service = 0; /* TODO */
595 /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
597 ill_get_Delivery_Address (gc, element, "billing-address");
599 r->num_iLL_service_type = 1;
600 r->iLL_service_type = (ILL_Service_Type **)
601 odr_malloc (o, sizeof(*r->iLL_service_type));
602 *r->iLL_service_type =
603 ill_get_enumerated (gc, element, "ill-service-type",
604 ILL_Service_Type_copy_non_returnable);
606 r->responder_specific_service = 0;
607 r->requester_optional_messages =
608 ill_get_Requester_Optional_Messages_Type (
609 gc, element,"requester-optional-messages");
610 r->search_type = ill_get_Search_Type(gc, element, "search-type");
611 r->num_supply_medium_info_type = 0;
612 r->supply_medium_info_type = 0;
614 r->place_on_hold = ill_get_enumerated (
615 gc, element, "place-on-hold",
616 ILL_Place_On_Hold_Type_according_to_responder_policy);
617 r->client_id = ill_get_Client_Id (gc, element, "client-id");
619 r->item_id = ill_get_Item_Id (gc, element, "item-id");
620 r->supplemental_item_description = 0;
621 r->cost_info_type = 0;
622 r->copyright_compliance =
623 ill_get_ILL_String(gc, element, "copyright-complicance");
624 r->third_party_info_type = 0;
625 r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
626 r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
627 r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
628 r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
629 r->num_iLL_request_extensions = 0;
630 r->iLL_request_extensions = 0;
634 ILL_Cancel *ill_get_Cancel (
635 struct ill_get_ctl *gc, const char *name, const char *sub)
638 ILL_Cancel *r = (ILL_Cancel *)odr_malloc(o, sizeof(*r));
641 strcpy(element, name);
644 strcat (element, ",");
645 strcat (element, sub);
647 r->protocol_version_num =
648 ill_get_enumerated (gc, element, "protocol-version-num",
649 ILL_Request_version_2);
651 r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
652 r->service_date_time =
653 ill_get_Service_Date_Time (gc, element, "service-date-time");
654 r->requester_id = ill_get_System_Id (gc, element, "requester-id");
655 r->responder_id = ill_get_System_Id (gc, element, "responder-id");
656 r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
658 r->num_cancel_extensions = 0;
659 r->cancel_extensions = 0;
663 ILL_APDU *ill_get_APDU (
664 struct ill_get_ctl *gc, const char *name, const char *sub)
667 ILL_APDU *r = (ILL_APDU *)odr_malloc(o, sizeof(*r));
671 strcpy (element, name);
672 strcat (element, ",which");
674 v = (gc->f)(gc->clientData, element);
677 if (!strcmp (v, "request"))
679 r->which = ILL_APDU_ILL_Request;
680 r->u.illRequest = ill_get_ILLRequest(gc, name, sub);
682 else if (!strcmp (v, "cancel"))
684 r->which = ILL_APDU_Cancel;
685 r->u.Cancel = ill_get_Cancel(gc, name, sub);