Prevent attempts to add duplicate feeds
This commit is contained in:
parent
9c6322b6fc
commit
522b3ac678
2 changed files with 114 additions and 48 deletions
|
@ -131,7 +131,7 @@ feed_panel_treeview_render_text_cb (GtkTreeViewColumn* column,
|
|||
}
|
||||
|
||||
static void
|
||||
feed_panel_add_item_cb (KatzeArray* feed,
|
||||
feed_panel_add_item_cb (KatzeArray* parent,
|
||||
KatzeItem* child,
|
||||
FeedPanel* panel)
|
||||
{
|
||||
|
@ -141,33 +141,36 @@ feed_panel_add_item_cb (KatzeArray* feed,
|
|||
KatzeItem* item;
|
||||
gint i;
|
||||
|
||||
g_return_if_fail (KATZE_IS_ARRAY (feed));
|
||||
g_return_if_fail (KATZE_IS_ARRAY (parent));
|
||||
g_return_if_fail (KATZE_IS_ITEM (child));
|
||||
|
||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (panel->treeview));
|
||||
|
||||
if (KATZE_IS_ARRAY (child))
|
||||
if (katze_item_get_parent (KATZE_ITEM (parent)))
|
||||
{
|
||||
gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), &child_iter,
|
||||
NULL, G_MAXINT, 0, child, -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
i = 0;
|
||||
while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
|
||||
if (KATZE_IS_ARRAY (child))
|
||||
{
|
||||
gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), &child_iter,
|
||||
NULL, G_MAXINT, 0, child, -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_tree_model_get (model, &iter, 0, &item, -1);
|
||||
if (item == KATZE_ITEM (feed))
|
||||
{
|
||||
gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), &child_iter,
|
||||
&iter, 0, 0, child, -1);
|
||||
|
||||
g_object_unref (child);
|
||||
i = 0;
|
||||
while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
|
||||
{
|
||||
gtk_tree_model_get (model, &iter, 0, &item, -1);
|
||||
if (item == KATZE_ITEM (parent))
|
||||
{
|
||||
gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), &child_iter,
|
||||
&iter, 0, 0, child, -1);
|
||||
|
||||
g_object_unref (child);
|
||||
g_object_unref (item);
|
||||
break;
|
||||
}
|
||||
g_object_unref (item);
|
||||
break;
|
||||
}
|
||||
g_object_unref (item);
|
||||
}
|
||||
}
|
||||
feed_panel_insert_item (panel, GTK_TREE_STORE (model), &child_iter, child);
|
||||
|
@ -199,21 +202,33 @@ feed_panel_remove_iter (GtkTreeModel* model,
|
|||
}
|
||||
|
||||
static void
|
||||
feed_panel_remove_item_cb (KatzeArray* feed,
|
||||
feed_panel_remove_item_cb (KatzeArray* item,
|
||||
KatzeItem* child,
|
||||
FeedPanel* panel)
|
||||
{
|
||||
GtkTreeModel* model;
|
||||
KatzeItem* pitem;
|
||||
|
||||
g_assert (KATZE_IS_ARRAY (feed));
|
||||
g_assert (KATZE_IS_ARRAY (item));
|
||||
g_assert (KATZE_IS_ITEM (child));
|
||||
|
||||
if (KATZE_IS_ARRAY (child))
|
||||
feed_panel_disconnect_feed (panel, KATZE_ARRAY (child));
|
||||
|
||||
if (!katze_item_get_parent (KATZE_ITEM (item)))
|
||||
{
|
||||
gint n;
|
||||
|
||||
n = katze_array_get_length (KATZE_ARRAY (child));
|
||||
g_assert (n == 1);
|
||||
pitem = katze_array_get_nth_item (KATZE_ARRAY (child), 0);
|
||||
}
|
||||
else
|
||||
pitem = child;
|
||||
|
||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (panel->treeview));
|
||||
feed_panel_remove_iter (model, child);
|
||||
g_object_unref (child);
|
||||
feed_panel_remove_iter (model, pitem);
|
||||
g_object_unref (pitem);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -362,13 +377,17 @@ feed_panel_cursor_or_row_changed_cb (GtkTreeView* treeview,
|
|||
if (date)
|
||||
{
|
||||
SoupDate* sdate;
|
||||
const gchar* suri;
|
||||
const gchar* puri;
|
||||
KatzeItem* parent;
|
||||
sdate = soup_date_new_from_time_t ((time_t) date);
|
||||
suri = (const gchar*)g_object_get_data (G_OBJECT (item), "feeduri");
|
||||
|
||||
parent = katze_item_get_parent (item);
|
||||
g_assert (KATZE_IS_ARRAY (parent));
|
||||
puri = katze_item_get_uri (parent);
|
||||
text = g_strdup_printf (
|
||||
"<html><head><title>feed</title></head>"
|
||||
"<body><h3>%s</h3><p />Last updated %s.</body></html>",
|
||||
suri, soup_date_to_string (sdate, SOUP_DATE_HTTP));
|
||||
puri, soup_date_to_string (sdate, SOUP_DATE_HTTP));
|
||||
soup_date_free (sdate);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,7 +58,6 @@ typedef struct
|
|||
|
||||
enum
|
||||
{
|
||||
FEED_NEW,
|
||||
FEED_READ,
|
||||
FEED_REMOVE
|
||||
};
|
||||
|
@ -104,10 +103,33 @@ feed_add_item (KatzeArray* feeds,
|
|||
|
||||
if (uri)
|
||||
{
|
||||
feed = katze_array_new (KATZE_TYPE_ITEM);
|
||||
g_object_set_data_full (G_OBJECT (feed), "feeduri",
|
||||
(gpointer) g_strdup ((uri)), g_free);
|
||||
katze_array_add_item (feeds, feed);
|
||||
if (katze_array_find_token (feeds, uri))
|
||||
{
|
||||
GtkWidget* dialog;
|
||||
|
||||
dialog = gtk_message_dialog_new (
|
||||
NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
|
||||
_("Error"));
|
||||
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
|
||||
_("Feed %s already exists"), uri);
|
||||
gtk_window_set_title (GTK_WINDOW (dialog), EXTENSION_NAME);
|
||||
gtk_widget_show (dialog);
|
||||
g_signal_connect_swapped (dialog, "response",
|
||||
G_CALLBACK (gtk_widget_destroy), dialog);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
KatzeArray* child;
|
||||
|
||||
feed = katze_array_new (KATZE_TYPE_ARRAY);
|
||||
child = katze_array_new (KATZE_TYPE_ITEM);
|
||||
katze_item_set_uri (KATZE_ITEM (feed), uri);
|
||||
katze_item_set_token (KATZE_ITEM (feed), uri);
|
||||
katze_item_set_uri (KATZE_ITEM (child), uri);
|
||||
katze_array_add_item (feeds, feed);
|
||||
katze_array_add_item (feed, child);
|
||||
}
|
||||
}
|
||||
return feed;
|
||||
}
|
||||
|
@ -129,7 +151,7 @@ feed_save_items (MidoriExtension* extension,
|
|||
for (i = 0; i < n; i++)
|
||||
{
|
||||
item = katze_array_get_nth_item (feed, i);
|
||||
sfeeds[i] = (gchar*) g_object_get_data (G_OBJECT (item), "feeduri");
|
||||
sfeeds[i] = (gchar*) katze_item_get_uri (KATZE_ITEM (item));
|
||||
}
|
||||
sfeeds[n] = NULL;
|
||||
|
||||
|
@ -141,12 +163,19 @@ static void
|
|||
feed_handle_net_error (FeedNetPrivate* netpriv,
|
||||
const gchar* msg)
|
||||
{
|
||||
KatzeItem* child;
|
||||
const gchar* uri;
|
||||
gint n;
|
||||
|
||||
uri = (gchar*) g_object_get_data (G_OBJECT (netpriv->feed), "feeduri");
|
||||
katze_item_set_name (KATZE_ITEM (netpriv->feed), uri);
|
||||
katze_item_set_text (KATZE_ITEM (netpriv->feed), msg);
|
||||
katze_item_set_uri (KATZE_ITEM (netpriv->feed), NULL);
|
||||
n = katze_array_get_length (netpriv->feed);
|
||||
g_assert (n == 1);
|
||||
child = katze_array_get_nth_item (netpriv->feed, 0);
|
||||
g_assert (KATZE_IS_ARRAY (child));
|
||||
|
||||
uri = katze_item_get_uri (KATZE_ITEM (netpriv->feed));
|
||||
katze_item_set_name (child, uri);
|
||||
katze_item_set_text (child, msg);
|
||||
katze_item_set_uri (child, NULL);
|
||||
feed_remove_flags (netpriv->feed, FEED_READ);
|
||||
}
|
||||
|
||||
|
@ -184,8 +213,19 @@ feed_transfer_cb (KatzeNetRequest* request,
|
|||
|
||||
if (request->data)
|
||||
{
|
||||
KatzeArray* item;
|
||||
const gchar* uri;
|
||||
gint n;
|
||||
|
||||
n = katze_array_get_length (netpriv->feed);
|
||||
g_assert (n == 1);
|
||||
item = katze_array_get_nth_item (netpriv->feed, 0);
|
||||
g_assert (KATZE_IS_ARRAY (item));
|
||||
uri = katze_item_get_uri (KATZE_ITEM (netpriv->feed));
|
||||
katze_item_set_uri (KATZE_ITEM (item), uri);
|
||||
|
||||
if (!parse_feed (request->data, request->length,
|
||||
netpriv->parsers, netpriv->feed, &error))
|
||||
netpriv->parsers, item, &error))
|
||||
{
|
||||
feed_handle_net_error (netpriv, error->message);
|
||||
g_error_free (error);
|
||||
|
@ -216,11 +256,8 @@ update_feed (FeedPrivate* priv,
|
|||
if (!(feed_has_flags (feed, FEED_READ)))
|
||||
{
|
||||
FeedNetPrivate* netpriv;
|
||||
gchar* uri;
|
||||
|
||||
uri = (gchar*) g_object_get_data (G_OBJECT (feed), "feeduri");
|
||||
feed_add_flags (feed, FEED_READ);
|
||||
katze_item_set_uri (KATZE_ITEM (feed), uri);
|
||||
netpriv = g_new0 (FeedNetPrivate, 1);
|
||||
netpriv->parsers = priv->parsers;
|
||||
netpriv->extension = priv->extension;
|
||||
|
@ -272,9 +309,11 @@ secondary_icon_released_cb (GtkAction* action,
|
|||
KatzeArray* feed;
|
||||
|
||||
feed = feed_add_item (priv->feeds, uri);
|
||||
feed_save_items (priv->extension, priv->feeds);
|
||||
feed_add_flags (feed, FEED_NEW);
|
||||
update_feed (priv, KATZE_ITEM (feed));
|
||||
if (feed)
|
||||
{
|
||||
feed_save_items (priv->extension, priv->feeds);
|
||||
update_feed (priv, KATZE_ITEM (feed));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -324,9 +363,11 @@ panel_add_feed_cb (FeedPanel* panel,
|
|||
KatzeArray* feed;
|
||||
|
||||
feed = feed_add_item (priv->feeds, uri);
|
||||
feed_save_items (priv->extension, priv->feeds);
|
||||
feed_add_flags (feed, FEED_NEW);
|
||||
update_feed (priv, KATZE_ITEM (feed));
|
||||
if (feed)
|
||||
{
|
||||
feed_save_items (priv->extension, priv->feeds);
|
||||
update_feed (priv, KATZE_ITEM (feed));
|
||||
}
|
||||
}
|
||||
}
|
||||
gtk_widget_destroy (dialog);
|
||||
|
@ -334,10 +375,15 @@ panel_add_feed_cb (FeedPanel* panel,
|
|||
|
||||
static void
|
||||
panel_remove_feed_cb (FeedPanel* panel,
|
||||
KatzeArray* feed,
|
||||
KatzeItem* item,
|
||||
FeedPrivate* priv)
|
||||
{
|
||||
KatzeArray* feed;
|
||||
|
||||
feed = katze_item_get_parent (item);
|
||||
|
||||
g_assert (KATZE_IS_ARRAY (priv->feeds));
|
||||
g_assert (KATZE_IS_ARRAY (feed));
|
||||
|
||||
if (feed_has_flags (feed, FEED_READ))
|
||||
feed_add_flags (feed, FEED_REMOVE);
|
||||
|
@ -394,7 +440,8 @@ feed_app_add_browser_cb (MidoriApp* app,
|
|||
if (sfeeds[i])
|
||||
{
|
||||
feed = feed_add_item (feeds, sfeeds[i]);
|
||||
update_feed (priv, KATZE_ITEM (feed));
|
||||
if (feed)
|
||||
update_feed (priv, KATZE_ITEM (feed));
|
||||
}
|
||||
}
|
||||
g_strdupv (sfeeds);
|
||||
|
|
Loading…
Reference in a new issue