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 * - OPML import handling
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.h>
29 #include <glib/gi18n.h>
30
31 /* Claws Mail includes */
32 #include <folder.h>
33 #include <alertpanel.h>
34 #include <common/utils.h>
35
36 /* Local includes */
37 #include "rssyl_subscribe.h"
38 #include "opml_import.h"
39
rssyl_folder_depth(FolderItem * item)40 gint rssyl_folder_depth(FolderItem *item)
41 {
42 gint i;
43
44 for( i = -1; item != NULL; item = folder_item_parent(item), i++ ) {}
45 return i;
46 }
47
48 /* This gets called from the libfeed's OPML parser as a user function for
49 * each <outline ...> from the .opml file.
50 * It creates a folder or subscribes a feed, while keeping track of the
51 * location inside folder hierarchy (using depth and linked list of parent
52 * folders up to the root). */
rssyl_opml_import_func(gchar * title,gchar * url,gint depth,gpointer data)53 void rssyl_opml_import_func(gchar *title, gchar *url, gint depth, gpointer data)
54 {
55 OPMLImportCtx *ctx = (OPMLImportCtx *)data;
56 gchar *tmp = NULL;
57 FolderItem *new_item;
58 gboolean nulltitle = FALSE;
59 gint i = 1;
60
61 debug_print("depth %d, ctx->depth %d\n", depth, ctx->depth);
62 while (depth < ctx->depth) {
63 /* We've gone up at least one level, need to find correct parent */
64 ctx->current = g_slist_delete_link(ctx->current, ctx->current);
65 ctx->depth--;
66 }
67
68 debug_print("OPML_IMPORT: %s %s (%s)\n",
69 (url != NULL ? "feed": "folder"), title, url);
70
71 if( title == NULL ) {
72 debug_print("NULL title received, substituting a placeholder title\n");
73 title = g_strdup(_("Untitled"));
74 nulltitle = TRUE;
75 }
76
77 /* If URL is not given, then it's a folder */
78 if( url == NULL ) {
79 /* Find an unused name for new folder */
80 tmp = g_strdup(title);
81 while (folder_find_child_item_by_name((FolderItem *)ctx->current->data, tmp)) {
82 debug_print("RSSyl: Folder '%s' already exists, trying another name\n",
83 title);
84 g_free(tmp);
85 tmp = g_strdup_printf("%s__%d", title, ++i);
86 }
87
88 /* Create the folder */
89 new_item = folder_create_folder((FolderItem *)ctx->current->data, tmp);
90 if (!new_item) {
91 alertpanel_error(_("Can't create the folder '%s'."), tmp);
92 g_free(tmp);
93 }
94
95 if (nulltitle) {
96 g_free(title);
97 title = NULL;
98 }
99
100 ctx->current = g_slist_prepend(ctx->current, new_item);
101 ctx->depth++;
102 } else {
103 /* We have URL, try to add new feed... */
104 new_item = rssyl_subscribe((FolderItem *)ctx->current->data,
105 url, RSSYL_SHOW_ERRORS);
106 /* ...and rename it if needed */
107 if (new_item != NULL && strcmp(title, new_item->name)) {
108 if (folder_item_rename(new_item, title) < 0) {
109 alertpanel_error(_("Error while subscribing feed\n"
110 "%s\n\nFolder name '%s' is not allowed."),
111 url, title);
112 }
113 }
114 }
115 }
116