gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r21348 - Extractor/src/plugins


From: gnunet
Subject: [GNUnet-SVN] r21348 - Extractor/src/plugins
Date: Tue, 8 May 2012 18:30:27 +0200

Author: grothoff
Date: 2012-05-08 18:30:27 +0200 (Tue, 08 May 2012)
New Revision: 21348

Modified:
   Extractor/src/plugins/Makefile.am
   Extractor/src/plugins/png_extractor.c
Log:
-LRN: port PNG extractor

Modified: Extractor/src/plugins/Makefile.am
===================================================================
--- Extractor/src/plugins/Makefile.am   2012-05-08 16:30:01 UTC (rev 21347)
+++ Extractor/src/plugins/Makefile.am   2012-05-08 16:30:27 UTC (rev 21348)
@@ -17,6 +17,7 @@
   libextractor_ebml.la \
   libextractor_s3m.la \
   libextractor_ogg.la \
+  libextractor_png.la \
   libextractor_mp3.la
 
 libextractor_mp3_la_SOURCES = \
@@ -68,4 +69,12 @@
   $(top_builddir)/src/common/libextractor_common.la \
   -lvorbisfile -lvorbis $(vorbisflag) -logg
 
+libextractor_png_la_SOURCES = \
+  png_extractor.c
+libextractor_png_la_LDFLAGS = \
+  $(PLUGINFLAGS)
+libextractor_png_la_LIBADD = \
+  $(top_builddir)/src/main/libextractor.la \
+  $(top_builddir)/src/common/libextractor_common.la
+
 EXTRA_DIST = template_extractor.c 

Modified: Extractor/src/plugins/png_extractor.c
===================================================================
--- Extractor/src/plugins/png_extractor.c       2012-05-08 16:30:01 UTC (rev 
21347)
+++ Extractor/src/plugins/png_extractor.c       2012-05-08 16:30:27 UTC (rev 
21348)
@@ -85,17 +85,21 @@
 
 
 static int
-processtEXt (const char *data,
+processtEXt (struct EXTRACTOR_PluginList *plugin,
              unsigned int length,
             EXTRACTOR_MetaDataProcessor proc,
             void *proc_cls)
 {
+  unsigned char *data;
   char *keyword;
   unsigned int off;
   int i;
   int ret;
 
-  data += 4;
+  if (length != pl_read (plugin, &data, length))
+    return 1;
+
+  //data += 4;
   off = stnlen (data, length) + 1;
   if (off >= length)
     return 0;                /* failed to find '\0' */
@@ -115,16 +119,17 @@
       i++;
     }
   ADDF (EXTRACTOR_METATYPE_KEYWORDS, keyword);
- FINISH:
+FINISH:
   return ret;
 }
 
 static int
-processiTXt (const char *data,
+processiTXt (struct EXTRACTOR_PluginList *plugin,
              unsigned int length, 
             EXTRACTOR_MetaDataProcessor proc,
             void *proc_cls)
 {
+  unsigned char *data;
   unsigned int pos;
   char *keyword;
   const char *language;
@@ -137,8 +142,11 @@
   int ret;
   int zret;
 
+  if (length != pl_read (plugin, &data, length))
+    return 1;
+
   pos = stnlen (data, length) + 1;
-  if (pos + 3 >= length)
+  if (pos >= length)
     return 0;
   compressed = data[pos++];
   if (compressed && (data[pos++] != 0))
@@ -148,8 +156,7 @@
   if (stnlen (language, length - pos) > 0)
     {
       lan = stndup (language, length - pos);
-      ADDF (EXTRACTOR_METATYPE_LANGUAGE,
-           lan);
+      ADDF (EXTRACTOR_METATYPE_LANGUAGE, lan);
     }
   pos += stnlen (language, length - pos) + 1;
   if (pos + 1 >= length)
@@ -158,8 +165,7 @@
   if (stnlen (translated, length - pos) > 0)
     {
       lan = stndup (translated, length - pos);
-      ADDF (EXTRACTOR_METATYPE_KEYWORDS,
-           lan);
+      ADDF (EXTRACTOR_METATYPE_KEYWORDS, lan);
     }
   pos += stnlen (translated, length - pos) + 1;
   if (pos >= length)
@@ -214,38 +220,44 @@
       i++;
     }
   ADDF (EXTRACTOR_METATYPE_COMMENT, keyword);
- FINISH:
+FINISH:
   return ret;
 }
 
 
 static int
-processIHDR (const char *data,
+processIHDR (struct EXTRACTOR_PluginList *plugin,
              unsigned int length, 
             EXTRACTOR_MetaDataProcessor proc,
             void *proc_cls)
 {
+  unsigned char *data;
   char tmp[128];
   int ret;
 
   if (length < 12)
     return 0;
+
+  if (length != pl_read (plugin, &data, length))
+    return 1;
+
   ret = 0;
   snprintf (tmp,
             sizeof(tmp),
             "%ux%u",
-            htonl (getIntAt (&data[4])), htonl (getIntAt (&data[8])));
+            htonl (getIntAt (data)), htonl (getIntAt (&data[4])));
   ADD (EXTRACTOR_METATYPE_IMAGE_DIMENSIONS, tmp);
- FINISH:
+FINISH:
   return ret;
 }
 
 static int
