45e6cf6357747da187e77003598243888a2b6ac8
[claws.git] / src / plugins / rssyl / old_feeds.c
1 /*
2  * Copyright (C) 2012 Andrej Kacian <andrej@kacian.sk>
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public
15  * License along with this program; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /* Expat parser for old feeds.xml */
21
22 #include <glib/gi18n.h>
23 #include <gtk/gtk.h>
24 #include <expat.h>
25
26 #include <alertpanel.h>
27 #include <common/utils.h>
28
29 #include "libfeed/parser.h"
30 #include "old_feeds.h"
31 #include "rssyl.h"
32
33 struct _oldrssyl_ctx {
34         GSList *oldfeeds;
35 };
36
37 static void _elparse_start_oldrssyl(void *data, const gchar *el,
38                 const gchar **attr)
39 {
40         struct _oldrssyl_ctx *ctx = data;
41         OldRFeed *of;
42         gchar *tmp;
43
44 #define GETVAL_STR(name) (g_strdup(feed_parser_get_attribute_value(attr, name)))
45 #define GETVAL_INT(name) \
46         ((tmp = feed_parser_get_attribute_value(attr, name)) == NULL ? 0 : \
47                 (gint)atoi(tmp))
48
49         if (!strcmp(el, "feed")) {
50                 of = g_new0(OldRFeed, 1);
51
52                 of->name = GETVAL_STR("name");
53                 of->official_name = GETVAL_STR("official_name");
54                 of->url = GETVAL_STR("url");
55                 of->default_refresh_interval = GETVAL_INT("default_refresh_interval");
56                 of->refresh_interval = GETVAL_INT("refresh_interval");
57                 of->expired_num = GETVAL_INT("expired_num");
58                 of->fetch_comments = GETVAL_INT("fetch_comments");
59                 of->fetch_comments_for = GETVAL_INT("fetch_comments_for");
60                 of->silent_update = GETVAL_INT("silent_update");
61
62                 debug_print("RSSyl: old feeds.xml: Adding '%s' (%s).\n", of->name,
63                                 of->url);
64
65                 ctx->oldfeeds = g_slist_prepend(ctx->oldfeeds, of);
66         }
67
68         return;
69 }
70
71 static void _elparse_end_oldrssyl(void *data, const gchar *el)
72 {
73         return;
74 }
75
76 GSList *rssyl_old_feed_metadata_parse(gchar *filepath)
77 {
78         XML_Parser parser;
79         GSList *oldfeeds = NULL;
80         gchar *contents = NULL;
81         gsize length;
82         GError *error;
83         struct _oldrssyl_ctx *ctx;
84
85         debug_print("RSSyl: Starting to parse old feeds.xml\n");
86
87         /* Read contents of the file into memory */
88         if (!g_file_get_contents(filepath, &contents, &length, &error)) {
89                 alertpanel_error(_("Couldn't read contents of old feeds.xml file:\n%s"),
90                                 error->message);
91                 debug_print("RSSyl: Couldn't read contents of feeds.xml\n");
92                 g_error_free(error);
93                 return NULL;
94         }
95
96         /* Set up expat parser */
97         parser = XML_ParserCreate(NULL);
98
99         ctx = g_new0(struct _oldrssyl_ctx, 1);
100         ctx->oldfeeds = NULL;
101         XML_SetUserData(parser, ctx);
102         XML_SetElementHandler(parser,
103                         _elparse_start_oldrssyl,
104                         _elparse_end_oldrssyl);
105
106         /* Parse the XML, our output ending up in oldfeeds */
107         XML_Parse(parser, contents, length, 1);
108
109         /* And clean up */
110         XML_ParserFree(parser);
111         g_free(contents);
112         oldfeeds = ctx->oldfeeds;
113         g_free(ctx);
114
115         debug_print("RSSyl: old feeds.xml: added %d items in total\n",
116                         g_slist_length(oldfeeds));
117
118         return oldfeeds;
119 }
120
121 static void _free_old_feed_entry(gpointer d, gpointer user_data)
122 {
123         OldRFeed *of = (OldRFeed *)d;
124
125         if (of == NULL)
126                 return;
127
128         g_free(of->name);
129         g_free(of->official_name);
130         g_free(of->url);
131         g_free(of);
132 }
133
134 void rssyl_old_feed_metadata_free(GSList *oldfeeds)
135 {
136         if (oldfeeds != NULL) {
137                 debug_print("RSSyl: releasing parsed contents of old feeds.xml\n");
138                 g_slist_foreach(oldfeeds, _free_old_feed_entry, NULL);
139                 g_slist_free(oldfeeds);
140                 oldfeeds = NULL;
141         }
142 }
143
144 static gint _old_feed_find_by_url(gconstpointer a, gconstpointer b)
145 {
146         OldRFeed *of = (OldRFeed *)a;
147         gchar *name = (gchar *)b;
148
149         if (of == NULL || of->name == NULL || of->url == NULL || name == NULL)
150                 return 1;
151
152         return strcmp(of->name, name);
153 }
154
155 OldRFeed *rssyl_old_feed_get_by_name(GSList *oldfeeds, gchar *name)
156 {
157         GSList *needle;
158
159         g_return_val_if_fail(oldfeeds != NULL, NULL);
160         g_return_val_if_fail(name != NULL, NULL);
161
162         if ((needle = g_slist_find_custom(oldfeeds, name, _old_feed_find_by_url))
163                         != NULL)
164                 return (OldRFeed *)needle->data;
165         
166         return NULL;
167 }