2 * Copyright (C) 2006 Andrej Kacian <andrej@kacian.sk>
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.
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.
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.
26 #include <glib/gi18n.h>
29 /* Claws Mail includes */
31 #include <mainwindow.h>
32 #include <statusbar.h>
36 #include "libfeed/feed.h"
38 #include "rssyl_feed.h"
39 #include "rssyl_parse_feed.h"
40 #include "rssyl_update_feed.h"
43 static void rssyl_update_reference_func(gpointer data, gpointer user_data)
45 FeedItem *item = (FeedItem *)data;
46 gchar *parent_id = (gchar *)user_data;
48 g_return_if_fail(item != NULL);
49 g_return_if_fail(user_data != NULL);
51 feed_item_set_parent_id(item, parent_id);
54 void rssyl_update_comments(RFolderItem *ritem)
56 FolderItem *item = &ritem->item;
58 RFetchCtx *fetchctx = NULL;
59 RFeedCtx *feedctx = NULL;
64 gchar *path, *msg, *fname;
65 MainWindow *mainwin = mainwindow_get_mainwindow();
67 g_return_if_fail(ritem != NULL);
69 if( ritem->fetch_comments == FALSE )
72 path = folder_item_get_path(item);
73 g_return_if_fail(path != NULL);
75 debug_print("RSSyl: starting to parse comments, path is '%s'\n", path);
77 if( (dp = g_dir_open(path, 0, &error)) == NULL ) {
78 debug_print("g_dir_open on \"%s\" failed with error %d (%s)\n",
79 path, error->code, error->message);
85 ritem->fetching_comments = TRUE;
87 while( (d = g_dir_read_name(dp)) != NULL ) {
88 if (claws_is_exiting()) {
91 debug_print("RSSyl: bailing out, app is exiting\n");
95 if( (num = to_number(d)) > 0) {
96 fname = g_strdup_printf("%s%c%s", path, G_DIR_SEPARATOR, d);
97 if (!g_file_test(fname, G_FILE_TEST_IS_REGULAR))
100 debug_print("RSSyl: starting to parse '%s'\n", d);
102 if( (fi = rssyl_parse_folder_item_file(fname)) != NULL ) {
103 feedctx = (RFeedCtx *)fi->data;
104 if( feed_item_get_comments_url(fi) && feed_item_get_id(fi) &&
105 (ritem->fetch_comments_max_age == -1 ||
106 time(NULL) - feed_item_get_date_modified(fi) <= ritem->fetch_comments_max_age*86400)) {
107 msg = g_strdup_printf(_("Updating comments for '%s'..."),
108 feed_item_get_title(fi));
109 debug_print("RSSyl: updating comments for '%s' (%s)\n",
110 feed_item_get_title(fi), feed_item_get_comments_url(fi));
111 STATUSBAR_PUSH(mainwin, msg);
113 fetchctx = rssyl_prep_fetchctx_from_url(feed_item_get_comments_url(fi));
114 if (fetchctx != NULL) {
115 feed_set_ssl_verify_peer(fetchctx->feed, ritem->ssl_verify_peer);
117 rssyl_fetch_feed(fetchctx, FALSE);
119 if( fetchctx->success && feed_n_items(fetchctx->feed) > 0 ) {
120 g_free(fetchctx->feed->title);
121 fetchctx->feed->title = g_strdup(ritem->official_title);
123 feed_foreach_item(fetchctx->feed, rssyl_update_reference_func,
124 feed_item_get_id(fi));
126 if( !rssyl_parse_feed(ritem, fetchctx->feed) ) {
127 debug_print("RSSyl: Error processing comments feed\n");
128 log_error(LOG_PROTOCOL, RSSYL_LOG_ERROR_PROC, fetchctx->feed->url);
132 STATUSBAR_POP(mainwin);
136 if (feedctx != NULL) {
137 g_free(feedctx->path);
147 ritem->fetching_comments = FALSE;
149 debug_print("RSSyl: rssyl_update_comments() is done\n");