Better ODR diagnostics for missing elements which includes additional
[yaz-moved-to-github.git] / doc / odr.xml
1 <!-- $Id: odr.xml,v 1.9 2003-05-20 19:55:29 adam Exp $ -->
2  <chapter id="odr"><title>The ODR Module</title>
3   
4   <sect1 id="odr.introduction"><title>Introduction</title>
5
6    <para>
7      &odr; is the BER-encoding/decoding subsystem of &yaz;. Care as been taken
8     to isolate &odr; from the rest of the package - specifically from the
9     transport interface. &odr; may be used in any context where basic
10     ASN.1/BER representations are used.
11    </para>
12
13    <para>
14     If you are only interested in writing a Z39.50 implementation based on
15     the PDUs that are already provided with &yaz;, you only need to concern
16     yourself with the section on managing ODR streams (section
17     <link linkend="odr-use">Using ODR</link>). Only if you need to
18     implement ASN.1 beyond that which has been provided, should you
19     worry about the second half of the documentation
20     (section <link linkend="odr-prog">Programming with ODR</link>).
21     If you use one of the higher-level interfaces, you can skip this
22     section entirely.
23    </para>
24
25    <para>
26     This is important, so we'll repeat it for emphasis: <emphasis>You do
27     not need to read section <link linkend="odr-prog">Programming with
28     ODR</link> to implement Z39.50 with &yaz;.</emphasis>
29    </para>
30
31    <para>
32     If you need a part of the protocol that isn't already in &yaz;, you
33     should contact the authors before going to work on it yourself: We
34     might already be working on it. Conversely, if you implement a useful
35     part of the protocol before us, we'd be happy to include it in a
36     future release.
37    </para>
38
39   </sect1>
40   <sect1 id="odr.use"><title id="odr-use">Using ODR</title>
41
42    <sect2><title>ODR Streams</title>
43
44     <para>
45      Conceptually, the ODR stream is the source of encoded data in the
46      decoding mode; when encoding, it is the receptacle for the encoded
47      data. Before you can use an ODR stream it must be allocated. This is
48      done with the function
49     </para>
50
51     <synopsis>
52      ODR odr_createmem(int direction);
53     </synopsis>
54
55     <para>
56      The <function>odr_createmem()</function> function takes as argument one
57      of three manifest constants: <literal>ODR_ENCODE</literal>,
58      <literal>ODR_DECODE</literal>, or <literal>ODR_PRINT</literal>.
59      An &odr; stream can be in only one mode - it is not possible to change
60      its mode once it's selected. Typically, your program will allocate
61      at least two ODR streams - one for decoding, and one for encoding.
62     </para>
63
64     <para>
65      When you're done with the stream, you can use
66     </para>
67
68     <synopsis>
69      void odr_destroy(ODR o);
70     </synopsis>
71
72     <para>
73      to release the resources allocated for the stream.
74     </para>
75    </sect2>
76
77    <sect2><title id="memory">Memory Management</title>
78
79     <para>
80      Two forms of memory management take place in the &odr; system. The first
81      one, which has to do with allocating little bits of memory (sometimes
82      quite large bits of memory, actually) when a protocol package is
83      decoded, and turned into a complex of interlinked structures. This
84      section deals with this system, and how you can use it for your own
85      purposes. The next section deals with the memory management which is
86      required when encoding data - to make sure that a large enough buffer is
87      available to hold the fully encoded PDU.
88     </para>
89
90     <para>
91      The &odr; module has its own memory management system, which is
92      used whenever memory is required. Specifically, it is used to allocate
93      space for data when decoding incoming PDUs. You can use the memory
94      system for your own purposes, by using the function
95     </para>
96
97     <synopsis>
98      void *odr_malloc(ODR o, int size);
99     </synopsis>
100
101     <para>
102      You can't use the normal <function>free(2)</function> routine to free
103      memory allocated by this function, and &odr; doesn't provide a parallel
104      function. Instead, you can call
105     </para>
106
107     <synopsis>
108      void odr_reset(ODR o, int size);
109     </synopsis>
110
111     <para>
112      when you are done with the
113      memory: Everything allocated since the last call to
114      <function>odr_reset()</function> is released.
115      The <function>odr_reset()</function> call is also required to clear
116      up an error condition on a stream.
117     </para>
118
119     <para>
120      The function
121     </para>
122
123     <synopsis>
124      int odr_total(ODR o);
125     </synopsis>
126
127     <para>
128      returns the number of bytes allocated on the stream since the last call to
129      <function>odr_reset()</function>.
130     </para>
131
132     <para>
133      The memory subsystem of &odr; is fairly efficient at allocating and
134      releasing little bits of memory. Rather than managing the individual,
135      small bits of space, the system maintains a free-list of larger chunks
136      of memory, which are handed out in small bits. This scheme is
137      generally known as a <emphasis>nibble memory</emphasis> system.
138      It is very useful for maintaining short-lived constructions such
139      as protocol PDUs.
140     </para>
141
142     <para>
143      If you want to retain a bit of memory beyond the next call to
144      <function>odr_reset()</function>, you can use the function
145     </para>
146
147     <synopsis>
148      ODR_MEM odr_extract_mem(ODR o);
149     </synopsis>
150
151     <para>
152      This function will give you control of the memory recently allocated
153      on the ODR stream. The memory will live (past calls to
154      <function>odr_reset()</function>), until you call the function
155     </para>
156
157     <synopsis>
158      void odr_release_mem(ODR_MEM p);
159     </synopsis>
160
161     <para>
162      The opaque <literal>ODR_MEM</literal> handle has no other purpose than
163      referencing the memory block for you until you want to release it.
164     </para>
165
166     <para>
167      You can use <function>odr_extract_mem()</function> repeatedly between
168      allocating data, to retain individual control of separate chunks of data.
169     </para>
170
171    </sect2>
172    <sect2><title>Encoding and Decoding Data</title>
173
174     <para>
175      When encoding data, the ODR stream will write the encoded octet string
176      in an internal buffer. To retrieve the data, use the function
177     </para>
178
179     <synopsis>
180      char *odr_getbuf(ODR o, int *len, int *size);
181     </synopsis>
182
183     <para>
184      The integer pointed to by len is set to the length of the encoded
185      data, and a pointer to that data is returned. <literal>*size</literal>
186      is set to the size of the buffer (unless <literal>size</literal> is null,
187      signaling that you are not interested in the size). The next call to
188      a primitive function using the same &odr; stream will overwrite the
189      data, unless a different buffer has been supplied using the call
190     </para>
191
192     <synopsis>
193      void odr_setbuf(ODR o, char *buf, int len, int can_grow);
194     </synopsis>
195
196     <para>
197      which sets the encoding (or decoding) buffer used by
198      <literal>o</literal> to <literal>buf</literal>, using the length
199      <literal>len</literal>.
200      Before a call to an encoding function, you can use
201      <function>odr_setbuf()</function> to provide the stream with an encoding
202      buffer of sufficient size (length). The <literal>can_grow</literal>
203      parameter tells the encoding &odr; stream whether it is allowed to use
204      <function>realloc(2)</function> to increase the size of the buffer when
205      necessary. The default condition of a new encoding stream is equivalent
206      to the results of calling
207     </para>
208
209     <synopsis>
210      odr_setbuf(stream, 0, 0, 1);
211     </synopsis>
212
213     <para>
214      In this case, the stream will allocate and reallocate memory as
215      necessary. The stream reallocates memory by repeatedly doubling the
216      size of the buffer - the result is that the buffer will typically
217      reach its maximum, working size with only a small number of reallocation
218      operations. The memory is freed by the stream when the latter is destroyed,
219      unless it was assigned by the user with the <literal>can_grow</literal>
220      parameter set to zero (in this case, you are expected to retain
221      control of the memory yourself).
222     </para>
223
224     <para>
225      To assume full control of an encoded buffer, you must first call
226      <function>odr_getbuf()</function> to fetch the buffer and its length.
227      Next, you should call <function>odr_setbuf()</function> to provide a
228      different buffer (or a null pointer) to the stream. In the simplest
229      case, you will reuse the same buffer over and over again, and you
230      will just need to call <function>odr_getbuf()</function> after each
231      encoding operation to get the length and address of the buffer.
232      Note that the stream may reallocate the buffer during an encoding
233      operation, so it is necessary to retrieve the correct address after
234      each encoding operation.
235     </para>
236
237     <para>
238      It is important to realize that the ODR stream will not release this
239      memory when you call <function>odr_reset()</function>: It will
240      merely update its internal pointers to prepare for the encoding of a
241      new data value.
242      When the stream is released by the <function>odr_destroy()</function>
243      function, the memory given to it by <function>odr_setbuf</function> will
244      be released <emphasis>only</emphasis> if the <literal>can_grow</literal>
245      parameter to <function>odr_setbuf()</function> was nonzero. The
246      <literal>can_grow</literal> parameter, in other words, is a way of
247      signaling who is to own the buffer, you or the ODR stream. If you never call
248      <function>odr_setbuf()</function> on your encoding stream, which is
249      typically the case, the buffer allocated by the stream will belong to
250      the stream by default.
251     </para>
252
253     <para>
254      When you wish to decode data, you should first call
255      <function>odr_setbuf()</function>, to tell the decoding stream
256      where to find the encoded data, and how long the buffer is
257      (the <literal>can_grow</literal> parameter is ignored by a decoding
258      stream). After this, you can call the function corresponding to the
259      data you wish to decode (eg, <function>odr_integer()</function> odr
260      <function>z_APDU()</function>).
261     </para>
262
263     <para>
264      Examples of encoding/decoding functions:
265     </para>
266
267     <synopsis>
268      int odr_integer(ODR o, int **p, int optional, const char *name);
269
270      int z_APDU(ODR o, Z_APDU **p, int optional, const char *name);
271     </synopsis>
272
273     <para>
274      If the data is absent (or doesn't match the tag corresponding to
275      the type), the return value will be either 0 or 1 depending on the
276      <literal>optional</literal> flag. If <literal>optional</literal>
277      is 0 and the data is absent, an error flag will be raised in the
278      stream, and you'll need to call <function>odr_reset()</function> before
279      you can use the stream again. If <literal>optional</literal> is
280      nonzero, the pointer <emphasis>pointed</emphasis> to/ by
281      <literal>p</literal> will be set to the null value, and the function
282      will return 1.
283      The <literal>name</literal> argument is used to pretty-print the
284      tag in question. It may be set to <literal>NULL</literal> if
285      pretty-printing is not desired.
286     </para>
287
288     <para>
289      If the data value is found where it's expected, the pointer
290      <emphasis>pointed to</emphasis> by the <literal>p</literal> argument
291      will be set to point to the decoded type.
292      The space for the type will be allocated and owned by the &odr;
293      stream, and it will live until you call
294      <function>odr_reset()</function> on the stream. You cannot use
295      <function>free(2)</function> to release the memory.
296      You can decode several data elements (by repeated calls to
297      <function>odr_setbuf()</function> and your decoding function), and
298      new memory will be allocated each time. When you do call 
299      <function>odr_reset()</function>, everything decoded since the
300      last call to <function>odr_reset()</function> will be released.
301     </para>
302
303     <para>
304      The use of the double indirection can be a little confusing at first
305      (its purpose will become clear later on, hopefully),
306      so an example is in order. We'll encode an integer value, and
307      immediately decode it again using a different stream. A useless, but
308      informative operation.
309     </para>
310
311     <programlisting>
312
313 void do_nothing_useful(int value)
314 {
315     ODR encode, decode;
316     int *valp, *resvalp;
317     char *bufferp;
318     int len;
319      
320     /* allocate streams */
321     if (!(encode = odr_createmem(ODR_ENCODE)))
322         return;
323     if (!(decode = odr_createmem(ODR_DECODE)))
324         return;
325
326     valp = &amp;value;
327     if (odr_integer(encode, &amp;valp, 0, 0) == 0)
328     {
329         printf("encoding went bad\n");
330         return;
331     }
332     bufferp = odr_getbuf(encode, &amp;len);
333     printf("length of encoded data is &percnt;d\n", len);
334
335     /* now let's decode the thing again */
336     odr_setbuf(decode, bufferp, len);
337     if (odr_integer(decode, &amp;resvalp, 0, 0) == 0)
338     {
339         printf("decoding went bad\n");
340         return;
341     }
342     printf("the value is &percnt;d\n", *resvalp);
343
344     /* clean up */
345     odr_destroy(encode);
346     odr_destroy(decode);
347 }
348     </programlisting>
349
350     <para>
351      This looks like a lot of work, offhand. In practice, the &odr; streams
352      will typically be allocated once, in the beginning of your program
353      (or at the beginning of a new network session), and the encoding
354      and decoding will only take place in a few, isolated places in your
355      program, so the overhead is quite manageable.
356     </para>
357
358    </sect2>
359
360    <sect2><title>Diagnostics</title>
361
362     <para>
363      The encoding/decoding functions all return 0 when an error occurs.
364      Until you call <function>odr_reset()</function>, you cannot use the
365      stream again, and any function called will immediately return 0.
366     </para>
367
368     <para>
369      To provide information to the programmer or administrator, the function
370     </para>
371
372     <synopsis>
373      void odr_perror(ODR o, char *message);
374     </synopsis>
375
376     <para>
377      is provided, which prints the <literal>message</literal> argument to
378      <literal>stderr</literal> along with an error message from the stream.
379     </para>
380
381     <para>
382      You can also use the function
383     </para>
384
385     <synopsis>
386      int odr_geterror(ODR o);
387     </synopsis>
388
389     <para>
390      to get the current error number from the screen. The number will be
391      one of these constants:
392     </para>
393
394     <table frame="top"><title>ODR Error codes</title>
395      <tgroup cols="2">
396       <thead>
397        <row>
398         <entry>code</entry>
399         <entry>Description</entry>
400        </row>
401       </thead>
402       <tbody>
403        <row>
404         <entry>OMEMORY</entry><entry>Memory allocation failed.</entry>
405        </row>
406
407        <row>
408         <entry>OSYSERR</entry><entry>A system- or library call has failed.
409          The standard diagnostic variable <literal>errno</literal> should be
410          examined to determine the actual error.</entry>
411        </row>
412
413        <row>
414         <entry>OSPACE</entry><entry>No more space for encoding.
415          This will only occur when the user has explicitly provided a
416          buffer for an encoding stream without allowing the system to
417          allocate more space.</entry>
418        </row>
419
420        <row>
421         <entry>OREQUIRED</entry><entry>This is a common protocol error; A
422          required data element was missing during encoding or decoding.</entry>
423        </row>
424
425        <row>
426         <entry>OUNEXPECTED</entry><entry>An unexpected data element was
427          found during decoding.</entry>
428        </row>
429
430        <row><entry>OOTHER</entry><entry>Other error. This is typically an
431          indication of misuse of the &odr; system by the programmer, and also
432          that the diagnostic system isn't as good as it should be, yet.</entry>
433        </row>
434       </tbody>
435      </tgroup>
436     </table>
437
438     <para>
439      The character string array
440     </para>
441
442     <synopsis>
443      char *odr_errlist&lsqb;&rsqb;
444     </synopsis>
445
446     <para>
447      can be indexed by the error code to obtain a human-readable
448      representation of the problem.
449     </para>
450
451    </sect2>
452    <sect2><title>Summary and Synopsis</title>
453
454     <synopsis>
455      #include &lt;odr.h>
456
457      ODR odr_createmem(int direction);
458
459      void odr_destroy(ODR o);
460
461      void odr_reset(ODR o);
462
463      char *odr_getbuf(ODR o, int *len);
464
465      void odr_setbuf(ODR o, char *buf, int len);
466
467      void *odr_malloc(ODR o, int size);
468
469      ODR_MEM odr_extract_mem(ODR o);
470
471      void odr_release_mem(ODR_MEM r);
472
473      int odr_geterror(ODR o);
474
475      void odr_perror(char *message);
476
477      extern char *odr_errlist[];
478     </synopsis>
479
480    </sect2>
481   </sect1>
482
483   <sect1 id="odr.programming"><title id="odr-prog">Programming with ODR</title>
484
485    <para>
486     The API of &odr; is designed to reflect the structure of ASN.1, rather
487     than BER itself. Future releases may be able to represent data in
488     other external forms.
489    </para>
490
491    <para>
492     The interface is based loosely on that of the Sun Microsystems XDR
493     routines.
494     Specifically, each function which corresponds to an ASN.1 primitive
495     type has a dual function. Depending on the settings of the ODR
496     stream which is supplied as a parameter, the function may be used
497     either to encode or decode data. The functions that can be built
498     using these primitive functions, to represent more complex data types,
499     share this quality. The result is that you only have to enter the
500     definition for a type once - and you have the functionality of encoding,
501     decoding (and pretty-printing) all in one unit.
502     The resulting C source code is quite compact, and is a pretty
503     straightforward representation of the source ASN.1 specification. 
504    </para>
505
506    <para>
507     In many cases, the model of the XDR functions works quite well in this
508     role.
509     In others, it is less elegant. Most of the hassle comes from the optional
510     SEQUENCE members which don't exist in XDR.
511    </para>
512
513    <sect2><title>The Primitive ASN.1 Types</title>
514
515     <para>
516      ASN.1 defines a number of primitive types (many of which correspond
517      roughly to primitive types in structured programming languages, such as C).
518     </para>
519
520     <sect3><title>INTEGER</title>
521
522      <para>
523       The &odr; function for encoding or decoding (or printing) the ASN.1
524       INTEGER type looks like this:
525      </para>
526
527      <synopsis>
528 int odr_integer(ODR o, int **p, int optional, const char *name);
529      </synopsis>
530
531      <para>
532       (we don't allow values that can't be contained in a C integer.)
533      </para>
534
535      <para>
536       This form is typical of the primitive &odr; functions. They are named
537       after the type of data that they encode or decode. They take an &odr;
538       stream, an indirect reference to the type in question, and an
539       <literal>optional</literal> flag (corresponding to the OPTIONAL keyword
540       of ASN.1) as parameters. They all return an integer value of either one
541       or zero.
542       When you use the primitive functions to construct encoders for complex
543       types of your own, you should follow this model as well. This
544       ensures that your new types can be reused as elements in yet more
545       complex types.
546      </para>
547
548      <para>
549       The <literal>o</literal> parameter should obviously refer to a properly
550       initialized &odr; stream of the right type (encoding/decoding/printing)
551       for the operation that you wish to perform.
552      </para>
553
554      <para>
555       When encoding or printing, the function first looks at
556       <literal>* p</literal>. If <literal>* p</literal> (the pointer pointed
557       to by <literal>p</literal>) is a null pointer, this is taken to mean that
558       the data element is absent. If the <literal>optional</literal> parameter
559       is nonzero, the function will return one (signifying success) without
560       any further processing. If the <literal>optional</literal> is zero, an
561       internal error flag is set in the &odr; stream, and the function will
562       return 0. No further operations can be carried out on the stream without
563       a call to the function <function>odr_reset()</function>.
564      </para>
565
566      <para>
567       If <literal>*p</literal> is not a null pointer, it is expected to
568       point to an instance of the data type. The data will be subjected to
569       the encoding rules, and the result will be placed in the buffer held
570       by the &odr; stream.
571      </para>
572
573      <para>
574       The other ASN.1 primitives have similar functions that operate in
575       similar manners:
576      </para>
577     </sect3>
578     <sect3><title>BOOLEAN</title>
579
580      <synopsis>
581 int odr_bool(ODR o, bool_t **p, int optional, const char *name);
582      </synopsis>
583
584     </sect3>
585     <sect3><title>REAL</title>
586
587      <para>
588       Not defined.
589      </para>
590
591     </sect3>
592     <sect3><title>NULL</title>
593
594      <synopsis>
595 int odr_null(ODR o, bool_t **p, int optional, const char *name);
596      </synopsis>
597
598      <para>
599       In this case, the value of **p is not important. If <literal>*p</literal>
600       is different from the null pointer, the null value is present, otherwise
601       it's absent.
602      </para>
603
604     </sect3>
605     <sect3><title>OCTET STRING</title>
606
607      <synopsis>
608 typedef struct odr_oct
609 {
610     unsigned char *buf;
611     int len;
612     int size;
613 } Odr_oct;
614
615 int odr_octetstring(ODR o, Odr_oct **p, int optional,
616                     const char *name);
617      </synopsis>
618
619      <para>
620       The <literal>buf</literal> field should point to the character array
621       that holds the octetstring. The <literal>len</literal> field holds the
622       actual length, while the <literal>size</literal> field gives the size
623       of the allocated array (not of interest to you, in most cases).
624       The character array need not be null terminated.
625      </para>
626
627      <para>
628       To make things a little easier, an alternative is given for string
629       types that are not expected to contain embedded NULL characters (eg.
630       VisibleString):
631      </para>
632
633      <synopsis>
634       int odr_cstring(ODR o, char **p, int optional, const char *name);
635      </synopsis>
636
637      <para>
638       Which encoded or decodes between OCTETSTRING representations and
639       null-terminates C strings.
640      </para>
641
642      <para>
643       Functions are provided for the derived string types, eg:
644      </para>
645
646      <synopsis>
647 int odr_visiblestring(ODR o, char **p, int optional,
648                       const char *name);
649      </synopsis>
650
651     </sect3>
652     <sect3><title>BIT STRING</title>
653
654      <synopsis>
655 int odr_bitstring(ODR o, Odr_bitmask **p, int optional,
656                   const char *name);
657      </synopsis>
658
659      <para>
660       The opaque type <literal>Odr_bitmask</literal> is only suitable for
661       holding relatively brief bit strings, eg. for options fields, etc.
662       The constant <literal>ODR_BITMASK_SIZE</literal> multiplied by 8
663       gives the maximum possible number of bits.
664      </para>
665
666      <para>
667       A set of macros are provided for manipulating the
668       <literal>Odr_bitmask</literal> type:
669      </para>
670
671      <synopsis>
672 void ODR_MASK_ZERO(Odr_bitmask *b);
673
674 void ODR_MASK_SET(Odr_bitmask *b, int bitno);
675
676 void ODR_MASK_CLEAR(Odr_bitmask *b, int bitno);
677
678 int ODR_MASK_GET(Odr_bitmask *b, int bitno);
679      </synopsis>
680
681      <para>
682       The functions are modeled after the manipulation functions that
683       accompany the <literal>fd_set</literal> type used by the
684       <function>select(2)</function> call.
685       <literal>ODR_MASK_ZERO</literal> should always be called first on a
686       new bitmask, to initialize the bits to zero.
687      </para>
688     </sect3>
689
690     <sect3><title>OBJECT IDENTIFIER</title>
691
692      <synopsis>
693 int odr_oid(ODR o, Odr_oid **p, int optional, const char *name);
694      </synopsis>
695
696      <para>
697       The C OID representation is simply an array of integers, terminated by
698       the value -1 (the <literal>Odr_oid</literal> type is synonymous with
699       the <literal>int</literal> type).
700       We suggest that you use the OID database module (see section
701       <link linkend="oid">Object Identifiers</link>) to handle object identifiers
702       in your application.
703      </para>
704
705     </sect3>
706    </sect2>
707    <sect2><title id="tag-prim">Tagging Primitive Types</title>
708
709     <para>
710      The simplest way of tagging a type is to use the
711      <function>odr_implicit_tag()</function> or 
712      <function>odr_explicit_tag()</function> macros:
713     </para>
714
715     <synopsis>
716 int odr_implicit_tag(ODR o, Odr_fun fun, int class, int tag,
717                      int optional, const char *name);
718
719 int odr_explicit_tag(ODR o, Odr_fun fun, int class, int tag,
720                      int optional, const char *name);
721     </synopsis>
722
723     <para>
724      To create a type derived from the integer type by implicit tagging, you
725      might write:
726     </para>
727
728     <screen>
729      MyInt ::= &lsqb;210&rsqb; IMPLICIT INTEGER
730     </screen>
731
732     <para>
733      In the &odr; system, this would be written like:
734     </para>
735
736     <screen>
737 int myInt(ODR o, int **p, int optional, const char *name)
738 {
739     return odr_implicit_tag(o, odr_integer, p,
740                             ODR_CONTEXT, 210, optional, name);
741 }
742     </screen>
743
744     <para>
745      The function <function>myInt()</function> can then be used like any of
746      the primitive functions provided by &odr;. Note that the behavior of
747      <function>odr_explicit_tag()</function>
748      and <function>odr_implicit_tag()</function> macros
749      act exactly the same as the functions they are applied to - they
750      respond to error conditions, etc, in the same manner - they
751      simply have three extra parameters. The class parameter may
752      take one of the values: <literal>ODR_CONTEXT</literal>,
753      <literal>ODR_PRIVATE</literal>, <literal>ODR_UNIVERSAL</literal>, or
754      <literal>/ODR_APPLICATION</literal>.
755     </para>
756
757    </sect2>
758    <sect2><title>Constructed Types</title>
759
760     <para>
761      Constructed types are created by combining primitive types. The
762       &odr; system only implements the SEQUENCE and SEQUENCE OF constructions
763      (although adding the rest of the container types should be simple
764      enough, if the need arises).
765     </para>
766
767     <para>
768      For implementing SEQUENCEs, the functions
769     </para>
770
771     <synopsis>
772 int odr_sequence_begin(ODR o, void *p, int size, const char *name);
773 int odr_sequence_end(ODR o);
774     </synopsis>
775
776     <para>
777      are provided.
778     </para>
779
780     <para>
781      The <function>odr_sequence_begin()</function> function should be
782      called in the beginning of a function that implements a SEQUENCE type.
783      Its parameters are the &odr; stream, a pointer (to a pointer to the type
784      you're implementing), and the <literal>size</literal> of the type
785      (typically a C structure). On encoding, it returns 1 if
786      <literal>* p</literal> is a null pointer. The <literal>size</literal>
787      parameter is ignored. On decoding, it returns 1 if the type is found in
788      the data stream. <literal>size</literal> bytes of memory are allocated,
789      and <literal>*p</literal> is set to point to this space.
790      <function>odr_sequence_end()</function> is called at the end of the
791      complex function. Assume that a type is defined like this:
792     </para>
793
794     <screen>
795 MySequence ::= SEQUENCE {
796      intval INTEGER,
797      boolval BOOLEAN OPTIONAL
798 }
799     </screen>
800
801     <para>
802      The corresponding &odr; encoder/decoder function and the associated data
803      structures could be written like this:
804     </para>
805
806     <screen>
807 typedef struct MySequence
808 {
809     int *intval;
810     bool_t *boolval;
811 } MySequence;
812      
813 int mySequence(ODR o, MySequence **p, int optional, const char *name)
814 {
815     if (odr_sequence_begin(o, p, sizeof(**p), name) == 0)
816         return optional &amp;&amp; odr_ok(o);
817     return
818         odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
819         odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
820         odr_sequence_end(o);
821 }
822
823     </screen>
824
825     <para>
826      Note the 1 in the call to <function>odr_bool()</function>, to mark
827      that the sequence member is optional.
828      If either of the member types had been tagged, the macros
829      <function>odr_implicit_tag()</function> or
830      <function>odr_explicit_tag()</function>
831      could have been used.
832      The new function can be used exactly like the standard functions provided
833      with &odr;. It will encode, decode or pretty-print a data value of the
834      <literal>MySequence</literal> type. We like to name types with an
835      initial capital, as done in ASN.1 definitions, and to name the
836      corresponding function with the first character of the name in lower case.
837      You could, of course, name your structures, types, and functions any way
838      you please - as long as you're consistent, and your code is easily readable.
839      <literal>odr_ok</literal> is just that - a predicate that returns the
840      state of the stream. It is used to ensure that the behavior of the new
841      type is compatible with the interface of the primitive types.
842     </para>
843
844    </sect2>
845    <sect2><title>Tagging Constructed Types</title>
846
847     <note>
848      <para>
849       See section <link linkend="tag-prim">Tagging Primitive types</link>
850       for information on how to tag the primitive types, as well as types
851       that are already defined.
852      </para>
853     </note>
854
855     <sect3><title>Implicit Tagging</title>
856
857      <para>
858       Assume the type above had been defined as
859      </para>
860
861      <screen>
862 MySequence ::= &lsqb;10&rsqb; IMPLICIT SEQUENCE {
863       intval INTEGER,
864       boolval BOOLEAN OPTIONAL
865 }
866      </screen>
867
868      <para>
869       You would implement this in &odr; by calling the function
870      </para>
871
872      <synopsis>
873 int odr_implicit_settag(ODR o, int class, int tag);
874      </synopsis>
875
876      <para>
877       which overrides the tag of the type immediately following it. The
878       macro <function>odr_implicit_tag()</function> works by calling
879       <function>odr_implicit_settag()</function> immediately
880       before calling the function pointer argument.
881       Your type function could look like this:
882      </para>
883
884      <screen>
885 int mySequence(ODR o, MySequence **p, int optional, const char *name)
886 {
887     if (odr_implicit_settag(o, ODR_CONTEXT, 10) == 0 ||
888         odr_sequence_begin(o, p, sizeof(**p), name) == 0)
889         return optional &amp;&amp; odr_ok(o);
890     return
891         odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
892         odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
893         odr_sequence_end(o);
894 }
895      </screen>
896
897      <para>
898       The definition of the structure <literal>MySequence</literal> would be
899       the same.
900      </para>
901     </sect3>
902
903     <sect3><title>Explicit Tagging</title>
904
905      <para>
906       Explicit tagging of constructed types is a little more complicated,
907       since you are in effect adding a level of construction to the data.
908      </para>
909
910      <para>
911       Assume the definition:
912      </para>
913
914      <screen>
915 MySequence ::= &lsqb;10&rsqb; IMPLICIT SEQUENCE {
916    intval INTEGER,
917    boolval BOOLEAN OPTIONAL
918 }
919      </screen>
920
921      <para>
922       Since the new type has an extra level of construction, two new functions
923       are needed to encapsulate the base type:
924      </para>
925
926      <synopsis>
927 int odr_constructed_begin(ODR o, void *p, int class, int tag,
928                           const char *name);
929
930 int odr_constructed_end(ODR o);
931      </synopsis>
932
933      <para>
934       Assume that the IMPLICIT in the type definition above were replaced
935       with EXPLICIT (or that the IMPLICIT keyword were simply deleted, which
936       would be equivalent). The structure definition would look the same,
937       but the function would look like this:
938      </para>
939
940      <screen>
941 int mySequence(ODR o, MySequence **p, int optional, const char *name)
942 {
943     if (odr_constructed_begin(o, p, ODR_CONTEXT, 10, name) == 0)
944         return optional &amp;&amp; odr_ok(o);
945     if (o->direction == ODR_DECODE)
946         *p = odr_malloc(o, sizeof(**p));
947     if (odr_sequence_begin(o, p, sizeof(**p), 0) == 0)
948     {
949         *p = 0; /* this is almost certainly a protocol error */
950         return 0;
951     }
952     return
953         odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
954         odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
955         odr_sequence_end(o) &amp;&amp;
956         odr_constructed_end(o);
957 }
958      </screen>
959
960      <para>
961       Notice that the interface here gets kind of nasty. The reason is
962       simple: Explicitly tagged, constructed types are fairly rare in
963       the protocols that we care about, so the
964       esthetic annoyance (not to mention the dangers of a cluttered
965       interface) is less than the time that would be required to develop a
966       better interface. Nevertheless, it is far from satisfying, and it's a
967       point that will be worked on in the future. One option for you would
968       be to simply apply the <function>odr_explicit_tag()</function> macro to
969       the first function, and not
970       have to worry about <function>odr_constructed_*</function> yourself.
971       Incidentally, as you might have guessed, the
972       <function>odr_sequence_</function> functions are themselves
973       implemented using the <function>/odr_constructed_</function> functions.
974      </para>
975
976     </sect3>
977    </sect2>
978    <sect2><title>SEQUENCE OF</title>
979
980     <para>
981      To handle sequences (arrays) of a specific type, the function
982     </para>
983
984     <synopsis>
985 int odr_sequence_of(ODR o, int (*fun)(ODR o, void *p, int optional),
986                     void *p, int *num, const char *name);
987     </synopsis>
988
989     <para>
990      The <literal>fun</literal> parameter is a pointer to the decoder/encoder
991      function of the type. <literal>p</literal> is a pointer to an array of
992      pointers to your type. <literal>num</literal> is the number of elements
993      in the array.
994     </para>
995
996     <para>
997      Assume a type
998     </para>
999
1000     <screen>
1001 MyArray ::= SEQUENCE OF INTEGER
1002     </screen>
1003
1004     <para>
1005      The C representation might be
1006     </para>
1007
1008     <screen>
1009 typedef struct MyArray
1010 {
1011     int num_elements;
1012     int **elements;
1013 } MyArray;
1014     </screen>
1015
1016     <para>
1017      And the function might look like
1018     </para>
1019
1020     <screen>
1021 int myArray(ODR o, MyArray **p, int optional, const char *name)
1022 {
1023     if (o->direction == ODR_DECODE)
1024         *p = odr_malloc(o, sizeof(**p));
1025     if (odr_sequence_of(o, odr_integer, &amp;(*p)->elements,
1026         &amp;(*p)->num_elements, name))
1027         return 1;
1028     *p = 0;
1029         return optional &amp;&amp; odr_ok(o);
1030 }
1031     </screen>
1032
1033    </sect2>
1034    <sect2><title>CHOICE Types</title>
1035
1036     <para>
1037      The choice type is used fairly often in some ASN.1 definitions, so
1038      some work has gone into streamlining its interface.
1039     </para>
1040
1041     <para>
1042      CHOICE types are handled by the function:
1043     </para>
1044
1045     <synopsis>
1046 int odr_choice(ODR o, Odr_arm arm&lsqb;&rsqb;, void *p, void *whichp,
1047                const char *name);
1048     </synopsis>
1049
1050     <para>
1051      The <literal>arm</literal> array is used to describe each of the possible
1052      types that the CHOICE type may assume. Internally in your application,
1053      the CHOICE type is represented as a discriminated union. That is, a
1054      C union accompanied by an integer (or enum) identifying the active
1055      'arm' of the union.
1056      <literal>whichp</literal> is a pointer to the union discriminator.
1057      When encoding, it is examined to determine the current type.
1058      When decoding, it is set to reference the type that was found in
1059      the input stream.
1060     </para>
1061
1062     <para>
1063      The Odr_arm type is defined thus:
1064     </para>
1065
1066     <screen>
1067 typedef struct odr_arm
1068 {
1069     int tagmode;
1070     int class;
1071     int tag;
1072     int which;
1073     Odr_fun fun;
1074     char *name;
1075 } Odr_arm;
1076     </screen>
1077
1078     <para>
1079      The interpretation of the fields are:
1080     </para>
1081
1082     <variablelist>
1083      <varlistentry><term>tagmode</term>
1084       <listitem><para>Either <literal>ODR_IMPLICIT</literal>,
1085         <literal>ODR_EXPLICIT</literal>, or <literal>ODR_NONE</literal> (-1)
1086         to mark no tagging.</para></listitem>
1087      </varlistentry>
1088
1089      <varlistentry><term>which</term>
1090       <listitem><para>The value of the discriminator that corresponds to
1091         this CHOICE element. Typically, it will be a &num;defined constant, or
1092         an enum member.</para></listitem>
1093      </varlistentry>
1094
1095      <varlistentry><term>fun</term>
1096       <listitem><para>A pointer to a function that implements the type of
1097         the CHOICE member. It may be either a standard &odr; type or a type
1098         defined by yourself.</para></listitem>
1099      </varlistentry>
1100
1101      <varlistentry><term>name</term>
1102       <listitem><para>Name of tag.</para></listitem>
1103      </varlistentry>
1104     </variablelist>
1105
1106     <para>
1107      A handy way to prepare the array for use by the
1108      <function>odr_choice()</function> function is to
1109      define it as a static, initialized array in the beginning of your
1110      decoding/encoding function. Assume the type definition:
1111     </para>
1112
1113     <screen>
1114 MyChoice ::= CHOICE {
1115     untagged INTEGER,
1116     tagged   &lsqb;99&rsqb; IMPLICIT INTEGER,
1117     other    BOOLEAN
1118 }
1119     </screen>
1120
1121     <para>
1122      Your C type might look like
1123     </para>
1124
1125     <screen>
1126 typedef struct MyChoice
1127 {
1128     enum
1129     {
1130         MyChoice_untagged,
1131         MyChoice_tagged,
1132         MyChoice_other
1133     } which;
1134     union
1135     {
1136         int *untagged;
1137         int *tagged;
1138         bool_t *other;
1139     } u;
1140 };
1141     </screen>
1142
1143     <para>
1144      And your function could look like this:
1145     </para>
1146
1147     <screen>
1148 int myChoice(ODR o, MyChoice **p, int optional, const char *name)
1149 {
1150     static Odr_arm arm&lsqb;&rsqb; =
1151     {
1152       {-1, -1, -1, MyChoice_untagged, odr_integer, "untagged"},
1153       {ODR_IMPLICIT, ODR_CONTEXT, 99, MyChoice_tagged, odr_integer,
1154       "tagged"},
1155       {-1, -1, -1, MyChoice_other, odr_boolean, "other"},
1156       {-1, -1, -1, -1, 0}
1157     };
1158
1159     if (o->direction == ODR_DECODE)
1160         *p = odr_malloc(o, sizeof(**p);
1161     else if (!*p)
1162         return optional &amp;&amp; odr_ok(o);
1163
1164     if (odr_choice(o, arm, &amp;(*p)->u, &amp;(*p)->which), name)
1165         return 1;
1166     *p = 0;
1167         return optional &amp;&amp; odr_ok(o);
1168 }
1169     </screen>
1170
1171     <para>
1172      In some cases (say, a non-optional choice which is a member of a
1173      sequence), you can "embed" the union and its discriminator in the
1174      structure belonging to the enclosing type, and you won't need to
1175      fiddle with memory allocation to create a separate structure to
1176      wrap the discriminator and union.
1177     </para>
1178
1179     <para>
1180      The corresponding function is somewhat nicer in the Sun XDR interface.
1181      Most of the complexity of this interface comes from the possibility of
1182      declaring sequence elements (including CHOICEs) optional.
1183     </para>
1184
1185     <para>
1186      The ASN.1 specifications naturally requires that each member of a
1187      CHOICE have a distinct tag, so they can be told apart on decoding.
1188      Sometimes it can be useful to define a CHOICE that has multiple types
1189      that share the same tag. You'll need some other mechanism, perhaps
1190      keyed to the context of the CHOICE type. In effect, we would like to
1191      introduce a level of context-sensitiveness to our ASN.1 specification.
1192      When encoding an internal representation, we have no problem, as long
1193      as each CHOICE member has a distinct discriminator value. For
1194      decoding, we need a way to tell the choice function to look for a
1195      specific arm of the table. The function
1196     </para>
1197
1198     <synopsis>
1199 void odr_choice_bias(ODR o, int what);
1200     </synopsis>
1201
1202     <para>
1203      provides this functionality. When called, it leaves a notice for the next
1204      call to <function>odr_choice()</function> to be called on the decoding
1205      stream <literal>o</literal> that only the <literal>arm</literal> entry with
1206      a <literal>which</literal> field equal to <literal>what</literal>
1207      should be tried.
1208     </para>
1209
1210     <para>
1211      The most important application (perhaps the only one, really) is in
1212      the definition of application-specific EXTERNAL encoders/decoders
1213      which will automatically decode an ANY member given the direct or
1214      indirect reference.
1215     </para>
1216
1217    </sect2>
1218   </sect1>
1219
1220   <sect1 id="odr.debugging"><title>Debugging</title>
1221
1222    <para>
1223     The protocol modules are suffering somewhat from a lack of diagnostic
1224     tools at the moment. Specifically ways to pretty-print PDUs that
1225     aren't recognized by the system. We'll include something to this end
1226     in a not-too-distant release. In the meantime, what we do when we get
1227     packages we don't understand is to compile the ODR module with
1228     <literal>ODR_DEBUG</literal> defined. This causes the module to dump tracing
1229     information as it processes data units. With this output and the
1230     protocol specification (Z39.50), it is generally fairly easy to see
1231     what goes wrong.
1232    </para>
1233   </sect1>
1234  </chapter>
1235  <!-- Keep this comment at the end of the file
1236  Local variables:
1237  mode: sgml
1238  sgml-omittag:t
1239  sgml-shorttag:t
1240  sgml-minimize-attributes:nil
1241  sgml-always-quote-attributes:t
1242  sgml-indent-step:1
1243  sgml-indent-data:t
1244  sgml-parent-document: "yaz.xml"
1245  sgml-local-catalogs: nil
1246  sgml-namecase-general:t
1247  End:
1248  -->