Handle OPAC for record conversion module.
[yaz-moved-to-github.git] / src / record_conv.c
index bf148e9..ab5f173 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (C) 2005-2006, Index Data ApS
+ * Copyright (C) 2005-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: record_conv.c,v 1.12 2006-12-12 10:41:38 marc Exp $
+ * $Id: record_conv.c,v 1.17 2007-12-16 11:08:51 adam Exp $
  */
 /**
  * \file record_conv.c
@@ -21,6 +21,7 @@
 #include <yaz/xmalloc.h>
 #include <yaz/nmem.h>
 #include <yaz/tpath.h>
+#include <yaz/z-opac.h>
 
 #if YAZ_HAVE_XML2
 #include <libxml/parser.h>
@@ -107,7 +108,7 @@ static void yaz_record_conv_reset(yaz_record_conv_t p)
 
 yaz_record_conv_t yaz_record_conv_create()
 {
-    yaz_record_conv_t p = xmalloc(sizeof(*p));
+    yaz_record_conv_t p = (yaz_record_conv_t) xmalloc(sizeof(*p));
     p->nmem = nmem_create();
     p->wr_error = wrbuf_alloc();
     p->rules = 0;
@@ -126,7 +127,7 @@ void yaz_record_conv_destroy(yaz_record_conv_t p)
     {
         yaz_record_conv_reset(p);
         nmem_destroy(p->nmem);
-        wrbuf_free(p->wr_error, 1);
+        wrbuf_destroy(p->wr_error);
         xfree(p->path);
         xfree(p);
     }
@@ -136,7 +137,8 @@ void yaz_record_conv_destroy(yaz_record_conv_t p)
 static struct yaz_record_conv_rule *add_rule(yaz_record_conv_t p,
                                              enum YAZ_RECORD_CONV_RULE type)
 {
-    struct yaz_record_conv_rule *r = nmem_malloc(p->nmem, sizeof(*r));
+    struct yaz_record_conv_rule *r = (struct yaz_record_conv_rule *)
+        nmem_malloc(p->nmem, sizeof(*r));
     r->which = type;
     r->next = 0;
     *p->rules_p = r;
@@ -339,10 +341,8 @@ static int conv_marc(yaz_record_conv_t p, const xmlNode *ptr)
     return 0;
 }
 
-int yaz_record_conv_configure(yaz_record_conv_t p, const void *ptr_v)
+int yaz_record_conv_configure(yaz_record_conv_t p, const xmlNode *ptr)
 {
-    const xmlNode *ptr = ptr_v; 
-
     yaz_record_conv_reset(p);
 
     /* parsing element children */
@@ -371,14 +371,56 @@ int yaz_record_conv_configure(yaz_record_conv_t p, const void *ptr_v)
     return 0;
 }
 
+static int yaz_record_conv_record_rule(yaz_record_conv_t p,
+                                       struct yaz_record_conv_rule *r,
+                                       const char *input_record_buf,
+                                       size_t input_record_len,
+                                       WRBUF output_record);
+
+int yaz_record_conv_opac_record(yaz_record_conv_t p,
+                                Z_OPACRecord *input_record,
+                                WRBUF output_record)
+{
+    int ret = 0;
+    struct yaz_record_conv_rule *r = p->rules;
+    WRBUF res = wrbuf_alloc();
+    yaz_marc_t mt = yaz_marc_create();
+    
+    wrbuf_rewind(p->wr_error);
+    yaz_marc_xml(mt, r->u.marc.output_format);
+    if (r->u.marc.iconv_t)
+        yaz_marc_iconv(mt, r->u.marc.iconv_t);
+    yaz_opac_decode_wrbuf(mt, input_record, res);
+    if (ret != -1)
+    {
+        ret = yaz_record_conv_record_rule(p, 
+                                          r->next,
+                                          wrbuf_buf(res), wrbuf_len(res),
+                                          output_record);
+    }
+    yaz_marc_destroy(mt);
+    wrbuf_destroy(res);
+    return ret;
+}
+
 int yaz_record_conv_record(yaz_record_conv_t p,
                            const char *input_record_buf,
                            size_t input_record_len,
                            WRBUF output_record)
 {
+    return yaz_record_conv_record_rule(p, p->rules,
+                                       input_record_buf,
+                                       input_record_len, output_record);
+}
+
+static int yaz_record_conv_record_rule(yaz_record_conv_t p,
+                                       struct yaz_record_conv_rule *r,
+                                       const char *input_record_buf,
+                                       size_t input_record_len,
+                                       WRBUF output_record)
+{
     int ret = 0;
     WRBUF record = output_record; /* pointer transfer */
-    struct yaz_record_conv_rule *r = p->rules;
     wrbuf_rewind(p->wr_error);
     
     wrbuf_write(record, input_record_buf, input_record_len);
@@ -486,7 +528,7 @@ int yaz_record_conv_record(yaz_record_conv_t p,
 
 const char *yaz_record_conv_get_error(yaz_record_conv_t p)
 {
-    return wrbuf_buf(p->wr_error);
+    return wrbuf_cstr(p->wr_error);
 }
 
 void yaz_record_conv_set_path(yaz_record_conv_t p, const char *path)