/*
- * $Id: zoom-c.c,v 1.28 2002-05-17 12:48:30 adam Exp $
+ * $Id: zoom-c.c,v 1.30 2002-05-19 15:39:54 oleg Exp $
*
* ZOOM layer for C, connections, result sets, queries.
*/
#include <yaz/log.h>
#include <yaz/pquery.h>
#include <yaz/diagbib1.h>
+#include <yaz/charneg.h>
#include "zoom-p.h"
c->host_port = 0;
c->proxy = 0;
+
+ c->charset = c->lang = 0;
c->cookie_out = 0;
c->cookie_in = 0;
else
c->proxy = 0;
+ val = ZOOM_options_get (c->options, "charset");
+ if (val && *val)
+ c->charset = xstrdup (val);
+ else
+ c->charset = 0;
+
+ val = ZOOM_options_get (c->options, "lang");
+ if (val && *val)
+ c->lang = xstrdup (val);
+ else
+ c->lang = 0;
+
if (portnum)
{
char hostn[128];
ZOOM_connection_remove_tasks (c);
xfree (c->host_port);
xfree (c->proxy);
+ xfree (c->charset);
+ xfree (c->lang);
xfree (c->cookie_out);
xfree (c->cookie_in);
xfree (c);
if (c->proxy)
yaz_oi_set_string_oidval(&ireq->otherInfo, c->odr_out,
VAL_PROXY, 1, c->host_port);
+ if (c->charset||c->lang)
+ {
+ Z_OtherInformation **oi;
+ Z_OtherInformationUnit *oi_unit;
+
+ yaz_oi_APDU(apdu, &oi);
+
+ if (oi_unit = yaz_oi_update(oi, c->odr_out, NULL, 0, 0))
+ {
+ ODR_MASK_SET(ireq->options, Z_Options_negotiationModel);
+
+ oi_unit->which = Z_OtherInfo_externallyDefinedInfo;
+ oi_unit->information.externallyDefinedInfo =
+ yaz_set_proposal_charneg(c->odr_out,
+ (const char **)&c->charset, (c->charset) ? 1:0,
+ (const char **)&c->lang, (c->lang) ? 1:0, 1);
+ }
+ }
assert (apdu);
send_APDU (c, apdu);
{
Z_NamePlusRecord *npr;
- *len = 0; /* if return 0 */
-
+ if (len)
+ *len = 0; /* default return */
+
if (!rec)
return 0;
npr = rec->npr;
return 0;
if (!strcmp (type, "database"))
{
- *len = strlen(npr->databaseName)+1;
+ if (len) *len = strlen(npr->databaseName)+1;
return npr->databaseName;
}
else if (!strcmp (type, "syntax"))
oident *ent = oid_getentbyoid(r->direct_reference);
if (ent)
{
- *len = strlen(ent->desc)+1;
+ if (len) *len = strlen(ent->desc)+1;
return ent->desc;
}
}
if (r->which == Z_External_sutrs)
{
- *len = r->u.sutrs->len;
+ if (len) *len = r->u.sutrs->len;
return (const char *) r->u.sutrs->buf;
}
else if (r->which == Z_External_octet)
r->u.octet_aligned->len,
0) > 0)
{
- *len = wrbuf_len(rec->wrbuf_marc);
+ if (len) *len = wrbuf_len(rec->wrbuf_marc);
return wrbuf_buf(rec->wrbuf_marc);
}
}
- *len = r->u.octet_aligned->len;
+ if (len) *len = r->u.octet_aligned->len;
return (const char *) r->u.octet_aligned->buf;
}
else if (r->which == Z_External_grs1)
{
- *len = 5;
+ if (len) *len = 5;
return "GRS-1";
}
return 0;
if (r->which == Z_External_sutrs)
{
- *len = r->u.sutrs->len;
+ if (len) *len = r->u.sutrs->len;
return (const char *) r->u.sutrs->buf;
}
else if (r->which == Z_External_octet)
r->u.octet_aligned->len,
1) > 0)
{
- *len = wrbuf_len(rec->wrbuf_marc);
+ if (len) *len = wrbuf_len(rec->wrbuf_marc);
return wrbuf_buf(rec->wrbuf_marc);
}
}
- *len = r->u.octet_aligned->len;
+ if (len) *len = r->u.octet_aligned->len;
return (const char *) r->u.octet_aligned->buf;
}
else if (r->which == Z_External_grs1)
{
- *len = 5;
+ if (len) *len = 5;
return "GRS-1";
}
return 0;
if (r->which == Z_External_sutrs)
{
- *len = r->u.sutrs->len;
+ if (len) *len = r->u.sutrs->len;
return (const char *) r->u.sutrs->buf;
}
else if (r->which == Z_External_octet)
{
- *len = r->u.octet_aligned->len;
+ if (len) *len = r->u.octet_aligned->len;
return (const char *) r->u.octet_aligned->buf;
}
else /* grs-1, explain, ... */
{
- *len = -1;
+ if (len) *len = -1;
return (const char *) npr->u.databaseRecord;
}
}
}
ZOOM_connection_exec_task (c);
}
+ if (ODR_MASK_GET(initrs->options, Z_Options_negotiationModel))
+ {
+ NMEM tmpmem = nmem_create();
+ Z_CharSetandLanguageNegotiation *p =
+ yaz_get_charneg_record(initrs->otherInfo);
+
+ if (p)
+ {
+ char *charset, *lang;
+ int selected;
+
+ yaz_get_response_charneg(tmpmem, p, &charset, &lang, &selected);
+ yaz_log(LOG_DEBUG, "Target accepted: charset - %s, language - %s, select - %d",
+ charset, lang, selected);
+
+ nmem_destroy(tmpmem);
+ }
+ }
break;
case Z_APDU_searchResponse:
handle_search_response (c, apdu->u.searchResponse);