Document odr_setpring and odr_set_stream.
[yaz-moved-to-github.git] / doc / odr.xml
1 <!-- $Id: odr.xml,v 1.13 2004-08-11 12:47:35 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
17     (<xref linkend="odr.use"/>). 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     (<xref linkend="odr.programming"/>).
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 <xref linkend="odr.programming"/>
28      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>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     <example><title>Encoding and decoding functions</title>
264      <synopsis>
265       int odr_integer(ODR o, int **p, int optional, const char *name);
266       
267       int z_APDU(ODR o, Z_APDU **p, int optional, const char *name);
268      </synopsis>
269     </example>
270
271     <para>
272      If the data is absent (or doesn't match the tag corresponding to
273      the type), the return value will be either 0 or 1 depending on the
274      <literal>optional</literal> flag. If <literal>optional</literal>
275      is 0 and the data is absent, an error flag will be raised in the
276      stream, and you'll need to call <function>odr_reset()</function> before
277      you can use the stream again. If <literal>optional</literal> is
278      nonzero, the pointer <emphasis>pointed</emphasis> to/ by
279      <literal>p</literal> will be set to the null value, and the function
280      will return 1.
281      The <literal>name</literal> argument is used to pretty-print the
282      tag in question. It may be set to <literal>NULL</literal> if
283      pretty-printing is not desired.
284     </para>
285
286     <para>
287      If the data value is found where it's expected, the pointer
288      <emphasis>pointed to</emphasis> by the <literal>p</literal> argument
289      will be set to point to the decoded type.
290      The space for the type will be allocated and owned by the &odr;
291      stream, and it will live until you call
292      <function>odr_reset()</function> on the stream. You cannot use
293      <function>free(2)</function> to release the memory.
294      You can decode several data elements (by repeated calls to
295      <function>odr_setbuf()</function> and your decoding function), and
296      new memory will be allocated each time. When you do call 
297      <function>odr_reset()</function>, everything decoded since the
298      last call to <function>odr_reset()</function> will be released.
299     </para>
300
301     <example><title>Encoding and decoding of an integer</title>
302      <para>
303       The use of the double indirection can be a little confusing at first
304       (its purpose will become clear later on, hopefully),
305       so an example is in order. We'll encode an integer value, and
306       immediately decode it again using a different stream. A useless, but
307       informative operation.
308      </para>
309      <programlisting><![CDATA[
310 void do_nothing_useful(int value)
311 {
312     ODR encode, decode;
313     int *valp, *resvalp;
314     char *bufferp;
315     int len;
316      
317     /* allocate streams */
318     if (!(encode = odr_createmem(ODR_ENCODE)))
319         return;
320     if (!(decode = odr_createmem(ODR_DECODE)))
321         return;
322
323     valp = &amp;value;
324     if (odr_integer(encode, &amp;valp, 0, 0) == 0)
325     {
326         printf("encoding went bad\n");
327         return;
328     }
329     bufferp = odr_getbuf(encode, &amp;len);
330     printf("length of encoded data is &percnt;d\n", len);
331
332     /* now let's decode the thing again */
333     odr_setbuf(decode, bufferp, len);
334     if (odr_integer(decode, &amp;resvalp, 0, 0) == 0)
335     {
336         printf("decoding went bad\n");
337         return;
338     }
339     printf("the value is &percnt;d\n", *resvalp);
340
341     /* clean up */
342     odr_destroy(encode);
343     odr_destroy(decode);
344 }
345 ]]>
346      </programlisting>
347      <para>
348       This looks like a lot of work, offhand. In practice, the &odr; streams
349       will typically be allocated once, in the beginning of your program
350       (or at the beginning of a new network session), and the encoding
351       and decoding will only take place in a few, isolated places in your
352       program, so the overhead is quite manageable.
353      </para>
354     </example>
355     
356    </sect2>
357
358    <sect2><title>Printing</title>
359     <para>
360      When an ODR stream is created of type <literal>ODR_PRINT</literal>
361      the ODR module will print the contents of a PDU in a readable format.
362      By default output is written to the <literal>stderr</literal> stream.
363      This behavior can be changed, however, by calling the function
364      <synopsis>
365       odr_setprint(ODR o, FILE *file);
366      </synopsis>
367      before encoders or decoders are being invoked.
368      It is also possible to direct the output to a buffer (of indeed
369      another file), by using the more generic mechanism:
370      <synopsis>
371       void odr_set_stream(ODR o, void *handle,
372                          void (*stream_puts)(void *handle, const char *strz),
373                          void (*stream_close)(void *handle));
374      </synopsis>
375      Here the user provides an opaque handle and two handlers,
376      <replaceable>stream_puts</replaceable> for printing,
377      and <replaceable>stream_close</replaceable> which is supposed
378      to close/free resources associated with handle. 
379      The <replaceable>stream_close</replaceable> handler is optional and
380      if NULL for the function is provided, it will not be invoked.
381     </para>
382    </sect2>
383    <sect2><title>Diagnostics</title>
384
385     <para>
386      The encoding/decoding functions all return 0 when an error occurs.
387      Until you call <function>odr_reset()</function>, you cannot use the
388      stream again, and any function called will immediately return 0.
389     </para>
390
391     <para>
392      To provide information to the programmer or administrator, the function
393     </para>
394
395     <synopsis>
396      void odr_perror(ODR o, char *message);
397     </synopsis>
398
399     <para>
400      is provided, which prints the <literal>message</literal> argument to
401      <literal>stderr</literal> along with an error message from the stream.
402     </para>
403
404     <para>
405      You can also use the function
406     </para>
407
408     <synopsis>
409      int odr_geterror(ODR o);
410     </synopsis>
411
412     <para>
413      to get the current error number from the screen. The number will be
414      one of these constants:
415     </para>
416
417     <table frame="top"><title>ODR Error codes</title>
418      <tgroup cols="2">
419       <thead>
420        <row>
421         <entry>code</entry>
422         <entry>Description</entry>
423        </row>
424       </thead>
425       <tbody>
426        <row>
427         <entry>OMEMORY</entry><entry>Memory allocation failed.</entry>
428        </row>
429
430        <row>
431         <entry>OSYSERR</entry><entry>A system- or library call has failed.
432          The standard diagnostic variable <literal>errno</literal> should be
433          examined to determine the actual error.</entry>
434        </row>
435
436        <row>
437         <entry>OSPACE</entry><entry>No more space for encoding.
438          This will only occur when the user has explicitly provided a
439          buffer for an encoding stream without allowing the system to
440          allocate more space.</entry>
441        </row>
442
443        <row>
444         <entry>OREQUIRED</entry><entry>This is a common protocol error; A
445          required data element was missing during encoding or decoding.</entry>
446        </row>
447
448        <row>
449         <entry>OUNEXPECTED</entry><entry>An unexpected data element was
450          found during decoding.</entry>
451        </row>
452
453        <row><entry>OOTHER</entry><entry>Other error. This is typically an
454          indication of misuse of the &odr; system by the programmer, and also
455          that the diagnostic system isn't as good as it should be, yet.</entry>
456        </row>
457       </tbody>
458      </tgroup>
459     </table>
460
461     <para>
462      The character string array
463     </para>
464
465     <synopsis>
466      char *odr_errlist&lsqb;&rsqb;
467     </synopsis>
468
469     <para>
470      can be indexed by the error code to obtain a human-readable
471      representation of the problem.
472     </para>
473
474    </sect2>
475    <sect2><title>Summary and Synopsis</title>
476
477     <synopsis>
478      #include &lt;odr.h>
479
480      ODR odr_createmem(int direction);
481
482      void odr_destroy(ODR o);
483
484      void odr_reset(ODR o);
485
486      char *odr_getbuf(ODR o, int *len);
487
488      void odr_setbuf(ODR o, char *buf, int len);
489
490      void *odr_malloc(ODR o, int size);
491
492      ODR_MEM odr_extract_mem(ODR o);
493
494      void odr_release_mem(ODR_MEM r);
495
496      int odr_geterror(ODR o);
497
498      void odr_perror(char *message);
499
500      extern char *odr_errlist[];
501     </synopsis>
502
503    </sect2>
504   </sect1>
505
506   <sect1 id="odr.programming"><title>Programming with ODR</title>
507
508    <para>
509     The API of &odr; is designed to reflect the structure of ASN.1, rather
510     than BER itself. Future releases may be able to represent data in
511     other external forms.
512    </para>
513
514    <tip>
515     <para>
516      There is an ASN.1 tutorial available at
517      <ulink url="http://asn1.elibel.tm.fr/en/introduction/">this site</ulink>.
518      This site also has standards for ASN.1 (X.680) and BER (X.690) 
519      <ulink url="http://asn1.elibel.tm.fr/en/standards/">online</ulink>.
520     </para>
521    </tip>
522    
523    <para>
524     The ODR interface is based loosely on that of the Sun Microsystems
525     XDR routines.
526     Specifically, each function which corresponds to an ASN.1 primitive
527     type has a dual function. Depending on the settings of the ODR
528     stream which is supplied as a parameter, the function may be used
529     either to encode or decode data. The functions that can be built
530     using these primitive functions, to represent more complex data types,
531     share this quality. The result is that you only have to enter the
532     definition for a type once - and you have the functionality of encoding,
533     decoding (and pretty-printing) all in one unit.
534     The resulting C source code is quite compact, and is a pretty
535     straightforward representation of the source ASN.1 specification. 
536    </para>
537    
538    <para>
539     In many cases, the model of the XDR functions works quite well in this
540     role.
541     In others, it is less elegant. Most of the hassle comes from the optional
542     SEQUENCE members which don't exist in XDR.
543    </para>
544
545    <sect2><title>The Primitive ASN.1 Types</title>
546
547     <para>
548      ASN.1 defines a number of primitive types (many of which correspond
549      roughly to primitive types in structured programming languages, such as C).
550     </para>
551
552     <sect3><title>INTEGER</title>
553
554      <para>
555       The &odr; function for encoding or decoding (or printing) the ASN.1
556       INTEGER type looks like this:
557      </para>
558
559      <synopsis>
560       int odr_integer(ODR o, int **p, int optional, const char *name);
561      </synopsis>
562
563      <para>
564       (we don't allow values that can't be contained in a C integer.)
565      </para>
566      
567      <para>
568       This form is typical of the primitive &odr; functions. They are named
569       after the type of data that they encode or decode. They take an &odr;
570       stream, an indirect reference to the type in question, and an
571       <literal>optional</literal> flag (corresponding to the OPTIONAL keyword
572       of ASN.1) as parameters. They all return an integer value of either one
573       or zero.
574       When you use the primitive functions to construct encoders for complex
575       types of your own, you should follow this model as well. This
576       ensures that your new types can be reused as elements in yet more
577       complex types.
578      </para>
579
580      <para>
581       The <literal>o</literal> parameter should obviously refer to a properly
582       initialized &odr; stream of the right type (encoding/decoding/printing)
583       for the operation that you wish to perform.
584      </para>
585
586      <para>
587       When encoding or printing, the function first looks at
588       <literal>* p</literal>. If <literal>* p</literal> (the pointer pointed
589       to by <literal>p</literal>) is a null pointer, this is taken to mean that
590       the data element is absent. If the <literal>optional</literal> parameter
591       is nonzero, the function will return one (signifying success) without
592       any further processing. If the <literal>optional</literal> is zero, an
593       internal error flag is set in the &odr; stream, and the function will
594       return 0. No further operations can be carried out on the stream without
595       a call to the function <function>odr_reset()</function>.
596      </para>
597
598      <para>
599       If <literal>*p</literal> is not a null pointer, it is expected to
600       point to an instance of the data type. The data will be subjected to
601       the encoding rules, and the result will be placed in the buffer held
602       by the &odr; stream.
603      </para>
604
605      <para>
606       The other ASN.1 primitives have similar functions that operate in
607       similar manners:
608      </para>
609     </sect3>
610     <sect3><title>BOOLEAN</title>
611
612      <synopsis>
613 int odr_bool(ODR o, bool_t **p, int optional, const char *name);
614      </synopsis>
615
616     </sect3>
617     <sect3><title>REAL</title>
618
619      <para>
620       Not defined.
621      </para>
622
623     </sect3>
624     <sect3><title>NULL</title>
625
626      <synopsis>
627 int odr_null(ODR o, bool_t **p, int optional, const char *name);
628      </synopsis>
629
630      <para>
631       In this case, the value of **p is not important. If <literal>*p</literal>
632       is different from the null pointer, the null value is present, otherwise
633       it's absent.
634      </para>
635
636     </sect3>
637     <sect3><title>OCTET STRING</title>
638
639      <synopsis>
640 typedef struct odr_oct
641 {
642     unsigned char *buf;
643     int len;
644     int size;
645 } Odr_oct;
646
647 int odr_octetstring(ODR o, Odr_oct **p, int optional,
648                     const char *name);
649      </synopsis>
650
651      <para>
652       The <literal>buf</literal> field should point to the character array
653       that holds the octetstring. The <literal>len</literal> field holds the
654       actual length, while the <literal>size</literal> field gives the size
655       of the allocated array (not of interest to you, in most cases).
656       The character array need not be null terminated.
657      </para>
658
659      <para>
660       To make things a little easier, an alternative is given for string
661       types that are not expected to contain embedded NULL characters (eg.
662       VisibleString):
663      </para>
664
665      <synopsis>
666       int odr_cstring(ODR o, char **p, int optional, const char *name);
667      </synopsis>
668
669      <para>
670       Which encoded or decodes between OCTETSTRING representations and
671       null-terminates C strings.
672      </para>
673
674      <para>
675       Functions are provided for the derived string types, eg:
676      </para>
677
678      <synopsis>
679 int odr_visiblestring(ODR o, char **p, int optional,
680                       const char *name);
681      </synopsis>
682
683     </sect3>
684     <sect3><title>BIT STRING</title>
685
686      <synopsis>
687 int odr_bitstring(ODR o, Odr_bitmask **p, int optional,
688                   const char *name);
689      </synopsis>
690
691      <para>
692       The opaque type <literal>Odr_bitmask</literal> is only suitable for
693       holding relatively brief bit strings, eg. for options fields, etc.
694       The constant <literal>ODR_BITMASK_SIZE</literal> multiplied by 8
695       gives the maximum possible number of bits.
696      </para>
697
698      <para>
699       A set of macros are provided for manipulating the
700       <literal>Odr_bitmask</literal> type:
701      </para>
702
703      <synopsis>
704 void ODR_MASK_ZERO(Odr_bitmask *b);
705
706 void ODR_MASK_SET(Odr_bitmask *b, int bitno);
707
708 void ODR_MASK_CLEAR(Odr_bitmask *b, int bitno);
709
710 int ODR_MASK_GET(Odr_bitmask *b, int bitno);
711      </synopsis>
712
713      <para>
714       The functions are modeled after the manipulation functions that
715       accompany the <literal>fd_set</literal> type used by the
716       <function>select(2)</function> call.
717       <literal>ODR_MASK_ZERO</literal> should always be called first on a
718       new bitmask, to initialize the bits to zero.
719      </para>
720     </sect3>
721
722     <sect3><title>OBJECT IDENTIFIER</title>
723
724      <synopsis>
725 int odr_oid(ODR o, Odr_oid **p, int optional, const char *name);
726      </synopsis>
727
728      <para>
729       The C OID representation is simply an array of integers, terminated by
730       the value -1 (the <literal>Odr_oid</literal> type is synonymous with
731       the <literal>int</literal> type).
732       We suggest that you use the OID database module (see
733       <xref linkend="asn.oid"/>) to handle object identifiers
734       in your application.
735      </para>
736
737     </sect3>
738    </sect2>
739    <sect2 id="tag.prim"><title>Tagging Primitive Types</title>
740
741     <para>
742      The simplest way of tagging a type is to use the
743      <function>odr_implicit_tag()</function> or 
744      <function>odr_explicit_tag()</function> macros:
745     </para>
746
747     <synopsis>
748 int odr_implicit_tag(ODR o, Odr_fun fun, int class, int tag,
749                      int optional, const char *name);
750
751 int odr_explicit_tag(ODR o, Odr_fun fun, int class, int tag,
752                      int optional, const char *name);
753     </synopsis>
754
755     <para>
756      To create a type derived from the integer type by implicit tagging, you
757      might write:
758     </para>
759
760     <screen>
761      MyInt ::= &lsqb;210&rsqb; IMPLICIT INTEGER
762     </screen>
763
764     <para>
765      In the &odr; system, this would be written like:
766     </para>
767
768     <screen>
769 int myInt(ODR o, int **p, int optional, const char *name)
770 {
771     return odr_implicit_tag(o, odr_integer, p,
772                             ODR_CONTEXT, 210, optional, name);
773 }
774     </screen>
775
776     <para>
777      The function <function>myInt()</function> can then be used like any of
778      the primitive functions provided by &odr;. Note that the behavior of
779      <function>odr_explicit_tag()</function>
780      and <function>odr_implicit_tag()</function> macros
781      act exactly the same as the functions they are applied to - they
782      respond to error conditions, etc, in the same manner - they
783      simply have three extra parameters. The class parameter may
784      take one of the values: <literal>ODR_CONTEXT</literal>,
785      <literal>ODR_PRIVATE</literal>, <literal>ODR_UNIVERSAL</literal>, or
786      <literal>/ODR_APPLICATION</literal>.
787     </para>
788
789    </sect2>
790    <sect2><title>Constructed Types</title>
791
792     <para>
793      Constructed types are created by combining primitive types. The
794       &odr; system only implements the SEQUENCE and SEQUENCE OF constructions
795      (although adding the rest of the container types should be simple
796      enough, if the need arises).
797     </para>
798
799     <para>
800      For implementing SEQUENCEs, the functions
801     </para>
802
803     <synopsis>
804 int odr_sequence_begin(ODR o, void *p, int size, const char *name);
805 int odr_sequence_end(ODR o);
806     </synopsis>
807
808     <para>
809      are provided.
810     </para>
811
812     <para>
813      The <function>odr_sequence_begin()</function> function should be
814      called in the beginning of a function that implements a SEQUENCE type.
815      Its parameters are the &odr; stream, a pointer (to a pointer to the type
816      you're implementing), and the <literal>size</literal> of the type
817      (typically a C structure). On encoding, it returns 1 if
818      <literal>* p</literal> is a null pointer. The <literal>size</literal>
819      parameter is ignored. On decoding, it returns 1 if the type is found in
820      the data stream. <literal>size</literal> bytes of memory are allocated,
821      and <literal>*p</literal> is set to point to this space.
822      <function>odr_sequence_end()</function> is called at the end of the
823      complex function. Assume that a type is defined like this:
824     </para>
825
826     <screen>
827 MySequence ::= SEQUENCE {
828      intval INTEGER,
829      boolval BOOLEAN OPTIONAL
830 }
831     </screen>
832
833     <para>
834      The corresponding &odr; encoder/decoder function and the associated data
835      structures could be written like this:
836     </para>
837
838     <screen>
839 typedef struct MySequence
840 {
841     int *intval;
842     bool_t *boolval;
843 } MySequence;
844      
845 int mySequence(ODR o, MySequence **p, int optional, const char *name)
846 {
847     if (odr_sequence_begin(o, p, sizeof(**p), name) == 0)
848         return optional &amp;&amp; odr_ok(o);
849     return
850         odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
851         odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
852         odr_sequence_end(o);
853 }
854
855     </screen>
856
857     <para>
858      Note the 1 in the call to <function>odr_bool()</function>, to mark
859      that the sequence member is optional.
860      If either of the member types had been tagged, the macros
861      <function>odr_implicit_tag()</function> or
862      <function>odr_explicit_tag()</function>
863      could have been used.
864      The new function can be used exactly like the standard functions provided
865      with &odr;. It will encode, decode or pretty-print a data value of the
866      <literal>MySequence</literal> type. We like to name types with an
867      initial capital, as done in ASN.1 definitions, and to name the
868      corresponding function with the first character of the name in lower case.
869      You could, of course, name your structures, types, and functions any way
870      you please - as long as you're consistent, and your code is easily readable.
871      <literal>odr_ok</literal> is just that - a predicate that returns the
872      state of the stream. It is used to ensure that the behavior of the new
873      type is compatible with the interface of the primitive types.
874     </para>
875
876    </sect2>
877    <sect2><title>Tagging Constructed Types</title>
878
879     <note>
880      <para>
881       See <xref linkend="tag.prim"/> for information on how to tag
882       the primitive types, as well as types that are already defined.
883      </para>
884     </note>
885
886     <sect3><title>Implicit Tagging</title>
887
888      <para>
889       Assume the type above had been defined as
890      </para>
891
892      <screen>
893 MySequence ::= &lsqb;10&rsqb; IMPLICIT SEQUENCE {
894       intval INTEGER,
895       boolval BOOLEAN OPTIONAL
896 }
897      </screen>
898
899      <para>
900       You would implement this in &odr; by calling the function
901      </para>
902
903      <synopsis>
904 int odr_implicit_settag(ODR o, int class, int tag);
905      </synopsis>
906
907      <para>
908       which overrides the tag of the type immediately following it. The
909       macro <function>odr_implicit_tag()</function> works by calling
910       <function>odr_implicit_settag()</function> immediately
911       before calling the function pointer argument.
912       Your type function could look like this:
913      </para>
914
915      <screen>
916 int mySequence(ODR o, MySequence **p, int optional, const char *name)
917 {
918     if (odr_implicit_settag(o, ODR_CONTEXT, 10) == 0 ||
919         odr_sequence_begin(o, p, sizeof(**p), name) == 0)
920         return optional &amp;&amp; odr_ok(o);
921     return
922         odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
923         odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
924         odr_sequence_end(o);
925 }
926      </screen>
927
928      <para>
929       The definition of the structure <literal>MySequence</literal> would be
930       the same.
931      </para>
932     </sect3>
933
934     <sect3><title>Explicit Tagging</title>
935
936      <para>
937       Explicit tagging of constructed types is a little more complicated,
938       since you are in effect adding a level of construction to the data.
939      </para>
940
941      <para>
942       Assume the definition:
943      </para>
944
945      <screen>
946 MySequence ::= &lsqb;10&rsqb; IMPLICIT SEQUENCE {
947    intval INTEGER,
948    boolval BOOLEAN OPTIONAL
949 }
950      </screen>
951
952      <para>
953       Since the new type has an extra level of construction, two new functions
954       are needed to encapsulate the base type:
955      </para>
956
957      <synopsis>
958 int odr_constructed_begin(ODR o, void *p, int class, int tag,
959                           const char *name);
960
961 int odr_constructed_end(ODR o);
962      </synopsis>
963
964      <para>
965       Assume that the IMPLICIT in the type definition above were replaced
966       with EXPLICIT (or that the IMPLICIT keyword were simply deleted, which
967       would be equivalent). The structure definition would look the same,
968       but the function would look like this:
969      </para>
970
971      <screen>
972 int mySequence(ODR o, MySequence **p, int optional, const char *name)
973 {
974     if (odr_constructed_begin(o, p, ODR_CONTEXT, 10, name) == 0)
975         return optional &amp;&amp; odr_ok(o);
976     if (o->direction == ODR_DECODE)
977         *p = odr_malloc(o, sizeof(**p));
978     if (odr_sequence_begin(o, p, sizeof(**p), 0) == 0)
979     {
980         *p = 0; /* this is almost certainly a protocol error */
981         return 0;
982     }
983     return
984         odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
985         odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
986         odr_sequence_end(o) &amp;&amp;
987         odr_constructed_end(o);
988 }
989      </screen>
990
991      <para>
992       Notice that the interface here gets kind of nasty. The reason is
993       simple: Explicitly tagged, constructed types are fairly rare in
994       the protocols that we care about, so the
995       esthetic annoyance (not to mention the dangers of a cluttered
996       interface) is less than the time that would be required to develop a
997       better interface. Nevertheless, it is far from satisfying, and it's a
998       point that will be worked on in the future. One option for you would
999       be to simply apply the <function>odr_explicit_tag()</function> macro to
1000       the first function, and not
1001       have to worry about <function>odr_constructed_*</function> yourself.
1002       Incidentally, as you might have guessed, the
1003       <function>odr_sequence_</function> functions are themselves
1004       implemented using the <function>/odr_constructed_</function> functions.
1005      </para>
1006
1007     </sect3>
1008    </sect2>
1009    <sect2><title>SEQUENCE OF</title>
1010
1011     <para>
1012      To handle sequences (arrays) of a specific type, the function
1013     </para>
1014
1015     <synopsis>
1016 int odr_sequence_of(ODR o, int (*fun)(ODR o, void *p, int optional),
1017                     void *p, int *num, const char *name);
1018     </synopsis>
1019
1020     <para>
1021      The <literal>fun</literal> parameter is a pointer to the decoder/encoder
1022      function of the type. <literal>p</literal> is a pointer to an array of
1023      pointers to your type. <literal>num</literal> is the number of elements
1024      in the array.
1025     </para>
1026
1027     <para>
1028      Assume a type
1029     </para>
1030
1031     <screen>
1032 MyArray ::= SEQUENCE OF INTEGER
1033     </screen>
1034
1035     <para>
1036      The C representation might be
1037     </para>
1038
1039     <screen>
1040 typedef struct MyArray
1041 {
1042     int num_elements;
1043     int **elements;
1044 } MyArray;
1045     </screen>
1046
1047     <para>
1048      And the function might look like
1049     </para>
1050
1051     <screen>
1052 int myArray(ODR o, MyArray **p, int optional, const char *name)
1053 {
1054     if (o->direction == ODR_DECODE)
1055         *p = odr_malloc(o, sizeof(**p));
1056     if (odr_sequence_of(o, odr_integer, &amp;(*p)->elements,
1057         &amp;(*p)->num_elements, name))
1058         return 1;
1059     *p = 0;
1060         return optional &amp;&amp; odr_ok(o);
1061 }
1062     </screen>
1063
1064    </sect2>
1065    <sect2><title>CHOICE Types</title>
1066
1067     <para>
1068      The choice type is used fairly often in some ASN.1 definitions, so
1069      some work has gone into streamlining its interface.
1070     </para>
1071
1072     <para>
1073      CHOICE types are handled by the function:
1074     </para>
1075
1076     <synopsis>
1077 int odr_choice(ODR o, Odr_arm arm&lsqb;&rsqb;, void *p, void *whichp,
1078                const char *name);
1079     </synopsis>
1080
1081     <para>
1082      The <literal>arm</literal> array is used to describe each of the possible
1083      types that the CHOICE type may assume. Internally in your application,
1084      the CHOICE type is represented as a discriminated union. That is, a
1085      C union accompanied by an integer (or enum) identifying the active
1086      'arm' of the union.
1087      <literal>whichp</literal> is a pointer to the union discriminator.
1088      When encoding, it is examined to determine the current type.
1089      When decoding, it is set to reference the type that was found in
1090      the input stream.
1091     </para>
1092
1093     <para>
1094      The Odr_arm type is defined thus:
1095     </para>
1096
1097     <screen>
1098 typedef struct odr_arm
1099 {
1100     int tagmode;
1101     int class;
1102     int tag;
1103     int which;
1104     Odr_fun fun;
1105     char *name;
1106 } Odr_arm;
1107     </screen>
1108
1109     <para>
1110      The interpretation of the fields are:
1111     </para>
1112
1113     <variablelist>
1114      <varlistentry><term>tagmode</term>
1115       <listitem><para>Either <literal>ODR_IMPLICIT</literal>,
1116         <literal>ODR_EXPLICIT</literal>, or <literal>ODR_NONE</literal> (-1)
1117         to mark no tagging.</para></listitem>
1118      </varlistentry>
1119
1120      <varlistentry><term>which</term>
1121       <listitem><para>The value of the discriminator that corresponds to
1122         this CHOICE element. Typically, it will be a &num;defined constant, or
1123         an enum member.</para></listitem>
1124      </varlistentry>
1125
1126      <varlistentry><term>fun</term>
1127       <listitem><para>A pointer to a function that implements the type of
1128         the CHOICE member. It may be either a standard &odr; type or a type
1129         defined by yourself.</para></listitem>
1130      </varlistentry>
1131
1132      <varlistentry><term>name</term>
1133       <listitem><para>Name of tag.</para></listitem>
1134      </varlistentry>
1135     </variablelist>
1136
1137     <para>
1138      A handy way to prepare the array for use by the
1139      <function>odr_choice()</function> function is to
1140      define it as a static, initialized array in the beginning of your
1141      decoding/encoding function. Assume the type definition:
1142     </para>
1143
1144     <screen>
1145 MyChoice ::= CHOICE {
1146     untagged INTEGER,
1147     tagged   &lsqb;99&rsqb; IMPLICIT INTEGER,
1148     other    BOOLEAN
1149 }
1150     </screen>
1151
1152     <para>
1153      Your C type might look like
1154     </para>
1155
1156     <screen>
1157 typedef struct MyChoice
1158 {
1159     enum
1160     {
1161         MyChoice_untagged,
1162         MyChoice_tagged,
1163         MyChoice_other
1164     } which;
1165     union
1166     {
1167         int *untagged;
1168         int *tagged;
1169         bool_t *other;
1170     } u;
1171 };
1172     </screen>
1173
1174     <para>
1175      And your function could look like this:
1176     </para>
1177
1178     <screen>
1179 int myChoice(ODR o, MyChoice **p, int optional, const char *name)
1180 {
1181     static Odr_arm arm&lsqb;&rsqb; =
1182     {
1183       {-1, -1, -1, MyChoice_untagged, odr_integer, "untagged"},
1184       {ODR_IMPLICIT, ODR_CONTEXT, 99, MyChoice_tagged, odr_integer,
1185       "tagged"},
1186       {-1, -1, -1, MyChoice_other, odr_boolean, "other"},
1187       {-1, -1, -1, -1, 0}
1188     };
1189
1190     if (o->direction == ODR_DECODE)
1191         *p = odr_malloc(o, sizeof(**p);
1192     else if (!*p)
1193         return optional &amp;&amp; odr_ok(o);
1194
1195     if (odr_choice(o, arm, &amp;(*p)->u, &amp;(*p)->which), name)
1196         return 1;
1197     *p = 0;
1198         return optional &amp;&amp; odr_ok(o);
1199 }
1200     </screen>
1201
1202     <para>
1203      In some cases (say, a non-optional choice which is a member of a
1204      sequence), you can "embed" the union and its discriminator in the
1205      structure belonging to the enclosing type, and you won't need to
1206      fiddle with memory allocation to create a separate structure to
1207      wrap the discriminator and union.
1208     </para>
1209
1210     <para>
1211      The corresponding function is somewhat nicer in the Sun XDR interface.
1212      Most of the complexity of this interface comes from the possibility of
1213      declaring sequence elements (including CHOICEs) optional.
1214     </para>
1215
1216     <para>
1217      The ASN.1 specifications naturally requires that each member of a
1218      CHOICE have a distinct tag, so they can be told apart on decoding.
1219      Sometimes it can be useful to define a CHOICE that has multiple types
1220      that share the same tag. You'll need some other mechanism, perhaps
1221      keyed to the context of the CHOICE type. In effect, we would like to
1222      introduce a level of context-sensitiveness to our ASN.1 specification.
1223      When encoding an internal representation, we have no problem, as long
1224      as each CHOICE member has a distinct discriminator value. For
1225      decoding, we need a way to tell the choice function to look for a
1226      specific arm of the table. The function
1227     </para>
1228
1229     <synopsis>
1230 void odr_choice_bias(ODR o, int what);
1231     </synopsis>
1232
1233     <para>
1234      provides this functionality. When called, it leaves a notice for the next
1235      call to <function>odr_choice()</function> to be called on the decoding
1236      stream <literal>o</literal> that only the <literal>arm</literal> entry with
1237      a <literal>which</literal> field equal to <literal>what</literal>
1238      should be tried.
1239     </para>
1240
1241     <para>
1242      The most important application (perhaps the only one, really) is in
1243      the definition of application-specific EXTERNAL encoders/decoders
1244      which will automatically decode an ANY member given the direct or
1245      indirect reference.
1246     </para>
1247
1248    </sect2>
1249   </sect1>
1250
1251   <sect1 id="odr.debugging"><title>Debugging</title>
1252
1253    <para>
1254     The protocol modules are suffering somewhat from a lack of diagnostic
1255     tools at the moment. Specifically ways to pretty-print PDUs that
1256     aren't recognized by the system. We'll include something to this end
1257     in a not-too-distant release. In the meantime, what we do when we get
1258     packages we don't understand is to compile the ODR module with
1259     <literal>ODR_DEBUG</literal> defined. This causes the module to dump tracing
1260     information as it processes data units. With this output and the
1261     protocol specification (Z39.50), it is generally fairly easy to see
1262     what goes wrong.
1263    </para>
1264   </sect1>
1265  </chapter>
1266  <!-- Keep this comment at the end of the file
1267  Local variables:
1268  mode: sgml
1269  sgml-omittag:t
1270  sgml-shorttag:t
1271  sgml-minimize-attributes:nil
1272  sgml-always-quote-attributes:t
1273  sgml-indent-step:1
1274  sgml-indent-data:t
1275  sgml-parent-document: "yaz.xml"
1276  sgml-local-catalogs: nil
1277  sgml-namecase-general:t
1278  End:
1279  -->