/*
- * Copyright (C) 1995-2005, Index Data ApS
+ * Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: charneg.c,v 1.4 2005-05-18 12:38:40 adam Exp $
+ * $Id: charneg.c,v 1.9 2007-04-16 21:53:09 adam Exp $
*/
/**
#include <yaz/z-charneg.h>
#include <yaz/charneg.h>
#include <yaz/yaz-util.h>
+#include <yaz/oid_db.h>
-static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value,
- const char *buf)
+static Z_External* z_ext_record2(ODR o, const char *buf)
{
Z_External *p;
- oident oid;
int len = strlen(buf);
if (!(p = (Z_External *)odr_malloc(o, sizeof(*p)))) return 0;
p->descriptor = 0;
p->indirect_reference = 0;
- oid.proto = PROTO_Z3950;
- oid.oclass = (enum oid_class) oid_class;
- oid.value = (enum oid_value) oid_value;
- p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
+ p->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_id);
p->which = Z_External_octet;
if (!(p->u.octet_aligned = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)))) {
}
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);
+ pc->u.externallySpecified = z_ext_record2(o, charset);
}
return p0;
}
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;
}
int selected)
{
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;
- oid.value = VAL_CHARNEG3;
- p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
+ p->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_3);
p->which = Z_External_charSetandLanguageNegotiation;
p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);
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(odr_getmem(o), delim, charset_list,
+ &charsets_addresses, &charsets_count);
+ if (lang_list)
+ nmem_strsplit(odr_getmem(o), 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, charset);
}
p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));
*p->recordsInSelectedCharSets = (selected) ? 1:0;
const char *lang, int selected)
{
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;
- oid.value = VAL_CHARNEG3;
- p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));
+ p->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_3);
p->which = Z_External_charSetandLanguageNegotiation;
p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);
Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p)
{
int i;
-
+
if (!p)
return 0;
-
+
for (i = 0; i < p->num_elements; i++) {
- Z_External *pext;
+ 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 (!oid_oidcmp(pext->direct_reference, yaz_oid_negot_charset_3)
+ && pext->which == Z_External_charSetandLanguageNegotiation)
+ {
return pext->u.charNeg3;
}
}
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;
+ 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;
+ (pext = (*p)->list[i]->information.externallyDefinedInfo))
+ {
+ if (!oid_oidcmp(pext->direct_reference, yaz_oid_negot_charset_3)
+ && pext->which == Z_External_charSetandLanguageNegotiation)
+ {
+ if ((*p)->num_elements <= 1)
+ *p = 0;
+ else
+ {
+ --((*p)->num_elements);
+ for(; i < (*p)->num_elements; i++)
+ (*p)->list[i] = (*p)->list[i+1];
+ }
+ return 1;
}
}
}
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
+ */
+