* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.340 2007-05-30 08:12:16 adam Exp $
+ * $Id: client.c,v 1.344 2007-06-03 14:59:34 adam Exp $
*/
/** \file client.c
* \brief yaz-client program
#include <yaz/diagbib1.h>
#include <yaz/otherinfo.h>
#include <yaz/charneg.h>
+#include <yaz/query-charset.h>
#include <yaz/pquery.h>
#include <yaz/sortspec.h>
static int negotiationCharsetVersion = 3;
static char *outputCharset = 0;
static char *marcCharset = 0;
+static char *queryCharset = 0;
static char* yazLang = 0;
static char last_cmd[32] = "?";
#endif
static char *command_generator(const char *text, int state);
int cmd_register_tab(const char* arg);
+int cmd_querycharset(const char *arg);
static void close_session (void);
negotiationCharsetRecords);
}
}
+ else if (ODR_MASK_GET(req->options, Z_Options_negotiationModel))
+ {
+ Z_OtherInformation **p;
+ Z_OtherInformationUnit *p0;
+
+ yaz_oi_APDU(apdu, &p);
+
+ if ((p0=yaz_oi_update(p, out, NULL, 0, 0)))
+ {
+ p0->which = Z_OtherInfo_externallyDefinedInfo;
+ p0->information.externallyDefinedInfo =
+ yaz_set_proposal_charneg(out, 0, 0, 0, 0, 0);
+ }
+
+ }
if (send_apdu(apdu))
printf("Sent initrequest.\n");
}
Z_CharSetandLanguageNegotiation *p =
yaz_get_charneg_record(res->otherInfo);
- if (p) {
-
+ if (p)
+ {
char *charset=NULL, *lang=NULL;
int selected;
yaz_get_response_charneg(session_mem, p, &charset, &lang,
&selected);
- printf("Accepted character set : %s\n", charset);
- printf("Accepted code language : %s\n", lang ? lang : "none");
+ printf("Accepted character set : %s\n", charset ? charset:"none");
+ printf("Accepted code language : %s\n", lang ? lang:"none");
printf("Accepted records in ...: %d\n", selected );
- if (outputCharset && negotiationCharset) {
+ if (outputCharset && charset)
+ {
printf("Converting between %s and %s\n",
- outputCharset, negotiationCharset);
- odr_set_charset (out, charset, outputCharset);
- odr_set_charset (in, outputCharset, charset);
+ outputCharset, charset);
+ odr_set_charset(out, charset, outputCharset);
+ odr_set_charset(in, outputCharset, charset);
+ cmd_querycharset(charset);
}
- else {
- odr_set_charset (out, 0, 0);
- odr_set_charset (in, 0, 0);
+ else
+ {
+ odr_set_charset(out, 0, 0);
+ odr_set_charset(in, 0, 0);
}
}
}
}
#endif
+static void query_charset_convert(Z_RPNQuery *q)
+{
+ if (queryCharset && outputCharset)
+ {
+ yaz_iconv_t cd = yaz_iconv_open(queryCharset, outputCharset);
+ if (!cd)
+ {
+ printf("Conversion from %s to %s unsupported\n",
+ outputCharset, queryCharset);
+ return;
+ }
+ yaz_query_charset_convert_rpnquery(q, out, cd);
+ yaz_iconv_close(cd);
+ }
+}
+
static int send_searchRequest(const char *arg)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_searchRequest);
return 0;
}
yaz_pqf_destroy (pqf_parser);
+ query_charset_convert(RPNquery);
query.u.type_1 = RPNquery;
break;
case QueryType_CCL:
printf ("Couldn't convert from CCL to RPN\n");
return 0;
}
+ query_charset_convert(RPNquery);
query.u.type_1 = RPNquery;
ccl_rpn_delete (rpn);
break;
}
yaz_pqf_destroy (pqf_parser);
}
+ if (queryCharset && outputCharset)
+ {
+ yaz_iconv_t cd = yaz_iconv_open(queryCharset, outputCharset);
+ if (!cd)
+ {
+ printf("Conversion from %s to %s unsupported\n",
+ outputCharset, queryCharset);
+ return -1;
+ }
+ yaz_query_charset_convert_apt(req->termListAndStartPoint, out, cd);
+ yaz_iconv_close(cd);
+ }
if (term && *term)
{
if (req->termListAndStartPoint->term &&
}
xfree (marcCharset);
marcCharset = 0;
- if (strcmp(l1, "-"))
+ if (strcmp(l1, "-") && strcmp(l1, "none"))
marcCharset = xstrdup(l1);
return 1;
}
+int cmd_querycharset(const char *arg)
+{
+ char l1[30];
+
+ *l1 = 0;
+ if (sscanf(arg, "%29s", l1) < 1)
+ {
+ printf("Query character set is `%s'\n",
+ queryCharset ? queryCharset: "none");
+ return 1;
+ }
+ xfree (queryCharset);
+ queryCharset = 0;
+ if (strcmp(l1, "-") && strcmp(l1, "none"))
+ queryCharset = xstrdup(l1);
+ return 1;
+}
+
int cmd_displaycharset(const char *arg)
{
char l1[30];
if (sscanf(arg, "%29s %d %d", l1, &negotiationCharsetRecords,
&negotiationCharsetVersion) < 1)
{
- printf("Current negotiation character set is `%s'\n",
+ printf("Negotiation character set `%s'\n",
negotiationCharset ? negotiationCharset: "none");
- printf("Records in charset %s\n", negotiationCharsetRecords ?
- "yes" : "no");
- printf("Charneg version %d\n", negotiationCharsetVersion);
+ if (negotiationCharset)
+ {
+ printf("Records in charset %s\n", negotiationCharsetRecords ?
+ "yes" : "no");
+ printf("Charneg version %d\n", negotiationCharsetVersion);
+ }
}
else
{
int cmd_charset(const char* arg)
{
- char l1[30], l2[30], l3[30];
+ char l1[30], l2[30], l3[30], l4[30];
- *l1 = *l2 = *l3 = 0;
- if (sscanf(arg, "%29s %29s %29s", l1, l2, l3) < 1)
+ *l1 = *l2 = *l3 = *l4 = '\0';
+ if (sscanf(arg, "%29s %29s %29s %29s", l1, l2, l3, l4) < 1)
{
cmd_negcharset("");
cmd_displaycharset("");
cmd_marccharset("");
+ cmd_querycharset("");
}
else
{
cmd_displaycharset(l2);
if (*l3)
cmd_marccharset(l3);
+ if (*l4)
+ cmd_querycharset(l4);
}
return 1;
}
int cmd_lang(const char* arg)
{
if (*arg == '\0') {
- printf("Current language is `%s'\n", (yazLang)?yazLang:NULL);
+ printf("Current language is `%s'\n", yazLang ? yazLang : "none");
return 1;
}
xfree (yazLang);
return 1;
}
-void source_rcfile(void)
+void source_rc_file(const char *rc_file)
{
- /* Look for a $HOME/.yazclientrc and source it if it exists */
+ /* If rc_file != NULL, source that. Else
+ Look for .yazclientrc and read it if it exists.
+ If it does not exist, read $HOME/.yazclientrc instead */
struct stat statbuf;
- char fname[1000];
- char* homedir = getenv("HOME");
-
- sprintf(fname, "%.500s%s%s", homedir ? homedir : "",
- homedir ? "/" : "",
- ".yazclientrc");
- if (stat(fname,&statbuf)==0)
- cmd_source(fname, 0 );
+ if (rc_file)
+ {
+ if (stat(rc_file, &statbuf) == 0)
+ cmd_source(rc_file, 0);
+ else
+ {
+ fprintf(stderr, "yaz_client: cannot source '%s'\n", rc_file);
+ exit(1);
+ }
+ }
+ else
+ {
+ char fname[1000];
+ strcpy(fname, ".yazclientrc");
+ if (stat(fname, &statbuf)==0)
+ {
+ cmd_source(fname, 0);
+ }
+ else
+ {
+ const char* homedir = getenv("HOME");
+ if (homedir)
+ {
+ sprintf(fname, "%.800s/%s", homedir, ".yazclientrc");
+ if (stat(fname, &statbuf)==0)
+ cmd_source(fname, 0);
+ }
+ }
+ }
}
void add_to_readline_history(void *client_data, const char *line)
#endif
}
-static void initialize(void)
+static void initialize(const char *rc_file)
{
FILE *inf;
int i;
cmd_format("usmarc");
- source_rcfile();
+ source_rc_file(rc_file);
file_history = file_history_new();
file_history_load(file_history);
const char *connection_head = z_HTTP_header_lookup(hres->headers,
"Connection");
if (!yaz_srw_check_content_type(hres))
- printf("Content type does not appear to be XML");
+ printf("Content type does not appear to be XML\n");
else
{
Z_SOAP *soap_package = 0;
{"negcharset", cmd_negcharset, "<nego_charset>",NULL,0,NULL},
{"displaycharset", cmd_displaycharset, "<output_charset>",NULL,0,NULL},
{"marccharset", cmd_marccharset, "<charset_name>",NULL,0,NULL},
+ {"querycharset", cmd_querycharset, "<charset_name>",NULL,0,NULL},
{"lang", cmd_lang, "<language_code>",NULL,0,NULL},
{"source", cmd_source_echo, "<filename>",NULL,1,NULL},
{".", cmd_source_echo, "<filename>",NULL,1,NULL},
char *open_command = 0;
char *auth_command = 0;
char *arg;
+ const char *rc_file = 0;
int ret;
#if HAVE_LOCALE_H
ODR_MASK_SET(&z3950_options, Z_Options_delSet);
ODR_MASK_SET(&z3950_options, Z_Options_negotiationModel);
- while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:", argv, argc, &arg)) != -2)
+ while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:f:", argv, argc, &arg)) != -2)
{
switch (ret)
{
case 'v':
yaz_log_init(yaz_log_mask_str(arg), "", 0);
break;
+ case 'f':
+ rc_file = arg;
+ break;
case 'V':
show_version();
break;
exit (1);
}
}
- initialize();
+ initialize(rc_file);
if (auth_command)
{
#ifdef HAVE_GETTIMEOFDAY