From 3109185a2036377894be1dd303d899a305b44281 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 20 Apr 1999 10:30:05 +0000 Subject: [PATCH] Implemented various stuff for client and proxy. Updated calls to ODR to reflect new name parameter. --- include/yaz-ir-assoc.h | 17 +-- include/yaz-pdu-assoc.h | 15 +-- include/yaz-pdu-observer.h | 18 +-- include/yaz-proxy.h | 28 +--- include/yaz-query.h | 5 +- include/yaz-socket-manager.h | 11 +- include/yaz-socket-observer.h | 11 +- include/yaz-z-assoc.h | 11 +- include/yaz-z-query.h | 8 +- src/yaz-client.cpp | 294 ++++++++++++++++++++++++++++++++++++++++- src/yaz-ir-assoc.cpp | 120 +++++++---------- src/yaz-pdu-assoc.cpp | 31 +++-- src/yaz-proxy.cpp | 47 ++++++- src/yaz-z-assoc.cpp | 82 +++++++++++- src/yaz-z-query.cpp | 12 +- 15 files changed, 517 insertions(+), 193 deletions(-) diff --git a/include/yaz-ir-assoc.h b/include/yaz-ir-assoc.h index ad7efbb..553903c 100644 --- a/include/yaz-ir-assoc.h +++ b/include/yaz-ir-assoc.h @@ -3,10 +3,7 @@ * 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 @@ -49,18 +46,21 @@ class YAZ_EXPORT Yaz_IR_Assoc: public Yaz_Z_Assoc { 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); @@ -75,6 +75,7 @@ class YAZ_EXPORT Yaz_IR_Assoc: public Yaz_Z_Assoc { private: char *m_proxy; char *m_host; + char *m_cookie; int m_num_databaseNames; char **m_databaseNames; int m_preferredRecordSyntax; diff --git a/include/yaz-pdu-assoc.h b/include/yaz-pdu-assoc.h index c5930c4..afda750 100644 --- a/include/yaz-pdu-assoc.h +++ b/include/yaz-pdu-assoc.h @@ -3,20 +3,7 @@ * 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 diff --git a/include/yaz-pdu-observer.h b/include/yaz-pdu-observer.h index f89436f..292bb95 100644 --- a/include/yaz-pdu-observer.h +++ b/include/yaz-pdu-observer.h @@ -3,23 +3,7 @@ * 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 diff --git a/include/yaz-proxy.h b/include/yaz-proxy.h index 9d8e213..86ae642 100644 --- a/include/yaz-proxy.h +++ b/include/yaz-proxy.h @@ -3,17 +3,7 @@ * 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 @@ -28,14 +18,8 @@ class YAZ_EXPORT Yaz_ProxyClient : public Yaz_Z_Assoc { 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. @@ -46,8 +30,10 @@ class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc { 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; }; diff --git a/include/yaz-query.h b/include/yaz-query.h index f484d05..59e566d 100644 --- a/include/yaz-query.h +++ b/include/yaz-query.h @@ -3,10 +3,7 @@ * 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 $ */ diff --git a/include/yaz-socket-manager.h b/include/yaz-socket-manager.h index 9404b39..2f57cf2 100644 --- a/include/yaz-socket-manager.h +++ b/include/yaz-socket-manager.h @@ -3,16 +3,7 @@ * 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 diff --git a/include/yaz-socket-observer.h b/include/yaz-socket-observer.h index 2732eed..8ffe601 100644 --- a/include/yaz-socket-observer.h +++ b/include/yaz-socket-observer.h @@ -3,16 +3,7 @@ * 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 diff --git a/include/yaz-z-assoc.h b/include/yaz-z-assoc.h index caec440..59b0b9f 100644 --- a/include/yaz-z-assoc.h +++ b/include/yaz-z-assoc.h @@ -3,10 +3,7 @@ * 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 @@ -49,6 +46,12 @@ class YAZ_EXPORT Yaz_Z_Assoc : public IYaz_PDU_Observer { 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(); diff --git a/include/yaz-z-query.h b/include/yaz-z-query.h index 8febc1e..587a842 100644 --- a/include/yaz-z-query.h +++ b/include/yaz-z-query.h @@ -3,13 +3,7 @@ * 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 diff --git a/src/yaz-client.cpp b/src/yaz-client.cpp index 8a88bc3..e0c26f1 100644 --- a/src/yaz-client.cpp +++ b/src/yaz-client.cpp @@ -4,7 +4,11 @@ * 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 @@ -24,6 +28,7 @@ #include #include +#include #include #include #include @@ -42,6 +47,7 @@ private: 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, @@ -52,16 +58,28 @@ public: 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); } @@ -69,6 +87,7 @@ MyClient::MyClient(IYaz_PDU_Observable *the_PDU_Observable, 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'; @@ -90,6 +109,245 @@ void MyClient::recv_initResponse(Z_InitResponse *initResponse) 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; iwhich != 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 "); @@ -100,6 +358,14 @@ void MyClient::recv_searchResponse(Z_SearchResponse *searchResponse) } 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() @@ -150,6 +416,22 @@ int MyClient::cmd_find(char *args) 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]; @@ -160,10 +442,12 @@ int MyClient::processCommand(const char *commandLine) int (MyClient::*fun)(char *arg); char *ad; } cmd[] = { - {"open", &cmd_open, "('tcp'|'osi')':'['/'][':']"}, + {"open", &cmd_open, "[':'][/]"}, {"quit", &cmd_quit, ""}, {"close", &cmd_close, ""}, - {"find", &cmd_find, ""}, + {"find", &cmd_find, ""}, + {"show", &cmd_show, "[ []]"}, + {"cookie", &cmd_cookie, ""}, {0,0,0} }; @@ -216,7 +500,7 @@ const char *MyClient::getCommand() *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') diff --git a/src/yaz-ir-assoc.cpp b/src/yaz-ir-assoc.cpp index 4217bcd..ad24cb2 100644 --- a/src/yaz-ir-assoc.cpp +++ b/src/yaz-ir-assoc.cpp @@ -4,9 +4,12 @@ * 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 @@ -24,7 +27,7 @@ Yaz_IR_Assoc::Yaz_IR_Assoc(IYaz_PDU_Observable *the_PDU_Observable) m_lastReceived = 0; m_host = 0; m_proxy = 0; - + m_cookie = 0; const char *db = "Default"; set_databaseNames(1, &db); } @@ -33,7 +36,10 @@ Yaz_IR_Assoc::~Yaz_IR_Assoc() { 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) @@ -149,72 +155,31 @@ void Yaz_IR_Assoc::get_elementSetName (const char **elementSetName) 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; inum_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"); @@ -258,8 +223,6 @@ int Yaz_IR_Assoc::send_searchRequest(Yaz_Z_Query *query) if (!req->query) return -1; get_databaseNames (&req->num_databaseNames, &req->databaseNames); - for (int i = 0; inum_databaseNames; i++) - logf (LOG_LOG, "Database %s", req->databaseNames[i]); int oid_syntax[OID_SIZE]; oident prefsyn; get_preferredRecordSyntax(&recordSyntax); @@ -272,6 +235,9 @@ int Yaz_IR_Assoc::send_searchRequest(Yaz_Z_Query *query) 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); } @@ -304,6 +270,8 @@ int Yaz_IR_Assoc::send_presentRequest(int start, int number) 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); } @@ -314,6 +282,18 @@ void Yaz_IR_Assoc::set_proxy(const char *str) 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; @@ -384,7 +364,6 @@ void Yaz_IR_Assoc::set_lastReceived(int lastReceived) int Yaz_IR_Assoc::send_initRequest() { - Z_APDU *apdu = create_Z_PDU(Z_APDU_initRequest); Z_InitRequest *req = apdu->u.initRequest; @@ -402,16 +381,9 @@ int Yaz_IR_Assoc::send_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); } diff --git a/src/yaz-pdu-assoc.cpp b/src/yaz-pdu-assoc.cpp index e20837b..7937e59 100644 --- a/src/yaz-pdu-assoc.cpp +++ b/src/yaz-pdu-assoc.cpp @@ -4,7 +4,11 @@ * 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 @@ -243,10 +247,11 @@ int Yaz_PDU_Assoc::flush_PDU() 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; @@ -265,7 +270,7 @@ int Yaz_PDU_Assoc::send_PDU(const char *buf, int len) 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) @@ -274,7 +279,8 @@ int Yaz_PDU_Assoc::send_PDU(const char *buf, int len) 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; } @@ -332,8 +338,17 @@ void Yaz_PDU_Assoc::connect(IYaz_PDU_Observer *observer, 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 { @@ -344,12 +359,12 @@ void Yaz_PDU_Assoc::connect(IYaz_PDU_Observer *observer, 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; } } diff --git a/src/yaz-proxy.cpp b/src/yaz-proxy.cpp index 59ccc36..8360dbe 100644 --- a/src/yaz-proxy.cpp +++ b/src/yaz-proxy.cpp @@ -4,7 +4,11 @@ * 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 @@ -26,7 +30,6 @@ Yaz_Proxy::Yaz_Proxy(IYaz_PDU_Observable *the_PDU_Observable) : Yaz_Z_Assoc(the_PDU_Observable) { m_PDU_Observable = the_PDU_Observable; - m_maps = 0; m_client = 0; } @@ -40,6 +43,36 @@ IYaz_PDU_Observer *Yaz_Proxy::clone(IYaz_PDU_Observable 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) @@ -48,7 +81,12 @@ void Yaz_Proxy::recv_Z_PDU(Z_APDU *apdu) 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"); @@ -78,7 +116,8 @@ IYaz_PDU_Observer *Yaz_ProxyClient::clone(IYaz_PDU_Observable 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) diff --git a/src/yaz-z-assoc.cpp b/src/yaz-z-assoc.cpp index 360bcf6..4d16b08 100644 --- a/src/yaz-z-assoc.cpp +++ b/src/yaz-z-assoc.cpp @@ -4,11 +4,17 @@ * 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 + #include #include @@ -69,7 +75,7 @@ Z_APDU *Yaz_Z_Assoc::decode_Z_PDU(const char *buf, int len) 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)), @@ -87,7 +93,7 @@ Z_APDU *Yaz_Z_Assoc::decode_Z_PDU(const char *buf, int len) 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; @@ -131,3 +137,73 @@ ODR Yaz_Z_Assoc::odr_encode() { 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; inum_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]; +} + diff --git a/src/yaz-z-query.cpp b/src/yaz-z-query.cpp index 3fbd3e6..895fbb0 100644 --- a/src/yaz-z-query.cpp +++ b/src/yaz-z-query.cpp @@ -4,7 +4,11 @@ * 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 @@ -30,7 +34,7 @@ int Yaz_Z_Query::set_rpn (const char *rpn) 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; @@ -40,7 +44,7 @@ void Yaz_Z_Query::set_Z_Query(Z_Query *z_query) { 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); } @@ -57,7 +61,7 @@ Z_Query *Yaz_Z_Query::get_Z_Query () 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; } -- 1.7.10.4