Release 1.6.4
[yazpp-moved-to-github.git] / src / yaz-my-client.cpp
index b21442a..f4879af 100644 (file)
@@ -1,10 +1,11 @@
-/*
- * Copyright (c) 1998-2004, Index Data.
+/* This file is part of the yazpp toolkit.
+ * Copyright (C) Index Data 
  * See the file LICENSE for details.
- * 
- * $Id: yaz-my-client.cpp,v 1.25 2007-03-20 07:54:11 adam Exp $
  */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 #include <stdlib.h>
 #include <yaz/log.h>
 #include <yaz/options.h>
@@ -13,6 +14,7 @@
 #include <yazpp/ir-assoc.h>
 #include <yazpp/pdu-assoc.h>
 #include <yazpp/socket-manager.h>
+#include <yaz/oid_db.h>
 
 extern "C" {
 #if HAVE_READLINE_READLINE_H
@@ -48,10 +50,8 @@ public:
     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_textRecord(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);
     void connectNotify();
     void failNotify();
     void timeoutNotify();
@@ -91,7 +91,7 @@ void MyClient::failNotify()
 
 IPDU_Observer *MyClient::sessionNotify(IPDU_Observable *the_PDU_Observable,
                                        int fd)
-{ 
+{
     return new MyClient(the_PDU_Observable, m_socketManager);
 }
 
@@ -114,16 +114,10 @@ void usage(char *prog)
 
 char *MyClient::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;
+    Z_OtherInformationUnit *oi =
+        update_otherInformation(otherInfo, 0, yaz_oid_userinfo_cookie, 1, 1);
 
-    if (oid_ent_to_oid (&ent, oid) && 
-        (oi = update_otherInformation(otherInfo, 0, oid, 1, 1)) &&
-        oi->which == Z_OtherInfo_characterInfo)
+    if (oi && oi->which == Z_OtherInfo_characterInfo)
         return oi->information.characterInfo;
     return 0;
 }
@@ -149,7 +143,6 @@ void MyClient::recv_initResponse(Z_InitResponse *initResponse)
 void MyClient::recv_diagrecs(Z_DiagRec **pp, int num)
 {
     int i;
-    oident *ent;
     Z_DefaultDiagFormat *r;
 
     printf("Diagnostic message(s) from database:\n");
@@ -163,11 +156,7 @@ void MyClient::recv_diagrecs(Z_DiagRec **pp, int num)
         }
         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
+             printf("    [" ODR_INT_PRINTF "] %s", *r->condition, diagbib1_str(*r->condition));
         switch (r->which)
         {
         case Z_DefaultDiagFormat_v2Addinfo:
@@ -177,181 +166,43 @@ void MyClient::recv_diagrecs(Z_DiagRec **pp, int num)
             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)
+void MyClient::recv_textRecord(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);
+    WRBUF w = wrbuf_alloc();
+    yaz_display_grs1(w, r, 0);
+    fwrite(wrbuf_buf(w), 1, wrbuf_len(w), stdout);
+    wrbuf_destroy(w);
 }
 
 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 %ld]\n", (long) 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;
