diff options
Diffstat (limited to 'src/tracker-extract/tracker-gsf.c')
-rw-r--r-- | src/tracker-extract/tracker-gsf.c | 176 |
1 files changed, 0 insertions, 176 deletions
diff --git a/src/tracker-extract/tracker-gsf.c b/src/tracker-extract/tracker-gsf.c deleted file mode 100644 index 592a37bb8..000000000 --- a/src/tracker-extract/tracker-gsf.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2010, Nokia <ivan.frade@nokia.com> - * - * 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 <errno.h> -#include <string.h> - -#include <glib.h> - -#include <libtracker-common/tracker-file-utils.h> - -#include <gsf/gsf.h> -#include <gsf/gsf-infile.h> -#include <gsf/gsf-input-stdio.h> -#include <gsf/gsf-infile-zip.h> - -#include "tracker-gsf.h" - -/* Size of the buffer to use */ -#define XML_BUFFER_SIZE 8192 /* bytes */ -/* Note: 20 MBytes of max size is really assumed to be a safe limit. */ -#define XML_MAX_BYTES_READ (20u << 20) /* bytes */ - -/** - * based on find_member() from vsd_utils.c: - * http://vsdump.sourcearchive.com/documentation/0.0.44/vsd__utils_8c-source.html - */ -static GsfInput * -find_member (GsfInfile *arch, - gchar const *name) -{ - gchar const *slash; - - slash = strchr (name, '/'); - - if (slash) { - gchar *dirname; - GsfInput *member; - - dirname = g_strndup (name, slash - name); - - /** - * Ignore if the directory is the current one that is ".". - * Go to next direcotry if exists - */ - - if (strcmp (dirname, ".") == 0) { - member = find_member (arch, slash + 1); - } else if ((member = gsf_infile_child_by_name (arch, dirname)) != NULL) { - GsfInfile *dir; - - dir = GSF_INFILE (member); - member = find_member (dir, slash + 1); - g_object_unref (dir); - } - - g_free (dirname); - return member; - } else { - return gsf_infile_child_by_name (arch, name); - } -} - -/** - * tracker_gsf_parse_xml_in_zip: - * @zip_file_uri: URI of the ZIP archive - * @xml_filename: Name of the XML file stored inside the ZIP archive - * @context: Markup context to be used when parsing the XML - * - * This function reads and parses the contents of an XML file stored - * inside a ZIP compressed archive. Reading and parsing is done buffered, and - * maximum size of the uncompressed XML file is limited to be to 20MBytes. - */ -void -tracker_gsf_parse_xml_in_zip (const gchar *zip_file_uri, - const gchar *xml_filename, - GMarkupParseContext *context, - GError **err) -{ - gchar *filename; - GError *error = NULL; - GsfInfile *infile = NULL; - GsfInput *src = NULL; - GsfInput *member = NULL; - FILE *file; - - g_debug ("Parsing '%s' XML file contained inside zip archive...", - xml_filename); - - /* Get filename from the given URI */ - if ((filename = g_filename_from_uri (zip_file_uri, - NULL, &error)) == NULL) { - g_warning ("Can't get filename from uri '%s': %s", - zip_file_uri, error ? error->message : "no error given"); - } else { /* Create a new Input GSF object for the given file */ - - file = tracker_file_open (filename); - if (!file) { - g_warning ("Can't open file from uri '%s': %s", - zip_file_uri, g_strerror (errno)); - } else if ((src = gsf_input_stdio_new_FILE (filename, file, TRUE)) == NULL) { - g_warning ("Failed creating a GSF Input object for '%s': %s", - zip_file_uri, error ? error->message : "no error given"); - } - /* Input object is a Zip file */ - else if ((infile = gsf_infile_zip_new (src, &error)) == NULL) { - g_warning ("'%s' Not a zip file: %s", - zip_file_uri, error ? error->message : "no error given"); - } - /* Look for requested filename inside the ZIP file */ - else if ((member = find_member (infile, xml_filename)) == NULL) { - g_warning ("No member '%s' in zip file '%s'", - xml_filename, zip_file_uri); - } - /* Load whole contents of the internal file in the xml buffer */ - else { - guint8 buf[XML_BUFFER_SIZE]; - size_t remaining_size, chunk_size, accum; - - /* Get whole size of the contents to read */ - remaining_size = (size_t) gsf_input_size (GSF_INPUT (member)); - - /* Note that gsf_input_read() needs to be able to read ALL specified - * number of bytes, or it will fail */ - chunk_size = MIN (remaining_size, XML_BUFFER_SIZE); - - accum = 0; - while (!error && - accum <= XML_MAX_BYTES_READ && - chunk_size > 0 && - gsf_input_read (GSF_INPUT (member), chunk_size, buf) != NULL) { - - /* update accumulated count */ - accum += chunk_size; - - /* Pass the read stream to the context parser... */ - g_markup_parse_context_parse (context, buf, chunk_size, &error); - - /* update bytes to be read */ - remaining_size -= chunk_size; - chunk_size = MIN (remaining_size, XML_BUFFER_SIZE); - } - } - - if (file) { - tracker_file_close (file, FALSE); - } - } - - g_free (filename); - - if (error) - g_propagate_error (err, error); - if (infile) - g_object_unref (infile); - if (src) - g_object_unref (src); - if (member) - g_object_unref (member); -} - |