Implemented various stuff for client and proxy. Updated calls
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 20 Apr 1999 10:30:05 +0000 (10:30 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 20 Apr 1999 10:30:05 +0000 (10:30 +0000)
to ODR to reflect new name parameter.

15 files changed:
include/yaz-ir-assoc.h
include/yaz-pdu-assoc.h
include/yaz-pdu-observer.h
include/yaz-proxy.h
include/yaz-query.h
include/yaz-socket-manager.h
include/yaz-socket-observer.h
include/yaz-z-assoc.h
include/yaz-z-query.h
src/yaz-client.cpp
src/yaz-ir-assoc.cpp
src/yaz-pdu-assoc.cpp
src/yaz-proxy.cpp
src/yaz-z-assoc.cpp
src/yaz-z-query.cpp

index ad7efbb..553903c 100644 (file)
@@ -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 <yaz-z-assoc.h>
@@ -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;
index c5930c4..afda750 100644 (file)
@@ -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 <comstack.h>
index f89436f..292bb95 100644 (file)
@@ -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
index 9d8e213..86ae642 100644 (file)
@@ -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 <yaz-z-assoc.h>
@@ -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;
 };
index f484d05..59e566d 100644 (file)
@@ -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 $
  */
 
 
index 9404b39..2f57cf2 100644 (file)
@@ -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 <yaz-socket-observer.h>
index 2732eed..8ffe601 100644 (file)
@@ -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
index caec440..59b0b9f 100644 (file)
@@ -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 <proto.h>
@@ -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();
index 8febc1e..587a842 100644 (file)
@@ -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 <proto.h>
index 8a88bc3..e0c26f1 100644 (file)
@@ -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 <log.h>
 #include <options.h>
+#include <diagbib1.h>
 #include <yaz-ir-assoc.h>
 #include <yaz-pdu-assoc.h>
 #include <yaz-socket-manager.h>
@@ -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; 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 ");
@@ -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')':'[<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}
     };
     
@@ -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')
index 4217bcd..ad24cb2 100644 (file)
@@ -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 <assert.h>
@@ -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; 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");
@@ -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; i<req->num_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);
 }
 
index e20837b..7937e59 100644 (file)
@@ -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;
        }
     }
index 59ccc36..8360dbe 100644 (file)
@@ -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)
index 360bcf6..4d16b08 100644 (file)
@@ -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 <assert.h>
+
 #include <log.h>
 #include <yaz-z-assoc.h>
 
@@ -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; 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];
+}
+
index 3fbd3e6..895fbb0 100644 (file)
@@ -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;
 }