zip-reader: Make the zip_reader reference counted.
[pspp] / src / output / spv / spv.c
index 574f068f54077a6c69b0e46053e96bea7290fb02..fc058281eccd633f1e1824cd78c12a728de8fb51 100644 (file)
@@ -31,7 +31,7 @@
 #include "libpspp/message.h"
 #include "libpspp/str.h"
 #include "libpspp/zip-reader.h"
-#include "output/page-setup-item.h"
+#include "output/page-setup.h"
 #include "output/pivot-table.h"
 #include "output/spv/detail-xml-parser.h"
 #include "output/spv/light-binary-parser.h"
@@ -55,7 +55,6 @@
 
 struct spv_reader
   {
-    struct string zip_errs;
     struct zip_reader *zip;
     struct spv_item *root;
     struct page_setup *page_setup;
@@ -201,7 +200,6 @@ spv_item_is_image (const struct spv_item *item)
   return item->type == SPV_ITEM_IMAGE;
 }
 
-#ifdef HAVE_CAIRO
 static cairo_status_t
 read_from_zip_member (void *zm_, unsigned char *data, unsigned int length)
 {
@@ -230,17 +228,16 @@ spv_item_get_image (const struct spv_item *item_)
 
   if (!item->image)
     {
-      struct zip_member *zm = zip_member_open (item->spv->zip,
-                                               item->png_member);
+      struct zip_member *zm;
+      char *error = zip_member_open (item->spv->zip, item->png_member, &zm);
       item->image = cairo_image_surface_create_from_png_stream (
         read_from_zip_member, zm);
-      if (zm)
-        zip_member_finish (zm);
+      zip_member_finish (zm);
+      free (error);
     }
 
   return item->image;
 }
-#endif
 
 struct spv_item *
 spv_item_next (const struct spv_item *item)
@@ -315,10 +312,8 @@ spv_item_destroy (struct spv_item *item)
       pivot_value_destroy (item->text);
 
       free (item->png_member);
-#ifdef HAVE_CAIRO
       if (item->image)
         cairo_surface_destroy (item->image);
-#endif
 
       free (item);
     }
@@ -623,10 +618,8 @@ spv_item_load (const struct spv_item *item)
 {
   if (spv_item_is_table (item))
     spv_item_get_table (item);
-#ifdef HAVE_CAIRO
   else if (spv_item_is_image (item))
     spv_item_get_image (item);
-#endif
 }
 
 bool
@@ -735,9 +728,10 @@ spv_read_xml_member (struct spv_reader *spv, const char *member_name,
 {
   *docp = NULL;
 
-  struct zip_member *zm = zip_member_open (spv->zip, member_name);
-  if (!zm)
-    return ds_steal_cstr (&spv->zip_errs);
+  struct zip_member *zm;
+  char *error = zip_member_open (spv->zip, member_name, &zm);
+  if (error)
+    return error;
 
   xmlParserCtxt *parser;
   xmlKeepBlanksDefault (keep_blanks);
@@ -760,7 +754,7 @@ spv_read_xml_member (struct spv_reader *spv, const char *member_name,
 
   if (retval < 0)
     {
-      char *error = ds_steal_cstr (&spv->zip_errs);
+      char *error = zip_member_steal_error (zm);
       zip_member_finish (zm);
       xmlFreeDoc (doc);
       return error;
@@ -1159,16 +1153,14 @@ spv_detect__ (struct zip_reader *zip, char **errorp)
 char * WARN_UNUSED_RESULT
 spv_detect (const char *filename)
 {
-  struct string zip_error;
-  struct zip_reader *zip = zip_reader_create (filename, &zip_error);
-  if (!zip)
-    return ds_steal_cstr (&zip_error);
+  struct zip_reader *zip;
+  char *error = zip_reader_create (filename, &zip);
+  if (error)
+    return error;
 
-  char *error;
   if (spv_detect__ (zip, &error) <= 0 && !error)
     error = xasprintf("%s: not an SPV file", filename);
-  zip_reader_destroy (zip);
-  ds_destroy (&zip_error);
+  zip_reader_unref (zip);
   return error;
 }
 
@@ -1178,16 +1170,13 @@ spv_open (const char *filename, struct spv_reader **spvp)
   *spvp = NULL;
 
   struct spv_reader *spv = xzalloc (sizeof *spv);
-  ds_init_empty (&spv->zip_errs);
-  spv->zip = zip_reader_create (filename, &spv->zip_errs);
-  if (!spv->zip)
+  char *error = zip_reader_create (filename, &spv->zip);
+  if (error)
     {
-      char *error = ds_steal_cstr (&spv->zip_errs);
       spv_close (spv);
       return error;
     }
 
-  char *error;
   int detect = spv_detect__ (spv->zip, &error);
   if (detect <= 0)
     {
@@ -1226,8 +1215,7 @@ spv_close (struct spv_reader *spv)
 {
   if (spv)
     {
-      ds_destroy (&spv->zip_errs);
-      zip_reader_destroy (spv->zip);
+      zip_reader_unref (spv->zip);
       spv_item_destroy (spv->root);
       page_setup_destroy (spv->page_setup);
       free (spv);