* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.336 2007-05-03 08:04:10 adam Exp $
+ * $Id: client.c,v 1.342 2007-05-30 21:56:59 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] = "?";
#define AVOID_MARC_DECODE 1
#define maxOtherInfosSupported 10
-struct {
- int oid[OID_SIZE];
+struct eoi {
+ Odr_oid oid[OID_SIZE];
char* value;
} extraOtherInfos[maxOtherInfosSupported];
#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");
}
}
else if (uif->which == Z_External_single)
{
- const int *oclc_oid = yaz_string_to_oid(yaz_oid_std(),
- CLASS_GENERAL,
- "OCLC-userInfo");
Odr_any *sat = uif->u.single_ASN1_type;
- if (!oid_oidcmp(uif->direct_reference, oclc_oid))
+ if (!oid_oidcmp(uif->direct_reference,
+ yaz_oid_userinfo_oclc_userinfo))
{
Z_OCLC_UserInformation *oclc_ui;
ODR decode = odr_createmem(ODR_DECODE);
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);
}
}
}
return 0;
}
*len = fsize;
- *buf = odr_malloc(out, fsize);
+ *buf = (char *) odr_malloc(out, fsize);
if (fread(*buf, 1, fsize, inf) != fsize)
{
printf("Unable to read %s\n", fname);
static void display_record(Z_External *r)
{
- const int *oid = r->direct_reference;
+ const Odr_oid *oid = r->direct_reference;
record_last = r;
/*
*/
if (oid)
{
- int oclass;
+ oid_class oclass;
char oid_name_buf[OID_STR_MAX];
const char *oid_name
= yaz_oid_to_string_buf(oid, &oclass, oid_name_buf);
}
else
{
- const int *oidsuffix = oid_oidlen(oid) > 1
- ? oid + oid_oidlen(oid)-2 : 0;
- if (
-#if AVOID_MARC_DECODE
- /* primitive check for a marc OID 5.1-29 except 16 */
- oidsuffix[0] == 5 && oidsuffix[1] < 30 && oidsuffix[1] != 16
-#else
- 1
-#endif
- )
+ if (oid && yaz_oid_is_iso2709(oid))
{
const char *result;
size_t rlen;
printf("Missing diagset\n");
else
{
- int oclass;
+ oid_class oclass;
char diag_name_buf[OID_STR_MAX];
const char *diag_name = 0;
diag_name = yaz_oid_to_string_buf
Z_GDU *gdu;
char *path = 0;
- path = odr_malloc(out, 2+strlen(databaseNames[0]));
+ path = (char *) odr_malloc(out, 2+strlen(databaseNames[0]));
*path = '/';
strcpy(path+1, databaseNames[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;
{
if (pOid != NULL)
{
- int *pInt = pOid;
+ Odr_oid *pInt = pOid;
print_level(iLevel);
printf("%s:", pTag);
}
else
{
- const int *ill_oid = yaz_string_to_oid(yaz_oid_std(),
- CLASS_GENERAL, "ISOILL-1");
r = (Z_External *) odr_malloc (out, sizeof(*r));
- r->direct_reference = odr_oiddup(out, ill_oid);
+ r->direct_reference = odr_oiddup(out, yaz_oid_general_isoill_1);
r->indirect_reference = 0;
r->descriptor = 0;
r->which = Z_External_single;
}
else
{
- const int *ill_oid = yaz_string_to_oid(yaz_oid_std(),
- CLASS_GENERAL, "ISOILL-1");
-
ill_request_buf = odr_getbuf (out, &ill_request_size, 0);
r = (Z_External *) odr_malloc (out, sizeof(*r));
- r->direct_reference = odr_oiddup(out, ill_oid);
+ r->direct_reference = odr_oiddup(out, yaz_oid_general_isoill_1);
r->indirect_reference = 0;
r->descriptor = 0;
r->which = Z_External_single;
static Z_External *create_ItemOrderExternal(const char *type, int itemno)
{
Z_External *r = (Z_External *) odr_malloc(out, sizeof(Z_External));
- const int *itemorder_oid = yaz_string_to_oid(yaz_oid_std(),
- CLASS_EXTSERV,
- "Item order");
- r->direct_reference = odr_oiddup(out, itemorder_oid);
+ r->direct_reference = odr_oiddup(out, yaz_oid_extserv_item_order);
r->indirect_reference = 0;
r->descriptor = 0;
}
else if (!strcmp(type, "xml") || !strcmp(type, "3"))
{
- const int *oid_xml = yaz_string_to_oid(yaz_oid_std(),
- CLASS_RECSYN, "xml");
const char *xml_buf =
"<itemorder>\n"
" <type>request</type>\n"
" <borrowerTicketNo> 1212 </borrowerTicketNo>\n"
"</itemorder>";
r->u.itemOrder->u.esRequest->notToKeep->itemRequest =
- z_ext_record_oid(out, oid_xml, xml_buf, strlen(xml_buf));
+ z_ext_record_oid(out, yaz_oid_recsyn_xml, xml_buf, strlen(xml_buf));
}
else
r->u.itemOrder->u.esRequest->notToKeep->itemRequest = 0;
Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest);
Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
- const int *itemorder_oid = yaz_string_to_oid(yaz_oid_std(),
- CLASS_EXTSERV,
- "Item order");
req->referenceId = set_refid (out);
- req->packageType = odr_oiddup(out, itemorder_oid);
+ req->packageType = odr_oiddup(out, yaz_oid_extserv_item_order);
req->packageName = esPackageName;
req->taskSpecificParameters = create_ItemOrderExternal(type, itemno);
Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
Z_External *r;
Z_External *record_this = 0;
- const int *oid_xml = yaz_string_to_oid(yaz_oid_std(),
- CLASS_RECSYN, "xml");
-
if (rec_buf)
- record_this = z_ext_record_oid(out, oid_xml, rec_buf, rec_len);
+ record_this = z_ext_record_oid(out, yaz_oid_recsyn_xml,
+ rec_buf, rec_len);
else
{
if (!record_last)
{
char *asn_buf = 0;
int noread = 0;
- int *oid;
+ Odr_oid *oid;
char oid_str[51];
Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest);
Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
return fres;
}
-int send_scanrequest(const char *query, int pp, int num, const char *term)
+int send_scanrequest(const char *set, const char *query,
+ int pp, int num, const char *term)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest);
Z_ScanRequest *req = apdu->u.scanRequest;
}
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 &&
req->numberOfTermsRequested = #
req->preferredPositionInResponse = &pp;
req->stepSize = odr_intdup(out, scan_stepSize);
+
+ if (set)
+ yaz_oi_set_string_oid(&req->otherInfo, out,
+ yaz_oid_userinfo_scan_set, 1, set);
+
send_apdu(apdu);
return 2;
}
return 0;
}
-int cmd_scan(const char *arg)
+static int cmd_scan_common(const char *set, const char *arg)
{
if (protocol == PROTO_HTTP)
{
if (*arg)
{
strcpy (last_scan_query, arg);
- if (send_scanrequest(arg, scan_position, scan_size, 0) < 0)
+ if (send_scanrequest(set, arg,
+ scan_position, scan_size, 0) < 0)
return 0;
}
else
{
- if (send_scanrequest(last_scan_query, 1, scan_size, last_scan_line) < 0)
+ if (send_scanrequest(set, last_scan_query,
+ 1, scan_size, last_scan_line) < 0)
return 0;
}
return 2;
}
}
+int cmd_scan(const char *arg)
+{
+ return cmd_scan_common(0, arg);
+}
+
+int cmd_setscan(const char *arg)
+{
+ char setstring[100];
+ int nor;
+ if (sscanf(arg, "%99s%n", setstring, &nor) < 1)
+ {
+ printf("missing set for setscan\n");
+ return 0;
+ }
+ return cmd_scan_common(setstring, arg + nor);
+}
+
int cmd_schema(const char *arg)
{
xfree(record_schema);
}
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);
};
char oname_str[101], oclass_str[101], oid_str[101];
int i;
- int oidclass = CLASS_GENERAL;
- int oid[OID_SIZE];
+ oid_class oidclass = CLASS_GENERAL;
+ Odr_oid oid[OID_SIZE];
if (sscanf (args, "%100[^ ] %100[^ ] %100s",
oname_str,oclass_str, oid_str) < 1) {
/* If this fails, no problem: we detect cqltrans == 0 later */
#if HAVE_READLINE_READLINE_H
- rl_attempted_completion_function = (CPPFunction*)readline_completer;
+ rl_attempted_completion_function =
+ (char **(*)(const char *, int, int)) readline_completer;
#endif
for(i = 0; i < maxOtherInfosSupported; ++i) {
extraOtherInfos[i].oid[0] = -1;
static void http_response(Z_HTTP_Response *hres)
{
int ret = -1;
- const char *content_type = z_HTTP_header_lookup(hres->headers,
- "Content-Type");
const char *connection_head = z_HTTP_header_lookup(hres->headers,
"Connection");
- if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
+ if (!yaz_srw_check_content_type(hres))
+ printf("Content type does not appear to be XML");
+ else
{
Z_SOAP *soap_package = 0;
ODR o = odr_createmem(ODR_DECODE);
soap_handlers);
if (!ret && soap_package->which == Z_SOAP_generic)
{
- Z_SRW_PDU *sr = soap_package->u.generic->p;
+ Z_SRW_PDU *sr = (Z_SRW_PDU *) soap_package->u.generic->p;
if (sr->which == Z_SRW_searchRetrieve_response)
handle_srw_response(sr->u.response);
else if (sr->which == Z_SRW_explain_response)
else
{
NMEM oid_tmp = nmem_create();
- const int *oid =
+ const Odr_oid *oid =
yaz_string_to_oid_nmem(yaz_oid_std(),
CLASS_GENERAL, oidstr, oid_tmp);
oid_oidcpy(extraOtherInfos[otherinfoNo].oid, oid);
if (extraOtherInfos[i].value)
{
char name_oid[OID_STR_MAX];
- int oclass;
+ oid_class oclass;
const char *name =
yaz_oid_to_string_buf(extraOtherInfos[i].oid, &oclass,
name_oid);
if (extraOtherInfos[i].value)
{
char name_oid[OID_STR_MAX];
- int oclass;
+ oid_class oclass;
const char *name =
yaz_oid_to_string_buf(extraOtherInfos[i].oid, &oclass,
name_oid);
i, name ? name : "null",
extraOtherInfos[i].value);
}
-
}
}
return 0;
{"delete", cmd_delete, "<setname>",NULL,0,NULL},
{"base", cmd_base, "<base-name>",NULL,0,NULL},
{"show", cmd_show, "<rec#>['+'<#recs>['+'<setname>]]",NULL,0,NULL},
+ {"setscan", cmd_setscan, "<term>",NULL,0,NULL},
{"scan", cmd_scan, "<term>",NULL,0,NULL},
{"scanstep", cmd_scanstep, "<size>",NULL,0,NULL},
{"scanpos", cmd_scanpos, "<size>",NULL,0,NULL},
{"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},