X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=ea23a86af56f9a695807e9c8b163d126210b3f9e;hb=a5a9ecf542c87afaa06315bcb389686bedae07b3;hp=4d55399e8f9c9f9e17f02930abdadeafc4adda60;hpb=fe507b6b15788a3a8e58063d9dae52532a5229a5;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 4d55399..ea23a86 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.129 2007-05-06 20:12:20 adam Exp $ + * $Id: zoom-c.c,v 1.136 2007-06-25 18:34:09 adam Exp $ */ /** * \file zoom-c.c @@ -47,9 +47,9 @@ static char *cql2pqf(ZOOM_connection c, const char *cql); * This wrapper is just for logging failed lookups. It would be nicer * if it could cause failure when a lookup fails, but that's hard. */ -static int *zoom_yaz_str_to_z3950oid(ZOOM_connection c, +static Odr_oid *zoom_yaz_str_to_z3950oid(ZOOM_connection c, int oid_class, const char *str) { - int *res = yaz_string_to_oid_odr(yaz_oid_std(), oid_class, str, + Odr_oid *res = yaz_string_to_oid_odr(yaz_oid_std(), oid_class, str, c->odr_out); if (res == 0) yaz_log(YLOG_WARN, "%p OID lookup (%d, '%s') failed", @@ -1225,7 +1225,7 @@ static void otherInfo_attach(ZOOM_connection c, Z_APDU *a, ODR out) for (i = 0; i<200; i++) { size_t len; - int *oid; + Odr_oid *oid; Z_OtherInformation **oi; char buf[80]; const char *val; @@ -1341,7 +1341,7 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.129 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.136 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = @@ -1666,9 +1666,11 @@ static zoom_ret ZOOM_connection_send_search(ZOOM_connection c) static void response_default_diag(ZOOM_connection c, Z_DefaultDiagFormat *r) { - int oclass; + char oid_name_buf[OID_STR_MAX]; + const char *oid_name; char *addinfo = 0; + oid_name = yaz_oid_to_string_buf(r->diagnosticSetId, 0, oid_name_buf); switch (r->which) { case Z_DefaultDiagFormat_v2Addinfo: @@ -1680,10 +1682,7 @@ static void response_default_diag(ZOOM_connection c, Z_DefaultDiagFormat *r) } xfree(c->addinfo); c->addinfo = 0; - set_dset_error(c, *r->condition, - yaz_oid_to_string(yaz_oid_std(), - r->diagnosticSetId, &oclass), - addinfo, 0); + set_dset_error(c, *r->condition, oid_name, addinfo, 0); } static void response_diag(ZOOM_connection c, Z_DiagRec *p) @@ -1889,7 +1888,7 @@ ZOOM_API(int) if (diag_rec->which == Z_DiagRec_defaultFormat) { Z_DefaultDiagFormat *ddf = diag_rec->u.defaultFormat; - int oclass; + oid_class oclass; error = *ddf->condition; switch (ddf->which) @@ -2003,7 +2002,7 @@ ZOOM_API(const char *) if (!strcmp(type, "render")) { Z_External *r = (Z_External *) npr->u.databaseRecord; - const int *oid = r->direct_reference; + const Odr_oid *oid = r->direct_reference; /* render bibliographic record .. */ if (r->which == Z_External_OPAC) @@ -2051,7 +2050,7 @@ ZOOM_API(const char *) else if (!strcmp(type, "xml")) { Z_External *r = (Z_External *) npr->u.databaseRecord; - const int *oid = r->direct_reference; + const Odr_oid *oid = r->direct_reference; /* render bibliographic record .. */ if (r->which == Z_External_OPAC) @@ -2887,14 +2886,12 @@ ZOOM_API(void) ZOOM_options_set(scan->options, key, val); } -static Z_APDU *create_es_package(ZOOM_package p, const int *oid) +static Z_APDU *create_es_package(ZOOM_package p, const Odr_oid *oid) { const char *str; Z_APDU *apdu = zget_APDU(p->odr_out, Z_APDU_extendedServicesRequest); Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest; - *req->function = Z_ExtendedServicesRequest_create; - str = ZOOM_options_get(p->options, "package-name"); if (str && *str) req->packageName = odr_strdup(p->odr_out, str); @@ -2909,11 +2906,24 @@ static Z_APDU *create_es_package(ZOOM_package p, const int *oid) if (str) { if (!strcmp (str, "create")) - *req->function = 1; + *req->function = Z_ExtendedServicesRequest_create; if (!strcmp (str, "delete")) - *req->function = 2; + *req->function = Z_ExtendedServicesRequest_delete; if (!strcmp (str, "modify")) - *req->function = 3; + *req->function = Z_ExtendedServicesRequest_modify; + } + + str = ZOOM_options_get(p->options, "waitAction"); + if (str) + { + if (!strcmp (str, "wait")) + *req->waitAction = Z_ExtendedServicesRequest_wait; + if (!strcmp (str, "waitIfPossible")) + *req->waitAction = Z_ExtendedServicesRequest_waitIfPossible; + if (!strcmp (str, "dontWait")) + *req->waitAction = Z_ExtendedServicesRequest_dontWait; + if (!strcmp (str, "dontReturnPackage")) + *req->waitAction = Z_ExtendedServicesRequest_dontReturnPackage; } return apdu; } @@ -3114,8 +3124,13 @@ static Z_APDU *create_update_package(ZOOM_package p) const char *recordIdNumber = ZOOM_options_get(p->options, "recordIdNumber"); const char *record_buf = ZOOM_options_get(p->options, "record"); const char *syntax_str = ZOOM_options_get(p->options, "syntax"); + + const char *correlationInfo_note = + ZOOM_options_get(p->options, "correlationInfo.note"); + const char *correlationInfo_id = + ZOOM_options_get(p->options, "correlationInfo.id"); int action_no = -1; - int *syntax_oid = 0; + Odr_oid *syntax_oid = 0; if (!syntax_str) syntax_str = "xml"; @@ -3160,6 +3175,8 @@ static Z_APDU *create_update_package(ZOOM_package p) Z_IUSuppliedRecords *notToKeep; Z_External *r = (Z_External *) odr_malloc(p->odr_out, sizeof(*r)); + const char *elementSetName = + ZOOM_options_get(p->options, "elementSetName"); apdu->u.extendedServicesRequest->taskSpecificParameters = r; @@ -3181,7 +3198,11 @@ static Z_APDU *create_update_package(ZOOM_package p) toKeep->databaseName = odr_strdup(p->odr_out, first_db); toKeep->schema = 0; + toKeep->elementSetName = 0; + if (elementSetName) + toKeep->elementSetName = odr_strdup(p->odr_out, elementSetName); + toKeep->actionQualifier = 0; toKeep->action = odr_intdup(p->odr_out, action_no); @@ -3211,7 +3232,18 @@ static Z_APDU *create_update_package(ZOOM_package p) else notToKeep->elements[0]->u.opaque = 0; notToKeep->elements[0]->supplementalId = 0; - notToKeep->elements[0]->correlationInfo = 0; + if (correlationInfo_note || correlationInfo_id) + { + Z_IUCorrelationInfo *ci; + ci = notToKeep->elements[0]->correlationInfo = + odr_malloc(p->odr_out, sizeof(*ci)); + ci->note = correlationInfo_note ? + odr_strdup(p->odr_out, correlationInfo_note) : 0; + ci->id = correlationInfo_id ? + odr_intdup(p->odr_out, atoi(correlationInfo_id)) : 0; + } + else + notToKeep->elements[0]->correlationInfo = 0; notToKeep->elements[0]->record = z_ext_record_oid(p->odr_out, syntax_oid, record_buf, strlen(record_buf)); @@ -3724,14 +3756,15 @@ static void handle_srw_response(ZOOM_connection c, static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres) { int ret = -1; - const char *content_type = z_HTTP_header_lookup(hres->headers, - "Content-Type"); + const char *addinfo = 0; const char *connection_head = z_HTTP_header_lookup(hres->headers, "Connection"); ZOOM_connection_set_mask(c, 0); yaz_log(log_details, "%p handle_http", c); - - if (content_type && !yaz_strcmp_del("text/xml", content_type, "; ")) + + if (!yaz_srw_check_content_type(hres)) + addinfo = "content-type"; + else { Z_SOAP *soap_package = 0; ODR o = c->odr_in; @@ -3766,7 +3799,7 @@ static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres) if (hres->code != 200) set_HTTP_error(c, hres->code, 0, 0); else - set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0); + set_ZOOM_error(c, ZOOM_ERROR_DECODE, addinfo); do_close(c); } ZOOM_connection_remove_task(c); @@ -4063,6 +4096,8 @@ static void ZOOM_connection_do_io(ZOOM_connection c, int mask) if (c->cs->io_pending & CS_WANT_READ) mask += ZOOM_SELECT_READ; ZOOM_connection_set_mask(c, mask); + event = ZOOM_Event_create(ZOOM_EVENT_NONE); + ZOOM_connection_put_event(c, event); } else if (ret == 0) {