]> git.imager.perl.org - imager.git/commitdiff
io_glue_destroy() now uses an extra callback to handle type specific
authorTony Cook <tony@develop=help.com>
Wed, 15 Mar 2006 12:49:49 +0000 (12:49 +0000)
committerTony Cook <tony@develop=help.com>
Wed, 15 Mar 2006 12:49:49 +0000 (12:49 +0000)
destruction, instead of switching on "class"

Imager.xs
iolayer.c
iolayer.h

index 531dd626035369fd3618ab6d49e57747934e5cb5..c0c5e940f5b7d8fba8bf09d9533802c7eae89c14 100644 (file)
--- a/Imager.xs
+++ b/Imager.xs
@@ -879,6 +879,9 @@ i_int_hlines_dump(i_int_hlines *hlines) {
 #define i_exif_enabled() 0
 #endif
 
+/* trying to use more C style names, map them here */
+#define io_glue_DESTROY(ig) io_glue_destroy(ig)
+
 MODULE = Imager                PACKAGE = Imager::Color PREFIX = ICL_
 
 Imager::Color
index 9ddfb55bf50a4a7991c95a653b6e62dc1e1e3906..9e0e06fd089dcdeb26015f6e45bf458e5101ce56 100644 (file)
--- a/iolayer.c
+++ b/iolayer.c
@@ -82,7 +82,7 @@ iolayer.c - encapsulates different source of data into a single framework.
     break;
   }  
 
-  io_glue_DESTROY(ig);
+  io_glue_destroy(ig);
   // and much more
 
 =head1 DESCRIPTION
@@ -247,6 +247,17 @@ realseek_seek(io_glue *ig, off_t offset, int whence) {
   /* FIXME: How about implementing this offset handling stuff? */
 }
 
+static
+void
+realseek_destroy(io_glue *ig) {
+  io_ex_rseek *ier = ig->exdata;
+
+  if (ig->source.cb.destroycb)
+    ig->source.cb.destroycb(ig->source.cb.p);
+
+  myfree(ier);
+}
+
 /*
  * Callbacks for sources that are a fixed size buffer
  */
@@ -352,7 +363,18 @@ buffer_seek(io_glue *ig, off_t offset, int whence) {
   /* FIXME: How about implementing this offset handling stuff? */
 }
 
+static
+void
+buffer_destroy(io_glue *ig) {
+  io_ex_buffer *ieb = ig->exdata;
 
+  if (ig->source.buffer.closecb) {
+    mm_log((1,"calling close callback %p for io_buffer\n", 
+           ig->source.buffer.closecb));
+    ig->source.buffer.closecb(ig->source.buffer.closedata);
+  }
+  myfree(ieb);
+}
 
 
 
@@ -777,10 +799,15 @@ bufchain_seek(io_glue *ig, off_t offset, int whence) {
   return ieb->gpos;
 }
 
+static
+void
+bufchain_destroy(io_glue *ig) {
+  io_ex_bchain *ieb = ig->exdata;
 
+  io_destroy_bufchain(ieb);
 
-
-
+  myfree(ieb);
+}
 
 /*
  * Methods for setting up data source
@@ -918,11 +945,12 @@ io_new_bufchain() {
   ieb->cp     = ieb->head;
   ieb->tail   = ieb->head;
   
-  ig->exdata  = ieb;
-  ig->readcb  = bufchain_read;
-  ig->writecb = bufchain_write;
-  ig->seekcb  = bufchain_seek;
-  ig->closecb = bufchain_close;
+  ig->exdata    = ieb;
+  ig->readcb    = bufchain_read;
+  ig->writecb   = bufchain_write;
+  ig->seekcb    = bufchain_seek;
+  ig->closecb   = bufchain_close;
+  ig->destroycb = bufchain_destroy;
 
   return ig;
 }
@@ -954,11 +982,12 @@ io_new_buffer(char *data, size_t len, closebufp closecb, void *closedata) {
   ieb->offset = 0;
   ieb->cpos   = 0;
   
-  ig->exdata  = ieb;
-  ig->readcb  = buffer_read;
-  ig->writecb = buffer_write;
-  ig->seekcb  = buffer_seek;
-  ig->closecb = buffer_close;
+  ig->exdata    = ieb;
+  ig->readcb    = buffer_read;
+  ig->writecb   = buffer_write;
+  ig->seekcb    = buffer_seek;
+  ig->closecb   = buffer_close;
+  ig->destroycb = buffer_destroy;
 
   return ig;
 }
@@ -988,12 +1017,13 @@ io_new_fd(int fd) {
   ig->source.fdseek.fd = fd;
   ig->flags = 0;
 
-  ig->exdata  = NULL;
-  ig->readcb  = fd_read;
-  ig->writecb = fd_write;
-  ig->seekcb  = fd_seek;
-  ig->closecb = fd_close;
-  ig->sizecb  = fd_size;
+  ig->exdata    = NULL;
+  ig->readcb    = fd_read;
+  ig->writecb   = fd_write;
+  ig->seekcb    = fd_seek;
+  ig->closecb   = fd_close;
+  ig->sizecb    = fd_size;
+  ig->destroycb = NULL;
       
   mm_log((1, "(%p) <- io_new_fd\n", ig));
   return ig;
@@ -1014,11 +1044,12 @@ io_glue *io_new_cb(void *p, readl readcb, writel writecb, seekl seekcb,
   ier->offset = 0;
   ier->cpos   = 0;
   
-  ig->exdata  = ier;
-  ig->readcb  = realseek_read;
-  ig->writecb = realseek_write;
-  ig->seekcb  = realseek_seek;
-  ig->closecb = realseek_close;
+  ig->exdata    = ier;
+  ig->readcb    = realseek_read;
+  ig->writecb   = realseek_write;
+  ig->seekcb    = realseek_seek;
+  ig->closecb   = realseek_close;
+  ig->destroycb = realseek_destroy;
 
   return ig;
 }
@@ -1126,7 +1157,7 @@ static ssize_t fd_size(io_glue *ig) {
 }
 
 /*
-=item io_glue_DESTROY(ig)
+=item io_glue_destroy(ig)
 
 A destructor method for io_glue objects.  Should clean up all related buffers.
 Might leave us with a dangling pointer issue on some buffers.
@@ -1137,39 +1168,13 @@ Might leave us with a dangling pointer issue on some buffers.
 */
 
 void
