to ODR to reflect new name parameter.
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-ir-assoc.h,v $
- * Revision 1.5 1999-04-09 11:47:23 adam
- * Added object Yaz_Z_Assoc. Much more functional client.
- *
+ * $Id: yaz-ir-assoc.h,v 1.6 1999-04-20 10:30:05 adam Exp $
*/
#include <yaz-z-assoc.h>
void set_lastReceived(int lastReceived);
/// OtherInformation
- Z_OtherInformationUnit *set_otherInformation(
- Z_OtherInformation **otherInformationP, int *oid,
- int categoryValue);
void set_otherInformationString (Z_OtherInformation **otherInformationP,
int *oid, int categoryValue,
const char *str);
-
+ void set_otherInformationString (
+ Z_OtherInformation **otherInformation,
+ int oidval, int categoryValue,
+ const char *str);
/// Settings
void set_proxy(const char *str);
const char *get_proxy();
const char *get_host();
+ void set_cookie(const char *str);
+ const char *get_cookie();
+
/// Send Services
int send_initRequest();
int send_searchRequest(Yaz_Z_Query *query);
private:
char *m_proxy;
char *m_host;
+ char *m_cookie;
int m_num_databaseNames;
char **m_databaseNames;
int m_preferredRecordSyntax;
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-pdu-assoc.h,v $
- * Revision 1.4 1999-03-23 14:17:57 adam
- * More work on timeout handling. Work on yaz-client.
- *
- * Revision 1.3 1999/02/02 14:01:13 adam
- * First WIN32 port of YAZ++.
- *
- * Revision 1.2 1999/01/28 13:08:40 adam
- * Yaz_PDU_Assoc better encapsulated. Memory leak fix in
- * yaz-socket-manager.cc.
- *
- * Revision 1.1.1.1 1999/01/28 09:41:07 adam
- * First implementation of YAZ++.
- *
+ * $Id: yaz-pdu-assoc.h,v 1.5 1999-04-20 10:30:05 adam Exp $
*/
#include <comstack.h>
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-pdu-observer.h,v $
- * Revision 1.5 1999-04-09 11:47:23 adam
- * Added object Yaz_Z_Assoc. Much more functional client.
- *
- * Revision 1.4 1999/03/23 14:17:57 adam
- * More work on timeout handling. Work on yaz-client.
- *
- * Revision 1.3 1999/02/02 14:01:14 adam
- * First WIN32 port of YAZ++.
- *
- * Revision 1.2 1999/01/28 13:08:41 adam
- * Yaz_PDU_Assoc better encapsulated. Memory leak fix in
- * yaz-socket-manager.cc.
- *
- * Revision 1.1.1.1 1999/01/28 09:41:07 adam
- * First implementation of YAZ++.
- *
+ * $Id: yaz-pdu-observer.h,v 1.6 1999-04-20 10:30:05 adam Exp $
*/
#ifndef YAZ_PDU_OBSERVER_H
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-proxy.h,v $
- * Revision 1.3 1999-04-09 11:47:23 adam
- * Added object Yaz_Z_Assoc. Much more functional client.
- *
- * Revision 1.2 1999/02/02 14:01:15 adam
- * First WIN32 port of YAZ++.
- *
- * Revision 1.1.1.1 1999/01/28 09:41:07 adam
- * First implementation of YAZ++.
- *
- *
+ * $Id: yaz-proxy.h,v 1.4 1999-04-20 10:30:05 adam Exp $
*/
#include <yaz-z-assoc.h>
IYaz_PDU_Observer* clone(IYaz_PDU_Observable *the_PDU_Observable);
Yaz_Proxy *m_server;
void failNotify();
-};
-
-/// Private class
-class YAZ_EXPORT Yaz_ProxyMap {
- friend Yaz_Proxy;
- char *m_databaseName; /* from database name */
- char *m_ZURL; /* to this address */
- Yaz_ProxyMap *m_next;
+ char *m_cookie;
+ Yaz_ProxyClient *m_next;
};
/// Information Retrieval Proxy Server.
void recv_Z_PDU(Z_APDU *apdu);
IYaz_PDU_Observer* clone(IYaz_PDU_Observable *the_PDU_Observable);
void failNotify();
+ private:
+ char *get_cookie(Z_OtherInformation **otherInfo);
+ char *get_proxy(Z_OtherInformation **otherInfo);
+
Yaz_ProxyClient *m_client;
IYaz_PDU_Observable *m_PDU_Observable;
- private:
- Yaz_ProxyMap *m_maps;
};
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-query.h,v $
- * Revision 1.1 1999-03-23 14:17:57 adam
- * More work on timeout handling. Work on yaz-client.
- *
+ * $Id: yaz-query.h,v 1.2 1999-04-20 10:30:05 adam Exp $
*/
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-socket-manager.h,v $
- * Revision 1.3 1999-03-23 14:17:57 adam
- * More work on timeout handling. Work on yaz-client.
- *
- * Revision 1.2 1999/02/02 14:01:16 adam
- * First WIN32 port of YAZ++.
- *
- * Revision 1.1.1.1 1999/01/28 09:41:07 adam
- * First implementation of YAZ++.
- *
+ * $Id: yaz-socket-manager.h,v 1.4 1999-04-20 10:30:05 adam Exp $
*/
#include <yaz-socket-observer.h>
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-socket-observer.h,v $
- * Revision 1.3 1999-03-23 14:17:57 adam
- * More work on timeout handling. Work on yaz-client.
- *
- * Revision 1.2 1999/02/02 14:01:17 adam
- * First WIN32 port of YAZ++.
- *
- * Revision 1.1.1.1 1999/01/28 09:41:07 adam
- * First implementation of YAZ++.
- *
+ * $Id: yaz-socket-observer.h,v 1.4 1999-04-20 10:30:05 adam Exp $
*/
#ifndef YAZ_SOCKET_OBSERVER_H
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-z-assoc.h,v $
- * Revision 1.1 1999-04-09 11:47:23 adam
- * Added object Yaz_Z_Assoc. Much more functional client.
- *
+ * $Id: yaz-z-assoc.h,v 1.2 1999-04-20 10:30:05 adam Exp $
*/
#include <proto.h>
Z_APDU *create_Z_PDU(int type);
/// Request Alloc
ODR odr_encode ();
+ ODR odr_decode ();
+ ODR odr_print ();
+ /// OtherInformation
+ Z_OtherInformationUnit *update_otherInformation (
+ Z_OtherInformation **otherInformationP, int createFlag,
+ int *oid, int categoryValue);
private:
static int yaz_init_flag;
static int yaz_init_func();
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: yaz-z-query.h,v $
- * Revision 1.2 1999-04-09 11:47:23 adam
- * Added object Yaz_Z_Assoc. Much more functional client.
- *
- * Revision 1.1 1999/03/23 14:17:57 adam
- * More work on timeout handling. Work on yaz-client.
- *
+ * $Id: yaz-z-query.h,v 1.3 1999-04-20 10:30:05 adam Exp $
*/
#include <proto.h>
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: yaz-client.cpp,v $
- * Revision 1.5 1999-04-09 11:46:57 adam
+ * Revision 1.6 1999-04-20 10:30:05 adam
+ * Implemented various stuff for client and proxy. Updated calls
+ * to ODR to reflect new name parameter.
+ *
+ * Revision 1.5 1999/04/09 11:46:57 adam
* Added object Yaz_Z_Assoc. Much more functional client.
*
* Revision 1.4 1999/03/23 14:17:57 adam
#include <log.h>
#include <options.h>
+#include <diagbib1.h>
#include <yaz-ir-assoc.h>
#include <yaz-pdu-assoc.h>
#include <yaz-socket-manager.h>
int m_interactive_flag;
char m_thisCommand[1024];
char m_lastCommand[1024];
+ int m_setOffset;
Yaz_SocketManager *m_socketManager;
public:
MyClient(IYaz_PDU_Observable *the_PDU_Observable,
int wait();
void recv_initResponse(Z_InitResponse *initResponse);
void recv_searchResponse(Z_SearchResponse *searchResponse);
+ void recv_presentResponse(Z_PresentResponse *presentResponse);
+ void recv_records (Z_Records *records);
+ void recv_diagrecs(Z_DiagRec **pp, int num);
+ void recv_namePlusRecord (Z_NamePlusRecord *zpr, int offset);
+ void recv_record(Z_DatabaseRecord *record, int offset,
+ const char *databaseName);
+ void recv_textRecord(int type, const char *buf, size_t len);
+ void recv_genericRecord(Z_GenericRecord *r);
+ void display_genericRecord(Z_GenericRecord *r, int level);
+ void display_variant(Z_Variant *v, int level);
int processCommand(const char *cmd);
const char *MyClient::getCommand();
int cmd_open(char *host);
int cmd_quit(char *args);
int cmd_close(char *args);
int cmd_find(char *args);
+ int cmd_show(char *args);
+ int cmd_cookie(char *args);
};
IYaz_PDU_Observer *MyClient::clone(IYaz_PDU_Observable *the_PDU_Observable)
-{
+{
return new MyClient(the_PDU_Observable, m_socketManager);
}
Yaz_SocketManager *the_socketManager) :
Yaz_IR_Assoc (the_PDU_Observable)
{
+ m_setOffset = 1;
m_interactive_flag = 1;
m_thisCommand[0] = '\0';
m_lastCommand[0] = '\0';
printf ("Fail\n");
}
+void MyClient::recv_diagrecs(Z_DiagRec **pp, int num)
+{
+ int i;
+ oident *ent;
+ Z_DefaultDiagFormat *r;
+
+ printf("Diagnostic message(s) from database:\n");
+ for (i = 0; i<num; i++)
+ {
+ Z_DiagRec *p = pp[i];
+ if (p->which != Z_DiagRec_defaultFormat)
+ {
+ printf("Diagnostic record not in default format.\n");
+ return;
+ }
+ else
+ r = p->u.defaultFormat;
+ if (!(ent = oid_getentbyoid(r->diagnosticSetId)) ||
+ ent->oclass != CLASS_DIAGSET || ent->value != VAL_BIB1)
+ printf("Missing or unknown diagset\n");
+ printf(" [%d] %s", *r->condition, diagbib1_str(*r->condition));
+#ifdef ASN_COMPILED
+ switch (r->which)
+ {
+ case Z_DefaultDiagFormat_v2Addinfo:
+ printf (" -- v2 addinfo '%s'\n", r->u.v2Addinfo);
+ break;
+ case Z_DefaultDiagFormat_v3Addinfo:
+ printf (" -- v3 addinfo '%s'\n", r->u.v3Addinfo);
+ break;
+ }
+#else
+ if (r->addinfo && *r->addinfo)
+ printf(" -- '%s'\n", r->addinfo);
+ else
+ printf("\n");
+#endif
+ }
+}
+
+void MyClient::recv_textRecord(int type, const char *buf, size_t len)
+{
+ fwrite (buf, 1, len, stdout);
+ fputc ('\n', stdout);
+}
+
+void MyClient::display_variant(Z_Variant *v, int level)
+{
+ int i;
+
+ for (i = 0; i < v->num_triples; i++)
+ {
+ printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->zclass,
+ *v->triples[i]->type);
+ if (v->triples[i]->which == Z_Triple_internationalString)
+ printf(",value=%s\n", v->triples[i]->value.internationalString);
+ else
+ printf("\n");
+ }
+}
+
+void MyClient::display_genericRecord(Z_GenericRecord *r, int level)
+{
+ int i;
+
+ if (!r)
+ return;
+ for (i = 0; i < r->num_elements; i++)
+ {
+ Z_TaggedElement *t;
+
+ printf("%*s", level * 4, "");
+ t = r->elements[i];
+ printf("(");
+ if (t->tagType)
+ printf("%d,", *t->tagType);
+ else
+ printf("?,");
+ if (t->tagValue->which == Z_StringOrNumeric_numeric)
+ printf("%d) ", *t->tagValue->u.numeric);
+ else
+ printf("%s) ", t->tagValue->u.string);
+ if (t->content->which == Z_ElementData_subtree)
+ {
+ printf("\n");
+ display_genericRecord(t->content->u.subtree, level+1);
+ }
+ else if (t->content->which == Z_ElementData_string)
+ printf("%s\n", t->content->u.string);
+ else if (t->content->which == Z_ElementData_numeric)
+ printf("%d\n", *t->content->u.numeric);
+ else if (t->content->which == Z_ElementData_oid)
+ {
+ int *ip = t->content->u.oid;
+ oident *oent;
+
+ if ((oent = oid_getentbyoid(t->content->u.oid)))
+ printf("OID: %s\n", oent->desc);
+ else
+ {
+ printf("{");
+ while (ip && *ip >= 0)
+ printf(" %d", *(ip++));
+ printf(" }\n");
+ }
+ }
+ else if (t->content->which == Z_ElementData_noDataRequested)
+ printf("[No data requested]\n");
+ else if (t->content->which == Z_ElementData_elementEmpty)
+ printf("[Element empty]\n");
+ else if (t->content->which == Z_ElementData_elementNotThere)
+ printf("[Element not there]\n");
+ else
+ printf("??????\n");
+ if (t->appliedVariant)
+ display_variant(t->appliedVariant, level+1);
+ if (t->metaData && t->metaData->supportedVariants)
+ {
+ int c;
+
+ printf("%*s---- variant list\n", (level+1)*4, "");
+ for (c = 0; c < t->metaData->num_supportedVariants; c++)
+ {
+ printf("%*svariant #%d\n", (level+1)*4, "", c);
+ display_variant(t->metaData->supportedVariants[c], level + 2);
+ }
+ }
+ }
+}
+
+void MyClient::recv_genericRecord(Z_GenericRecord *r)
+{
+ display_genericRecord(r, 0);
+}
+
+void MyClient::recv_record(Z_DatabaseRecord *record, int offset,
+ const char *databaseName)
+{
+ Z_External *r = (Z_External*) record;
+ oident *ent = oid_getentbyoid(r->direct_reference);
+
+ /*
+ * Tell the user what we got.
+ */
+ if (r->direct_reference)
+ {
+ printf("Record type: ");
+ if (ent)
+ printf("%s\n", ent->desc);
+ }
+ /* Check if this is a known, ASN.1 type tucked away in an octet string */
+ Z_ext_typeent *etype = z_ext_getentbyref(ent->value);
+ if (ent && (r->which == Z_External_octet || r->which == Z_External_single)
+ && (etype = z_ext_getentbyref(ent->value)))
+
+ {
+ void *rr;
+ /*
+ * Call the given decoder to process the record.
+ */
+ odr_setbuf(odr_decode(), (char*)record->u.octet_aligned->buf,
+ record->u.octet_aligned->len, 0);
+ if (!(*etype->fun)(odr_decode(), (char **)&rr, 0, 0))
+ {
+ odr_perror(odr_decode(), "Decoding constructed record.");
+ fprintf(stderr, "[Near %d]\n", odr_offset(odr_decode()));
+ fprintf(stderr, "Packet dump:\n---------\n");
+ odr_dumpBER(stderr, (char*)record->u.octet_aligned->buf,
+ record->u.octet_aligned->len);
+ fprintf(stderr, "---------\n");
+ }
+ if (etype->what == Z_External_sutrs)
+ {
+ Z_SUTRS *sutrs = (Z_SUTRS *) rr;
+ recv_textRecord ((int) VAL_SUTRS, (const char *) sutrs->buf,
+ (size_t) sutrs->len);
+ }
+ return;
+ }
+ if (r->which == Z_External_octet && record->u.octet_aligned->len)
+ {
+ recv_textRecord((int) ent->value,
+ (const char *) record->u.octet_aligned->buf,
+ (size_t) record->u.octet_aligned->len);
+ }
+ else if (ent && ent->value == VAL_SUTRS && r->which == Z_External_sutrs)
+ recv_textRecord((int) VAL_SUTRS, (const char *) r->u.sutrs->buf,
+ (size_t) r->u.sutrs->len);
+ else if (ent && ent->value == VAL_GRS1 && r->which == Z_External_grs1)
+ recv_genericRecord(r->u.grs1);
+ else
+ {
+ printf("Unknown record representation.\n");
+ if (!z_External(odr_print(), &r, 0))
+ {
+ odr_perror(odr_print(), "Printing external");
+ odr_reset(odr_print());
+ }
+ }
+}
+
+void MyClient::recv_namePlusRecord (Z_NamePlusRecord *zpr, int offset)
+{
+ if (zpr->databaseName)
+ printf("[%s]", zpr->databaseName);
+ if (zpr->which == Z_NamePlusRecord_surrogateDiagnostic)
+ recv_diagrecs(&zpr->u.surrogateDiagnostic, 1);
+ else
+ recv_record(zpr->u.databaseRecord, offset, zpr->databaseName);
+}
+
+void MyClient::recv_records (Z_Records *records)
+{
+ Z_DiagRec dr, *dr_p = &dr;
+ int i;
+ switch (records->which)
+ {
+ case Z_Records_DBOSD:
+ for (i = 0; i < records->u.databaseOrSurDiagnostics->num_records; i++)
+ recv_namePlusRecord(records->u.databaseOrSurDiagnostics->
+ records[i], i + m_setOffset);
+ m_setOffset += records->u.databaseOrSurDiagnostics->num_records;
+ break;
+ case Z_Records_NSD:
+#ifdef ASN_COMPILED
+ dr.which = Z_DiagRec_defaultFormat;
+ dr.u.defaultFormat = records->u.nonSurrogateDiagnostic;
+ recv_diagrecs (&dr_p, 1);
+#else
+ recv_diagrecs (&records->u.nonSurrogateDiagnostic, 1);
+#endif
+ break;
+ case Z_Records_multipleNSD:
+ recv_diagrecs (records->u.multipleNonSurDiagnostics->diagRecs,
+ records->u.multipleNonSurDiagnostics->num_diagRecs);
+ break;
+ }
+}
+
void MyClient::recv_searchResponse(Z_SearchResponse *searchResponse)
{
printf ("Got SearchResponse. Status ");
}
printf ("Ok\n");
printf ("Hits: %d\n", *searchResponse->resultCount);
+ if (searchResponse->records)
+ recv_records (searchResponse->records);
+}
+
+void MyClient::recv_presentResponse(Z_PresentResponse *presentResponse)
+{
+ printf ("Got PresentResponse\n");
+ recv_records (presentResponse->records);
}
int MyClient::wait()
return 1;
}
+int MyClient::cmd_show(char *args)
+{
+ int start = m_setOffset, number = 1;
+
+ sscanf (args, "%d %d", &start, &number);
+ if (send_presentRequest(start, number) >= 0)
+ wait();
+ return 1;
+}
+
+int MyClient::cmd_cookie(char *args)
+{
+ set_cookie(args);
+ return 1;
+}
+
int MyClient::processCommand(const char *commandLine)
{
char cmdStr[1024], cmdArgs[1024];
int (MyClient::*fun)(char *arg);
char *ad;
} cmd[] = {
- {"open", &cmd_open, "('tcp'|'osi')':'[<tsel>'/']<host>[':'<port>]"},
+ {"open", &cmd_open, "<host>[':'<port>][/<database>]"},
{"quit", &cmd_quit, ""},
{"close", &cmd_close, ""},
- {"find", &cmd_find, ""},
+ {"find", &cmd_find, "<query>"},
+ {"show", &cmd_show, "[<start> [<number>]]"},
+ {"cookie", &cmd_cookie, "<cookie>"},
{0,0,0}
};
*cp = '\0';
cp = m_thisCommand;
// Remove leading spaces...
- while (strchr ("\t \n", *cp))
+ while (*cp && strchr ("\t \n", *cp))
cp++;
// Save command if non-empty
if (*cp != '\0')
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: yaz-ir-assoc.cpp,v $
- * Revision 1.5 1999-04-09 11:46:57 adam
- * Added object Yaz_Z_Assoc. Much more functional client.
+ * Revision 1.6 1999-04-20 10:30:05 adam
+ * Implemented various stuff for client and proxy. Updated calls
+ * to ODR to reflect new name parameter.
*
+ * Revision 1.5 1999/04/09 11:46:57 adam
+ * Added object Yaz_Z_Assoc. Much more functional client.
*/
#include <assert.h>
m_lastReceived = 0;
m_host = 0;
m_proxy = 0;
-
+ m_cookie = 0;
const char *db = "Default";
set_databaseNames(1, &db);
}
{
if (m_elementSetNames)
delete [] m_elementSetNames->u.generic;
- delete m_elementSetNames;
+ delete [] m_elementSetNames;
+ delete [] m_host;
+ delete [] m_proxy;
+ delete [] m_cookie;
}
void Yaz_IR_Assoc::get_databaseNames (int *num, char ***list)
void Yaz_IR_Assoc::set_otherInformationString (
Z_OtherInformation **otherInformation,
+ int oidval, int categoryValue,
+ const char *str)
+{
+ int oid[OID_SIZE];
+ struct oident ent;
+ ent.proto = PROTO_Z3950;
+ ent.oclass = CLASS_USERINFO;
+ ent.value = (oid_value) oidval;
+ if (!oid_ent_to_oid (&ent, oid))
+ return ;
+ set_otherInformationString(otherInformation, oid, categoryValue, str);
+}
+
+void Yaz_IR_Assoc::set_otherInformationString (
+ Z_OtherInformation **otherInformation,
int *oid, int categoryValue,
const char *str)
{
Z_OtherInformationUnit *oi =
- set_otherInformation(otherInformation, oid, categoryValue);
+ update_otherInformation(otherInformation, 1, oid, categoryValue);
if (!oi)
return;
oi->information.characterInfo = odr_strdup (odr_encode(), str);
}
-Z_OtherInformationUnit *Yaz_IR_Assoc::set_otherInformation (
- Z_OtherInformation **otherInformationP,
- int *oid, int categoryValue)
-{
- int i;
- Z_OtherInformation *otherInformation = *otherInformationP;
- if (!otherInformation)
- {
- otherInformation = *otherInformationP = (Z_OtherInformation *)
- odr_malloc (odr_encode(), sizeof(*otherInformation));
- otherInformation->num_elements = 0;
- otherInformation->list = (Z_OtherInformationUnit **)
- odr_malloc (odr_encode(), 8*sizeof(*otherInformation));
- for (i = 0; i<8; i++)
- otherInformation->list[i] = 0;
- }
- for (i = 0; i<otherInformation->num_elements; i++)
- {
- assert (otherInformation->list[i]);
- if (!oid)
- {
- if (!otherInformation->list[i]->category)
- return otherInformation->list[i];
- }
- else
- {
- if (otherInformation->list[i]->category &&
- categoryValue ==
- *otherInformation->list[i]->category->categoryValue &&
- !oid_oidcmp (oid, otherInformation->list[i]->category->
- categoryTypeId))
- return otherInformation->list[i];
- }
- }
- otherInformation->list[i] = (Z_OtherInformationUnit*)
- odr_malloc (odr_encode(), sizeof(Z_OtherInformationUnit));
- if (oid)
- {
- otherInformation->list[i]->category = (Z_InfoCategory*)
- odr_malloc (odr_encode(), sizeof(Z_InfoCategory));
- otherInformation->list[i]->category->categoryTypeId = (int*)
- odr_oiddup (odr_encode(), oid);
- otherInformation->list[i]->category->categoryValue = (int*)
- odr_malloc (odr_encode(), sizeof(int));
- *otherInformation->list[i]->category->categoryValue =
- categoryValue;
- }
- else
- otherInformation->list[i]->category = 0;
- otherInformation->list[i]->which = Z_OtherInfo_characterInfo;
- otherInformation->list[i]->information.characterInfo = 0;
-
- otherInformation->num_elements = i+1;
- return otherInformation->list[i];
-}
-
void Yaz_IR_Assoc::recv_Z_PDU(Z_APDU *apdu)
{
logf (LOG_LOG, "recv_Z_PDU");
if (!req->query)
return -1;
get_databaseNames (&req->num_databaseNames, &req->databaseNames);
- for (int i = 0; i<req->num_databaseNames; i++)
- logf (LOG_LOG, "Database %s", req->databaseNames[i]);
int oid_syntax[OID_SIZE];
oident prefsyn;
get_preferredRecordSyntax(&recordSyntax);
req->preferredRecordSyntax = oid_syntax;
}
logf (LOG_LOG, "send_searchRequest");
+ assert (req->otherInfo == 0);
+ if (m_cookie)
+ set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie);
return send_Z_PDU(apdu);
}
compo.which = Z_RecordComp_simple;
compo.u.simple = elementSetNames;
}
+ if (m_cookie)
+ set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie);
return send_Z_PDU(apdu);
}
strcpy (m_proxy, str);
}
+void Yaz_IR_Assoc::set_cookie(const char *str)
+{
+ delete m_cookie;
+ m_cookie = new char[strlen(str)+1];
+ strcpy(m_cookie, str);
+}
+
+const char *Yaz_IR_Assoc::get_cookie()
+{
+ return m_cookie;
+}
+
void Yaz_IR_Assoc::client(const char *addr)
{
delete [] m_host;
int Yaz_IR_Assoc::send_initRequest()
{
-
Z_APDU *apdu = create_Z_PDU(Z_APDU_initRequest);
Z_InitRequest *req = apdu->u.initRequest;
ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
if (m_proxy && m_host)
- {
- int oid[OID_SIZE];
- struct oident ent;
- ent.proto = PROTO_Z3950;
- ent.oclass = CLASS_USERINFO;
- ent.value = VAL_PROXY;
- oid_ent_to_oid (&ent, oid);
- logf (LOG_LOG, "proxy host %s", m_host);
- set_otherInformationString(&req->otherInfo, oid, 1, m_host);
- }
+ set_otherInformationString(&req->otherInfo, VAL_PROXY, 1, m_host);
+ if (m_cookie)
+ set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie);
return send_Z_PDU(apdu);
}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: yaz-pdu-assoc.cpp,v $
- * Revision 1.5 1999-04-09 11:46:57 adam
+ * Revision 1.6 1999-04-20 10:30:05 adam
+ * Implemented various stuff for client and proxy. Updated calls
+ * to ODR to reflect new name parameter.
+ *
+ * Revision 1.5 1999/04/09 11:46:57 adam
* Added object Yaz_Z_Assoc. Much more functional client.
*
* Revision 1.4 1999/03/23 14:17:57 adam
m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_READ|
YAZ_SOCKET_OBSERVE_EXCEPT|
YAZ_SOCKET_OBSERVE_WRITE);
- logf (LOG_LOG, "flush_PDU put %d bytes (incomplete write)", q->m_len);
+ logf (LOG_LOG, "Yaz_PDU_Assoc::flush_PDU put %d bytes (incomplete)",
+ q->m_len);
return r;
}
- logf (LOG_LOG, "flush_PDU put %d bytes fd=%d", q->m_len, cs_fileno(m_cs));
+ logf (LOG_LOG, "Yaz_PDU_Assoc::flush_PDU put %d bytes", q->m_len);
// whole packet sent... delete this and proceed to next ...
m_queue_out = q->m_next;
delete q;
if (!m_cs)
{
- logf (LOG_LOG, "send_PDU failed, m_cs == 0");
+ logf (LOG_LOG, "Yaz_PDU_Assoc::send_PDU failed, m_cs == 0");
return 0;
}
while (*pq)
if (is_idle)
return flush_PDU ();
else
- logf (LOG_LOG, "cannot send_PDU fd=%d", cs_fileno(m_cs));
+ logf (LOG_LOG, "Yaz_PDU_Assoc::cannot send_PDU fd=%d",
+ cs_fileno(m_cs));
return 0;
}
int res = cs_connect (cs, ap);
if (res < 0)
{
- logf (LOG_DEBUG, "Yaz_PDU_Assoc::connect failed");
+ logf (LOG_LOG, "Yaz_PDU_Assoc::connect failed");
+#if 1
+ logf (LOG_LOG, "Yaz_PDU_Assoc::connect fd=%d", cs_fileno(cs));
+ m_socketObservable->addObserver(cs_fileno(cs), this);
+ m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_READ|
+ YAZ_SOCKET_OBSERVE_EXCEPT|
+ YAZ_SOCKET_OBSERVE_WRITE);
+ m_state = Connecting;
+#else
close ();
+#endif
}
else
{
YAZ_SOCKET_OBSERVE_WRITE);
if (res == 1)
{
- logf (LOG_LOG, "Connect pending");
+ logf (LOG_LOG, "Yaz_PDU_Assoc::connect pending");
m_state = Connecting;
}
else
{
- logf (LOG_LOG, "Connect complete");
+ logf (LOG_LOG, "Yaz_PDU_Assoc::Connect complete");
m_state = Connected;
}
}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: yaz-proxy.cpp,v $
- * Revision 1.3 1999-04-09 11:46:57 adam
+ * Revision 1.4 1999-04-20 10:30:05 adam
+ * Implemented various stuff for client and proxy. Updated calls
+ * to ODR to reflect new name parameter.
+ *
+ * Revision 1.3 1999/04/09 11:46:57 adam
* Added object Yaz_Z_Assoc. Much more functional client.
*
* Revision 1.2 1999/01/28 13:08:46 adam
Yaz_Z_Assoc(the_PDU_Observable)
{
m_PDU_Observable = the_PDU_Observable;
- m_maps = 0;
m_client = 0;
}
return new Yaz_Proxy(the_PDU_Observable);
}
+char *Yaz_Proxy::get_cookie(Z_OtherInformation **otherInfo)
+{
+ int oid[OID_SIZE];
+ Z_OtherInformationUnit *oi;
+ struct oident ent;
+ ent.proto = PROTO_Z3950;
+ ent.oclass = CLASS_USERINFO;
+ ent.value = (oid_value) VAL_COOKIE;
+ if (oid_ent_to_oid (&ent, oid) &&
+ (oi = update_otherInformation(otherInfo, 0, oid, 1)) &&
+ oi->which == Z_OtherInfo_characterInfo)
+ return oi->information.characterInfo;
+ return 0;
+}
+
+char *Yaz_Proxy::get_proxy(Z_OtherInformation **otherInfo)
+{
+ int oid[OID_SIZE];
+ Z_OtherInformationUnit *oi;
+ struct oident ent;
+ ent.proto = PROTO_Z3950;
+ ent.oclass = CLASS_USERINFO;
+ ent.value = (oid_value) VAL_PROXY;
+ if (oid_ent_to_oid (&ent, oid) &&
+ (oi = update_otherInformation(otherInfo, 0, oid, 1)) &&
+ oi->which == Z_OtherInfo_characterInfo)
+ return oi->information.characterInfo;
+ return 0;
+}
+
void Yaz_Proxy::recv_Z_PDU(Z_APDU *apdu)
{
if (apdu->which == Z_APDU_initRequest)
logf (LOG_LOG, "got InitRequest");
m_client = new Yaz_ProxyClient(m_PDU_Observable->clone());
m_client->m_server = this;
- m_client->client("localhost:8888");
+
+ char *proxy_host = get_cookie(&apdu->u.initRequest->otherInfo);
+ if (proxy_host)
+ m_client->client(proxy_host);
+ else
+ m_client->client("localhost:8888");
}
assert (m_client);
logf (LOG_LOG, "sending PDU");
Yaz_ProxyClient::Yaz_ProxyClient(IYaz_PDU_Observable *the_PDU_Observable) :
Yaz_Z_Assoc (the_PDU_Observable)
{
-
+ m_cookie = 0;
+ m_next = 0;
}
void Yaz_ProxyClient::recv_Z_PDU(Z_APDU *apdu)
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: yaz-z-assoc.cpp,v $
- * Revision 1.1 1999-04-09 11:46:57 adam
+ * Revision 1.2 1999-04-20 10:30:05 adam
+ * Implemented various stuff for client and proxy. Updated calls
+ * to ODR to reflect new name parameter.
+ *
+ * Revision 1.1 1999/04/09 11:46:57 adam
* Added object Yaz_Z_Assoc. Much more functional client.
*
*/
+#include <assert.h>
+
#include <log.h>
#include <yaz-z-assoc.h>
odr_reset (m_odr_in);
odr_setbuf (m_odr_in, (char*) buf, len, 0);
- if (!z_APDU(m_odr_in, &apdu, 0))
+ if (!z_APDU(m_odr_in, &apdu, 0, 0))
{
logf(LOG_LOG, "ODR error on incoming PDU: %s [near byte %d] ",
odr_errmsg(odr_geterror(m_odr_in)),
int Yaz_Z_Assoc::encode_Z_PDU(Z_APDU *apdu, char **buf, int *len)
{
- if (!z_APDU(m_odr_out, &apdu, 0))
+ if (!z_APDU(m_odr_out, &apdu, 0, 0))
{
logf (LOG_LOG, "yaz_Z_Assoc::encode_Z_PDU failed");
return -1;
{
return m_odr_out;
}
+
+ODR Yaz_Z_Assoc::odr_decode()
+{
+ return m_odr_in;
+}
+ODR Yaz_Z_Assoc::odr_print()
+{
+ return m_odr_print;
+}
+
+Z_OtherInformationUnit *Yaz_Z_Assoc::update_otherInformation (
+ Z_OtherInformation **otherInformationP, int createFlag,
+ int *oid, int categoryValue)
+{
+ int i;
+ Z_OtherInformation *otherInformation = *otherInformationP;
+ if (!otherInformation)
+ {
+ if (!createFlag)
+ return 0;
+ otherInformation = *otherInformationP = (Z_OtherInformation *)
+ odr_malloc (odr_encode(), sizeof(*otherInformation));
+ otherInformation->num_elements = 0;
+ otherInformation->list = (Z_OtherInformationUnit **)
+ odr_malloc (odr_encode(), 8*sizeof(*otherInformation));
+ for (i = 0; i<8; i++)
+ otherInformation->list[i] = 0;
+ }
+ for (i = 0; i<otherInformation->num_elements; i++)
+ {
+ assert (otherInformation->list[i]);
+ if (!oid)
+ {
+ if (!otherInformation->list[i]->category)
+ return otherInformation->list[i];
+ }
+ else
+ {
+ if (otherInformation->list[i]->category &&
+ categoryValue ==
+ *otherInformation->list[i]->category->categoryValue &&
+ !oid_oidcmp (oid, otherInformation->list[i]->category->
+ categoryTypeId))
+ return otherInformation->list[i];
+ }
+ }
+ if (!createFlag)
+ return 0;
+ otherInformation->list[i] = (Z_OtherInformationUnit*)
+ odr_malloc (odr_encode(), sizeof(Z_OtherInformationUnit));
+ if (oid)
+ {
+ otherInformation->list[i]->category = (Z_InfoCategory*)
+ odr_malloc (odr_encode(), sizeof(Z_InfoCategory));
+ otherInformation->list[i]->category->categoryTypeId = (int*)
+ odr_oiddup (odr_encode(), oid);
+ otherInformation->list[i]->category->categoryValue = (int*)
+ odr_malloc (odr_encode(), sizeof(int));
+ *otherInformation->list[i]->category->categoryValue =
+ categoryValue;
+ }
+ else
+ otherInformation->list[i]->category = 0;
+ otherInformation->list[i]->which = Z_OtherInfo_characterInfo;
+ otherInformation->list[i]->information.characterInfo = 0;
+
+ otherInformation->num_elements = i+1;
+ return otherInformation->list[i];
+}
+
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: yaz-z-query.cpp,v $
- * Revision 1.2 1999-04-09 11:46:57 adam
+ * Revision 1.3 1999-04-20 10:30:05 adam
+ * Implemented various stuff for client and proxy. Updated calls
+ * to ODR to reflect new name parameter.
+ *
+ * Revision 1.2 1999/04/09 11:46:57 adam
* Added object Yaz_Z_Assoc. Much more functional client.
*
* Revision 1.1 1999/03/23 14:17:57 adam
query->u.type_1 = p_query_rpn (odr_encode, PROTO_Z3950, rpn);
if (!query->u.type_1)
return -1;
- if (!z_Query (odr_encode, &query, 0))
+ if (!z_Query (odr_encode, &query, 0, 0))
return -1;
buf = odr_getbuf (odr_encode, &len, 0);
return len;
{
buf = 0;
odr_reset (odr_encode);
- if (!z_Query (odr_encode, &z_query, 0))
+ if (!z_Query (odr_encode, &z_query, 0, 0))
return;
buf = odr_getbuf (odr_encode, &len, 0);
}
if (!buf)
return 0;
odr_setbuf (odr_decode, buf, len, 0);
- if (!z_Query(odr_decode, &query, 0))
+ if (!z_Query(odr_decode, &query, 0, 0))
return 0;
return query;
}