RSSyl: Convenience checkbox allowing user to open feed properties window after subscr...
[claws.git] / src / plugins / rssyl / rssyl_subscribe.c
1 /*
2  * Claws-Mail-- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2004 Hiroyuki Yamamoto
4  * This file (C) 2005 Andrej Kacian <andrej@kacian.sk>
5  *
6  * - DESCRIPTION HERE
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #  include "config.h"
25 #endif
26
27 /* Global includes */
28 #include <glib/gi18n.h>
29 #include <gtk/gtk.h>
30
31 /* Claws Mail includes */
32 #include <alertpanel.h>
33 #include <folder.h>
34 #include <log.h>
35 #include <common/utils.h>
36
37 /* Local includes */
38 #include "libfeed/feed.h"
39 #include "libfeed/feeditem.h"
40 #include "rssyl.h"
41 #include "rssyl_add_item.h"
42 #include "rssyl_feed.h"
43 #include "rssyl_gtk.h"
44 #include "rssyl_update_feed.h"
45 #include "rssyl_subscribe_gtk.h"
46 #include "strutils.h"
47
48 static void rssyl_subscribe_foreach_func(gpointer data, gpointer user_data)
49 {
50         RFolderItem *ritem = (RFolderItem *)user_data;
51         FeedItem *feed_item = (FeedItem *)data;
52
53         g_return_if_fail(ritem != NULL);
54         g_return_if_fail(feed_item != NULL);
55
56         rssyl_add_item(ritem, feed_item);
57 }
58
59 gboolean rssyl_subscribe(FolderItem *parent, const gchar *url,
60                 gboolean verbose)
61 {
62         gchar *myurl = NULL, *tmpname = NULL, *tmpname2 = NULL;
63         RFetchCtx *ctx;
64         FolderItem *new_item;
65         RFolderItem *ritem;
66         gint i = 1;
67         RSubCtx *sctx;
68         gboolean edit_properties = FALSE;
69
70         g_return_val_if_fail(parent != NULL, FALSE);
71         g_return_val_if_fail(url != NULL, FALSE);
72
73         log_print(LOG_PROTOCOL, RSSYL_LOG_SUBSCRIBING, url);
74
75         myurl = my_normalize_url(url);
76
77         /* Fetch the feed. */
78         ctx = rssyl_prep_fetchctx_from_url(myurl);
79         g_free(myurl);
80         g_return_val_if_fail(ctx != NULL, FALSE);
81
82         rssyl_fetch_feed(ctx, verbose);
83
84         debug_print("RSSyl: fetch success == %s\n",
85                         ctx->success ? "TRUE" : "FALSE");
86
87         if (!ctx->success) {
88                 /* User notification was already handled inside rssyl_fetch_feed(),
89                  * let's just return quietly. */
90                 feed_free(ctx->feed);
91                 g_free(ctx->error);
92                 g_free(ctx);
93                 return FALSE;
94         }
95
96         if (verbose) {
97                 sctx = g_new0(RSubCtx, 1);
98                 sctx->feed = ctx->feed;
99                 sctx->edit_properties = FALSE;
100
101                 debug_print("RSSyl: Calling subscribe dialog routine...\n");
102                 rssyl_subscribe_dialog(sctx);
103
104                 if (sctx->feed == NULL) {
105                         debug_print("RSSyl: User cancelled subscribe.\n");
106                         g_free(sctx);
107                         return FALSE;
108                 }
109
110                 edit_properties = sctx->edit_properties;
111                 if (sctx->edit_properties)
112                         debug_print("RSSyl: User wants to edit properties of the new feed.\n");
113                 else
114                         debug_print("RSSyl: User does not want to edit properties of the new feed.\n");
115                 g_free(sctx);
116         }
117
118         /* OK, feed is succesfully fetched and correct, let's add it to CM. */
119
120         /* Create a folder for it. */
121         tmpname = rssyl_format_string(ctx->feed->title, TRUE, TRUE);
122         tmpname2 = g_strdup(tmpname);
123         while (folder_find_child_item_by_name(parent, tmpname2) != 0 && i < 20) {
124                 debug_print("RSSyl: Folder '%s' already exists, trying another name\n",
125                                 tmpname2);
126                 g_free(tmpname2);
127                 tmpname2 = g_strdup_printf("%s__%d", tmpname, ++i);
128         }
129         /* TODO: handle cases where i reaches 20 */
130
131         folder_item_update_freeze();
132
133         new_item = folder_create_folder(parent, tmpname2);
134         g_free(tmpname);
135         g_free(tmpname2);
136
137         if (!new_item) {
138                 if (verbose)
139                         alertpanel_error(_("Couldn't create folder for new feed '%s'."),
140                                         myurl);
141                 feed_free(ctx->feed);
142                 g_free(ctx->error);
143                 g_free(ctx); 
144                 g_free(myurl);
145                 return FALSE;
146         }
147
148         debug_print("RSSyl: Adding '%s'\n", ctx->feed->url);
149
150         ritem = (RFolderItem *)new_item;
151         ritem->url = g_strdup(ctx->feed->url);
152
153         if (feed_n_items(ctx->feed) > 0)
154                 feed_foreach_item(ctx->feed, rssyl_subscribe_foreach_func, (gpointer)ritem);
155
156         folder_item_scan(new_item);
157         folder_write_list();
158
159         if (edit_properties)
160                 rssyl_gtk_prop(ritem);
161
162         folder_item_update_thaw();
163
164         return TRUE;
165 }