diff options
Diffstat (limited to 'src/libtracker-extract/tracker-iptc.c')
-rw-r--r-- | src/libtracker-extract/tracker-iptc.c | 335 |
1 files changed, 0 insertions, 335 deletions
diff --git a/src/libtracker-extract/tracker-iptc.c b/src/libtracker-extract/tracker-iptc.c deleted file mode 100644 index 68edda780..000000000 --- a/src/libtracker-extract/tracker-iptc.c +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (C) 2009, 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 "config.h" - -#include <string.h> - -#include "tracker-iptc.h" -#include "tracker-utils.h" - -#ifdef HAVE_LIBIPTCDATA - -#include <libiptcdata/iptc-data.h> -#include <libiptcdata/iptc-dataset.h> - -#define IPTC_DATE_FORMAT "%Y %m %d" - -/** - * SECTION:tracker-iptc - * @title: IPTC - * @short_description: Information Interchange Model (IIM) / - * International Press Telecommunications Council (IPTC) - * @stability: Stable - * @include: libtracker-extract/tracker-extract.h - * - * The Information Interchange Model (IIM) is a file structure and set - * of metadata attributes that can be applied to text, images and - * other media types. It was developed in the early 1990s by the - * International Press Telecommunications Council (IPTC) to expedite - * the international exchange of news among newspapers and news - * agencies. - * - * The full IIM specification includes a complex data structure and a - * set of metadata definitions. - * - * Although IIM was intended for use with all types of news items — - * including simple text articles — a subset found broad worldwide - * acceptance as the standard embedded metadata used by news and - * commercial photographers. Information such as the name of the - * photographer, copyright information and the caption or other - * description can be embedded either manually or automatically. - * - * IIM metadata embedded in images are often referred to as "IPTC - * headers," and can be easily encoded and decoded by most popular - * photo editing software. - * - * The Extensible Metadata Platform (XMP) has largely superseded IIM's - * file structure, but the IIM image attributes are defined in the - * IPTC Core schema for XMP and most image manipulation programs keep - * the XMP and non-XMP IPTC attributes synchronized. - * - * This API is provided to remove code duplication between extractors - * using these standards. - **/ - -static const gchar * -fix_iptc_orientation (const gchar *orientation) -{ - if (g_strcmp0 (orientation, "P") == 0) { - return "nfo:orientation-left"; - } - - return "nfo:orientation-top"; /* We take this as default */ -} - -static void -foreach_dataset (IptcDataSet *dataset, - void *user_data) -{ - TrackerIptcData *data = user_data; - gchar mbuffer[1024]; - - /* The meaning of dataset->tag DEPENDS on the value of dataset->record. - * See iptc-tag.h for the relationship. - * - * Now, We only want record-2 tags, otherwise we'll end up mixing - * for example IPTC_TAG_CITY and IPTC_TAG_CHARACTER_SET, which BOTH - * have a value of 90. */ - if (dataset->record != IPTC_RECORD_APP_2) - return; - - switch (dataset->tag) { - case IPTC_TAG_KEYWORDS: - if (!data->keywords) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->keywords = g_strdup (mbuffer); - } else { - gchar *tmp = data->keywords; - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->keywords = g_strdup_printf ("%s, %s", data->keywords, mbuffer); - g_free (tmp); - } - break; - - case IPTC_TAG_DATE_CREATED: - if (!data->date_created) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - /* From: ex; date "2007 04 15" - * To : ex. "2007-04-15T00:00:00+0200 where +0200 is offset w.r.t gmt */ - data->date_created = tracker_date_format_to_iso8601 (mbuffer, IPTC_DATE_FORMAT); - } - break; - - case IPTC_TAG_BYLINE: - if (!data->byline) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->byline = g_strdup (mbuffer); - } - break; - - case IPTC_TAG_CREDIT: - if (!data->credit) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->credit = g_strdup (mbuffer); - } - break; - - case IPTC_TAG_COPYRIGHT_NOTICE: - if (!data->copyright_notice) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->copyright_notice = g_strdup (mbuffer); - } - break; - - case IPTC_TAG_IMAGE_ORIENTATION: - if (!data->image_orientation) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->image_orientation = g_strdup (fix_iptc_orientation (mbuffer)); - } - break; - - case IPTC_TAG_BYLINE_TITLE: - if (!data->byline_title) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->byline_title = g_strdup (mbuffer); - } - break; - - case IPTC_TAG_CITY: - if (!data->city) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->city = g_strdup (mbuffer); - } - break; - - case IPTC_TAG_STATE: - if (!data->state) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->state = g_strdup (mbuffer); - } - break; - - case IPTC_TAG_SUBLOCATION: - if (!data->sublocation) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->sublocation = g_strdup (mbuffer); - } - break; - - case IPTC_TAG_COUNTRY_NAME: - if (!data->country_name) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->country_name = g_strdup (mbuffer); - } - break; - - case IPTC_TAG_CONTACT: - if (!data->contact) { - iptc_dataset_get_as_str (dataset, mbuffer, 1024); - data->contact = g_strdup (mbuffer); - } - break; - - default: - break; - } -} - -#endif /* HAVE_LIBIPTCDATA */ - -static gboolean -parse_iptc (const unsigned char *buffer, - size_t len, - const gchar *uri, - TrackerIptcData *data) -{ -#ifdef HAVE_LIBIPTCDATA - IptcData *iptc; -#endif /* HAVE_LIBIPTCDATA */ - - memset (data, 0, sizeof (TrackerIptcData)); - -#ifdef HAVE_LIBIPTCDATA - - /* FIXME According to valgrind this is leaking (together with the unref). - * Problem in libiptc (I replaced this with the _free equivalent) */ - - iptc = iptc_data_new (); - - if (!iptc) - return FALSE; - - if (iptc_data_load (iptc, buffer, len) < 0) { - iptc_data_free (iptc); - return FALSE; - } - - iptc_data_foreach_dataset (iptc, foreach_dataset, data); - iptc_data_free (iptc); -#endif /* HAVE_LIBIPTCDATA */ - - return TRUE; -} - -#ifndef TRACKER_DISABLE_DEPRECATED - -// LCOV_EXCL_START - -/** - * tracker_iptc_read: - * @buffer: a chunk of data with iptc data in it. - * @len: the size of @buffer. - * @uri: the URI this is related to. - * @data: a pointer to a TrackerIptcData struture to populate. - * - * This function takes @len bytes of @buffer and runs it through the - * IPTC library. The result is that @data is populated with the IPTC - * data found in @uri. - * - * Returns: %TRUE if the @data was populated successfully, otherwise - * %FALSE is returned. - * - * Since: 0.8 - * - * Deprecated: 0.9. Use tracker_iptc_new() instead. - **/ -gboolean -tracker_iptc_read (const unsigned char *buffer, - size_t len, - const gchar *uri, - TrackerIptcData *data) -{ - g_return_val_if_fail (buffer != NULL, FALSE); - g_return_val_if_fail (len > 0, FALSE); - g_return_val_if_fail (uri != NULL, FALSE); - g_return_val_if_fail (data != NULL, FALSE); - - return parse_iptc (buffer, len, uri, data); -} - -// LCOV_EXCL_STOP - -#endif /* TRACKER_DISABLE_DEPRECATED */ - -/** - * tracker_iptc_new: - * @buffer: a chunk of data with iptc data in it. - * @len: the size of @buffer. - * @uri: the URI this is related to. - * - * This function takes @len bytes of @buffer and runs it through the - * IPTC library. - * - * Returns: a newly allocated #TrackerIptcData struct if IPTC data was - * found, %NULL otherwise. Free the returned struct with - * tracker_iptc_free(). - * - * Since: 0.10 - **/ -TrackerIptcData * -tracker_iptc_new (const guchar *buffer, - gsize len, - const gchar *uri) -{ - TrackerIptcData *data; - - g_return_val_if_fail (buffer != NULL, NULL); - g_return_val_if_fail (len > 0, NULL); - g_return_val_if_fail (uri != NULL, NULL); - - data = g_new0 (TrackerIptcData, 1); - - if (!parse_iptc (buffer, len, uri, data)) { - tracker_iptc_free (data); - return NULL; - } - - return data; -} - -/** - * tracker_iptc_free: - * @data: a #TrackerIptcData - * - * Frees @data and all #TrackerIptcData members. %NULL will produce a - * a warning. - * - * Since: 0.10 - **/ -void -tracker_iptc_free (TrackerIptcData *data) -{ - g_return_if_fail (data != NULL); - - g_free (data->keywords); - g_free (data->date_created); - g_free (data->byline); - g_free (data->credit); - g_free (data->copyright_notice); - g_free (data->image_orientation); - g_free (data->byline_title); - g_free (data->city); - g_free (data->state); - g_free (data->sublocation); - g_free (data->country_name); - g_free (data->contact); - - g_free (data); -} |