claws-mail/src/plugins/rssyl/old_feeds.c
Andrej Kacian 0faddd1e85 Use g_dir_open() and friends instead of opendir() and friends.
This makes more things work on Windows, since Mingw
opendir() is kind of flakey, and breaks e.g. vcalendar or rssyl
being able to read contents of their folders.

I only left opendir() in archive plugin, since it is only found
in unused part of code (excluded by #ifdef _TEST, which is never
true for claws-mail compilations).
2015-06-29 11:35:13 +02:00

168 lines
4.3 KiB
C

/*
* Copyright (C) 2012 Andrej Kacian <andrej@kacian.sk>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/* Expat parser for old feeds.xml */
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <expat.h>
#include <alertpanel.h>
#include <common/utils.h>
#include "libfeed/parser.h"
#include "old_feeds.h"
#include "rssyl.h"
struct _oldrssyl_ctx {
GSList *oldfeeds;
};
static void _elparse_start_oldrssyl(void *data, const gchar *el,
const gchar **attr)
{
struct _oldrssyl_ctx *ctx = data;
OldRFeed *of;
gchar *tmp;
#define GETVAL_STR(name) (g_strdup(feed_parser_get_attribute_value(attr, name)))
#define GETVAL_INT(name) \
((tmp = feed_parser_get_attribute_value(attr, name)) == NULL ? 0 : \
(gint)atoi(tmp))
if (!strcmp(el, "feed")) {
of = g_new0(OldRFeed, 1);
of->name = GETVAL_STR("name");
of->official_name = GETVAL_STR("official_name");
of->url = GETVAL_STR("url");
of->default_refresh_interval = GETVAL_INT("default_refresh_interval");
of->refresh_interval = GETVAL_INT("refresh_interval");
of->expired_num = GETVAL_INT("expired_num");
of->fetch_comments = GETVAL_INT("fetch_comments");
of->fetch_comments_for = GETVAL_INT("fetch_comments_for");
of->silent_update = GETVAL_INT("silent_update");
of->ssl_verify_peer = GETVAL_INT("ssl_verify_peer");
debug_print("RSSyl: old feeds.xml: Adding '%s' (%s).\n", of->name,
of->url);
ctx->oldfeeds = g_slist_prepend(ctx->oldfeeds, of);
}
return;
}
static void _elparse_end_oldrssyl(void *data, const gchar *el)
{
return;
}
GSList *rssyl_old_feed_metadata_parse(gchar *filepath)
{
XML_Parser parser;
GSList *oldfeeds = NULL;
gchar *contents = NULL;
gsize length;
GError *error = NULL;
struct _oldrssyl_ctx *ctx;
debug_print("RSSyl: Starting to parse old feeds.xml\n");
/* Read contents of the file into memory */
if (!g_file_get_contents(filepath, &contents, &length, &error)) {
alertpanel_error(_("Couldn't read contents of old feeds.xml file:\n%s"),
error->message);
debug_print("RSSyl: Couldn't read contents of feeds.xml\n");
g_error_free(error);
return NULL;
}
/* Set up expat parser */
parser = XML_ParserCreate(NULL);
ctx = g_new0(struct _oldrssyl_ctx, 1);
ctx->oldfeeds = NULL;
XML_SetUserData(parser, ctx);
XML_SetElementHandler(parser,
_elparse_start_oldrssyl,
_elparse_end_oldrssyl);
/* Parse the XML, our output ending up in oldfeeds */
XML_Parse(parser, contents, length, 1);
/* And clean up */
XML_ParserFree(parser);
g_free(contents);
oldfeeds = ctx->oldfeeds;
g_free(ctx);
debug_print("RSSyl: old feeds.xml: added %d items in total\n",
g_slist_length(oldfeeds));
return oldfeeds;
}
static void _free_old_feed_entry(gpointer d, gpointer user_data)
{
OldRFeed *of = (OldRFeed *)d;
if (of == NULL)
return;
g_free(of->name);
g_free(of->official_name);
g_free(of->url);
g_free(of);
}
void rssyl_old_feed_metadata_free(GSList *oldfeeds)
{
if (oldfeeds != NULL) {
debug_print("RSSyl: releasing parsed contents of old feeds.xml\n");
g_slist_foreach(oldfeeds, _free_old_feed_entry, NULL);
g_slist_free(oldfeeds);
oldfeeds = NULL;
}
}
static gint _old_feed_find_by_url(gconstpointer a, gconstpointer b)
{
OldRFeed *of = (OldRFeed *)a;
gchar *name = (gchar *)b;
if (of == NULL || of->name == NULL || of->url == NULL || name == NULL)
return 1;
return strcmp(of->name, name);
}
OldRFeed *rssyl_old_feed_get_by_name(GSList *oldfeeds, gchar *name)
{
GSList *needle;
g_return_val_if_fail(oldfeeds != NULL, NULL);
g_return_val_if_fail(name != NULL, NULL);
if ((needle = g_slist_find_custom(oldfeeds, name, _old_feed_find_by_url))
!= NULL)
return (OldRFeed *)needle->data;
return NULL;
}