7c6bbd4eb1fe8849595b9d727c1adc99a469fa0c
[yaz-moved-to-github.git] / src / ill-get.c
1 /*
2  * Copyright (c) 1999-2004, Index Data.
3  * See the file LICENSE for details.
4  *
5  * $Id: ill-get.c,v 1.2 2004-10-15 00:19:00 adam Exp $
6  */
7
8 /**
9  * \file ill-get.c
10  * \brief Implements ILL package creator utilities
11  */
12
13 #include <yaz/ill.h>
14
15 bool_t *ill_get_bool (struct ill_get_ctl *gc, const char *name,
16                       const char *sub, int val)
17 {
18     ODR o = gc->odr;
19     char element[128];
20     const char *v;
21     bool_t *r = (bool_t *) odr_malloc (o, sizeof(*r));
22     
23     strcpy(element, name);
24     if (sub)
25     {
26         strcat (element, ",");
27         strcat (element, sub);
28     }    
29
30     v = (gc->f)(gc->clientData, element);
31     if (v)
32         val = atoi(v);
33     else if (val < 0)
34         return 0;
35     *r = val;
36     return r;
37 }
38
39 int *ill_get_int (struct ill_get_ctl *gc, const char *name,
40                   const char *sub, int val)
41 {
42     ODR o = gc->odr;
43     char element[128];
44     const char *v;
45     
46     strcpy(element, name);
47     if (sub)
48     {
49         strcat (element, ",");
50         strcat (element, sub);
51     }    
52     v = (gc->f)(gc->clientData, element);
53     if (v)
54         val = atoi(v);
55     return odr_intdup(o, val);
56 }
57
58 int *ill_get_enumerated (struct ill_get_ctl *gc, const char *name,
59                          const char *sub, int val)
60 {
61     return ill_get_int(gc, name, sub, val);
62 }
63
64 ILL_String *ill_get_ILL_String_x (struct ill_get_ctl *gc, const char *name,
65                                   const char *sub, const char *vdefault)
66 {
67     ILL_String *r = (ILL_String *) odr_malloc (gc->odr, sizeof(*r));
68     char element[128];
69     const char *v;
70
71     strcpy(element, name);
72     if (sub)
73     {
74         strcat (element, ",");
75         strcat (element, sub);
76     }
77     v = (gc->f)(gc->clientData, element);
78     if (!v)
79         v = vdefault;
80     if (!v)
81         return 0;
82     r->which = ILL_String_GeneralString;
83     r->u.GeneralString = odr_strdup (gc->odr, v);
84     return r;
85 }
86
87 ILL_String *ill_get_ILL_String(struct ill_get_ctl *gc, const char *name,
88                                const char *sub)
89 {
90     return ill_get_ILL_String_x (gc, name, sub, 0);
91 }
92
93 ILL_ISO_Date *ill_get_ILL_ISO_Date (struct ill_get_ctl *gc, const char *name,
94                                     const char *sub, const char *val)
95 {
96     char element[128];
97     const char *v;
98
99     strcpy(element, name);
100     if (sub)
101     {
102         strcat (element, ",");
103         strcat (element, sub);
104     }
105     v = (gc->f)(gc->clientData, element);
106     if (!v)
107         v = val;
108     if (!v)
109         return 0;
110     return odr_strdup (gc->odr, v);
111 }
112
113 ILL_ISO_Time *ill_get_ILL_ISO_Time (struct ill_get_ctl *gc, const char *name,
114                                     const char *sub, const char *val)
115 {
116     char element[128];
117     const char *v;
118
119     strcpy(element, name);
120     if (sub)
121     {
122         strcat (element, ",");
123         strcat (element, sub);
124     }
125     v = (gc->f)(gc->clientData, element);
126     if (!v)
127         v = val;
128     if (!v)
129         return 0;
130     return odr_strdup (gc->odr, v);
131 }
132
133 ILL_Person_Or_Institution_Symbol *ill_get_Person_Or_Insitution_Symbol (
134     struct ill_get_ctl *gc, const char *name, const char *sub)
135 {
136     char element[128];
137     ODR o = gc->odr;
138     ILL_Person_Or_Institution_Symbol *p =
139         (ILL_Person_Or_Institution_Symbol *) odr_malloc (o, sizeof(*p));
140     
141     strcpy(element, name);
142     if (sub)
143     {
144         strcat (element, ",");
145         strcat (element, sub);
146     }
147     p->which = ILL_Person_Or_Institution_Symbol_person_symbol;
148     if ((p->u.person_symbol = ill_get_ILL_String (gc, element, "person")))
149         return p;
150
151     p->which = ILL_Person_Or_Institution_Symbol_institution_symbol;
152     if ((p->u.institution_symbol =
153          ill_get_ILL_String (gc, element, "institution")))
154         return p;
155     return 0;
156 }
157
158 static ILL_Name_Of_Person_Or_Institution *ill_get_Name_Of_Person_Or_Institution(
159     struct ill_get_ctl *gc, const char *name, const char *sub)
160 {
161     char element[128];
162     ODR o = gc->odr;
163     ILL_Name_Of_Person_Or_Institution *p =
164         (ILL_Name_Of_Person_Or_Institution *) odr_malloc (o, sizeof(*p));
165     
166     strcpy(element, name);
167     if (sub)
168     {
169         strcat (element, ",");
170         strcat (element, sub);
171     }
172     p->which = ILL_Name_Of_Person_Or_Institution_name_of_person;
173     if ((p->u.name_of_person =
174          ill_get_ILL_String (gc, element, "name-of-person")))
175         return p;
176
177     p->which = ILL_Name_Of_Person_Or_Institution_name_of_institution;
178     if ((p->u.name_of_institution =
179          ill_get_ILL_String (gc, element, "name-of-institution")))
180         return p;
181     return 0;
182 }
183     
184 ILL_System_Id *ill_get_System_Id(struct ill_get_ctl *gc,
185                                  const char *name, const char *sub)
186 {
187     ODR o = gc->odr;
188     char element[128];
189     ILL_System_Id *p;
190     
191     strcpy(element, name);
192     if (sub)
193     {
194         strcat (element, ",");
195         strcat (element, sub);
196     }
197     p = (ILL_System_Id *) odr_malloc (o, sizeof(*p));
198     p->person_or_institution_symbol = ill_get_Person_Or_Insitution_Symbol (
199         gc, element, "person-or-institution-symbol");
200     p->name_of_person_or_institution = ill_get_Name_Of_Person_Or_Institution (
201         gc, element, "name-of-person-or-institution");
202     return p;
203 }
204
205 ILL_Transaction_Id *ill_get_Transaction_Id (struct ill_get_ctl *gc,
206                                             const char *name, const char *sub)
207 {
208     ODR o = gc->odr;
209     ILL_Transaction_Id *r = (ILL_Transaction_Id *) odr_malloc (o, sizeof(*r));
210     char element[128];
211     
212     strcpy(element, name);
213     if (sub)
214     {
215         strcat (element, ",");
216         strcat (element, sub);
217     }    
218     r->initial_requester_id =
219         ill_get_System_Id (gc, element, "initial-requester-id");
220     r->transaction_group_qualifier =
221         ill_get_ILL_String_x (gc, element, "transaction-group-qualifier", "");
222     r->transaction_qualifier =
223         ill_get_ILL_String_x (gc, element, "transaction-qualifier", "");
224     r->sub_transaction_qualifier =
225         ill_get_ILL_String (gc, element, "sub-transaction-qualifier");
226     return r;
227 }
228
229
230 ILL_Service_Date_this *ill_get_Service_Date_this (
231     struct ill_get_ctl *gc, const char *name, const char *sub)
232 {
233     ODR o = gc->odr;
234     ILL_Service_Date_this *r =
235         (ILL_Service_Date_this *) odr_malloc (o, sizeof(*r));
236     char element[128];
237     
238     strcpy(element, name);
239     if (sub)
240     {
241         strcat (element, ",");
242         strcat (element, sub);
243     }
244     r->date = ill_get_ILL_ISO_Date (gc, element, "date", "20000101");
245     r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
246     return r;
247 }
248
249 ILL_Service_Date_original *ill_get_Service_Date_original (
250     struct ill_get_ctl *gc, const char *name, const char *sub)
251 {
252     ODR o = gc->odr;
253     ILL_Service_Date_original *r =
254         (ILL_Service_Date_original *) odr_malloc (o, sizeof(*r));
255     char element[128];
256     
257     strcpy(element, name);
258     if (sub)
259     {
260         strcat (element, ",");
261         strcat (element, sub);
262     }
263     r->date = ill_get_ILL_ISO_Date (gc, element, "date", 0);
264     r->time = ill_get_ILL_ISO_Time (gc, element, "time", 0);
265     if (!r->date && !r->time)
266         return 0;
267     return r;
268 }
269
270 ILL_Service_Date_Time *ill_get_Service_Date_Time (
271     struct ill_get_ctl *gc, const char *name, const char *sub)
272 {
273     ODR o = gc->odr;
274     ILL_Service_Date_Time *r =
275         (ILL_Service_Date_Time *) odr_malloc (o, sizeof(*r));
276     char element[128];
277     
278     strcpy(element, name);
279     if (sub)
280     {
281         strcat (element, ",");
282         strcat (element, sub);
283     }    
284     r->date_time_of_this_service = ill_get_Service_Date_this (
285         gc, element, "this");
286     r->date_time_of_original_service = ill_get_Service_Date_original (
287         gc, element, "original");
288     return r;
289 }
290
291 ILL_Requester_Optional_Messages_Type *ill_get_Requester_Optional_Messages_Type (
292     struct ill_get_ctl *gc, const char *name, const char *sub)
293 {
294     ODR o = gc->odr;
295     ILL_Requester_Optional_Messages_Type *r =
296         (ILL_Requester_Optional_Messages_Type *) odr_malloc (o, sizeof(*r));
297     char element[128];
298     
299     strcpy(element, name);
300     if (sub)
301     {
302         strcat (element, ",");
303         strcat (element, sub);
304     }
305     r->can_send_RECEIVED = ill_get_bool (gc, element, "can-send-RECEIVED", 0);
306     r->can_send_RETURNED = ill_get_bool (gc, element, "can-send-RETURNED", 0);
307     r->requester_SHIPPED =
308         ill_get_enumerated (gc, element, "requester-SHIPPED", 1);
309     r->requester_CHECKED_IN =
310         ill_get_enumerated (gc, element, "requester-CHECKED-IN", 1);
311     return r;
312 }
313
314 ILL_Item_Id *ill_get_Item_Id (
315     struct ill_get_ctl *gc, const char *name, const char *sub)   
316 {
317     ODR o = gc->odr;
318     ILL_Item_Id *r = (ILL_Item_Id *) odr_malloc (o, sizeof(*r));
319     char element[128];
320     
321     strcpy(element, name);
322     if (sub)
323     {
324         strcat (element, ",");
325         strcat (element, sub);
326     }
327     r->item_type = ill_get_enumerated (gc, element, "item-type",
328                                        ILL_Item_Id_monograph);
329     r->held_medium_type = 0;
330     r->call_number = ill_get_ILL_String(gc, element, "call-number");
331     r->author = ill_get_ILL_String(gc, element, "author");
332     r->title = ill_get_ILL_String(gc, element, "title");
333     r->sub_title = ill_get_ILL_String(gc, element, "sub-title");
334     r->sponsoring_body = ill_get_ILL_String(gc, element, "sponsoring-body");
335     r->place_of_publication =
336         ill_get_ILL_String(gc, element, "place-of-publication");
337     r->publisher = ill_get_ILL_String(gc, element, "publisher");
338     r->series_title_number =
339         ill_get_ILL_String(gc, element, "series-title-number");
340     r->volume_issue = ill_get_ILL_String(gc, element, "volume-issue");
341     r->edition = ill_get_ILL_String(gc, element, "edition");
342     r->publication_date = ill_get_ILL_String(gc, element, "publication-date");
343     r->publication_date_of_component =
344         ill_get_ILL_String(gc, element, "publication-date-of-component");
345     r->author_of_article = ill_get_ILL_String(gc, element,
346                                               "author-of-article");
347     r->title_of_article = ill_get_ILL_String(gc, element, "title-of-article");
348     r->pagination = ill_get_ILL_String(gc, element, "pagination");
349     r->national_bibliography_no = 0;
350     r->iSBN = ill_get_ILL_String(gc, element, "ISBN");
351     r->iSSN = ill_get_ILL_String(gc, element, "ISSN");
352     r->system_no = 0;
353     r->additional_no_letters =
354         ill_get_ILL_String(gc, element, "additional-no-letters");
355     r->verification_reference_source = 
356         ill_get_ILL_String(gc, element, "verification-reference-source");
357     return r;
358 }
359
360
361 ILL_Client_Id *ill_get_Client_Id (
362     struct ill_get_ctl *gc, const char *name, const char *sub)
363 {
364     char element[128];
365     ODR o = gc->odr;
366     ILL_Client_Id *r = (ILL_Client_Id *) odr_malloc(o, sizeof(*r));
367
368     strcpy(element, name);
369     if (sub)
370     {
371         strcat (element, ",");
372         strcat (element, sub);
373     }
374     r->client_name = ill_get_ILL_String (gc, element, "client-name");
375     r->client_status = ill_get_ILL_String (gc, element, "client-status");
376     r->client_identifier = ill_get_ILL_String (gc, element,
377                                                "client-identifier");
378     return r;
379 }
380
381 ILL_Postal_Address *ill_get_Postal_Address (
382     struct ill_get_ctl *gc, const char *name, const char *sub)
383 {
384     ODR o = gc->odr;
385     ILL_Postal_Address *r =
386         (ILL_Postal_Address *) odr_malloc(o, sizeof(*r));
387     char element[128];
388
389     strcpy(element, name);
390     if (sub)
391     {
392         strcat (element, ",");
393         strcat (element, sub);
394     }
395     r->name_of_person_or_institution = 
396         ill_get_Name_Of_Person_Or_Institution (
397             gc, element, "name-of-person-or-institution");
398     r->extended_postal_delivery_address =
399         ill_get_ILL_String (
400             gc, element, "extended-postal-delivery-address");
401     r->street_and_number =
402         ill_get_ILL_String (gc, element, "street-and-number");
403     r->post_office_box =
404         ill_get_ILL_String (gc, element, "post-office-box");
405     r->city = ill_get_ILL_String (gc, element, "city");
406     r->region = ill_get_ILL_String (gc, element, "region");
407     r->country = ill_get_ILL_String (gc, element, "country");
408     r->postal_code = ill_get_ILL_String (gc, element, "postal-code");
409     return r;
410 }
411
412 ILL_System_Address *ill_get_System_Address (
413     struct ill_get_ctl *gc, const char *name, const char *sub)
414 {
415     ODR o = gc->odr;
416     ILL_System_Address *r =
417         (ILL_System_Address *) odr_malloc(o, sizeof(*r));
418     char element[128];
419     
420     strcpy(element, name);
421     if (sub)
422     {
423         strcat (element, ",");
424         strcat (element, sub);
425     }
426     r->telecom_service_identifier =
427         ill_get_ILL_String (gc, element, "telecom-service-identifier");
428     r->telecom_service_address =
429         ill_get_ILL_String (gc, element, "telecom-service-addreess");
430     return r;
431 }
432
433 ILL_Delivery_Address *ill_get_Delivery_Address (
434     struct ill_get_ctl *gc, const char *name, const char *sub)
435 {
436     ODR o = gc->odr;
437     ILL_Delivery_Address *r =
438         (ILL_Delivery_Address *) odr_malloc(o, sizeof(*r));
439     char element[128];
440     
441     strcpy(element, name);
442     if (sub)
443     {
444         strcat (element, ",");
445         strcat (element, sub);
446     }
447     r->postal_address =
448         ill_get_Postal_Address (gc, element, "postal-address");
449     r->electronic_address =
450         ill_get_System_Address (gc, element, "electronic-address");
451     return r;
452 }
453
454 ILL_Search_Type *ill_get_Search_Type (
455     struct ill_get_ctl *gc, const char *name, const char *sub)
456 {
457     ODR o = gc->odr;
458     ILL_Search_Type *r = (ILL_Search_Type *) odr_malloc(o, sizeof(*r));
459     char element[128];
460     
461     strcpy(element, name);
462     if (sub)
463     {
464         strcat (element, ",");
465         strcat (element, sub);
466     }
467     r->level_of_service = ill_get_ILL_String (gc, element, "level-of-service");
468     r->need_before_date = ill_get_ILL_ISO_Date (gc, element,
469                                                 "need-before-date", 0);
470     r->expiry_date = ill_get_ILL_ISO_Date (gc, element, "expiry-date", 0);
471     r->expiry_flag = ill_get_enumerated (gc, element, "expiry-flag", 3);
472                                          
473     return r;
474 }
475
476 ILL_Request *ill_get_ILLRequest (
477     struct ill_get_ctl *gc, const char *name, const char *sub)
478 {
479     ODR o = gc->odr;
480     ILL_Request *r = (ILL_Request *) odr_malloc(o, sizeof(*r));
481     char element[128];
482     
483     strcpy(element, name);
484     if (sub)
485     {
486         strcat (element, ",");
487         strcat (element, sub);
488     }
489     r->protocol_version_num =
490         ill_get_enumerated (gc, element, "protocol-version-num", 
491                             ILL_Request_version_2);
492     
493     r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
494     r->service_date_time =
495         ill_get_Service_Date_Time (gc, element, "service-date-time");
496     r->requester_id = ill_get_System_Id (gc, element, "requester-id");
497     r->responder_id = ill_get_System_Id (gc, element, "responder-id");
498     r->transaction_type =
499         ill_get_enumerated(gc, element, "transaction-type", 1);
500
501     r->delivery_address =
502         ill_get_Delivery_Address (gc, element, "delivery-address");
503     r->delivery_service = 0; /* TODO */
504     /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
505     r->billing_address =
506         ill_get_Delivery_Address (gc, element, "billing-address");
507
508     r->num_iLL_service_type = 1;
509     r->iLL_service_type = (ILL_Service_Type **)
510         odr_malloc (o, sizeof(*r->iLL_service_type));
511     *r->iLL_service_type =
512         ill_get_enumerated (gc, element, "ill-service-type",
513                             ILL_Service_Type_copy_non_returnable);
514
515     r->responder_specific_service = 0;
516     r->requester_optional_messages =
517         ill_get_Requester_Optional_Messages_Type (
518             gc, element,"requester-optional-messages");
519     r->search_type = ill_get_Search_Type(gc, element, "search-type");
520     r->num_supply_medium_info_type = 0;
521     r->supply_medium_info_type = 0;
522
523     r->place_on_hold = ill_get_enumerated (
524         gc, element, "place-on-hold", 
525         ILL_Place_On_Hold_Type_according_to_responder_policy);
526     r->client_id = ill_get_Client_Id (gc, element, "client-id");
527                            
528     r->item_id = ill_get_Item_Id (gc, element, "item-id");
529     r->supplemental_item_description = 0;
530     r->cost_info_type = 0;
531     r->copyright_compliance =
532         ill_get_ILL_String(gc, element, "copyright-complicance");
533     r->third_party_info_type = 0;
534     r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
535     r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
536     r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
537     r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
538     r->num_iLL_request_extensions = 0;
539     r->iLL_request_extensions = 0;
540     return r;
541 }
542
543 ILL_ItemRequest *ill_get_ItemRequest (
544     struct ill_get_ctl *gc, const char *name, const char *sub)
545 {
546     ODR o = gc->odr;
547     ILL_ItemRequest *r = (ILL_ItemRequest *)odr_malloc(o, sizeof(*r));
548     char element[128];
549     
550     strcpy(element, name);
551     if (sub)
552     {
553         strcat (element, ",");
554         strcat (element, sub);
555     }
556     r->protocol_version_num =
557         ill_get_enumerated (gc, element, "protocol-version-num", 
558                             ILL_Request_version_2);
559     
560     r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
561     r->service_date_time =
562         ill_get_Service_Date_Time (gc, element, "service-date-time");
563     r->requester_id = ill_get_System_Id (gc, element, "requester-id");
564     r->responder_id = ill_get_System_Id (gc, element, "responder-id");
565     r->transaction_type =
566         ill_get_enumerated(gc, element, "transaction-type", 1);
567
568     r->delivery_address =
569         ill_get_Delivery_Address (gc, element, "delivery-address");
570     r->delivery_service = 0; /* TODO */
571     /* ill_get_Delivery_Service (gc, element, "delivery-service"); */
572     r->billing_address =
573         ill_get_Delivery_Address (gc, element, "billing-address");
574
575     r->num_iLL_service_type = 1;
576     r->iLL_service_type = (ILL_Service_Type **)
577         odr_malloc (o, sizeof(*r->iLL_service_type));
578     *r->iLL_service_type =
579         ill_get_enumerated (gc, element, "ill-service-type",
580                             ILL_Service_Type_copy_non_returnable);
581
582     r->responder_specific_service = 0;
583     r->requester_optional_messages =
584         ill_get_Requester_Optional_Messages_Type (
585             gc, element,"requester-optional-messages");
586     r->search_type = ill_get_Search_Type(gc, element, "search-type");
587     r->num_supply_medium_info_type = 0;
588     r->supply_medium_info_type = 0;
589
590     r->place_on_hold = ill_get_enumerated (
591         gc, element, "place-on-hold", 
592         ILL_Place_On_Hold_Type_according_to_responder_policy);
593     r->client_id = ill_get_Client_Id (gc, element, "client-id");
594                            
595     r->item_id = ill_get_Item_Id (gc, element, "item-id");
596     r->supplemental_item_description = 0;
597     r->cost_info_type = 0;
598     r->copyright_compliance =
599         ill_get_ILL_String(gc, element, "copyright-complicance");
600     r->third_party_info_type = 0;
601     r->retry_flag = ill_get_bool (gc, element, "retry-flag", 0);
602     r->forward_flag = ill_get_bool (gc, element, "forward-flag", 0);
603     r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
604     r->forward_note = ill_get_ILL_String(gc, element, "forward-note");
605     r->num_iLL_request_extensions = 0;
606     r->iLL_request_extensions = 0;
607     return r;
608 }
609
610 ILL_Cancel *ill_get_Cancel (
611     struct ill_get_ctl *gc, const char *name, const char *sub)
612 {
613     ODR o = gc->odr;
614     ILL_Cancel *r = (ILL_Cancel *)odr_malloc(o, sizeof(*r));
615     char element[128];
616     
617     strcpy(element, name);
618     if (sub)
619     {
620         strcat (element, ",");
621         strcat (element, sub);
622     }
623     r->protocol_version_num =
624         ill_get_enumerated (gc, element, "protocol-version-num", 
625                             ILL_Request_version_2);
626     
627     r->transaction_id = ill_get_Transaction_Id (gc, element, "transaction-id");
628     r->service_date_time =
629         ill_get_Service_Date_Time (gc, element, "service-date-time");
630     r->requester_id = ill_get_System_Id (gc, element, "requester-id");
631     r->responder_id = ill_get_System_Id (gc, element, "responder-id");
632     r->requester_note = ill_get_ILL_String(gc, element, "requester-note");
633
634     r->num_cancel_extensions = 0;
635     r->cancel_extensions = 0;
636     return r;
637 }
638
639 ILL_APDU *ill_get_APDU (
640     struct ill_get_ctl *gc, const char *name, const char *sub)
641 {
642     ODR o = gc->odr;
643     ILL_APDU *r = (ILL_APDU *)odr_malloc(o, sizeof(*r));
644     char element[128];
645     const char *v;
646
647     strcpy (element, name);
648     strcat (element, ",which");
649
650     v = (gc->f)(gc->clientData, element);
651     if (!v)
652         v = "request";
653     if (!strcmp (v, "request"))
654     {
655         r->which = ILL_APDU_ILL_Request;
656         r->u.illRequest = ill_get_ILLRequest(gc, name, sub);
657     }
658     else if (!strcmp (v, "cancel"))
659     {
660         r->which = ILL_APDU_Cancel;
661         r->u.Cancel = ill_get_Cancel(gc, name, sub);
662     }
663     else
664         return 0;
665     return r;
666 }