+        char name_oid_str[OID_STR_MAX];
+        const char *name_oid = yaz_oid_to_string_buf(r->direct_reference, 0,
+                                                     name_oid_str);
+        printf("Record type: %s\n", name_oid ? name_oid : "unknown");
     }
     if (r->which == Z_External_octet && record->u.octet_aligned->len)
     {
-        yaz_marc_t mt = yaz_marc_create();
-        switch (ent->value)
+        if (yaz_oid_is_iso2709(r->direct_reference))
         {
-        case VAL_ISO2709:
-        case VAL_UNIMARC:
-        case VAL_INTERMARC:
-        case VAL_USMARC:
-        case VAL_UKMARC:
-        case VAL_NORMARC:
-        case VAL_LIBRISMARC:
-        case VAL_DANMARC:
-        case VAL_FINMARC:
-        case VAL_MAB:
-        case VAL_CANMARC:
-        case VAL_SBN:
-        case VAL_PICAMARC:
-        case VAL_AUSMARC:
-        case VAL_IBERMARC:
-        case VAL_CATMARC:
-        case VAL_MALMARC:
-        case VAL_JPMARC:
-        case VAL_SWEMARC:
-        case VAL_SIGLEMARC:
-        case VAL_ISDSMARC:
-        case VAL_RUSMARC:
+            yaz_marc_t mt = yaz_marc_create();
+
             const char *result_buf;
             size_t result_size;
             yaz_marc_decode_buf(mt, (const char *)
@@ -359,20 +210,20 @@ void MyClient::recv_record(Z_DatabaseRecord *record, int offset,
                                 record->u.octet_aligned->len,
                                 &result_buf, &result_size);
             fwrite(result_buf, 1, result_size, stdout);
-            break;
-        default:
-            recv_textRecord((int) ent->value,
-                            (const char *) record->u.octet_aligned->buf,
+            yaz_marc_destroy(mt);
+        }
+        else
+        {
+            recv_textRecord((const char *) record->u.octet_aligned->buf,
                             (size_t) record->u.octet_aligned->len);
         }
-        yaz_marc_destroy(mt);
     }
-    else if (ent && ent->value == VAL_SUTRS && r->which == Z_External_sutrs)
-        recv_textRecord((int) VAL_SUTRS, (const char *) r->u.sutrs->buf,
+    else if (r->which == Z_External_sutrs)
+        recv_textRecord((const char *) r->u.sutrs->buf,
                         (size_t) r->u.sutrs->len);
-    else if (ent && ent->value == VAL_GRS1 && r->which == Z_External_grs1)
+    else if (r->which == Z_External_grs1)
         recv_genericRecord(r->u.grs1);
-    else 
+    else
     {
         printf("Unknown record representation.\n");
         if (!z_External(odr_print(), &r, 0, 0))
@@ -380,7 +231,7 @@ void MyClient::recv_record(Z_DatabaseRecord *record, int offset,
             odr_perror(odr_print(), "Printing external");
             odr_reset(odr_print());
         }
-    }    
+    }
 }
 
 void MyClient::recv_namePlusRecord (Z_NamePlusRecord *zpr, int offset)
@@ -395,9 +246,7 @@ void MyClient::recv_namePlusRecord (Z_NamePlusRecord *zpr, int offset)
 
 void MyClient::recv_records (Z_Records *records)
 {
-#ifdef ASN_COMPILED
     Z_DiagRec dr, *dr_p = &dr;
-#endif
     if (!records)
         return;
     int i;
@@ -410,13 +259,9 @@ void MyClient::recv_records (Z_Records *records)
         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,
@@ -435,7 +280,7 @@ void MyClient::recv_searchResponse(Z_SearchResponse *searchResponse)
     else
     {
         printf ("Ok\n");
-        printf ("Hits: %d\n", *searchResponse->resultCount);
+        printf ("Hits: " ODR_INT_PRINTF "\n", *searchResponse->resultCount);
     }
     recv_records (searchResponse->records);
 }
@@ -569,14 +414,14 @@ int MyClient::processCommand(const char *commandLine)
         {"proxy", &MyClient::cmd_proxy, "<host>:[':'<port>]"},
         {0,0,0}
     };
-    
+
     if (sscanf(commandLine, "%s %[^;]", cmdStr, cmdArgs) < 1)
         return 1;
     int i;
     for (i = 0; cmd[i].cmd; i++)
         if (!strncmp(cmd[i].cmd, cmdStr, strlen(cmdStr)))
             break;
-    
+
     int res = 1;
     if (cmd[i].cmd) // Invoke command handler
         res = (this->*cmd[i].fun)(cmdArgs);
@@ -605,7 +450,7 @@ const char *MyClient::getCommand()
     strncpy(m_thisCommand,line_in, 1023);
     m_thisCommand[1023] = '\0';
     free (line_in);
-#else    
+#else
     // Read using fgets(3)
     printf (C_PROMPT);
     fflush(stdout);
@@ -710,6 +555,7 @@ int main(int argc, char **argv)
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab