+Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p)
+{
+ Z_External *pext;
+ int i;
+
+ if(!p)
+ return 0;
+
+ for (i=0; i<p->num_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; i<pro->num_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; i<pro->num_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;
+
+ }
+}