summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-10-30 00:03:05 -0400
committerMartyn Russell <martyn@lanedo.com>2012-11-01 17:40:52 +0000
commit28e146f80fd426d56fbb7f90298fd46e046de439 (patch)
tree9345c77ec5a3928ee2c6417f68149618c61bc8d7
parent8f2df3741b8bd3172ee234f57f48dcc95f7fd84b (diff)
downloadtracker-28e146f80fd426d56fbb7f90298fd46e046de439.tar.gz
tracker-extract: add a simple extractor for XPS
Fixes GB#687160
-rw-r--r--configure.ac34
-rw-r--r--src/tracker-extract/10-xps.rule.in4
-rw-r--r--src/tracker-extract/Makefile.am19
-rw-r--r--src/tracker-extract/tracker-extract-xps.c71
4 files changed, 128 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index 039485ab4..d8a864835 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1853,6 +1853,39 @@ fi
AM_CONDITIONAL(HAVE_POPPLER, test "x$have_poppler" = "xyes")
##################################################################
+# Check for tracker-extract: libgxps for XPS
+##################################################################
+
+AC_ARG_ENABLE(libgxps,
+ AS_HELP_STRING([--enable-libgxps],
+ [enable extractor for PDF data [[default=auto]]]),,
+ [enable_libgxps=auto])
+
+if test "x$enable_libgxps" != "xno" ; then
+ PKG_CHECK_MODULES(LIBGXPS,
+ [libgxps],
+ [have_libgxps=yes],
+ [have_libgxps=no])
+
+ AC_SUBST(LIBGXPS_CFLAGS)
+ AC_SUBST(LIBGXPS_LIBS)
+
+ if test "x$have_libgxps" = "xyes"; then
+ AC_DEFINE(HAVE_LIBGXPS, [], [Define if we have libgxps])
+ fi
+else
+ have_libgxps="no (disabled)"
+fi
+
+if test "x$enable_libgxps" = "xyes"; then
+ if test "x$have_libgxps" != "xyes"; then
+ AC_MSG_ERROR([Couldn't find libgxps.])
+ fi
+fi
+
+AM_CONDITIONAL(HAVE_LIBGXPS, test "x$have_libgxps" = "xyes")
+
+##################################################################
# Check for tracker-extract: libgsf
##################################################################
@@ -2425,6 +2458,7 @@ Metadata Extractors:
Support libstreamanalyzer: $have_libstreamanalyzer
Support PNG: yes
Support PDF: $have_poppler
+ Support XPS: $have_libgxps
Support GIF: $have_libgif (xmp: $have_exempi)
Support JPEG: $have_libjpeg (xmp: $have_exempi, exif: $have_libexif, iptc: $have_libiptcdata)
Support TIFF: $have_libtiff (xmp: $have_exempi, exif: yes, iptc: $have_libiptcdata)
diff --git a/src/tracker-extract/10-xps.rule.in b/src/tracker-extract/10-xps.rule.in
new file mode 100644
index 000000000..0ab63c678
--- /dev/null
+++ b/src/tracker-extract/10-xps.rule.in
@@ -0,0 +1,4 @@
+[ExtractorRule]
+ModulePath=@modulesdir@/libextract-xps.so
+MimeTypes=application/oxps;application/vnd.ms-xpsdocument;
+FallbackRdfType=nfo:Document
diff --git a/src/tracker-extract/Makefile.am b/src/tracker-extract/Makefile.am
index e8d532006..a3ccff9e0 100644
--- a/src/tracker-extract/Makefile.am
+++ b/src/tracker-extract/Makefile.am
@@ -35,6 +35,7 @@ rules_in_files = \
10-tiff.rule.in \
10-vorbis.rule.in \
10-xmp.rule.in \
+ 10-xps.rule.in \
11-iso.rule.in \
11-msoffice-xml.rule.in \
15-gstreamer-guess.rule.in \
@@ -114,6 +115,11 @@ modules_LTLIBRARIES += \
rules_DATA += 10-epub.rule 10-oasis.rule 10-msoffice.rule 11-msoffice-xml.rule
endif
+if HAVE_LIBGXPS
+modules_LTLIBRARIES += libextract-xps.la
+rules_DATA += 10-xps.rule
+endif
+
if HAVE_POPPLER
modules_LTLIBRARIES += libextract-pdf.la
rules_DATA += 10-pdf.rule
@@ -308,6 +314,19 @@ libextract_msoffice_xml_la_LIBADD = \
$(BUILD_LIBS) \
$(TRACKER_EXTRACT_MODULES_LIBS)
+# XPS
+libextract_xps_la_SOURCES = tracker-extract-xps.c
+libextract_xps_la_CFLAGS = \
+ $(TRACKER_EXTRACT_MODULES_CFLAGS) \
+ $(LIBGXPS_CFLAGS)
+libextract_xps_la_LDFLAGS = $(module_flags)
+libextract_xps_la_LIBADD = \
+ $(top_builddir)/src/libtracker-extract/libtracker-extract-@TRACKER_API_VERSION@.la \
+ $(top_builddir)/src/libtracker-common/libtracker-common.la \
+ $(BUILD_LIBS) \
+ $(TRACKER_EXTRACT_MODULES_LIBS) \
+ $(LIBGXPS_LIBS)
+
# PDF
libextract_pdf_la_SOURCES = tracker-extract-pdf.c
libextract_pdf_la_CFLAGS = \
diff --git a/src/tracker-extract/tracker-extract-xps.c b/src/tracker-extract/tracker-extract-xps.c
new file mode 100644
index 000000000..537f768d0
--- /dev/null
+++ b/src/tracker-extract/tracker-extract-xps.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2012, Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <glib.h>
+#include <gmodule.h>
+
+#include <libgxps/gxps.h>
+
+#include <libtracker-extract/tracker-extract.h>
+
+G_MODULE_EXPORT gboolean
+tracker_extract_get_metadata (TrackerExtractInfo *info)
+{
+ TrackerSparqlBuilder *metadata;
+ GXPSDocument *document;
+ GXPSFile *xps_file;
+ GFile *file;
+ gchar *filename;
+ GError *error = NULL;
+
+ g_type_init ();
+
+ metadata = tracker_extract_info_get_metadata_builder (info);
+ file = tracker_extract_info_get_file (info);
+ xps_file = gxps_file_new (file, &error);
+ filename = g_file_get_path (file);
+
+ if (error != NULL) {
+ g_warning ("Unable to open '%s': %s", filename, error->message);
+ g_error_free (error);
+ g_free (filename);
+ return FALSE;
+ }
+
+ document = gxps_file_get_document (xps_file, 0, &error);
+ g_object_unref (xps_file);
+
+ if (error != NULL) {
+ g_warning ("Unable to read '%s': %s", filename, error->message);
+ g_error_free (error);
+ g_free (filename);
+ return FALSE;
+ }
+
+ tracker_sparql_builder_predicate (metadata, "a");
+ tracker_sparql_builder_object (metadata, "nfo:PaginatedTextDocument");
+
+ tracker_sparql_builder_predicate (metadata, "nfo:pageCount");
+ tracker_sparql_builder_object_int64 (metadata, gxps_document_get_n_pages (document));
+
+ g_object_unref (document);
+ g_free (filename);
+
+ return TRUE;
+}