X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zutil%2Fzoom-c.c;h=9ca55c1700ce488c6bdd17264b0cd2b719f31701;hb=366dc7568281c9774cd309b28c24a077604264a0;hp=b220b01658bd1dfbef316c9a806fab5f20d7379e;hpb=165b231b0f6eaa0b2b5fbf438f5ddede630b10e3;p=yaz-moved-to-github.git diff --git a/zutil/zoom-c.c b/zutil/zoom-c.c index b220b01..9ca55c1 100644 --- a/zutil/zoom-c.c +++ b/zutil/zoom-c.c @@ -1,5 +1,5 @@ /* - * $Id: zoom-c.c,v 1.2 2002-09-24 08:05:42 adam Exp $ + * $Id: zoom-c.c,v 1.9 2002-12-03 10:03:27 adam Exp $ * * ZOOM layer for C, connections, result sets, queries. */ @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -1054,18 +1055,19 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) } else if (!strcmp (type, "syntax")) { + const char *desc = 0; if (npr->which == Z_NamePlusRecord_databaseRecord) { Z_External *r = (Z_External *) npr->u.databaseRecord; oident *ent = oid_getentbyoid(r->direct_reference); if (ent) - { - if (len) - *len = strlen(ent->desc); - return ent->desc; - } + desc = ent->desc; } - return "none"; + if (!desc) + desc = "none"; + if (len) + *len = strlen(desc); + return desc; } else if (!strcmp (type, "render") && npr->which == Z_NamePlusRecord_databaseRecord) @@ -1108,13 +1110,18 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) } else if (r->which == Z_External_grs1) { - if (len) *len = 5; - return "GRS-1"; + if (!rec->wrbuf_marc) + rec->wrbuf_marc = wrbuf_alloc(); + wrbuf_rewind (rec->wrbuf_marc); + yaz_display_grs1(rec->wrbuf_marc, r->u.grs1, 0); + if (len) + *len = wrbuf_len(rec->wrbuf_marc); + return wrbuf_buf(rec->wrbuf_marc); } return 0; } - else if (!strcmp (type, "xml") && - npr->which == Z_NamePlusRecord_databaseRecord) + else if (npr->which == Z_NamePlusRecord_databaseRecord && + (!strcmp (type, "xml") || !strcmp(type, "MarcXML"))) { Z_External *r = (Z_External *) npr->u.databaseRecord; oident *ent = oid_getentbyoid(r->direct_reference); @@ -1126,6 +1133,10 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) } else if (r->which == Z_External_octet) { + int marc_decode_type = YAZ_MARC_OAIMARC; + + if (!strcmp(type, "MarcXML")) + marc_decode_type = YAZ_MARC_MARCXML; switch (ent->value) { case VAL_SOIF: @@ -1143,7 +1154,7 @@ ZOOM_record_get (ZOOM_record rec, const char *type, int *len) r->u.octet_aligned->buf, rec->wrbuf_marc, 0, r->u.octet_aligned->len, - 1) > 0) + marc_decode_type) > 0) { if (len) *len = wrbuf_len(rec->wrbuf_marc); return wrbuf_buf(rec->wrbuf_marc); @@ -2035,10 +2046,15 @@ static void handle_apdu (ZOOM_connection c, Z_APDU *apdu) int sel; yaz_get_response_charneg(tmpmem, p, &charset, &lang, &sel); - yaz_log(LOG_DEBUG, "Target accepted: charset - %s," - "language - %s, select - %d", - charset, lang, sel); - + yaz_log(LOG_DEBUG, "Target accepted: charset %s, " + "language %s, select %d", + charset ? charset : "none", lang ? lang : "none", sel); + if (charset) + ZOOM_connection_option_set (c, "negotiation-charset", + charset); + if (lang) + ZOOM_connection_option_set (c, "negotiation-lang", + lang); nmem_destroy(tmpmem); } } @@ -2172,7 +2188,6 @@ static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out) } else { - // c->reconnect_ok = 0; c->mask = ZOOM_SELECT_READ|ZOOM_SELECT_EXCEPT; yaz_log (LOG_DEBUG, "do_write_ex 2 mask=%d", c->mask); } @@ -2234,6 +2249,34 @@ ZOOM_connection_addinfo (ZOOM_connection c) return addinfo; } +ZOOM_API(const char *) +ZOOM_diag_str (int error) +{ + switch (error) + { + case ZOOM_ERROR_NONE: + return "No error"; + case ZOOM_ERROR_CONNECT: + return "Connect failed"; + case ZOOM_ERROR_MEMORY: + return "Out of memory"; + case ZOOM_ERROR_ENCODE: + return "Encoding failed"; + case ZOOM_ERROR_DECODE: + return "Decoding failed"; + case ZOOM_ERROR_CONNECTION_LOST: + return "Connection lost"; + case ZOOM_ERROR_INIT: + return "Init rejected"; + case ZOOM_ERROR_INTERNAL: + return "Internal failure"; + case ZOOM_ERROR_TIMEOUT: + return "Timeout"; + default: + return diagbib1_str (error); + } +} + ZOOM_API(int) ZOOM_connection_error (ZOOM_connection c, const char **cp, const char **addinfo) @@ -2241,29 +2284,7 @@ ZOOM_connection_error (ZOOM_connection c, const char **cp, int error = c->error; if (cp) { - switch (error) - { - case ZOOM_ERROR_NONE: - *cp = "No error"; break; - case ZOOM_ERROR_CONNECT: - *cp = "Connect failed"; break; - case ZOOM_ERROR_MEMORY: - *cp = "Out of memory"; break; - case ZOOM_ERROR_ENCODE: - *cp = "Encoding failed"; break; - case ZOOM_ERROR_DECODE: - *cp = "Decoding failed"; break; - case ZOOM_ERROR_CONNECTION_LOST: - *cp = "Connection lost"; break; - case ZOOM_ERROR_INIT: - *cp = "Init rejected"; break; - case ZOOM_ERROR_INTERNAL: - *cp = "Internal failure"; break; - case ZOOM_ERROR_TIMEOUT: - *cp = "Timeout"; break; - default: - *cp = diagbib1_str (error); - } + *cp = ZOOM_diag_str(error); } if (addinfo) {