2 * Copyright (C) 1995-2008, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: opacdisp.c,v 1.10 2008-01-30 20:00:55 adam Exp $
9 * \brief Implements OPAC record display
17 #include <yaz/proto.h>
18 #include <yaz/marcdisp.h>
20 static void opac_element_str(WRBUF wrbuf, yaz_iconv_t cd,
21 int l, const char *elem,
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");
38 static void opac_element_bool(WRBUF wrbuf, int l, const char *elem, int *data)
43 wrbuf_puts(wrbuf, " ");
44 wrbuf_puts(wrbuf, "<");
45 wrbuf_puts(wrbuf, elem);
47 wrbuf_puts(wrbuf, " value=\"1\"");
49 wrbuf_puts(wrbuf, " value=\"0\"");
50 wrbuf_puts(wrbuf, "/>\n");
54 void yaz_opac_decode_wrbuf(yaz_marc_t mt, Z_OPACRecord *r, WRBUF wrbuf)
57 yaz_iconv_t cd = yaz_marc_get_iconv(mt);
59 wrbuf_puts(wrbuf, "<opacRecord>\n");
60 if (r->bibliographicRecord)
62 Z_External *ext = r->bibliographicRecord;
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");
70 wrbuf_puts(wrbuf, "<holdings>\n");
72 for (i = 0; i < r->num_holdingsData; i++)
74 Z_HoldingsRecord *h = r->holdingsData[i];
75 wrbuf_puts(wrbuf, " <holding>\n");
77 if (h->which == Z_HoldingsRecord_marcHoldingsRecord)
79 Z_External *ext = h->u.marcHoldingsRecord;
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");
88 else if (h->which == Z_HoldingsRecord_holdingsAndCirc)
92 Z_HoldingsAndCircData *d = h->u.holdingsAndCirc;
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);
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);
114 wrbuf_puts (wrbuf, " <volumes>\n");
115 for (j = 0; j<d->num_volumes; j++)
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");
126 wrbuf_puts(wrbuf, " </volumes>\n");
128 if (d->num_circulationData)
130 wrbuf_puts (wrbuf, " <circulations>\n");
131 for (j = 0; j<d->num_circulationData; j++)
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");
156 wrbuf_puts(wrbuf, " </circulations>\n");
159 wrbuf_puts(wrbuf, " </holding>\n");
161 wrbuf_puts(wrbuf, "</holdings>\n");
162 wrbuf_puts(wrbuf, "</opacRecord>\n");
165 void yaz_display_OPAC(WRBUF wrbuf, Z_OPACRecord *opac_rec, int flags)
167 yaz_marc_t mt = yaz_marc_create();
169 yaz_marc_xml(mt, YAZ_MARC_MARCXML);
170 yaz_opac_decode_wrbuf(mt, opac_rec, wrbuf);
171 yaz_marc_destroy(mt);
177 * indent-tabs-mode: nil
179 * vim: shiftwidth=4 tabstop=8 expandtab