-io_glue_DESTROY(io_glue *ig) {
+io_glue_destroy(io_glue *ig) {
   io_type      inn = ig->source.type;
   mm_log((1, "io_glue_DESTROY(ig %p)\n", ig));
+
+  if (ig->destroycb)
+    ig->destroycb(ig);
   
-  switch (inn) {
-  case BUFCHAIN:
-    {
-      io_ex_bchain *ieb = ig->exdata;
-      io_destroy_bufchain(ieb);
-      myfree(ieb);
-    }
-    break;
-  case CBSEEK:
-    {
-      io_ex_rseek *ier = ig->exdata;
-      if (ig->source.cb.destroycb)
-        ig->source.cb.destroycb(ig->source.cb.p);
-      myfree(ier);
-    }
-    break;
-  case BUFFER:
-    {
-      io_ex_buffer *ieb = ig->exdata;
-      if (ig->source.buffer.closecb) {
-       mm_log((1,"calling close callback %p for io_buffer\n", ig->source.buffer.closecb));
-       ig->source.buffer.closecb(ig->source.buffer.closedata);
-      }
-      myfree(ieb);
-    }
-    break;
-  default:
-    break;
-  }
   myfree(ig);
 }
 
index 2d815fd7d4ee847f69373929decdd2849713f359..e69b24fe6e0d92b940c1d9c3c38c70a4e31d3e3d 100644 (file)
--- a/iolayer.h
+++ b/iolayer.h
@@ -44,6 +44,7 @@ typedef void   (*closep)(io_glue *ig);
 typedef ssize_t(*sizep) (io_glue *ig);
 
 typedef void   (*closebufp)(void *p);
+typedef void (*i_io_destroy_t)(i_io_glue_t *ig);
 
 
 /* Callbacks we get */
@@ -102,6 +103,7 @@ struct i_io_glue_t {
   seekp                seekcb;
   closep       closecb;
   sizep                sizecb;
+  i_io_destroy_t destroycb;
 };
 
 void io_glue_commit_types(io_glue *ig);
@@ -114,8 +116,12 @@ io_glue *io_new_bufchain(void);
 io_glue *io_new_buffer(char *data, size_t len, closebufp closecb, void *closedata);
 io_glue *io_new_cb(void *p, readl readcb, writel writecb, seekl seekcb, closel closecb, destroyl destroycb);
 size_t   io_slurp(io_glue *ig, unsigned char **c);
-void     io_glue_DESTROY(io_glue *ig);
+void     io_glue_destroy(io_glue *ig);
 
 #define i_io_type(ig) ((ig)->source.ig_type)
+#define i_io_read(ig, buf, size) ((ig)->readcb((ig), (buf), (size)))
+#define i_io_write(ig, data, size) ((ig)->writedb((ig), (data), (size)))
+#define i_io_seek(ig, offset, whence) ((ig)->seekdb((ig), (offset), (size)))
+#define i_io_close(ig) ((ig)->closecb(ig))
 
 #endif /* _IOLAYER_H_ */