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