The YAZ toolkit offers several different levels of access to the ISO23950/Z39.50, ILL and SRU protocols. The level that you need to use depends on your requirements, and the role (server or client) that you want to implement. If you're developing a client application you should consider the ZOOM API. It is, by far, the easiest way to develop clients in C. Server implementors should consider the generic front-end server. None of those high-level APIs support the whole protocol, but they do include most facilities used in existing Z39.50 applications.
If you're using 'exotic' functionality (meaning anything not included in the high-level APIs), developing non-standard extensions to Z39.50 or you're going to develop an ILL application, you'll have to learn the lower level APIs of YAZ.
The YAZ toolkit modules are shown in figure Figure 1.1, “YAZ layers”.
There are four layers.
A client or server application (or both). This layer includes ZOOM and the generic front-end server.
The second layer provides a C representation of the protocol units (packages) for Z39.50 ASN.1, ILL ASN.1, SRU.
The third layer encodes and decodes protocol data units to simple packages (buffer with certain length). The ODR module encodes and decodes BER whereas the HTTP modules encodes and decodes HTTP requests/responses.
The lowest layer is COMSTACK which exchanges the encoded packages with a peer process over a network.
The Z39.50 ASN.1 module represents the ASN.1 definition of the Z39.50 protocol. It establishes a set of type and structure definitions, with one structure for each of the top-level PDUs, and one structure or type for each of the contained ASN.1 types. For primitive types, or other types that are defined by the ASN.1 standard itself (such as the EXTERNAL type), the C representation is provided by the ODR (Open Data Representation) subsystem.
ODR is a basic mechanism for representing an
ASN.1 type in the C programming language, and for implementing BER
encoders and decoders for values of that type. The types defined in
the Z39.50 ASN.1 module generally have the prefix Z_
, and
a suffix corresponding to the name of the type in the ASN.1
specification of the protocol (generally Z39.50-1995). In the case of
base types (those originating in the ASN.1 standard itself), the prefix
Odr_
is sometimes seen. Either way, look for
the actual definition in either z-core.h
(for the types
from the protocol), odr.h
(for the primitive ASN.1
types).
The Z39.50 ASN.1 library also provides functions (which are, in turn,
defined using ODR primitives) for encoding and decoding data values.
Their general form is
int z_xxx( | o, | |
p, | ||
optional, | ||
name) ; |
ODR o
;Z_xxx **p
;int optional
;const char *name
;(note the lower-case "z" in the function name)
If you are using the premade definitions of the Z39.50 ASN.1 module, and you are not adding a new protocol of your own, the only parts of ODR that you need to worry about are documented in Section 2, “Using ODR”.
When you have created a BER-encoded buffer, you can use the COMSTACK subsystem to transmit (or receive) data over the network. The COMSTACK module provides simple functions for establishing a connection (passively or actively, depending on the role of your application), and for exchanging BER-encoded PDUs over that connection. When you create a connection endpoint, you need to specify what transport to use (TCP/IP, SSL or UNIX sockets). For the remainder of the connection's lifetime, you don't have to worry about the underlying transport protocol at all - the COMSTACK will ensure that the correct mechanism is used.
We call the combined interfaces to ODR, Z39.50 ASN.1, and COMSTACK the service level API. It's the API that most closely models the Z39.50 service/protocol definition, and it provides unlimited access to all fields and facilities of the protocol definitions.
The reason that the YAZ service-level API is a conglomerate of the APIs from three different sub-modules is twofold. First, we wanted to allow the user a choice of different options for each major task. For instance, if you don't like the protocol API provided by ODR/Z39.50 ASN.1, you can use SNACC or BERUtils instead, and still have the benefits of the transparent transport approach of the COMSTACK module. Secondly, we realize that you may have to fit the toolkit into an existing event-processing structure, in a way that is incompatible with the COMSTACK interface or some other part of YAZ.