X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=94af209f8cf91ebc01a9246f7540b25b32f6345a;hb=71664fe63983cbd1a74e22dd2f5fb75df2f57981;hp=7f25a9d1360ed29aa3e5b5a8054a66260e2f4fb3;hpb=022ffdfe3ef1fd6f868cc870c829b92f08166113;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 7f25a9d..94af209 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.282 2005-05-20 06:22:48 ja7 Exp $ + * $Id: client.c,v 1.287 2005-06-08 12:34:05 adam Exp $ */ #include @@ -104,7 +104,7 @@ static enum oid_value recordsyntax = VAL_USMARC; static char *record_schema = 0; static int sent_close = 0; static NMEM session_mem = NULL; /* memory handle for init-response */ -static Z_InitResponse *session = 0; /* session parameters */ +static Z_InitResponse *session_initResponse = 0; /* session parameters */ static char last_scan_line[512] = "0"; static char last_scan_query[512] = "0"; static char ccl_fields[512] = "default.bib"; @@ -365,7 +365,7 @@ static int process_initResponse(Z_InitResponse *res) int ver = 0; /* save session parameters for later use */ session_mem = odr_extract_mem(in); - session = res; + session_initResponse = res; for (ver = 0; ver < 8; ver++) if (!ODR_MASK_GET(res->protocolVersion, ver)) @@ -591,13 +591,14 @@ int session_connect(const char *arg) if (conn) { cs_close (conn); - conn = NULL; - if (session_mem) - { - nmem_destroy (session_mem); - session_mem = NULL; - } + conn = 0; } + if (session_mem) + { + nmem_destroy (session_mem); + session_mem = NULL; + session_initResponse = 0; + } cs_get_host_args(arg, &basep); strncpy(type_and_host, arg, sizeof(type_and_host)-1); @@ -1841,6 +1842,11 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) } } } + if (res->taskPackage && res->taskPackage->which == Z_External_octet) + { + Odr_oct *doc = res->taskPackage->u.octet_aligned; + printf("%.*s\n", doc->len, doc->buf); + } } const char *get_ill_element (void *clientData, const char *element) @@ -2246,6 +2252,29 @@ static int cmd_update_common(const char *arg, int version) return 2; } +static int cmd_xmlupdate(const char *arg) +{ + Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest); + Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest; + + Z_External *ext = (Z_External *) odr_malloc(out, sizeof(*ext)); + req->taskSpecificParameters = ext; + req->packageType = yaz_oidval_to_z3950oid(out, CLASS_EXTSERV, + VAL_XMLUPDATE); + ext->direct_reference = req->packageType; + ext->descriptor = 0; + ext->indirect_reference = 0; + + ext->which = Z_External_octet; + ext->u.single_ASN1_type = (Odr_oct *) odr_malloc (out, sizeof(Odr_oct)); + + ext->u.single_ASN1_type->buf = (unsigned char*) odr_strdup(out, arg); + ext->u.single_ASN1_type->size = ext->u.single_ASN1_type->len = strlen(arg); + send_apdu(apdu); + + return 2; +} + static int cmd_itemorder(const char *arg) { char type[12]; @@ -2283,6 +2312,8 @@ static int cmd_options(const char *arg) int r; int pos; r = yaz_init_opt_encode(&z3950_options, arg, &pos); + if (r == -1) + printf("Unknown option(s) near %s\n", arg+pos); } else { @@ -2552,11 +2583,6 @@ static void close_session (void) if (conn) cs_close (conn); conn = 0; - if (session_mem) - { - nmem_destroy (session_mem); - session_mem = NULL; - } sent_close = 0; odr_reset(out); odr_reset(in); @@ -2645,7 +2671,9 @@ int cmd_cancel(const char *arg) } if (only_z3950()) return 0; - if (!ODR_MASK_GET(session->options, Z_Options_triggerResourceCtrl)) + if (session_initResponse && + !ODR_MASK_GET(session_initResponse->options, + Z_Options_triggerResourceCtrl)) { printf("Target doesn't support cancel (trigger resource ctrl)\n"); return 0; @@ -2870,7 +2898,8 @@ int cmd_sort_generic(const char *arg, int newset) } if (only_z3950()) return 0; - if (!ODR_MASK_GET(session->options, Z_Options_sort)) + if (session_initResponse && + !ODR_MASK_GET(session_initResponse->options, Z_Options_sort)) { printf("Target doesn't support sort\n"); return 0; @@ -2951,7 +2980,8 @@ int cmd_scan(const char *arg) return 0; } } - if (!ODR_MASK_GET(session->options, Z_Options_scan)) + if (session_initResponse && + !ODR_MASK_GET(session_initResponse->options, Z_Options_scan)) { printf("Target doesn't support scan\n"); return 0; @@ -3736,7 +3766,7 @@ static void http_response(Z_HTTP_Response *hres) } #endif -void wait_and_handle_response() +void wait_and_handle_response(int one_response_only) { int reconnect_ok = 1; int res; @@ -3870,6 +3900,8 @@ void wait_and_handle_response() http_response(gdu->u.HTTP_Response); } #endif + if (one_response_only) + break; if (conn && !cs_more(conn)) break; } @@ -4117,7 +4149,7 @@ int cmd_wait_response(const char *arg) }; for( i=0 ; i < wait_for ; ++i ) { - wait_and_handle_response( ); + wait_and_handle_response(1); }; return 0; } @@ -4164,6 +4196,7 @@ static struct { {"itemorder", cmd_itemorder, "ill|item ",NULL,0,NULL}, {"update", cmd_update, " []",NULL,0,NULL}, {"update0", cmd_update0, " []",NULL,0,NULL}, + {"xmlupdate", cmd_xmlupdate, " ",NULL,0,NULL}, {"packagename", cmd_packagename, "",NULL,0,NULL}, {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0,NULL}, {"charset", cmd_charset, " ",NULL,0,NULL}, @@ -4359,7 +4392,7 @@ void process_cmd_line(char* line) if(apdu_file) fflush(apdu_file); if (res >= 2 && auto_wait) - wait_and_handle_response(); + wait_and_handle_response(0); if(apdu_file) fflush(apdu_file);