summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2018-06-04 14:25:29 +0200
committerBastien Nocera <hadess@hadess.net>2018-07-13 13:15:41 +0200
commit3945c9c009ae4955b3ccc9018191b45fe85a1621 (patch)
treeaf95a28fe9dc8399e7e12ae404411bddb51e6c7e
parentd22b15599ff8554377e0dab493673754f615b49d (diff)
downloadtotem-pl-parser-3945c9c009ae4955b3ccc9018191b45fe85a1621.tar.gz
podcast: Remove GMIME dependency
And use an internal copy of the one function we're interested in.
-rw-r--r--README1
-rw-r--r--meson.build31
-rw-r--r--meson_options.txt2
-rw-r--r--plparse/meson.build1
-rw-r--r--plparse/totem-pl-parser-decode-date.c560
-rw-r--r--plparse/totem-pl-parser-decode-date.h23
-rw-r--r--plparse/totem-pl-parser-podcast.c28
-rw-r--r--plparse/totem-pl-parser-podcast.h7
-rw-r--r--plparse/totem-pl-parser.c13
-rw-r--r--totem-plparser.pc.in4
10 files changed, 587 insertions, 83 deletions
diff --git a/README b/README
index 7e4e299..a0aee8f 100644
--- a/README
+++ b/README
@@ -16,7 +16,6 @@ Dependencies
============
glib >= 2.36
-gmime >= 2.6 or >= 3.0
libxml2
libquvi >= 0.9.1 (optional)
diff --git a/meson.build b/meson.build
index e6cdf9d..fce5832 100644
--- a/meson.build
+++ b/meson.build
@@ -136,37 +136,6 @@ foreach cflag: test_cflags
endif
endforeach
-# gmime dependency
-enable_gmime = not get_option('disable-gmime-i-know-what-im-doing')
-if enable_gmime
- have_gmime3 = false
- gmime_dep = dependency('gmime-3.0', required : false)
- if gmime_dep.found()
- cdata.set('HAVE_GMIME3', true,
- description: 'GMime 3.0 available in the system')
- pkgconf.set('GMIME', 'gmime-3.0')
- else
- gmime_dep = dependency('gmime-2.6', required : false)
- if not gmime_dep.found()
- error('libgmime is required to compile totem-pl-parser.')
- endif
- pkgconf.set('GMIME', 'gmime-2.6')
- endif
- pkgconf.set('USEGMIME', 'yes')
- cdata.set('HAVE_GMIME', true,
- description: 'GMime available in the system')
- totem_pl_parser_deps += [gmime_dep]
-else
- message('''
-**************************************************************
- Compiling totem-pl-parser without libgmime.
- This will break podcast support and is completely unsupported.
-**************************************************************
- ''')
- pkgconf.set('USEGMIME', 'no')
- pkgconf.set('GMIME', '')
-endif
-
# quvi dependency
enable_quvi = get_option('enable-quvi')
have_quvi = false
diff --git a/meson_options.txt b/meson_options.txt
index 8888ba8..9c32a5f 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,5 +1,3 @@
-option('disable-gmime-i-know-what-im-doing', type: 'boolean', value: 'false',
- description : 'Disable libgmime (Unsupported, breaks Podcast support).')
option('enable-quvi', type: 'combo', choices : ['yes', 'no', 'auto'], value : 'auto',
description : 'Enable libquvi support.')
option('enable-libarchive', type: 'combo', choices : ['yes', 'no', 'auto'], value : 'auto',
diff --git a/plparse/meson.build b/plparse/meson.build
index bbc3757..48b0556 100644
--- a/plparse/meson.build
+++ b/plparse/meson.build
@@ -34,6 +34,7 @@ plparser_sources = [
'totem-disc.c',
'totem-pl-parser.c',
'totem-pl-parser-amz.c',
+ 'totem-pl-parser-decode-date.c',
'totem-pl-parser-lines.c',
'totem-pl-parser-media.c',
'totem-pl-parser-misc.c',
diff --git a/plparse/totem-pl-parser-decode-date.c b/plparse/totem-pl-parser-decode-date.c
new file mode 100644
index 0000000..0111ffb
--- /dev/null
+++ b/plparse/totem-pl-parser-decode-date.c
@@ -0,0 +1,560 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* GMime
+ * Copyright (C) 2000-2017 Jeffrey Stedfast
+ *
+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+
+#include <config.h>
+
+#include "totem-pl-parser-decode-date.h"
+
+#define d(x)
+
+/* date parser macros */
+#define DATE_TOKEN_NON_NUMERIC (1 << 0)
+#define DATE_TOKEN_NON_WEEKDAY (1 << 1)
+#define DATE_TOKEN_NON_MONTH (1 << 2)
+#define DATE_TOKEN_NON_TIME (1 << 3)
+#define DATE_TOKEN_HAS_COLON (1 << 4)
+#define DATE_TOKEN_NON_TIMEZONE_ALPHA (1 << 5)
+#define DATE_TOKEN_NON_TIMEZONE_NUMERIC (1 << 6)
+#define DATE_TOKEN_HAS_SIGN (1 << 7)
+
+static unsigned char gmime_datetok_table[256] = {
+ 128,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111, 79, 79,111,175,111,175,111,111,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,119,111,111,111,111,111,
+ 111, 75,111, 79, 75, 79,105, 79,111,111,107,111,111, 73, 75,107,
+ 79,111,111, 73, 77, 79,111,109,111, 79, 79,111,111,111,111,111,
+ 111,105,107,107,109,105,111,107,105,105,111,111,107,107,105,105,
+ 107,111,105,105,105,105,107,111,111,105,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+};
+
+/* Timezone values defined in rfc5322 */
+static struct {
+ const char *name;
+ int offset;
+} tz_offsets [] = {
+ { "UT", 0 },
+ { "GMT", 0 },
+ { "EDT", -400 },
+ { "EST", -500 },
+ { "CDT", -500 },
+ { "CST", -600 },
+ { "MDT", -600 },
+ { "MST", -700 },
+ { "PDT", -700 },
+ { "PST", -800 },
+ /* Note: rfc822 got the signs backwards for the military
+ * timezones so some sending clients may mistakenly use the
+ * wrong values. */
+ { "A", 100 },
+ { "B", 200 },
+ { "C", 300 },
+ { "D", 400 },
+ { "E", 500 },
+ { "F", 600 },
+ { "G", 700 },
+ { "H", 800 },
+ { "I", 900 },
+ { "K", 1000 },
+ { "L", 1100 },
+ { "M", 1200 },
+ { "N", -100 },
+ { "O", -200 },
+ { "P", -300 },
+ { "Q", -400 },
+ { "R", -500 },
+ { "S", -600 },
+ { "T", -700 },
+ { "U", -800 },
+ { "V", -900 },
+ { "W", -1000 },
+ { "X", -1100 },
+ { "Y", -1200 },
+ { "Z", 0 },
+};
+
+static char *tm_months[] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+
+static char *tm_days[] = {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+};
+
+
+/* This is where it gets ugly... */
+
+typedef struct _date_token {
+ struct _date_token *next;
+ unsigned char mask;
+ const char *start;
+ size_t len;
+} date_token;
+
+#define date_token_free(tok) g_slice_free (date_token, tok)
+#define date_token_new() g_slice_new (date_token)
+
+static date_token *
+datetok (const char *date)
+{
+ date_token tokens, *token, *tail;
+ const char *start, *end;
+ unsigned char mask;
+
+ tail = (date_token *) &tokens;
+ tokens.next = NULL;
+
+ start = date;
+ while (*start) {
+ /* kill leading whitespace */
+ while (*start == ' ' || *start == '\t')
+ start++;
+
+ if (*start == '\0')
+ break;
+
+ mask = gmime_datetok_table[(unsigned char) *start];
+
+ /* find the end of this token */
+ end = start + 1;
+ while (*end && !strchr ("-/,\t\r\n ", *end))
+ mask |= gmime_datetok_table[(unsigned char) *end++];
+
+ if (end != start) {
+ token = date_token_new ();
+ token->next = NULL;
+ token->start = start;
+ token->len = end - start;
+ token->mask = mask;
+
+ tail->next = token;
+ tail = token;
+ }
+
+ if (*end)
+ start = end + 1;
+ else
+ break;
+ }
+
+ return tokens.next;
+}
+
+static int
+decode_int (const char *in, size_t inlen)
+{
+ register const char *inptr = in;
+ const char *inend = in + inlen;
+ int val = 0;
+
+ while (inptr < inend) {
+ if (!(*inptr >= '0' && *inptr <= '9'))
+ return -1;
+ if (val > (INT_MAX - (*inptr - '0')) / 10)
+ return -1;
+ val = (val * 10) + (*inptr - '0');
+ inptr++;
+ }
+
+ return val;
+}
+
+static int
+get_wday (const char *in, size_t inlen)
+{
+ int wday;
+
+ g_return_val_if_fail (in != NULL, -1);
+
+ if (inlen < 3)
+ return -1;
+
+ for (wday = 0; wday < 7; wday++) {
+ if (!g_ascii_strncasecmp (in, tm_days[wday], 3))
+ return wday;
+ }
+
+ return -1; /* unknown week day */
+}
+
+static int
+get_mday (const char *in, size_t inlen)
+{
+ int mday;
+
+ g_return_val_if_fail (in != NULL, -1);
+
+ mday = decode_int (in, inlen);
+
+ if (mday < 0 || mday > 31)
+ mday = -1;
+
+ return mday;
+}
+
+static int
+get_month (const char *in, size_t inlen)
+{
+ int i;
+
+ g_return_val_if_fail (in != NULL, -1);
+
+ if (inlen < 3)
+ return -1;
+
+ for (i = 0; i < 12; i++) {
+ if (!g_ascii_strncasecmp (in, tm_months[i], 3))
+ return i + 1;
+ }
+
+ return -1; /* unknown month */
+}
+
+static int
+get_year (const char *in, size_t inlen)
+{
+ int year;
+
+ g_return_val_if_fail (in != NULL, -1);
+
+ if ((year = decode_int (in, inlen)) == -1)
+ return -1;
+
+ if (year < 100)
+ year += (year < 70) ? 2000 : 1900;
+
+ if (year < 1969)
+ return -1;
+
+ return year;
+}
+
+static gboolean
+get_time (const char *in, size_t inlen, int *hour, int *min, int *sec)
+{
+ register const char *inptr;
+ int *val, max, colons = 0;
+ const char *inend;
+
+ *hour = *min = *sec = 0;
+
+ inend = in + inlen;
+ val = hour;
+ max = 23;
+ for (inptr = in; inptr < inend; inptr++) {
+ if (*inptr == ':') {
+ colons++;
+ switch (colons) {
+ case 1:
+ val = min;
+ max = 59;
+ break;
+ case 2:
+ val = sec;
+ max = 60;
+ break;
+ default:
+ return FALSE;
+ }
+ } else if (!(*inptr >= '0' && *inptr <= '9'))
+ return FALSE;
+ else {
+ *val = (*val * 10) + (*inptr - '0');
+ if (*val > max)
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static GTimeZone *
+get_tzone (date_token **token)
+{
+ const char *inptr, *inend;
+ char tzone[8];
+ size_t len, n;
+ int value, i;
+ guint t;
+
+ for (i = 0; *token && i < 2; *token = (*token)->next, i++) {
+ inptr = (*token)->start;
+ len = (*token)->len;
+ inend = inptr + len;
+
+ if (len >= 6)
+ continue;
+
+ if (len == 5 && (*inptr == '+' || *inptr == '-')) {
+ if ((value = decode_int (inptr + 1, len - 1)) == -1)
+ return NULL;
+
+ memcpy (tzone, inptr, len);
+ tzone[len] = '\0';
+
+ return g_time_zone_new (tzone);
+ }
+
+ if (*inptr == '(') {
+ inptr++;
+ if (*(inend - 1) == ')')
+ len -= 2;
+ else
+ len--;
+ }
+
+ for (t = 0; t < G_N_ELEMENTS (tz_offsets); t++) {
+ n = strlen (tz_offsets[t].name);
+
+ if (n != len || strncmp (inptr, tz_offsets[t].name, n) != 0)
+ continue;
+
+ snprintf (tzone, 6, "%+05d", tz_offsets[t].offset);
+
+ return g_time_zone_new (tzone);
+ }
+ }
+
+ return NULL;
+}
+
+static GDateTime *
+parse_rfc822_date (date_token *tokens)
+{
+ int year, month, day, hour, min, sec, n;
+ GTimeZone *tz = NULL;
+ date_token *token;
+ GDateTime *date;
+
+ token = tokens;
+
+ year = month = day = hour = min = sec = 0;
+
+ if ((n = get_wday (token->start, token->len)) != -1) {
+ /* not all dates may have this... */
+ token = token->next;
+ }
+
+ /* get the mday */
+ if (!token || (n = get_mday (token->start, token->len)) == -1)
+ return NULL;
+
+ token = token->next;
+ day = n;
+
+ /* get the month */
+ if (!token || (n = get_month (token->start, token->len)) == -1)
+ return NULL;
+
+ token = token->next;
+ month = n;
+
+ /* get the year */
+ if (!token || (n = get_year (token->start, token->len)) == -1)
+ return NULL;
+
+ token = token->next;
+ year = n;
+
+ /* get the hour/min/sec */
+ if (!token || !get_time (token->start, token->len, &hour, &min, &sec))
+ return NULL;
+
+ token = token->next;
+
+ /* get the timezone */
+ if (!token || !(tz = get_tzone (&token))) {
+ /* I guess we assume tz is GMT? */
+ tz = g_time_zone_new_utc ();
+ }
+
+ date = g_date_time_new (tz, year, month, day, hour, min, (gdouble) sec);
+ g_time_zone_unref (tz);
+
+ return date;
+}
+
+
+#define date_token_mask(t) (((date_token *) t)->mask)
+#define is_numeric(t) ((date_token_mask (t) & DATE_TOKEN_NON_NUMERIC) == 0)
+#define is_weekday(t) ((date_token_mask (t) & DATE_TOKEN_NON_WEEKDAY) == 0)
+#define is_month(t) ((date_token_mask (t) & DATE_TOKEN_NON_MONTH) == 0)
+#define is_time(t) (((date_token_mask (t) & DATE_TOKEN_NON_TIME) == 0) && (date_token_mask (t) & DATE_TOKEN_HAS_COLON))
+#define is_tzone_alpha(t) ((date_token_mask (t) & DATE_TOKEN_NON_TIMEZONE_ALPHA) == 0)
+#define is_tzone_numeric(t) (((date_token_mask (t) & DATE_TOKEN_NON_TIMEZONE_NUMERIC) == 0) && (date_token_mask (t) & DATE_TOKEN_HAS_SIGN))
+#define is_tzone(t) (is_tzone_alpha (t) || is_tzone_numeric (t))
+
+#define YEAR (1 << 0)
+#define MONTH (1 << 1)
+#define DAY (1 << 2)
+#define WEEKDAY (1 << 3)
+#define TIME (1 << 4)
+#define TZONE (1 << 5)
+
+static GDateTime *
+parse_broken_date (date_token *tokens)
+{
+ int year, month, day, hour, min, sec, n;
+ GTimeZone *tz = NULL;
+ date_token *token;
+ GDateTime *date;
+ int mask;
+
+ year = month = day = hour = min = sec = 0;
+ mask = 0;
+
+ token = tokens;
+ while (token) {
+ if (is_weekday (token) && !(mask & WEEKDAY)) {
+ if ((n = get_wday (token->start, token->len)) != -1) {
+ d(printf ("weekday; "));
+ mask |= WEEKDAY;
+ goto next;
+ }
+ }
+
+ if (is_month (token) && !(mask & MONTH)) {
+ if ((n = get_month (token->start, token->len)) != -1) {
+ d(printf ("month; "));
+ mask |= MONTH;
+ month = n;
+ goto next;
+ }
+ }
+
+ if (is_time (token) && !(mask & TIME)) {
+ if (get_time (token->start, token->len, &hour, &min, &sec)) {
+ d(printf ("time; "));
+ mask |= TIME;
+ goto next;
+ }
+ }
+
+ if (is_tzone (token) && !(mask & TZONE)) {
+ date_token *t = token;
+
+ if ((tz = get_tzone (&t))) {
+ d(printf ("tzone; "));
+ mask |= TZONE;
+ goto next;
+ }
+ }
+
+ if (is_numeric (token)) {
+ if (token->len == 4 && !(mask & YEAR)) {
+ if ((n = get_year (token->start, token->len)) != -1) {
+ d(printf ("year; "));
+ mask |= YEAR;
+ year = n;
+ goto next;
+ }
+ } else {
+ /* Note: assumes MM-DD-YY ordering if '0 < MM < 12' holds true */
+ if (!(mask & MONTH) && token->next && is_numeric (token->next)) {
+ if ((n = decode_int (token->start, token->len)) > 12) {
+ goto mday;
+ } else if (n > 0) {
+ d(printf ("mon; "));
+ mask |= MONTH;
+ month = n;
+ }
+ goto next;
+ } else if (!(mask & DAY) && (n = get_mday (token->start, token->len)) != -1) {
+ mday:
+ d(printf ("mday; "));
+ mask |= DAY;
+ day = n;
+ goto next;
+ } else if (!(mask & YEAR)) {
+ if ((n = get_year (token->start, token->len)) != -1) {
+ d(printf ("2-digit year; "));
+ mask |= YEAR;
+ year = n;
+ }
+ goto next;
+ }
+ }
+ }
+
+ d(printf ("???; "));
+
+ next:
+
+ token = token->next;
+ }
+
+ d(printf ("\n"));
+
+ if (!(mask & (YEAR | MONTH | DAY | TIME))) {
+ if (tz != NULL)
+ g_time_zone_unref (tz);
+
+ return NULL;
+ }
+
+ if (tz == NULL)
+ tz = g_time_zone_new_utc ();
+
+ date = g_date_time_new (tz, year, month, day, hour, min, (gdouble) sec);
+ g_time_zone_unref (tz);
+
+ return date;
+}
+
+/**
+ * g_mime_utils_header_decode_date:
+ * @str: input date string
+ *
+ * Parses the rfc822 date string.
+ *
+ * Returns: (nullable) (transfer full): the #GDateTime representation of the date
+ * string specified by @str or %NULL on error.
+ **/
+GDateTime *
+g_mime_utils_header_decode_date (const char *str)
+{
+ date_token *token, *tokens;
+ GDateTime *date;
+
+ if (!(tokens = datetok (str)))
+ return NULL;
+
+ if (!(date = parse_rfc822_date (tokens)))
+ date = parse_broken_date (tokens);
+
+ /* cleanup */
+ while (tokens) {
+ token = tokens;
+ tokens = tokens->next;
+ date_token_free (token);
+ }
+
+ return date;
+}
diff --git a/plparse/totem-pl-parser-decode-date.h b/plparse/totem-pl-parser-decode-date.h
new file mode 100644
index 0000000..ebc0942
--- /dev/null
+++ b/plparse/totem-pl-parser-decode-date.h
@@ -0,0 +1,23 @@
+/* GMime
+ * Copyright (C) 2000-2018 Jeffrey Stedfast
+ *
+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include <glib.h>
+#include <stdio.h>
+
+GDateTime *g_mime_utils_header_decode_date (const char *str);
diff --git a/plparse/totem-pl-parser-podcast.c b/plparse/totem-pl-parser-podcast.c
index 62cca92..08e229f 100644
--- a/plparse/totem-pl-parser-podcast.c
+++ b/plparse/totem-pl-parser-podcast.c
@@ -294,9 +294,6 @@ totem_pl_parser_add_rss (TotemPlParser *parser,
TotemPlParseData *parse_data,
gpointer data)
{
-#ifndef HAVE_GMIME
- WARN_NO_GMIME;
-#else
xml_node_t* doc, *channel;
char *contents;
gsize size;
@@ -336,7 +333,6 @@ totem_pl_parser_add_rss (TotemPlParser *parser,
xml_parser_free_tree (doc);
return TOTEM_PL_PARSER_RESULT_SUCCESS;
-#endif /* !HAVE_GMIME */
}
/* http://www.apple.com/itunes/store/podcaststechspecs.html */
@@ -347,9 +343,6 @@ totem_pl_parser_add_itpc (TotemPlParser *parser,
TotemPlParseData *parse_data,
gpointer data)
{
-#ifndef HAVE_GMIME
- WARN_NO_GMIME;
-#else
TotemPlParserResult ret;
char *uri, *new_uri, *uri_scheme;
GFile *new_file;
@@ -368,7 +361,6 @@ totem_pl_parser_add_itpc (TotemPlParser *parser,
g_object_unref (new_file);
return ret;
-#endif /* !HAVE_GMIME */
}
TotemPlParserResult
@@ -378,9 +370,6 @@ totem_pl_parser_add_zune (TotemPlParser *parser,
TotemPlParseData *parse_data,
gpointer data)
{
-#ifndef HAVE_GMIME
- WARN_NO_GMIME;
-#else
TotemPlParserResult ret;
char *uri, *new_uri;
GFile *new_file;
@@ -407,7 +396,6 @@ totem_pl_parser_add_zune (TotemPlParser *parser,
g_object_unref (new_file);
return ret;
-#endif /* !HAVE_GMIME */
}
/* Atom docs:
@@ -545,9 +533,6 @@ totem_pl_parser_add_atom (TotemPlParser *parser,
TotemPlParseData *parse_data,
gpointer data)
{
-#ifndef HAVE_GMIME
- WARN_NO_GMIME;
-#else
xml_node_t* doc;
char *contents, *uri;
gsize size;
@@ -577,7 +562,6 @@ totem_pl_parser_add_atom (TotemPlParser *parser,
xml_parser_free_tree (doc);
return TOTEM_PL_PARSER_RESULT_SUCCESS;
-#endif /* !HAVE_GMIME */
}
TotemPlParserResult
@@ -587,9 +571,6 @@ totem_pl_parser_add_xml_feed (TotemPlParser *parser,
TotemPlParseData *parse_data,
gpointer data)
{
-#ifndef HAVE_GMIME
- WARN_NO_GMIME;
-#else
guint len;
if (data == NULL)
@@ -605,7 +586,6 @@ totem_pl_parser_add_xml_feed (TotemPlParser *parser,
return totem_pl_parser_add_opml (parser, file, base_file, parse_data, data);
return TOTEM_PL_PARSER_RESULT_UNHANDLED;
-#endif /* !HAVE_GMIME */
}
static char *
@@ -661,9 +641,6 @@ totem_pl_parser_add_itms (TotemPlParser *parser,
TotemPlParseData *parse_data,
gpointer data)
{
-#ifndef HAVE_GMIME
- WARN_NO_GMIME;
-#else
GFile *json_file, *feed_file;
TotemPlParserResult ret;
char *contents, *id, *json_uri, *feed_url;
@@ -706,7 +683,6 @@ totem_pl_parser_add_itms (TotemPlParser *parser,
g_object_unref (feed_file);
return ret;
-#endif /* !HAVE_GMIME */
}
gboolean
@@ -796,9 +772,6 @@ totem_pl_parser_add_opml (TotemPlParser *parser,
TotemPlParseData *parse_data,
gpointer data)
{
-#ifndef HAVE_GMIME
- WARN_NO_GMIME;
-#else
xml_node_t* doc;
char *contents, *uri;
gsize size;
@@ -828,7 +801,6 @@ totem_pl_parser_add_opml (TotemPlParser *parser,
xml_parser_free_tree (doc);
return TOTEM_PL_PARSER_RESULT_SUCCESS;
-#endif /* !HAVE_GMIME */
}
#endif /* !TOTEM_PL_PARSER_MINI */
diff --git a/plparse/totem-pl-parser-podcast.h b/plparse/totem-pl-parser-podcast.h
index c8fb934..5aba3d7 100644
--- a/plparse/totem-pl-parser-podcast.h
+++ b/plparse/totem-pl-parser-podcast.h
@@ -39,13 +39,6 @@ const char * totem_pl_parser_is_xml_feed (const char *data, gsize len);
#ifndef TOTEM_PL_PARSER_MINI
-#ifndef HAVE_GMIME
-#define WARN_NO_GMIME { \
- g_warning("Trying to parse a podcast, but totem-pl-parser built without libgmime support. Please contact your distribution provider."); \
- return TOTEM_PL_PARSER_RESULT_ERROR; \
-}
-#endif /* !HAVE_GMIME */
-
gboolean totem_pl_parser_is_itms_feed (GFile *file);
TotemPlParserResult totem_pl_parser_add_xml_feed (TotemPlParser *parser,
diff --git a/plparse/totem-pl-parser.c b/plparse/totem-pl-parser.c
index 505957a..7203fe8 100644
--- a/plparse/totem-pl-parser.c
+++ b/plparse/totem-pl-parser.c
@@ -132,16 +132,13 @@
#ifndef TOTEM_PL_PARSER_MINI
#include <gobject/gvaluecollector.h>
-#ifdef HAVE_GMIME
-#include <gmime/gmime-utils.h>
-#endif
-
#include "totem-pl-parser.h"
#include "totemplparser-marshal.h"
#include "totem-disc.h"
#endif /* !TOTEM_PL_PARSER_MINI */
#include "totem-pl-parser-mini.h"
+#include "totem-pl-parser-decode-date.h"
#include "totem-pl-parser-wm.h"
#include "totem-pl-parser-qt.h"
#include "totem-pl-parser-pls.h"
@@ -2345,7 +2342,6 @@ totem_pl_parser_parse_duration (const char *duration, gboolean debug)
guint64
totem_pl_parser_parse_date (const char *date_str, gboolean debug)
{
-#ifdef HAVE_GMIME
GTimeVal val;
g_return_val_if_fail (date_str != NULL, -1);
@@ -2358,7 +2354,6 @@ totem_pl_parser_parse_date (const char *date_str, gboolean debug)
}
D(g_message ("Failed to parse duration '%s' using the ISO8601 parser", date_str));
/* Fall back to RFC 2822 date parsing */
-#ifdef HAVE_GMIME3
{
g_autoptr(GDateTime) date = NULL;
date = g_mime_utils_header_decode_date (date_str);
@@ -2368,12 +2363,6 @@ totem_pl_parser_parse_date (const char *date_str, gboolean debug)
}
return val.tv_sec;
}
-#else
- return g_mime_utils_header_decode_date (date_str, NULL);
-#endif /* HAVE_GMIME3 */
-#else
- WARN_NO_GMIME;
-#endif /* HAVE_GMIME */
}
#endif /* !TOTEM_PL_PARSER_MINI */
diff --git a/totem-plparser.pc.in b/totem-plparser.pc.in
index 16f9240..c41b06d 100644
--- a/totem-plparser.pc.in
+++ b/totem-plparser.pc.in
@@ -7,8 +7,8 @@ Name: totem-plparser
Description: Totem Playlist Parser library
Version: @VERSION@
Requires: glib-2.0 gobject-2.0 gio-2.0
-Requires.private: gthread-2.0 libxml-2.0 @GMIME@ @ARCHIVE@
+Requires.private: gthread-2.0 libxml-2.0 @ARCHIVE@
Libs: -L${libdir} -ltotem-plparser
Libs.private: @LIBGCRYPT_LIBS@
Cflags: -I${includedir}/totem-pl-parser/1/plparser @LIBGCRYPT_CFLAGS@
-uselibcamel=@USEGMIME@
+uselibcamel=true