-/*
- $ $Id: charneg.c,v 1.1 2003-10-27 12:21:30 adam Exp $
- * Helper functions for Character Set and Language Negotiation - 3
+/*
+ * Copyright (C) 1995-2005, Index Data ApS
+ * See the file LICENSE for details.
+ *
+ * $Id: charneg.c,v 1.6 2006-03-31 09:51:22 adam Exp $
*/
+/**
+ * \file charneg.c
+ * \brief Implements Z39.50 Charset negotiation utilities
+ *
+ * Helper functions for Character Set and Language Negotiation - 3
+ */
#include <stdio.h>
#include <yaz/otherinfo.h>
#include <yaz/z-charneg.h>
}
p->u.octet_aligned->len = p->u.octet_aligned->size = len;
memcpy(p->u.octet_aligned->buf, buf, len);
-
+
return p;
}
p0->which = Z_OriginProposal_0_private;
p0->u.zprivate = pc;
-
+
pc->which = Z_PrivateCharacterSet_externallySpecified;
pc->u.externallySpecified =
z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);
static Z_OriginProposal *z_get_OriginProposal(
ODR o, const char **charsets, int num_charsets,
const char **langs, int num_langs, int selected)
-{
+{
int i;
Z_OriginProposal *p = (Z_OriginProposal *) odr_malloc(o, sizeof(*p));
-
+
memset(p, 0, sizeof(*p));
p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
*p->recordsInSelectedCharSets = (selected) ? 1:0;
- if (charsets && num_charsets) {
-
+ if (charsets && num_charsets) {
+
p->num_proposedCharSets = num_charsets;
p->proposedCharSets =
(Z_OriginProposal_0**)
z_get_OriginProposal_0(o, charsets[i]);
}
if (langs && num_langs) {
-
+
p->num_proposedlanguages = num_langs;
p->proposedlanguages =
for (i = 0; i<num_langs; i++) {
p->proposedlanguages[i] = (char *)langs[i];
-
+
}
}
return p;
(Z_CharSetandLanguageNegotiation *) odr_malloc(o, sizeof(*p));
memset(p, 0, sizeof(*p));
-
+
return p;
}
{
Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));
oident oid;
-
+
p->descriptor = 0;
- p->indirect_reference = 0;
+ p->indirect_reference = 0;
oid.proto = PROTO_Z3950;
oid.oclass = CLASS_NEGOT;
return p;
}
+Z_External *yaz_set_proposal_charneg_list(ODR o,
+ const char *delim,
+ const char *charset_list,
+ const char *lang_list,
+ int selected)
+{
+ char **charsets_addresses = 0;
+ char **langs_addresses = 0;
+ int charsets_count = 0;
+ int langs_count = 0;
+
+ if (charset_list)
+ nmem_strsplit(o->mem, delim, charset_list,
+ &charsets_addresses, &charsets_count);
+ if (lang_list)
+ nmem_strsplit(o->mem, delim, lang_list,
+ &langs_addresses, &langs_count);
+ return yaz_set_proposal_charneg(o,
+ (const char **) charsets_addresses,
+ charsets_count,
+ (const char **) langs_addresses,
+ langs_count,
+ selected);
+}
+
+
/* used by yaz_set_response_charneg */
static Z_TargetResponse *z_get_TargetResponse(ODR o, const char *charset,
const char *lang, int selected)
-{
+{
Z_TargetResponse *p = (Z_TargetResponse *) odr_malloc(o, sizeof(*p));
int form = get_form(charset);
(Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));
memset(pc, 0, sizeof(*pc));
-
+
p->which = Z_TargetResponse_private;
p->u.zprivate = pc;
-
+
pc->which = Z_PrivateCharacterSet_externallySpecified;
pc->u.externallySpecified =
- z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);
+ z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);
}
p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
*p->recordsInSelectedCharSets = (selected) ? 1:0;
{
Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));
oident oid;
-
+
p->descriptor = 0;
- p->indirect_reference = 0;
+ p->indirect_reference = 0;
oid.proto = PROTO_Z3950;
oid.oclass = CLASS_NEGOT;
/* Get negotiation from OtherInformation. Client&Server side */
Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p)
{
- Z_External *pext;
int i;
-
- if(!p)
+
+ if (!p)
return 0;
-
- for (i=0; i<p->num_elements; i++) {
-
+
+ for (i = 0; i < p->num_elements; i++) {
+ Z_External *pext;
if ((p->list[i]->which == Z_OtherInfo_externallyDefinedInfo) &&
(pext = p->list[i]->information.externallyDefinedInfo)) {
-
+
oident *ent = oid_getentbyoid(pext->direct_reference);
-
- if (ent && ent->value == VAL_CHARNEG3 && ent->oclass == CLASS_NEGOT &&
- pext->which == Z_External_charSetandLanguageNegotiation) {
-
+
+ if (ent && ent->value == VAL_CHARNEG3
+ && ent->oclass == CLASS_NEGOT
+ && pext->which == Z_External_charSetandLanguageNegotiation)
+ {
return pext->u.charNeg3;
}
}
return 0;
}
+/* Delete negotiation from OtherInformation. Client&Server side */
+int yaz_del_charneg_record(Z_OtherInformation **p)
+{
+ int i;
+
+ if (!*p)
+ return 0;
+
+ for (i = 0; i < (*p)->num_elements; i++) {
+ Z_External *pext;
+ if (((*p)->list[i]->which == Z_OtherInfo_externallyDefinedInfo) &&
+ (pext = (*p)->list[i]->information.externallyDefinedInfo)) {
+
+ oident *ent = oid_getentbyoid(pext->direct_reference);
+
+ if (ent && ent->value == VAL_CHARNEG3
+ && ent->oclass == CLASS_NEGOT
+ && pext->which == Z_External_charSetandLanguageNegotiation)
+ {
+ --((*p)->num_elements);
+ if ((*p)->num_elements == 0)
+ *p = 0;
+ else
+ {
+ for(; i < (*p)->num_elements; i++)
+ (*p)->list[i] = (*p)->list[i+1];
+ }
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+
/* Get charsets, langs, selected from negotiation.. Server side */
void yaz_get_proposal_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p,
char ***charsets, int *num_charsets,
char **charset, char **lang, int *selected)
{
Z_TargetResponse *res = p->u.response;
-
+
if (charset && res->which == Z_TargetResponse_private &&
res->u.zprivate->which == Z_PrivateCharacterSet_externallySpecified) {
memcpy (*charset, pext->u.octet_aligned->buf,
pext->u.octet_aligned->len);
(*charset)[pext->u.octet_aligned->len] = 0;
- }
+ }
}
if (charset && res->which == Z_TargetResponse_iso10646)
*charset = set_form (res->u.iso10646->encodingLevel);
if(selected && res->recordsInSelectedCharSets)
*selected = *res->recordsInSelectedCharSets;
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+