X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=zutil%2Fcharneg.c;h=3cc9b4bf2ee05b7e3200af51ee9c25bc0c28728b;hb=2bdde7e3c49ae8dbc8da613f6554d6b7ae94c4e3;hp=7e5ac4d862ad87bf5e64ed89b2785f0359dddbdc;hpb=379c41a9a422911c58dc6a6db5f16eae56f22a7d;p=yaz-moved-to-github.git diff --git a/zutil/charneg.c b/zutil/charneg.c index 7e5ac4d..3cc9b4b 100644 --- a/zutil/charneg.c +++ b/zutil/charneg.c @@ -1,10 +1,10 @@ /* - $ $Id: charneg.c,v 1.1 2002-05-18 09:41:11 oleg Exp $ + $ $Id: charneg.c,v 1.3 2002-05-21 08:36:04 adam Exp $ * Helper functions for Character Set and Language Negotiation - 3 */ #include -#include +#include #include #include @@ -56,38 +56,43 @@ static Z_OriginProposal_0 *z_get_OriginProposal_0(ODR o, const char *charset) return p0; } static Z_OriginProposal *z_get_OriginProposal(ODR o, const char **charsets, - int num_charsets, const char **langs, int num_langs) + 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->num_proposedCharSets = num_charsets; - p->num_proposedlanguages = num_langs; + p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t)); - *p->recordsInSelectedCharSets = 1; + *p->recordsInSelectedCharSets = (selected) ? 1:0; + + if (charsets && num_charsets) { - p->proposedCharSets = + p->num_proposedCharSets = num_charsets; + p->proposedCharSets = (Z_OriginProposal_0**) odr_malloc(o, num_charsets*sizeof(Z_OriginProposal_0*)); - for (i = 0; iproposedCharSets[i] = - z_get_OriginProposal_0(o, charsets[i]); + p->proposedCharSets[i] = + z_get_OriginProposal_0(o, charsets[i]); + } } - p->proposedlanguages = + if (langs && num_langs) { + + p->num_proposedlanguages = num_langs; + + p->proposedlanguages = (char **) odr_malloc(o, num_langs*sizeof(char *)); - for (i = 0; iproposedlanguages[i] = plang; + p->proposedlanguages[i] = (char *)langs[i]; + } } - return p; } static Z_CharSetandLanguageNegotiation *z_get_CharSetandLanguageNegotiation(ODR o) @@ -99,9 +104,8 @@ static Z_CharSetandLanguageNegotiation *z_get_CharSetandLanguageNegotiation(ODR return p; } -Z_External *yaz_set_charset_and_lang(ODR o, int oid_class, int oid_value, - const char **charsets, int num_charsets, - const char **langs, int num_langs) +Z_External *yaz_set_proposal_charneg(ODR o, const char **charsets, int num_charsets, + const char **langs, int num_langs, int selected) { Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p)); oident oid; @@ -110,8 +114,8 @@ Z_External *yaz_set_charset_and_lang(ODR o, int oid_class, int oid_value, p->indirect_reference = 0; oid.proto = PROTO_Z3950; - oid.oclass = oid_class; - oid.value = oid_value; + oid.oclass = CLASS_NEGOT; + oid.value = VAL_CHARNEG3; p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid)); p->which = Z_External_charSetandLanguageNegotiation; @@ -119,7 +123,155 @@ Z_External *yaz_set_charset_and_lang(ODR o, int oid_class, int oid_value, p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_proposal; p->u.charNeg3->u.proposal = z_get_OriginProposal(o, charsets, num_charsets, - langs, num_langs); + langs, num_langs, selected); return p; } +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)); + Z_PrivateCharacterSet *pc = + (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc)); + + memset(p, 0, sizeof(*p)); + memset(pc, 0, sizeof(*pc)); + + p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t)); + *p->recordsInSelectedCharSets = (selected) ? 1:0; + p->selectedLanguage = (char *)odr_strdup(o, lang); + + p->which = Z_TargetResponse_private; + p->u.zprivate = pc; + + pc->which = Z_PrivateCharacterSet_externallySpecified; + pc->u.externallySpecified = + z_ext_record2(o, CLASS_RECSYN, VAL_NOP, charset, (strlen(charset)+1)); + return p; +} +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; + + oid.proto = PROTO_Z3950; + oid.oclass = CLASS_NEGOT; + oid.value = VAL_CHARNEG3; + p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid)); + + p->which = Z_External_charSetandLanguageNegotiation; + p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o); + p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_response; + p->u.charNeg3->u.response = z_get_TargetResponse(o, charset, lang, selected); + + return p; +} +Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p) +{ + Z_External *pext; + int i; + + if(!p) + return 0; + + for (i=0; inum_elements; i++) { + + 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) { + + return pext->u.charNeg3; + } + } + } + + return 0; +} +void yaz_get_proposal_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p, char **charsets, + int *num_charsets, char **langs, int *num_langs, int *selected) +{ + int i; + Z_OriginProposal *pro = p->u.proposal; + + if (pro->num_proposedCharSets && charsets && num_charsets) { + + *num_charsets = pro->num_proposedCharSets; + + charsets = (char **)nmem_malloc(mem, pro->num_proposedCharSets * sizeof(char *)); + + for (i=0; inum_proposedCharSets; i++) { + + if (pro->proposedCharSets[i]->which == Z_OriginProposal_0_private && + pro->proposedCharSets[i]->u.zprivate->which == Z_PrivateCharacterSet_externallySpecified) { + + Z_External *pext = + pro->proposedCharSets[i]->u.zprivate->u.externallySpecified; + + if (pext->which == Z_External_octet) { + + charsets[i] = (char *)nmem_malloc(mem, pext->u.octet_aligned->len * sizeof(char)); + + memcpy (charsets[i], pext->u.octet_aligned->buf, pext->u.octet_aligned->len); + + } + } + } + } + + if (pro->num_proposedlanguages && langs && num_langs) { + + *num_langs = pro->num_proposedlanguages; + + langs = (char **)nmem_malloc(mem, pro->num_proposedlanguages * sizeof(char *)); + + for (i=0; inum_proposedlanguages; i++) { + + langs[i] = (char *)nmem_malloc(mem, strlen(pro->proposedlanguages[i])+1); + memcpy (langs[i], pro->proposedlanguages[i], strlen(pro->proposedlanguages[i])+1); + } + } + + if(pro->recordsInSelectedCharSets && selected) { + + *selected = *pro->recordsInSelectedCharSets; + + } +} +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) { + + Z_External *pext = res->u.zprivate->u.externallySpecified; + + if (pext->which == Z_External_octet) { + + *charset = (char *)nmem_malloc(mem, pext->u.octet_aligned->len * sizeof(char)); + memcpy (*charset, pext->u.octet_aligned->buf, pext->u.octet_aligned->len); + } + } + + if (lang && res->selectedLanguage) { + + *lang = (char *)nmem_malloc(mem, strlen(res->selectedLanguage)+1); + memcpy (*lang, res->selectedLanguage, strlen(res->selectedLanguage)+1); + + } + + if(selected && res->recordsInSelectedCharSets) { + + *selected = *res->recordsInSelectedCharSets; + + } +}