X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zoom%2Fzoom-c.c;h=267bb2cb5a7d5f951d826a071e8727f1122fa300;hb=73453b196192a42ea0ef9c26e0a1a0cc759fd105;hp=61f29d6d2945a7418f4c3efdd0d8a78ec7c585ea;hpb=2af1d65a7126d623ab596d831d6bc4257d75a051;p=yaz-moved-to-github.git diff --git a/zoom/zoom-c.c b/zoom/zoom-c.c index 61f29d6..267bb2c 100644 --- a/zoom/zoom-c.c +++ b/zoom/zoom-c.c @@ -1,5 +1,5 @@ /* - * $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. */ @@ -9,6 +9,7 @@ #include #include #include +#include #include "zoom-p.h" @@ -156,6 +157,8 @@ ZOOM_connection_create (ZOOM_options options) c->host_port = 0; c->proxy = 0; + + c->charset = c->lang = 0; c->cookie_out = 0; c->cookie_in = 0; @@ -249,6 +252,18 @@ ZOOM_connection_connect(ZOOM_connection c, 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]; @@ -342,6 +357,8 @@ ZOOM_connection_destroy(ZOOM_connection c) 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); @@ -705,6 +722,24 @@ static int ZOOM_connection_send_init (ZOOM_connection 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); @@ -914,8 +949,9 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) { Z_NamePlusRecord *npr; - *len = 0; /* if return 0 */ - + if (len) + *len = 0; /* default return */ + if (!rec) return 0; npr = rec->npr; @@ -923,7 +959,7 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) 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")) @@ -934,7 +970,7 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) oident *ent = oid_getentbyoid(r->direct_reference); if (ent) { - *len = strlen(ent->desc)+1; + if (len) *len = strlen(ent->desc)+1; return ent->desc; } } @@ -948,7 +984,7 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) 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) @@ -972,16 +1008,16 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) 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; @@ -994,7 +1030,7 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) 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) @@ -1018,16 +1054,16 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) 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; @@ -1040,17 +1076,17 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) 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; } } @@ -1587,6 +1623,24 @@ static void handle_apdu (ZOOM_connection c, Z_APDU *apdu) } 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);