X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zoom%2Fzoom-c.c;h=267bb2cb5a7d5f951d826a071e8727f1122fa300;hb=73453b196192a42ea0ef9c26e0a1a0cc759fd105;hp=2136dab6dc1bbf9d6fcff72bdf65ef06d7ef6f68;hpb=6361856cbc8d8ddd689ce877dfb04c939504da03;p=yaz-moved-to-github.git diff --git a/zoom/zoom-c.c b/zoom/zoom-c.c index 2136dab..267bb2c 100644 --- a/zoom/zoom-c.c +++ b/zoom/zoom-c.c @@ -1,5 +1,5 @@ /* - * $Id: zoom-c.c,v 1.26 2002-05-07 11:00:58 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" @@ -136,7 +137,8 @@ static ZOOM_record record_cache_lookup (ZOOM_resultset r, int pos, const char *elementSetName); -ZOOM_connection ZOOM_connection_create (ZOOM_options options) +ZOOM_API(ZOOM_connection) +ZOOM_connection_create (ZOOM_options options) { ZOOM_connection c = (ZOOM_connection) xmalloc (sizeof(*c)); @@ -155,6 +157,8 @@ ZOOM_connection 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; @@ -226,7 +230,8 @@ static char **set_DatabaseNames (ZOOM_connection con, ZOOM_options options, return databaseNames; } -ZOOM_connection ZOOM_connection_new (const char *host, int portnum) +ZOOM_API(ZOOM_connection) +ZOOM_connection_new (const char *host, int portnum) { ZOOM_connection c = ZOOM_connection_create (0); @@ -234,8 +239,9 @@ ZOOM_connection ZOOM_connection_new (const char *host, int portnum) return c; } -void ZOOM_connection_connect(ZOOM_connection c, - const char *host, int portnum) +ZOOM_API(void) +ZOOM_connection_connect(ZOOM_connection c, + const char *host, int portnum) { const char *val; ZOOM_task task; @@ -246,6 +252,18 @@ void 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]; @@ -270,7 +288,8 @@ void ZOOM_connection_connect(ZOOM_connection c, } } -ZOOM_query ZOOM_query_create(void) +ZOOM_API(ZOOM_query) +ZOOM_query_create(void) { ZOOM_query s = (ZOOM_query) xmalloc (sizeof(*s)); @@ -282,7 +301,8 @@ ZOOM_query ZOOM_query_create(void) return s; } -void ZOOM_query_destroy(ZOOM_query s) +ZOOM_API(void) +ZOOM_query_destroy(ZOOM_query s) { if (!s) return; @@ -296,7 +316,8 @@ void ZOOM_query_destroy(ZOOM_query s) } } -int ZOOM_query_prefix(ZOOM_query s, const char *str) +ZOOM_API(int) +ZOOM_query_prefix(ZOOM_query s, const char *str) { s->query = (Z_Query *) odr_malloc (s->odr, sizeof(*s->query)); s->query->which = Z_Query_type_1; @@ -306,7 +327,8 @@ int ZOOM_query_prefix(ZOOM_query s, const char *str) return 0; } -int ZOOM_query_sortby(ZOOM_query s, const char *criteria) +ZOOM_API(int) +ZOOM_query_sortby(ZOOM_query s, const char *criteria) { s->sort_spec = yaz_sort_spec (s->odr, criteria); if (!s->sort_spec) @@ -316,7 +338,8 @@ int ZOOM_query_sortby(ZOOM_query s, const char *criteria) static int do_write(ZOOM_connection c); -void ZOOM_connection_destroy(ZOOM_connection c) +ZOOM_API(void) +ZOOM_connection_destroy(ZOOM_connection c) { ZOOM_resultset r; if (!c) @@ -334,6 +357,8 @@ void 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); @@ -364,7 +389,8 @@ ZOOM_resultset ZOOM_resultset_create () return r; } -ZOOM_resultset ZOOM_connection_search_pqf(ZOOM_connection c, const char *q) +ZOOM_API(ZOOM_resultset) +ZOOM_connection_search_pqf(ZOOM_connection c, const char *q) { ZOOM_resultset r; ZOOM_query s = ZOOM_query_create(); @@ -376,7 +402,8 @@ ZOOM_resultset ZOOM_connection_search_pqf(ZOOM_connection c, const char *q) return r; } -ZOOM_resultset ZOOM_connection_search(ZOOM_connection c, ZOOM_query q) +ZOOM_API(ZOOM_resultset) +ZOOM_connection_search(ZOOM_connection c, ZOOM_query q) { ZOOM_resultset r = ZOOM_resultset_create (); ZOOM_task task; @@ -414,7 +441,8 @@ ZOOM_resultset ZOOM_connection_search(ZOOM_connection c, ZOOM_query q) return r; } -void ZOOM_resultset_destroy(ZOOM_resultset r) +ZOOM_API(void) +ZOOM_resultset_destroy(ZOOM_resultset r) { if (!r) return; @@ -450,7 +478,8 @@ void ZOOM_resultset_destroy(ZOOM_resultset r) } } -size_t ZOOM_resultset_size (ZOOM_resultset r) +ZOOM_API(size_t) +ZOOM_resultset_size (ZOOM_resultset r) { return r->size; } @@ -487,8 +516,9 @@ static void ZOOM_resultset_retrieve (ZOOM_resultset r, ; } -void ZOOM_resultset_records (ZOOM_resultset r, ZOOM_record *recs, - size_t start, size_t count) +ZOOM_API(void) +ZOOM_resultset_records (ZOOM_resultset r, ZOOM_record *recs, + size_t start, size_t count) { int force_present = 0; @@ -692,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); @@ -849,7 +897,8 @@ static void response_diag (ZOOM_connection c, Z_DiagRec *p) c->error = *r->condition; } -ZOOM_record ZOOM_record_clone (ZOOM_record srec) +ZOOM_API(ZOOM_record) +ZOOM_record_clone (ZOOM_record srec) { char *buf; int size; @@ -871,18 +920,21 @@ ZOOM_record ZOOM_record_clone (ZOOM_record srec) return nrec; } -ZOOM_record ZOOM_resultset_record_immediate (ZOOM_resultset s,size_t pos) +ZOOM_API(ZOOM_record) +ZOOM_resultset_record_immediate (ZOOM_resultset s,size_t pos) { return record_cache_lookup (s, pos, 0); } -ZOOM_record ZOOM_resultset_record (ZOOM_resultset r, size_t pos) +ZOOM_API(ZOOM_record) +ZOOM_resultset_record (ZOOM_resultset r, size_t pos) { ZOOM_resultset_retrieve (r, 1, pos, 1); return ZOOM_resultset_record_immediate (r, pos); } -void ZOOM_record_destroy (ZOOM_record rec) +ZOOM_API(void) +ZOOM_record_destroy (ZOOM_record rec) { if (!rec) return; @@ -892,9 +944,14 @@ void ZOOM_record_destroy (ZOOM_record rec) xfree (rec); } -const char *ZOOM_record_get (ZOOM_record rec, const char *type, int *len) +ZOOM_API(const char *) +ZOOM_record_get (ZOOM_record rec, const char *type, int *len) { Z_NamePlusRecord *npr; + + if (len) + *len = 0; /* default return */ + if (!rec) return 0; npr = rec->npr; @@ -902,6 +959,7 @@ const char *ZOOM_record_get (ZOOM_record rec, const char *type, int *len) return 0; if (!strcmp (type, "database")) { + if (len) *len = strlen(npr->databaseName)+1; return npr->databaseName; } else if (!strcmp (type, "syntax")) @@ -911,7 +969,10 @@ const char *ZOOM_record_get (ZOOM_record rec, const char *type, int *len) Z_External *r = (Z_External *) npr->u.databaseRecord; oident *ent = oid_getentbyoid(r->direct_reference); if (ent) + { + if (len) *len = strlen(ent->desc)+1; return ent->desc; + } } return "none"; } @@ -923,7 +984,7 @@ const char *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) @@ -947,16 +1008,16 @@ const char *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; @@ -969,7 +1030,7 @@ const char *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) @@ -993,16 +1054,16 @@ const char *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; @@ -1015,17 +1076,17 @@ const char *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; } } @@ -1359,7 +1420,8 @@ static int send_present (ZOOM_connection c) return 1; } -ZOOM_scanset ZOOM_connection_scan (ZOOM_connection c, const char *start) +ZOOM_API(ZOOM_scanset) +ZOOM_connection_scan (ZOOM_connection c, const char *start) { ZOOM_scanset scan = (ZOOM_scanset) xmalloc (sizeof(*scan)); @@ -1386,7 +1448,8 @@ ZOOM_scanset ZOOM_connection_scan (ZOOM_connection c, const char *start) return scan; } -void ZOOM_scanset_destroy (ZOOM_scanset scan) +ZOOM_API(void) +ZOOM_scanset_destroy (ZOOM_scanset scan) { if (!scan) return; @@ -1400,7 +1463,7 @@ void ZOOM_scanset_destroy (ZOOM_scanset scan) } } -int send_scan (ZOOM_connection c) +static int send_scan (ZOOM_connection c) { ZOOM_scanset scan; Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_scanRequest); @@ -1432,14 +1495,16 @@ int send_scan (ZOOM_connection c) return 1; } -size_t ZOOM_scanset_size (ZOOM_scanset scan) +ZOOM_API(size_t) +ZOOM_scanset_size (ZOOM_scanset scan) { if (!scan || !scan->scan_response || !scan->scan_response->entries) return 0; return scan->scan_response->entries->num_entries; } -const char *ZOOM_scanset_term (ZOOM_scanset scan, size_t pos, +ZOOM_API(const char *) +ZOOM_scanset_term (ZOOM_scanset scan, size_t pos, int *occ, int *len) { const char *term = 0; @@ -1464,12 +1529,14 @@ const char *ZOOM_scanset_term (ZOOM_scanset scan, size_t pos, return term; } -const char *ZOOM_scanset_option_get (ZOOM_scanset scan, const char *key) +ZOOM_API(const char *) +ZOOM_scanset_option_get (ZOOM_scanset scan, const char *key) { return ZOOM_options_get (scan->options, key); } -void ZOOM_scanset_option_set (ZOOM_scanset scan, const char *key, +ZOOM_API(void) +ZOOM_scanset_option_set (ZOOM_scanset scan, const char *key, const char *val) { ZOOM_options_set (scan->options, key, val); @@ -1556,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); @@ -1655,49 +1740,57 @@ static int do_write(ZOOM_connection c) } -const char *ZOOM_connection_option_get (ZOOM_connection c, const char *key) +ZOOM_API(const char *) +ZOOM_connection_option_get (ZOOM_connection c, const char *key) { return ZOOM_options_get (c->options, key); } -void ZOOM_connection_option_set (ZOOM_connection c, const char *key, +ZOOM_API(void) +ZOOM_connection_option_set (ZOOM_connection c, const char *key, const char *val) { ZOOM_options_set (c->options, key, val); } -const char *ZOOM_resultset_option_get (ZOOM_resultset r, const char *key) +ZOOM_API(const char *) +ZOOM_resultset_option_get (ZOOM_resultset r, const char *key) { return ZOOM_options_get (r->options, key); } -void ZOOM_resultset_option_set (ZOOM_resultset r, const char *key, +ZOOM_API(void) +ZOOM_resultset_option_set (ZOOM_resultset r, const char *key, const char *val) { ZOOM_options_set (r->options, key, val); } -int ZOOM_connection_errcode (ZOOM_connection c) +ZOOM_API(int) +ZOOM_connection_errcode (ZOOM_connection c) { return ZOOM_connection_error (c, 0, 0); } -const char *ZOOM_connection_errmsg (ZOOM_connection c) +ZOOM_API(const char *) +ZOOM_connection_errmsg (ZOOM_connection c) { const char *msg; ZOOM_connection_error (c, &msg, 0); return msg; } -const char *ZOOM_connection_addinfo (ZOOM_connection c) +ZOOM_API(const char *) +ZOOM_connection_addinfo (ZOOM_connection c) { const char *addinfo; ZOOM_connection_error (c, 0, &addinfo); return addinfo; } -int ZOOM_connection_error (ZOOM_connection c, const char **cp, +ZOOM_API(int) +ZOOM_connection_error (ZOOM_connection c, const char **cp, const char **addinfo) { int error = c->error; @@ -1737,7 +1830,7 @@ int ZOOM_connection_error (ZOOM_connection c, const char **cp, return c->error; } -int ZOOM_connection_do_io(ZOOM_connection c, int mask) +static int ZOOM_connection_do_io(ZOOM_connection c, int mask) { ZOOM_Event event = 0; int r = cs_look(c->cs); @@ -1790,14 +1883,16 @@ int ZOOM_connection_do_io(ZOOM_connection c, int mask) return 1; } -int ZOOM_connection_last_event(ZOOM_connection cs) +ZOOM_API(int) +ZOOM_connection_last_event(ZOOM_connection cs) { if (!cs) return ZOOM_EVENT_NONE; return cs->last_event; } -int ZOOM_event (int no, ZOOM_connection *cs) +ZOOM_API(int) +ZOOM_event (int no, ZOOM_connection *cs) { #if HAVE_SYS_POLL_H struct pollfd pollfds[1024];