Fixed bug #2068: pkg-config trouble.
[yaz-moved-to-github.git] / src / opacdisp.c
1 /*
2  * Copyright (C) 1995-2008, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: opacdisp.c,v 1.10 2008-01-30 20:00:55 adam Exp $
6  */
7 /**
8  * \file opacdisp.c
9  * \brief Implements OPAC record display
10  */
11
12 #include <stdio.h>
13 #include <string.h>
14 #include <stdlib.h>
15 #include <ctype.h>
16
17 #include <yaz/proto.h>
18 #include <yaz/marcdisp.h>
19
20 static void opac_element_str(WRBUF wrbuf, yaz_iconv_t cd, 
21                              int l, const char *elem,
22                              const char *data)
23 {
24     if (data)
25     {
26         while (--l >= 0)
27             wrbuf_puts(wrbuf, " ");
28         wrbuf_puts(wrbuf, "<");
29         wrbuf_puts(wrbuf, elem);
30         wrbuf_puts(wrbuf, ">");
31         wrbuf_iconv_puts_cdata(wrbuf, cd, data);
32         wrbuf_puts(wrbuf, "</");
33         wrbuf_puts(wrbuf, elem);
34         wrbuf_puts(wrbuf, ">\n");
35     }
36 }
37
38 static void opac_element_bool(WRBUF wrbuf, int l, const char *elem, int *data)
39 {
40     if (data)
41     {
42         while (--l >= 0)
43             wrbuf_puts(wrbuf, " ");
44         wrbuf_puts(wrbuf, "<");
45         wrbuf_puts(wrbuf, elem);
46         if (*data)
47             wrbuf_puts(wrbuf, " value=\"1\"");
48         else
49             wrbuf_puts(wrbuf, " value=\"0\"");
50         wrbuf_puts(wrbuf, "/>\n");
51     }
52 }
53
54 void yaz_opac_decode_wrbuf(yaz_marc_t mt, Z_OPACRecord *r, WRBUF wrbuf)
55 {
56     int i;
57     yaz_iconv_t cd = yaz_marc_get_iconv(mt);
58
59     wrbuf_puts(wrbuf, "<opacRecord>\n");
60     if (r->bibliographicRecord)
61     {
62         Z_External *ext = r->bibliographicRecord;
63         
64         wrbuf_puts(wrbuf, "  <bibliographicRecord>\n");
65         if (ext->which == Z_External_octet)
66             yaz_marc_decode_wrbuf(mt, (const char *) ext->u.octet_aligned->buf,
67                                   ext->u.octet_aligned->len, wrbuf);
68         wrbuf_puts(wrbuf, "  </bibliographicRecord>\n");
69     }
70     wrbuf_puts(wrbuf, "<holdings>\n");
71
72     for (i = 0; i < r->num_holdingsData; i++)
73     {
74         Z_HoldingsRecord *h = r->holdingsData[i];
75         wrbuf_puts(wrbuf, " <holding>\n");
76
77         if (h->which == Z_HoldingsRecord_marcHoldingsRecord)
78         {
79             Z_External *ext = h->u.marcHoldingsRecord;
80
81             wrbuf_puts(wrbuf, "  <marcHoldingsRecord>\n");
82             if (ext->which == Z_External_octet)
83                 yaz_marc_decode_wrbuf(mt, (const char *)
84                                       ext->u.octet_aligned->buf,
85                                       ext->u.octet_aligned->len, wrbuf);
86             wrbuf_puts(wrbuf, "  </marcHoldingsRecord>\n");
87         }
88         else if (h->which == Z_HoldingsRecord_holdingsAndCirc)
89         {
90             int j;
91             
92             Z_HoldingsAndCircData *d = h->u.holdingsAndCirc;
93         
94             opac_element_str(wrbuf, cd, 2, "typeOfRecord", d->typeOfRecord);
95             opac_element_str(wrbuf, cd, 2, "encodingLevel", d->encodingLevel);
96             opac_element_str(wrbuf, cd, 2, "format", d->format);
97             opac_element_str(wrbuf, cd, 2, "receiptAcqStatus", d->receiptAcqStatus);
98             opac_element_str(wrbuf, cd, 2, "generalRetention", d->generalRetention);
99             opac_element_str(wrbuf, cd, 2, "completeness", d->completeness);
100             opac_element_str(wrbuf, cd, 2, "dateOfReport", d->dateOfReport);
101             opac_element_str(wrbuf, cd, 2, "nucCode", d->nucCode);
102             opac_element_str(wrbuf, cd, 2, "localLocation", d->localLocation);
103             opac_element_str(wrbuf, cd, 2, "shelvingLocation", d->shelvingLocation);
104             opac_element_str(wrbuf, cd, 2, "callNumber", d->callNumber);
105             opac_element_str(wrbuf, cd, 2, "shelvingData", d->shelvingData);
106             
107             opac_element_str(wrbuf, cd, 2, "copyNumber", d->copyNumber);
108             opac_element_str(wrbuf, cd, 2, "publicNote", d->publicNote);
109             opac_element_str(wrbuf, cd, 2, "reproductionNote", d->reproductionNote);
110             opac_element_str(wrbuf, cd, 2, "termsUseRepro", d->termsUseRepro);
111             opac_element_str(wrbuf, cd, 2, "enumAndChron", d->enumAndChron);
112             if (d->num_volumes)
113             {
114                 wrbuf_puts (wrbuf, "  <volumes>\n");
115                 for (j = 0; j<d->num_volumes; j++)
116                 {
117                     wrbuf_puts (wrbuf, "   <volume>\n");
118                     opac_element_str(wrbuf, cd, 4, "enumeration",
119                                      d->volumes[j]->enumeration);
120                     opac_element_str(wrbuf, cd, 4, "chronology",
121                                      d->volumes[j]->chronology);
122                     opac_element_str(wrbuf, cd, 4, "enumAndChron",
123                                      d->volumes[j]->enumAndChron);
124                     wrbuf_puts(wrbuf, "   </volume>\n");
125                 }
126                 wrbuf_puts(wrbuf, "  </volumes>\n");
127             }
128             if (d->num_circulationData)
129             {
130                 wrbuf_puts (wrbuf, "  <circulations>\n");
131                 for (j = 0; j<d->num_circulationData; j++)
132                 {
133                     wrbuf_puts(wrbuf,"   <circulation>\n");
134                     opac_element_bool(wrbuf, 4, "availableNow",
135                                       d->circulationData[j]->availableNow);
136                     opac_element_str(wrbuf, cd, 4, "availabiltyDate",
137                                      d->circulationData[j]->availablityDate);
138                     opac_element_str(wrbuf, cd, 4, "availableThru",
139                                       d->circulationData[j]->availableThru);
140                     opac_element_str(wrbuf, cd, 4, "restrictions",
141                                       d->circulationData[j]->restrictions);
142                     opac_element_str(wrbuf, cd, 4, "itemId",
143                                       d->circulationData[j]->itemId);
144                     opac_element_bool(wrbuf, 4, "renewable",
145                                       d->circulationData[j]->renewable);
146                     opac_element_bool(wrbuf, 4, "onHold",
147                                       d->circulationData[j]->onHold);
148                     opac_element_str(wrbuf, cd, 4, "enumAndChron",
149                                       d->circulationData[j]->enumAndChron);
150                     opac_element_str(wrbuf, cd, 4, "midspine",
151                                       d->circulationData[j]->midspine);
152                     opac_element_str(wrbuf, cd, 4, "temporaryLocation",
153                                       d->circulationData[j]->temporaryLocation);
154                     wrbuf_puts(wrbuf, "   </circulation>\n");
155                 }
156                 wrbuf_puts(wrbuf, "  </circulations>\n");
157             }
158         }
159         wrbuf_puts(wrbuf, " </holding>\n");
160     }
161     wrbuf_puts(wrbuf, "</holdings>\n");
162     wrbuf_puts(wrbuf, "</opacRecord>\n");
163 }
164
165 void yaz_display_OPAC(WRBUF wrbuf, Z_OPACRecord *opac_rec, int flags)
166 {
167     yaz_marc_t mt = yaz_marc_create();
168
169     yaz_marc_xml(mt, YAZ_MARC_MARCXML);
170     yaz_opac_decode_wrbuf(mt, opac_rec, wrbuf);
171     yaz_marc_destroy(mt);
172 }
173
174 /*
175  * Local variables:
176  * c-basic-offset: 4
177  * indent-tabs-mode: nil
178  * End:
179  * vim: shiftwidth=4 tabstop=8 expandtab
180  */
181