Fix types for call to yaz_marc_decode_buf
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 6 Mar 2008 11:52:53 +0000 (11:52 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 6 Mar 2008 11:52:53 +0000 (11:52 +0000)
src/yaz-my-client.cpp

index 8f9469e..6c7ae7f 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 1998-2007, Index Data.
+ * Copyright (c) 1998-2004, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-my-client.cpp,v 1.29 2007-05-02 09:17:48 adam Exp $
+ * $Id: yaz-my-client.cpp,v 1.25.2.1 2008-03-06 11:52:53 adam Exp $
  */
 
 #include <stdlib.h>
@@ -13,7 +13,6 @@
 #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
@@ -49,8 +48,10 @@ public:
     void recv_namePlusRecord (Z_NamePlusRecord *zpr, int offset);
     void recv_record(Z_DatabaseRecord *record, int offset,
                      const char *databaseName);
-    void recv_textRecord(const char *buf, size_t len);
+    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);
     void connectNotify();
     void failNotify();
     void timeoutNotify();
@@ -113,10 +114,16 @@ void usage(char *prog)
 
 char *MyClient::get_cookie(Z_OtherInformation **otherInfo)
 {
-    Z_OtherInformationUnit *oi =
-        update_otherInformation(otherInfo, 0, yaz_oid_userinfo_cookie, 1, 1);
-
-    if (oi && oi->which == Z_OtherInfo_characterInfo)
+    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, 1)) &&
+        oi->which == Z_OtherInfo_characterInfo)
         return oi->information.characterInfo;
     return 0;
 }
@@ -142,6 +149,7 @@ 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");
@@ -155,7 +163,11 @@ void MyClient::recv_diagrecs(Z_DiagRec **pp, int num)
         }
         else
             r = p->u.defaultFormat;
-             printf("    [%d] %s", *r->condition, diagbib1_str(*r->condition));
+        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:
@@ -165,62 +177,200 @@ 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(const char *buf, size_t len)
+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)
 {
-    WRBUF w = wrbuf_alloc();
-    yaz_display_grs1(w, r, 0);
-    fwrite(wrbuf_buf(w), 1, wrbuf_len(w), stdout);
-    wrbuf_destroy(w);
+    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)
     {
-        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");
+        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;
     }
     if (r->which == Z_External_octet && record->u.octet_aligned->len)
     {
-        if (yaz_oid_is_iso2709(r->direct_reference))
+        yaz_marc_t mt = yaz_marc_create();
+        switch (ent->value)
         {
-            yaz_marc_t mt = yaz_marc_create();
-
-            const char *result_buf;
-            size_t result_size;
+        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:
+            char *result_buf;
+            int result_size;
             yaz_marc_decode_buf(mt, (const char *)
                                 record->u.octet_aligned->buf,
                                 record->u.octet_aligned->len,
                                 &result_buf, &result_size);
             fwrite(result_buf, 1, result_size, stdout);
-            yaz_marc_destroy(mt);
-        }
-        else
-        {
-            recv_textRecord((const char *) record->u.octet_aligned->buf,
+            break;
+        default:
+            recv_textRecord((int) ent->value,
+                            (const char *) record->u.octet_aligned->buf,
                             (size_t) record->u.octet_aligned->len);
         }
+        yaz_marc_destroy(mt);
     }
-    else if (r->which == Z_External_sutrs)
-        recv_textRecord((const char *) r->u.sutrs->buf,
+    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 (r->which == Z_External_grs1)
+    else if (ent && ent->value == VAL_GRS1 && r->which == Z_External_grs1)
         recv_genericRecord(r->u.grs1);
     else 
     {
@@ -245,7 +395,9 @@ 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;
@@ -258,9 +410,13 @@ 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,