2 * Copyright (c) 1999-2001, Index Data.
3 * See the file LICENSE for details.
6 * Revision 1.8 2001-02-21 13:46:53 adam
9 * Revision 1.7 2001/02/20 11:25:32 adam
10 * Added ill_get_APDU and ill_get_Cancel.
12 * Revision 1.6 2000/08/10 08:41:26 adam
15 * Revision 1.5 2000/02/24 08:52:01 adam
18 * Revision 1.4 2000/02/04 11:01:15 adam
19 * Added more elements.
21 * Revision 1.3 2000/01/31 13:15:21 adam
22 * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
23 * that some characters are not surrounded by spaces in resulting term.
26 * Revision 1.2 2000/01/15 09:38:51 adam
27 * Implemented ill_get_ILLRequest. Added some type mappings for ILL protocol.
29 * Revision 1.1 1999/12/16 23:36:19 adam
30 * Implemented ILL protocol. Minor updates ASN.1 compiler.
36 bool_t *ill_get_bool (struct ill_get_ctl *gc, const char *name,
37 const char *sub, int val)
42 bool_t *r = (bool_t *) odr_malloc (o, sizeof(*r));
44 strcpy(element, name);
47 strcat (element, ",");
48 strcat (element, sub);
51 v = (gc->f)(gc->clientData, element);
60 int *ill_get_int (struct ill_get_ctl *gc, const char *name,
61 const char *sub, int val)
66 int *r = (int *) odr_malloc (o, sizeof(*r));
68 strcpy(element, name);
71 strcat (element, ",");
72 strcat (element, sub);
74 v = (gc->f)(gc->clientData, element);
81 int *ill_get_enumerated (struct ill_get_ctl *gc, const char *name,
82 const char *sub, int val)
84 return ill_get_int(gc, name, sub, val);
87 ILL_String *ill_get_ILL_String_x (struct ill_get_ctl *gc, const char *name,
88 const char *sub, const char *vdefault)
90 ILL_String *r = (ILL_String *) odr_malloc (gc->odr, sizeof(*r));
94 strcpy(element, name);
97 strcat (element, ",");
98 strcat (element, sub);
100 v = (gc->f)(gc->clientData, element);
105 r->which = ILL_String_GeneralString;
106 r->u.GeneralString = odr_strdup (gc->odr, v);
110 ILL_String *ill_get_ILL_String(struct ill_get_ctl *gc, const char *name,
113 return ill_get_ILL_String_x (gc, name, sub, 0);
116 ILL_ISO_Date *ill_get_ILL_ISO_Date (struct ill_get_ctl *gc, const char *name,
117 const char *sub, const char *val)
122 strcpy(element, name);
125 strcat (element, ",");
126 strcat (element, sub);
128 v = (gc->f)(gc->clientData, element);
133 return odr_strdup (gc->odr, v);
136 ILL_ISO_Time *ill_get_ILL_ISO_Time (struct ill_get_ctl *gc, const char *name,
137 const char *sub, const char *val)
142 strcpy(element, name);
145 strcat (element, ",");
146 strcat (element, sub);
148 v = (gc->f)(gc->clientData, element);
153 return odr_strdup (gc->odr, v);
156 ILL_Person_Or_Institution_Symbol *ill_get_Person_Or_Insitution_Symbol (
157 struct ill_get_ctl *gc, const char *name, const char *sub)
161 ILL_Person_Or_Institution_Symbol *p =
162 (ILL_Person_Or_Institution_Symbol *) odr_malloc (o, sizeof(*p));
164 strcpy(element, name);
167 strcat (element, ",");
168 strcat (element, sub);
170 p->which = ILL_Person_Or_Institution_Symbol_person_symbol;
171 if ((p->u.person_symbol = ill_get_ILL_String (gc, element, "person")))
174 p->which = ILL_Person_Or_Institution_Symbol_institution_symbol;
175 if ((p->u.institution_symbol =
176 ill_get_ILL_String (gc, element, "institution")))
181 static ILL_Name_Of_Person_Or_Institution *ill_get_Name_Of_Person_Or_Institution(
182 struct ill_get_ctl *gc, const char *name, const char *sub)
186 ILL_Name_Of_Person_Or_Institution *p =
187 (ILL_Name_Of_Person_Or_Institution *) odr_malloc (o, sizeof(*p));
189 strcpy(element, name);
192 strcat (element, ",");
193 strcat (element, sub);
195 p->which = ILL_Name_Of_Person_Or_Institution_name_of_person;
196 if ((p->u.name_of_person =
197 ill_get_ILL_String (gc, element, "name-of-person")))
200 p->which = ILL_Name_Of_Person_Or_Institution_name_of_institution;
201 if ((p->u.name_of_institution =
202 ill_get_ILL_String (gc, element, "name-of-institution")))
207 ILL_System_Id *ill_get_System_Id(struct ill_get_ctl *gc,
208 const char *name, const char *sub)
214 strcpy(element, name);
217 strcat (element, ",");
218 strcat (element, sub);
220 p = (ILL_System_Id *) odr_malloc (o, sizeof(*p));
221 p->person_or_institution_symbol = ill_get_Person_Or_Insitution_Symbol (
222 gc, element, "person-or-institution-symbol");
223 p->name_of_person_or_institution = ill_get_Name_Of_Person_Or_Institution (
224 gc, element, "name-of-person-or-institution");
228 ILL_Transaction_Id *ill_get_Transaction_Id (struct ill_get_ctl *gc,
229 const char *name, const char *sub)
232 ILL_Transaction_Id *r = (ILL_Transaction_Id *) odr_malloc (o, sizeof(*r));
235 strcpy(element, name);
238 strcat (element, ",");
239 strcat (element, sub);
241 r->initial_requester_id =
242 ill_get_System_Id (gc, element, "initial-requester-id");
243 r->transaction_group_qualifier =
244 ill_get_ILL_String_x (gc, element, "transaction-group-qualifier", "");
245 r->transaction_qualifier =
246 ill_get_ILL_String_x (gc, element, "transaction-qualifier", "");
247 r->sub_transaction_qualifier =
248 ill_get_ILL_String (gc, element, "sub-transaction-qualifier");
253 ILL_Service_Date_this *ill_get_Service_Date_this (
254 struct ill_get_ctl *gc, const char *name, const char *sub)
257 ILL_Service_Date_this *r =
258 (ILL_Service_Date_this *) odr_malloc (o, sizeof(*r));
261 strcpy(element, name);
264 strcat (element, ",");
265 strcat (element, sub);
267 r->date = ill_get_ILL_ISO_Date (gc, element, "date", "20000101");
268 r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
272 ILL_Service_Date_original *ill_get_Service_Date_original (
273 struct ill_get_ctl *gc, const char *name, const char *sub)
276 ILL_Service_Date_original *r =
277 (ILL_Service_Date_original *) odr_malloc (o, sizeof(*r));
280 strcpy(element, name);
283 strcat (element, ",");
284 strcat (element, sub);
286 r->date = ill_get_ILL_ISO_Date (gc, element, "date", 0);
287 r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
288 if (!r->date && !r->time)
293 ILL_Service_Date_Time *ill_get_Service_Date_Time (
294 struct ill_get_ctl *gc, const char *name, const char *sub)
297 ILL_Service_Date_Time *r =
298 (ILL_Service_Date_Time *) odr_malloc (o, sizeof(*r));
301 strcpy(element, name);
304 strcat (element, ",");
305 strcat (element, sub);
307 r->date_time_of_this_service = ill_get_Service_Date_this (
308 gc, element, "this");
309 r->date_time_of_original_service = ill_get_Service_Date_original (
310 gc, element, "original");
314 ILL_Requester_Optional_Messages_Type *ill_get_Requester_Optional_Messages_Type (
315 struct ill_get_ctl *gc, const char *name, const char *sub)
318 ILL_Requester_Optional_Messages_Type *r =
319 (ILL_Requester_Optional_Messages_Type *) odr_malloc (o, sizeof(*r));
322 strcpy(element, name);
325 strcat (element, ",");
326 strcat (element, sub);
328 r->can_send_RECEIVED = ill_get_bool (gc, element, "can-send-RECEIVED", 0);
329 r->can_send_RETURNED = ill_get_bool (gc, element, "can-send-RETURNED", 0);
330 r->requester_SHIPPED =
331 ill_get_enumerated (gc, element, "requester-SHIPPED", 1);
332 r->requester_CHECKED_IN =
333 ill_get_enumerated (gc, element, "requester-CHECKED-IN", 1);
337 ILL_Item_Id *ill_get_Item_Id (
338 struct ill_get_ctl *gc, const char *name, const char *sub)
341 ILL_Item_Id *r = (ILL_Item_Id *) odr_malloc (o, sizeof(*r));
344 strcpy(element, name);
347 strcat (element, ",");
348 strcat (element, sub);
350 r->item_type = ill_get_enumerated (gc, element, "item-type",
351 ILL_Item_Id_monograph);
352 r->held_medium_type = 0;
353 r->call_number = ill_get_ILL_String(gc, element, "call-number");
354 r->author = ill_get_ILL_String(gc, element, "author");
355 r->title = ill_get_ILL_String(gc, element, "title");
356 r->sub_title = ill_get_ILL_String(gc, element, "sub-title");
357 r->sponsoring_body = ill_get_ILL_String(gc, element, "sponsoring-body");
358 r->place_of_publication =
359 ill_get_ILL_String(gc, element, "place-of-publication");
360 r->publisher = ill_get_ILL_String(gc, element, "publisher");
361 r->series_title_number =
362 ill_get_ILL_String(gc, element, "series-title-number");
363 r->volume_issue = ill_get_ILL_String(gc, element, "volume-issue");
364 r->edition = ill_get_ILL_String(gc, element, "edition");
365 r->publication_date = ill_get_ILL_String(gc, element, "publication-date");
366 r->publication_date_of_component =
367 ill_get_ILL_String(gc, element, "publication-date-of-component");
368 r->author_of_article = ill_get_ILL_String(gc, element,
369 "author-of-article");
370 r->title_of_article = ill_get_ILL_String(gc, element, "title-of-article");
371 r->pagination = ill_get_ILL_String(gc, element, "pagination");
372 r->national_bibliography_no = 0;
373 r->iSBN = ill_get_ILL_String(gc, element, "ISBN");
374 r->iSSN = ill_get_ILL_String(gc, element, "ISSN");
376 r->additional_no_letters =
377 ill_get_ILL_String(gc, element, "additional-no-letters");
378 r->verification_reference_source =
379 ill_get_ILL_String(gc, element, "verification-reference-source");
384 ILL_Client_Id *ill_get_Client_Id (
385 struct ill_get_ctl *gc, const char *name, const char *sub)
389 ILL_Client_Id *r = (ILL_Client_Id *) odr_malloc(o, sizeof(*r));
391 strcpy(element, name);
394 strcat (element, ",");
395 strcat (element, sub);
397 r->client_name = ill_get_ILL_String (gc, element, "client-name");
398 r->client_status = ill_get_ILL_String (gc, element, "client-status");
399 r->client_identifier = ill_get_ILL_String (gc, element,
400 "client-identifier");
404 ILL_Postal_Address *ill_get_Postal_Address (
405 struct ill_get_ctl *gc, const char *name, const char *sub)
408 ILL_Postal_Address *r =
409 (ILL_Postal_Address *) odr_malloc(o, sizeof(*r));
412 strcpy(element, name);
415 strcat (element, ",");
416 strcat (element, sub);
418 r->name_of_person_or_institution =
419 ill_get_Name_Of_Person_Or_Institution (
420 gc, element, "name-of-person-or-institution");
421 r->extended_postal_delivery_address =
423 gc, element, "extended-postal-delivery-address");
424 r->street_and_number =
425 ill_get_ILL_String (gc, element, "street-and-number");
427 ill_get_ILL_String (gc, element, "post-office-box");
428 r->city = ill_get_ILL_String (gc, element, "city");
429 r->region = ill_get_ILL_String (gc, element, "region");
430 r->country = ill_get_ILL_String (gc, element, "country");
431 r->postal_code = ill_get_ILL_String (gc, element, "postal-code");
435 ILL_System_Address *ill_get_System_Address (
436 struct ill_get_ctl *gc, const char *name, const char *sub)
439 ILL_System_Address *r =
440 (ILL_System_Address *) odr_malloc(o, sizeof(*r));
443 strcpy(element, name);
446 strcat (element, ",");
447 strcat (element, sub);
449 r->telecom_service_identifier =
450 ill_get_ILL_String (gc, element, "telecom-service-identifier");
451 r->telecom_service_address =
452 ill_get_ILL_String (gc, element, "telecom-service-addreess");
456 ILL_Delivery_Address *ill_get_Delivery_Address (
457 struct ill_get_ctl *gc, const char *name, const char *sub)
460 ILL_Delivery_Address *r =
461 (ILL_Delivery_Address *) odr_malloc(o, sizeof(*r));
464 strcpy(element, name);
467 strcat (element, ",");
468 strcat (element, sub);
471 ill_get_Postal_Address (gc, element, "postal-address");
472 r->electronic_address =
473 ill_get_System_Address (gc, element, "electronic-address");
477 ILL_Search_Type *ill_get_Search_Type (
478 struct ill_get_ctl *gc, const char *name, const char *sub)
481 ILL_Search_Type *r = (ILL_Search_Type *) odr_malloc(o, sizeof(*r));
484 strcpy(element, name);
487 strcat (element, ",");
488 strcat (element, sub);
490 r->level_of_service = ill_get_ILL_String (gc, element, "level-of-service");
491 r->need_before_date = ill_get_ILL_ISO_Date (gc, element,
492 "need-before-date", 0);
493 r->expiry_date = ill_get_ILL_ISO_Date (gc, element, "expiry-date", 0);
494 r->expiry_flag = ill_get_enumerated (gc, element, "expiry-flag", 3);
499 ILL_Request *ill_get_ILLRequest (
500 struct ill_get_ctl *gc, const char *name, const char *sub)
503 ILL_Request *r = (ILL_Request *) odr_malloc(o, sizeof(*r));
506 strcpy(element, name);
509 strcat (element, ",");
510 strcat (element, sub);
512 r->protocol_version_num =
513 ill_get_enumerated (gc, element, "protocol-version-num",
514 ILL_Request_version_2);
516 r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
517 r->service_date_time =
518 ill_get_Service_Date_Time (gc, element, "service-date-time");
519 r->requester_id = ill_get_System_Id (gc, element, "requester-id");
520 r->responder_id = ill_get_System_Id (gc, element, "responder-id");
521 r->transaction_type =
522 ill_get_enumerated(gc, element, "transaction-type", 1);
524 r->delivery_address =
525 ill_get_Delivery_Address (gc, element, "delivery-address");
526 r->delivery_service = 0; /* TODO */
527 /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
529 ill_get_Delivery_Address (gc, element, "billing-address");
531 r->num_iLL_service_type = 1;
532 r->iLL_service_type = (ILL_Service_Type **)
533 odr_malloc (o, sizeof(*r->iLL_service_type));
534 *r->iLL_service_type =
535 ill_get_enumerated (gc, element, "ill-service-type",
536 ILL_Service_Type_copy_non_returnable);
538 r->responder_specific_service = 0;
539 r->requester_optional_messages =
540 ill_get_Requester_Optional_Messages_Type (
541 gc, element,"requester-optional-messages");
542 r->search_type = ill_get_Search_Type(gc, element, "search-type");
543 r->num_supply_medium_info_type = 0;
544 r->supply_medium_info_type = 0;
546 r->place_on_hold = ill_get_enumerated (
547 gc, element, "place-on-hold",
548 ILL_Place_On_Hold_Type_according_to_responder_policy);
549 r->client_id = ill_get_Client_Id (gc, element, "client-id");
551 r->item_id = ill_get_Item_Id (gc, element, "item-id");
552 r->supplemental_item_description = 0;
553 r->cost_info_type = 0;
554 r->copyright_compliance =
555 ill_get_ILL_String(gc, element, "copyright-complicance");
556 r->third_party_info_type = 0;
557 r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
558 r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
559 r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
560 r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
561 r->num_iLL_request_extensions = 0;
562 r->iLL_request_extensions = 0;
566 ILL_ItemRequest *ill_get_ItemRequest (
567 struct ill_get_ctl *gc, const char *name, const char *sub)
570 ILL_ItemRequest *r = (ILL_ItemRequest *)odr_malloc(o, sizeof(*r));
573 strcpy(element, name);
576 strcat (element, ",");
577 strcat (element, sub);
579 r->protocol_version_num =
580 ill_get_enumerated (gc, element, "protocol-version-num",
581 ILL_Request_version_2);
583 r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
584 r->service_date_time =
585 ill_get_Service_Date_Time (gc, element, "service-date-time");
586 r->requester_id = ill_get_System_Id (gc, element, "requester-id");
587 r->responder_id = ill_get_System_Id (gc, element, "responder-id");
588 r->transaction_type =
589 ill_get_enumerated(gc, element, "transaction-type", 1);
591 r->delivery_address =
592 ill_get_Delivery_Address (gc, element, "delivery-address");
593 r->delivery_service = 0; /* TODO */
594 /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
596 ill_get_Delivery_Address (gc, element, "billing-address");
598 r->num_iLL_service_type = 1;
599 r->iLL_service_type = (ILL_Service_Type **)
600 odr_malloc (o, sizeof(*r->iLL_service_type));
601 *r->iLL_service_type =
602 ill_get_enumerated (gc, element, "ill-service-type",
603 ILL_Service_Type_copy_non_returnable);
605 r->responder_specific_service = 0;
606 r->requester_optional_messages =
607 ill_get_Requester_Optional_Messages_Type (
608 gc, element,"requester-optional-messages");
609 r->search_type = ill_get_Search_Type(gc, element, "search-type");
610 r->num_supply_medium_info_type = 0;
611 r->supply_medium_info_type = 0;
613 r->place_on_hold = ill_get_enumerated (
614 gc, element, "place-on-hold",
615 ILL_Place_On_Hold_Type_according_to_responder_policy);
616 r->client_id = ill_get_Client_Id (gc, element, "client-id");
618 r->item_id = ill_get_Item_Id (gc, element, "item-id");
619 r->supplemental_item_description = 0;
620 r->cost_info_type = 0;
621 r->copyright_compliance =
622 ill_get_ILL_String(gc, element, "copyright-complicance");
623 r->third_party_info_type = 0;
624 r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
625 r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
626 r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
627 r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
628 r->num_iLL_request_extensions = 0;
629 r->iLL_request_extensions = 0;
633 ILL_Cancel *ill_get_Cancel (
634 struct ill_get_ctl *gc, const char *name, const char *sub)
637 ILL_Cancel *r = (ILL_Cancel *)odr_malloc(o, sizeof(*r));
640 strcpy(element, name);
643 strcat (element, ",");
644 strcat (element, sub);
646 r->protocol_version_num =
647 ill_get_enumerated (gc, element, "protocol-version-num",
648 ILL_Request_version_2);
650 r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
651 r->service_date_time =
652 ill_get_Service_Date_Time (gc, element, "service-date-time");
653 r->requester_id = ill_get_System_Id (gc, element, "requester-id");
654 r->responder_id = ill_get_System_Id (gc, element, "responder-id");
655 r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
657 r->num_cancel_extensions = 0;
658 r->cancel_extensions = 0;
662 ILL_APDU *ill_get_APDU (
663 struct ill_get_ctl *gc, const char *name, const char *sub)
666 ILL_APDU *r = (ILL_APDU *)odr_malloc(o, sizeof(*r));
670 strcpy (element, name);
671 strcat (element, ",which");
673 v = (gc->f)(gc->clientData, element);
676 if (!strcmp (v, "request"))
678 r->which = ILL_APDU_ILL_Request;
679 r->u.illRequest = ill_get_ILLRequest(gc, name, sub);
681 else if (!strcmp (v, "cancel"))
683 r->which = ILL_APDU_Cancel;
684 r->u.Cancel = ill_get_Cancel(gc, name, sub);