2 $ $Id: charneg.c,v 1.3 2002-05-21 08:36:04 adam Exp $
3 * Helper functions for Character Set and Language Negotiation - 3
7 #include <yaz/otherinfo.h>
8 #include <yaz/z-charneg.h>
9 #include <yaz/charneg.h>
11 static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value,
12 const char *buf, int len)
17 if (!(p = (Z_External *)odr_malloc(o, sizeof(*p)))) return 0;
20 p->indirect_reference = 0;
22 oid.proto = PROTO_Z3950;
23 oid.oclass = oid_class;
24 oid.value = oid_value;
25 p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
27 p->which = Z_External_octet;
28 if (!(p->u.octet_aligned = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)))) {
31 if (!(p->u.octet_aligned->buf = (unsigned char *)odr_malloc(o, len))) {
34 p->u.octet_aligned->len = p->u.octet_aligned->size = len;
35 memcpy(p->u.octet_aligned->buf, buf, len);
39 static Z_OriginProposal_0 *z_get_OriginProposal_0(ODR o, const char *charset)
41 Z_OriginProposal_0 *p0 =
42 (Z_OriginProposal_0*)odr_malloc(o, sizeof(*p0));
43 Z_PrivateCharacterSet *pc =
44 (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));
46 memset(p0, 0, sizeof(*p0));
47 memset(pc, 0, sizeof(*pc));
49 p0->which = Z_OriginProposal_0_private;
52 pc->which = Z_PrivateCharacterSet_externallySpecified;
53 pc->u.externallySpecified =
54 z_ext_record2(o, CLASS_RECSYN, VAL_NOP, charset, (strlen(charset)+1));
58 static Z_OriginProposal *z_get_OriginProposal(ODR o, const char **charsets,
59 int num_charsets, const char **langs, int num_langs, int selected)
62 Z_OriginProposal *p = (Z_OriginProposal *) odr_malloc(o, sizeof(*p));
64 memset(p, 0, sizeof(*p));
66 p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
67 *p->recordsInSelectedCharSets = (selected) ? 1:0;
69 if (charsets && num_charsets) {
71 p->num_proposedCharSets = num_charsets;
73 (Z_OriginProposal_0**) odr_malloc(o,
74 num_charsets*sizeof(Z_OriginProposal_0*));
76 for (i = 0; i<num_charsets; i++) {
78 p->proposedCharSets[i] =
79 z_get_OriginProposal_0(o, charsets[i]);
83 if (langs && num_langs) {
85 p->num_proposedlanguages = num_langs;
87 p->proposedlanguages =
88 (char **) odr_malloc(o, num_langs*sizeof(char *));
90 for (i = 0; i<num_langs; i++) {
92 p->proposedlanguages[i] = (char *)langs[i];
98 static Z_CharSetandLanguageNegotiation *z_get_CharSetandLanguageNegotiation(ODR o)
100 Z_CharSetandLanguageNegotiation *p =
101 (Z_CharSetandLanguageNegotiation *) odr_malloc(o, sizeof(*p));
103 memset(p, 0, sizeof(*p));
107 Z_External *yaz_set_proposal_charneg(ODR o, const char **charsets, int num_charsets,
108 const char **langs, int num_langs, int selected)
110 Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));
114 p->indirect_reference = 0;
116 oid.proto = PROTO_Z3950;
117 oid.oclass = CLASS_NEGOT;
118 oid.value = VAL_CHARNEG3;
119 p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
121 p->which = Z_External_charSetandLanguageNegotiation;
122 p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);
123 p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_proposal;
124 p->u.charNeg3->u.proposal =
125 z_get_OriginProposal(o, charsets, num_charsets,
126 langs, num_langs, selected);
130 static Z_TargetResponse *z_get_TargetResponse(ODR o, const char *charset,
131 const char *lang, int selected)
133 Z_TargetResponse *p = (Z_TargetResponse *) odr_malloc(o, sizeof(*p));
134 Z_PrivateCharacterSet *pc =
135 (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));
137 memset(p, 0, sizeof(*p));
138 memset(pc, 0, sizeof(*pc));
140 p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
141 *p->recordsInSelectedCharSets = (selected) ? 1:0;
142 p->selectedLanguage = (char *)odr_strdup(o, lang);
144 p->which = Z_TargetResponse_private;
147 pc->which = Z_PrivateCharacterSet_externallySpecified;
148 pc->u.externallySpecified =
149 z_ext_record2(o, CLASS_RECSYN, VAL_NOP, charset, (strlen(charset)+1));
152 Z_External *yaz_set_response_charneg(ODR o, const char *charset,
153 const char *lang, int selected)
155 Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));
159 p->indirect_reference = 0;
161 oid.proto = PROTO_Z3950;
162 oid.oclass = CLASS_NEGOT;
163 oid.value = VAL_CHARNEG3;
164 p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
166 p->which = Z_External_charSetandLanguageNegotiation;
167 p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);
168 p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_response;
169 p->u.charNeg3->u.response = z_get_TargetResponse(o, charset, lang, selected);
173 Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p)
181 for (i=0; i<p->num_elements; i++) {
183 if ((p->list[i]->which == Z_OtherInfo_externallyDefinedInfo) &&
184 (pext = p->list[i]->information.externallyDefinedInfo)) {
186 oident *ent = oid_getentbyoid(pext->direct_reference);
188 if (ent && ent->value == VAL_CHARNEG3 && ent->oclass == CLASS_NEGOT &&
189 pext->which == Z_External_charSetandLanguageNegotiation) {
191 return pext->u.charNeg3;
198 void yaz_get_proposal_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p, char **charsets,
199 int *num_charsets, char **langs, int *num_langs, int *selected)
202 Z_OriginProposal *pro = p->u.proposal;
204 if (pro->num_proposedCharSets && charsets && num_charsets) {
206 *num_charsets = pro->num_proposedCharSets;
208 charsets = (char **)nmem_malloc(mem, pro->num_proposedCharSets * sizeof(char *));
210 for (i=0; i<pro->num_proposedCharSets; i++) {
212 if (pro->proposedCharSets[i]->which == Z_OriginProposal_0_private &&
213 pro->proposedCharSets[i]->u.zprivate->which == Z_PrivateCharacterSet_externallySpecified) {
216 pro->proposedCharSets[i]->u.zprivate->u.externallySpecified;
218 if (pext->which == Z_External_octet) {
220 charsets[i] = (char *)nmem_malloc(mem, pext->u.octet_aligned->len * sizeof(char));
222 memcpy (charsets[i], pext->u.octet_aligned->buf, pext->u.octet_aligned->len);
229 if (pro->num_proposedlanguages && langs && num_langs) {
231 *num_langs = pro->num_proposedlanguages;
233 langs = (char **)nmem_malloc(mem, pro->num_proposedlanguages * sizeof(char *));
235 for (i=0; i<pro->num_proposedlanguages; i++) {
237 langs[i] = (char *)nmem_malloc(mem, strlen(pro->proposedlanguages[i])+1);
238 memcpy (langs[i], pro->proposedlanguages[i], strlen(pro->proposedlanguages[i])+1);
242 if(pro->recordsInSelectedCharSets && selected) {
244 *selected = *pro->recordsInSelectedCharSets;
248 void yaz_get_response_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p,
249 char **charset, char **lang, int *selected)
251 Z_TargetResponse *res = p->u.response;
253 if (charset && res->which == Z_TargetResponse_private &&
254 res->u.zprivate->which == Z_PrivateCharacterSet_externallySpecified) {
256 Z_External *pext = res->u.zprivate->u.externallySpecified;
258 if (pext->which == Z_External_octet) {
260 *charset = (char *)nmem_malloc(mem, pext->u.octet_aligned->len * sizeof(char));
261 memcpy (*charset, pext->u.octet_aligned->buf, pext->u.octet_aligned->len);
265 if (lang && res->selectedLanguage) {
267 *lang = (char *)nmem_malloc(mem, strlen(res->selectedLanguage)+1);
268 memcpy (*lang, res->selectedLanguage, strlen(res->selectedLanguage)+1);
272 if(selected && res->recordsInSelectedCharSets) {
274 *selected = *res->recordsInSelectedCharSets;