-processzTXt (const char *data,
+processzTXt (struct EXTRACTOR_PluginList *plugin,
              unsigned int length,
             EXTRACTOR_MetaDataProcessor proc,
             void *proc_cls)
 {
+  unsigned char *data;
   char *keyword;
   unsigned int off;
   int i;
@@ -254,7 +266,10 @@
   int zret;
   int ret;
 
-  data += 4;
+  if (length != pl_read (plugin, &data, length))
+    return 1;
+
+  //data += 4;
   off = stnlen (data, length) + 1;
   if (off >= length)
     return 0;                /* failed to find '\0' */
@@ -303,16 +318,17 @@
       i++;
     }
   ADDF (EXTRACTOR_METATYPE_COMMENT, keyword);
- FINISH:
+FINISH:
   return ret;
 }
 
 static int
-processtIME (const char *data,
+processtIME (struct EXTRACTOR_PluginList *plugin,
              unsigned int length,
             EXTRACTOR_MetaDataProcessor proc,
             void *proc_cls)
 {
+  unsigned char *data;
   unsigned short y;
   unsigned int year;
   unsigned int mo;
@@ -325,8 +341,12 @@
 
   if (length != 7)
     return 0;
+
+  if (length != pl_read (plugin, &data, length))
+    return 1;
+
   ret = 0;
-  memcpy (&y, &data[4], sizeof (unsigned short));
+  memcpy (&y, data, sizeof (unsigned short));
   year = ntohs (y);
   mo = (unsigned char) data[6];
   day = (unsigned char) data[7];
@@ -337,7 +357,7 @@
            sizeof(val),
            "%04u-%02u-%02u %02d:%02d:%02d", year, mo, day, h, m, s);
   ADD (EXTRACTOR_METATYPE_MODIFICATION_DATE, val);
- FINISH:
+FINISH:
   return ret;
 }
 
@@ -345,47 +365,55 @@
 
 
 
-int 
-EXTRACTOR_png_extract (const char *data,
-                      size_t size,
-                      EXTRACTOR_MetaDataProcessor proc,
-                      void *proc_cls,
-                      const char *options)
+int
+EXTRACTOR_png_extract_method (struct EXTRACTOR_PluginList *plugin,
+    EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
 {
-  const char *pos;
-  const char *end;
+  unsigned char *data;
   unsigned int length;
+  int64_t pos;
   int ret;
 
-  if (size < strlen (PNG_HEADER))
-    return 0;
-  if (0 != strncmp (data, PNG_HEADER, strlen (PNG_HEADER)))
-    return 0;
-  end = &data[size];
-  pos = &data[strlen (PNG_HEADER)];
+  if (plugin == NULL)
+    return 1;
+
+  ret = strlen (PNG_HEADER);
+
+  if (ret != pl_read (plugin, &data, ret))
+    return 1;
+  
+  if (0 != strncmp (data, PNG_HEADER, ret))
+    return 1;
+
   ADD (EXTRACTOR_METATYPE_MIMETYPE, "image/png");
   ret = 0;
   while (ret == 0)
     {
-      if (pos + 12 >= end)
+      if (4 != pl_read (plugin, &data, 4))
         break;
-      length = htonl (getIntAt (pos));
-      pos += 4;
+      length = htonl (getIntAt (data));
       /* printf("Length: %u, pos %u\n", length, pos - data); */
-      if ((pos + 4 + length + 4 > end) || (pos + 4 + length + 4 < pos + 8))
+      if (4 != pl_read (plugin, &data, 4))
         break;
-      if (0 == strncmp (pos, "IHDR", 4))
-        ret = processIHDR (pos, length, proc, proc_cls);
-      if (0 == strncmp (pos, "iTXt", 4))
-        ret = processiTXt (pos, length, proc, proc_cls);
-      if (0 == strncmp (pos, "tEXt", 4))
-        ret = processtEXt (pos, length, proc, proc_cls);
-      if (0 == strncmp (pos, "zTXt", 4))
-        ret = processzTXt (pos, length, proc, proc_cls);
-      if (0 == strncmp (pos, "tIME", 4))
-        ret = processtIME (pos, length, proc, proc_cls);
-      pos += 4 + length + 4;    /* Chunk type, data, crc */
+      pos = pl_get_pos (plugin);
+      if (pos <= 0)
+        break;
+      pos += length + 4; /* Chunk type, data, crc */
+      if (0 == strncmp (data, "IHDR", 4))
+        ret = processIHDR (plugin, length, proc, proc_cls);
+      if (0 == strncmp (data, "iTXt", 4))
+        ret = processiTXt (plugin, length, proc, proc_cls);
+      if (0 == strncmp (data, "tEXt", 4))
+        ret = processtEXt (plugin, length, proc, proc_cls);
+      if (0 == strncmp (data, "zTXt", 4))
+        ret = processzTXt (plugin, length, proc, proc_cls);
+      if (0 == strncmp (data, "tIME", 4))
+        ret = processtIME (plugin, length, proc, proc_cls);
+      if (ret != 0)
+        break;
+      if (pos != pl_seek (plugin, pos, SEEK_SET))
+        break;
     }
- FINISH:
-  return ret;
+FINISH:
+  return 1;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]