Implement ZOOM_scanset_display_term
[yaz-moved-to-github.git] / doc / introduction.xml
1 <!-- $Id: introduction.xml,v 1.15 2003-11-03 10:54:49 adam Exp $ -->
2  <chapter id="introduction"><title>Introduction</title>
3
4   <para>
5    &yaz; is a C/C++ library for information retrieval applications
6    using the Z39.50/SRW/SRU protocols for information retrieval.
7   </para>
8
9   <para>
10    Properties of &yaz;:
11    <itemizedlist>
12     <listitem><para>
13       Complete 
14       <ulink url="http://www.loc.gov/z3950/agency/">Z39.50</ulink>
15       version 3 support. Amendments and Z39.50-2002 revision is
16       supported.
17      </para></listitem>
18     <listitem><para>
19       Supports 
20       <ulink url="http://www.loc.gov/z3950/agency/zing/srw/">SRW/SRU</ulink>
21       version 1.0 (over HTTP and HTTPS).
22      </para></listitem>
23     <listitem><para>
24       Includes BER encoders/decoders for the 
25       <ulink url="http://www.nlc-bnc.ca/iso/ill/">ISO ILL</ulink>
26       protocol.
27      </para></listitem>
28     <listitem><para>
29       Supports the following transports: BER over TCP/IP
30       (<ulink url="http://www.faqs.org/rfcs/rfc1729.html">RFC1729</ulink>),
31       BER over unix local socket, and 
32       <ulink url="http://www.w3.org/Protocols/rfc2616/rfc2616.html">HTTP
33        1.1</ulink>.
34      </para></listitem>
35     <listitem><para>
36       Secure Socket Layer support using
37       <ulink url="http://www.openssl.org/">OpenSSL</ulink>.
38       If enabled, &yaz; uses HTTPS transport (for SOAP) or
39       "Secure BER" (for Z39.50).
40      </para></listitem>
41     <listitem><para>
42       Offers 
43       <ulink url="http://zoom.z3950.org/">ZOOM</ulink>
44       C API implementing both Z39.50 and SRW.
45      </para></listitem>
46     <listitem><para>
47       The &yaz; library offers a set of useful utilities
48       related to the protocols, such as MARC (ISO2709) parser,
49       CCL (ISO8777) parser, 
50       <ulink url="http://www.loc.gov/z3950/agency/zing/cql/">CQL</ulink>
51       parser, memory management routines, character set conversion.
52      </para></listitem>
53     <listitem><para>
54       Portable code. &yaz; compiles out-of-the box on most Unixes and
55       on Windows using Microsoft Visual C++.
56      </para></listitem>
57     <listitem><para>
58       Fast operation. The C based BER encoders/decoders as well
59       as the server component of &yaz; is very fast.
60      </para></listitem>
61     <listitem><para>
62       Liberal license that allows for commercial use of &yaz;.
63      </para></listitem>
64    </itemizedlist>
65   </para>
66
67   <sect1 id="introduction.reading"><title>Reading this Manual</title>
68    <para>Most implementors only need to read a fraction of the
69     material in thie manual, so a quick walkthrough of the chapters
70     is in order.
71    </para>
72    <itemizedlist>
73     <listitem>
74      <para>
75       <xref linkend="installation"/> contains installation 
76       instructions for &yaz;. You don't need reading this
77       if you expect to download &yaz; binaries.
78       However, the chapter contains information about how
79       to make <emphasis>your</emphasis> application link
80       with &yaz;.
81      </para>
82     </listitem>
83
84     <listitem>
85      <para>
86       <xref linkend="zoom"/> describes the ZOOM API of &yaz;.
87       This is definitely worth a read if you wish to develop a Z39.50/SRW
88      client.
89     </para>
90     </listitem>
91     
92     <listitem>
93      <para>
94       <xref linkend="server"/> describes the generic frontend server
95       and explains how to develop server Z39.50/SRW applications for &yaz;.
96      Obviously worth reading if you're to develop a server.
97     </para>
98     </listitem>
99
100     <listitem>
101      <para>
102       <xref linkend="client"/> describes how to use the &yaz; Z39.50
103       client. If you're developer and wish to test your server
104       or a server from another party, you might find this chapter
105       useful.
106     </para>
107     </listitem>
108
109     <listitem>
110      <para>
111       <xref linkend="asn"/> documents the most commonly used Z39.50
112       C data structures offered by the &yaz; API. Client
113       developers using ZOOM and non-Z39.50 implementors may skip this.
114      </para>
115     </listitem>
116
117     <listitem>
118      <para>
119       <xref linkend="soap"/> describes how SRW and SOAP is used 
120       in &yaz;. Only if you're developing SOAP/SRW applications
121       this section is a must.
122      </para>
123     </listitem>
124
125     <listitem>
126      <para>
127       <xref linkend="tools"/> contains sections for the various
128       tools offered by &yaz;. Scan through the material quickly
129       and see what's relevant to you! SRW/SRU implementors
130       might find the <link linkend="tools.cql">CQL</link> section
131       particularly useful.
132      </para>
133     </listitem>
134
135     <listitem>
136      <para>
137       <xref linkend="odr"/> goes through the details of the
138       ODR module which is the work horse that encodes and decodes
139       BER packages. Implementors using ZOOM only do <emphasis>not</emphasis>
140       need reading this.
141       Most other Z39.50 implementors only need to read the first two
142       sections (<xref linkend="odr.introduction"/> and
143       <xref linkend="odr.use"/>).
144      </para>
145     </listitem>
146
147     <listitem>
148      <para>
149       <xref linkend="comstack"/> describes the network layer module
150       COMSTACK. Implementors using ZOOM or the generic frontend server
151       may skip this. Others, presumably, handling client/server
152      communication on their own should read this.
153      </para>
154     </listitem>
155
156    </itemizedlist>
157   </sect1>
158   <sect1 id="introduction.api"><title>The API</title>
159    
160    <para>
161     The <ulink url="http://www.indexdata.dk/yaz/">&yaz;</ulink>
162     toolkit offers several different levels of access to the
163     <ulink url="http://www.loc.gov/z3950/agency/">ISO23950/Z39.50</ulink>,
164     <ulink url="http://www.nlc-bnc.ca/iso/ill/">ILL</ulink> and
165     <ulink url="http://www.loc.gov/z3950/agency/zing/srw/">SRW</ulink>
166     protocols.
167     The level that you need to use depends on your requirements, and
168     the role (server or client) that you want to implement.
169     If you're developing a client application you should consider the
170     <link linkend="zoom">ZOOM</link> API.
171     It is, by far, the easiest way to develop clients in C.
172     Server implementers should consider the 
173     <link linkend="server">generic frontend server</link>.
174     None of those high-level APIs support the whole protocol, but
175     they do include most facilities used in existing Z39.50
176     applications.
177    </para>
178    <para>
179     If you're using 'exotic' functionality (meaning anything not included in
180     the high-level APIs), developing non-standard extensions to Z39.50 or
181     you're going to develop an ILL application you'll have to learn the lower
182     level APIs of &yaz;.
183    </para>
184
185    
186    <para>
187     The YAZ toolkit modules is shown in figure <xref linkend="yaz.layer"/>.
188    </para>
189    <figure id="yaz.layer">
190     <title>YAZ layers</title>
191     <mediaobject>
192      <imageobject>
193       <imagedata fileref="apilayer.png" format="PNG"/>
194      </imageobject>
195      <imageobject>
196       <imagedata fileref="apilayer.eps" format="EPS"/>
197      </imageobject>
198     </mediaobject>
199    </figure>
200    <para>
201     There are four layers.
202     <itemizedlist>
203      <listitem>
204       <para>A client or server application (or both).
205        This layer includes ZOOM and the generic frontend server.
206       </para>
207      </listitem>
208      <listitem>
209       <para>
210        The second layer provides a C represenation of the 
211        protocol units (packages) for Z39.50 ASN.1, ILL ASN.1,
212        SRW SOAP.
213       </para>
214      </listitem>
215      <listitem>
216       <para>
217        The third layer encodes and decodes protocol data units to
218        simple packages (buffer with certain length). The &odr; module
219        encodes and decodes BER whereas the HTTP modules encodes and
220        decodes HTTP ruquests/responses.
221       </para>
222      </listitem>
223      <listitem>
224       <para>
225        The lowest layer is &comstack; which exchanges the encoded packages
226        with a peer process over a network.
227       </para>
228      </listitem>
229     </itemizedlist>
230    </para>
231    <para>
232     The &asn; module represents the ASN.1 definition of
233     the Z39.50 protocol. It establishes a set of type and
234     structure definitions, with one structure for each of the top-level
235     PDUs, and one structure or type for each of the contained ASN.1 types.
236     For primitive types, or other types that are defined by the ASN.1
237     standard itself (such as the EXTERNAL type), the C representation is
238     provided by the &odr; (Open Data Representation) subsystem.
239   </para>
240    <para>
241      &odr; is a basic mechanism for representing an
242     ASN.1 type in the C programming language, and for implementing BER
243     encoders and decoders for values of that type. The types defined in
244     the &asn; module generally have the prefix <literal>Z_</literal>, and
245     a suffix corresponding to the name of the type in the ASN.1
246     specification of the protocol (generally Z39.50-1995). In the case of
247     base types (those originating in the ASN.1 standard itself), the prefix
248     <literal>Odr_</literal> is sometimes seen. Either way, look for
249     the actual definition in either <filename>z-core.h</filename> (for the types
250     from the protocol), <filename>odr.h</filename> (for the primitive ASN.1
251     types).
252     The &asn; library also provides functions (which are, in turn,
253     defined using &odr; primitives) for encoding and decoding data values.
254     Their general form is
255     
256     <funcsynopsis>
257      <funcprototype><funcdef>int <function>z_<replaceable>xxx</replaceable></function></funcdef>
258       <paramdef>ODR <parameter>o</parameter></paramdef>
259       <paramdef>Z_<replaceable>xxx</replaceable> **<parameter>p</parameter></paramdef>
260       <paramdef>int <parameter>optional</parameter></paramdef>
261       <paramdef>const char *<parameter>name</parameter></paramdef>
262      </funcprototype>
263     </funcsynopsis>
264     (note the lower-case &quot;z&quot; in the function name)
265    </para>
266    
267    <note>
268     <para>
269      If you are using the premade definitions of the &asn; module, and you
270      are not adding new protocol of your own, the only parts of &odr; that you
271      need to worry about are documented in section 
272      <link linkend="odr-use">Using ODR</link>.
273     </para>
274    </note>
275    
276   <para>
277     When you have created a BER-encoded buffer, you can use the &comstack;
278     subsystem to transmit (or receive) data over the network. The &comstack;
279     module provides simple functions for establishing a connection
280     (passively or actively, depending on the role of your application),
281     and for exchanging BER-encoded PDUs over that connection. When you
282     create a connection endpoint, you need to specify what transport to
283     use (TCP/IP, SSL or UNIX sockets).
284     For the remainder of the connection's lifetime, you don't have
285     to worry about the underlying transport protocol at all - the &comstack;
286     will ensure that the correct mechanism is used.
287    </para>
288    <para>
289     We call the combined interfaces to &odr;, &asn;, and &comstack; the service
290     level API. It's the API that most closely models the Z39.50
291    service/protocol definition, and it provides unlimited access to all
292     fields and facilities of the protocol definitions.
293    </para>
294    <para>
295     The reason that the &yaz; service-level API is a conglomerate of the
296     APIs from three different submodules is twofold. First, we wanted to allow
297     the user a choice of different options for each major task. For instance,
298     if you don't like the protocol API provided by &odr;/&asn;, you
299     can use SNACC or BERUtils instead, and still have the benefits of the
300     transparent transport approach of the &comstack; module. Secondly,
301     we realize that you may have to fit the toolkit into an existing
302     event-processing structure, in a way that is incompatible with
303     the &comstack; interface or some other part of &yaz;.
304    </para>
305   </sect1>
306  </chapter>
307
308  <!-- Keep this comment at the end of the file
309  Local variables:
310  mode: sgml
311  sgml-omittag:t
312  sgml-shorttag:t
313  sgml-minimize-attributes:nil
314  sgml-always-quote-attributes:t
315  sgml-indent-step:1
316  sgml-indent-data:t
317  sgml-parent-document:"yaz.xml"
318  sgml-local-catalogs: nil
319  sgml-namecase-general:t
320  End:
321  -->