X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcharneg.c;h=8467ba006474d7522cf5af1fe2d24fb664063eea;hp=ebd10fc53f429ae6cfea6bff39fb90be8dd9b7a5;hb=d0e351c12fff564d876958e860338d43716dc269;hpb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9 diff --git a/src/charneg.c b/src/charneg.c index ebd10fc..8467ba0 100644 --- a/src/charneg.c +++ b/src/charneg.c @@ -1,19 +1,27 @@ -/* - $ $Id: charneg.c,v 1.1 2003-10-27 12:21:30 adam Exp $ +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2010 Index Data + * See the file LICENSE for details. + */ +/** + * \file charneg.c + * \brief Implements Z39.50 Charset negotiation utilities + * * Helper functions for Character Set and Language Negotiation - 3 */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include #include #include +#include -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; @@ -21,10 +29,7 @@ static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value, 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)))) { @@ -35,7 +40,7 @@ static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value, } p->u.octet_aligned->len = p->u.octet_aligned->size = len; memcpy(p->u.octet_aligned->buf, buf, len); - + return p; } @@ -100,10 +105,9 @@ static Z_OriginProposal_0 *z_get_OriginProposal_0(ODR o, const char *charset) 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; } @@ -111,17 +115,17 @@ static Z_OriginProposal_0 *z_get_OriginProposal_0(ODR o, const char *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**) @@ -132,7 +136,7 @@ static Z_OriginProposal *z_get_OriginProposal( z_get_OriginProposal_0(o, charsets[i]); } if (langs && num_langs) { - + p->num_proposedlanguages = num_langs; p->proposedlanguages = @@ -141,7 +145,7 @@ static Z_OriginProposal *z_get_OriginProposal( for (i = 0; iproposedlanguages[i] = (char *)langs[i]; - + } } return p; @@ -154,7 +158,7 @@ static Z_CharSetandLanguageNegotiation *z_get_CharSetandLanguageNegotiation( (Z_CharSetandLanguageNegotiation *) odr_malloc(o, sizeof(*p)); memset(p, 0, sizeof(*p)); - + return p; } @@ -165,15 +169,11 @@ Z_External *yaz_set_proposal_charneg(ODR o, 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); @@ -185,10 +185,36 @@ Z_External *yaz_set_proposal_charneg(ODR 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); @@ -211,13 +237,13 @@ static Z_TargetResponse *z_get_TargetResponse(ODR o, const char *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; @@ -231,15 +257,11 @@ Z_External *yaz_set_response_charneg(ODR o, const char *charset, 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); @@ -252,22 +274,19 @@ Z_External *yaz_set_response_charneg(ODR o, const char *charset, /* 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; inum_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 (!oid_oidcmp(pext->direct_reference, yaz_oid_negot_charset_3) + && pext->which == Z_External_charSetandLanguageNegotiation) + { return pext->u.charNeg3; } } @@ -275,6 +294,38 @@ Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p) 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)) + { + 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; + } + } + } + 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, @@ -351,7 +402,7 @@ void yaz_get_response_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p, 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) { @@ -364,7 +415,7 @@ void yaz_get_response_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p, 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); @@ -374,3 +425,12 @@ void yaz_get_response_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p, if(selected && res->recordsInSelectedCharSets) *selected = *res->recordsInSelectedCharSets; } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +