/*
- * $Id: zoom-c.c,v 1.24 2002-02-28 13:21:16 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"
#include <sys/poll.h>
#endif
+static int ZOOM_connection_send_init (ZOOM_connection c);
+
static ZOOM_Event ZOOM_Event_create (int kind)
{
ZOOM_Event event = (ZOOM_Event) xmalloc (sizeof(*event));
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));
c->host_port = 0;
c->proxy = 0;
+
+ c->charset = c->lang = 0;
c->cookie_out = 0;
c->cookie_in = 0;
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);
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;
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_query ZOOM_query_create(void)
+ZOOM_API(ZOOM_query)
+ZOOM_query_create(void)
{
ZOOM_query s = (ZOOM_query) xmalloc (sizeof(*s));
return s;
}
-void ZOOM_query_destroy(ZOOM_query s)
+ZOOM_API(void)
+ZOOM_query_destroy(ZOOM_query s)
{
if (!s)
return;
}
}
-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;
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)
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)
ZOOM_options_destroy (c->options);
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);
}
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();
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;
return r;
}
-void ZOOM_resultset_destroy(ZOOM_resultset r)
+ZOOM_API(void)
+ZOOM_resultset_destroy(ZOOM_resultset r)
{
if (!r)
return;
}
}
-size_t ZOOM_resultset_size (ZOOM_resultset r)
+ZOOM_API(size_t)
+ZOOM_resultset_size (ZOOM_resultset r)
{
return r->size;
}
;
}
-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;
{
int ret = cs_connect (c->cs, add);
yaz_log (LOG_DEBUG, "cs_connect returned %d", ret);
- if (ret >= 0)
+ if (ret == 0)
+ {
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_CONNECT);
+ ZOOM_connection_put_event(c, event);
+ ZOOM_connection_send_init(c);
+ c->state = STATE_ESTABLISHED;
+ return 1;
+ }
+ else if (ret > 0)
{
c->state = STATE_CONNECTING;
c->mask = ZOOM_SELECT_EXCEPT;
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);
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;
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;
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;
return 0;
if (!strcmp (type, "database"))
{
+ if (len) *len = strlen(npr->databaseName)+1;
return npr->databaseName;
}
else if (!strcmp (type, "syntax"))
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";
}
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;
}
}
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));
return scan;
}
-void ZOOM_scanset_destroy (ZOOM_scanset scan)
+ZOOM_API(void)
+ZOOM_scanset_destroy (ZOOM_scanset scan)
{
if (!scan)
return;
}
}
-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);
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;
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);
}
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);
}
-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;
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);
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];