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