From 42eddac0e9f0216175fef223fd9b1023ed502a6e Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Tue, 12 Apr 2011 10:54:29 +0000 Subject: some quite significant changes to only receive/update recently-active torrents, if enabled. also use a hash table and tree row references for lookup. hopefully performance will be much better for people with large number of torrents. --- src/trg-state-selector.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'src/trg-state-selector.c') diff --git a/src/trg-state-selector.c b/src/trg-state-selector.c index 80fadde..8a6c4bc 100644 --- a/src/trg-state-selector.c +++ b/src/trg-state-selector.c @@ -24,6 +24,7 @@ #include "torrent.h" #include "trg-state-selector.h" +#include "trg-torrent-model.h" #include "util.h" #include "trg-preferences.h" #include "trg-client.h" @@ -216,22 +217,38 @@ void trg_state_selector_update(TrgStateSelector * s) GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(s)); trg_client *client = priv->client; GtkTreeIter iter; - int i, j; + GList *trackerItem, *li; + GList *torrentItemRefs = g_hash_table_get_values(client->torrentTable); + struct cruft_remove_args cruft; if (!client->session) return; - for (i = 0; i < json_array_get_length(client->torrents); i++) { - JsonObject *t = json_array_get_object_element(client->torrents, i); + for (li = torrentItemRefs; li; li = g_list_next(li)) { + GtkTreeRowReference *rr = (GtkTreeRowReference*)li->data; + GtkTreePath *path = gtk_tree_row_reference_get_path(rr); + GtkTreeModel *torrentModel = gtk_tree_row_reference_get_model(rr); + JsonObject *t = NULL; gpointer result; + if (path) { + GtkTreeIter iter; + if (gtk_tree_model_get_iter(torrentModel, &iter, path)) { + gtk_tree_model_get(torrentModel, &iter, TORRENT_COLUMN_JSON, &t, -1); + } + gtk_tree_path_free(path); + } + + if (!t) + continue; + if (priv->showTrackers) { JsonArray *trackers = torrent_get_trackers(t); - for (j = 0; j < json_array_get_length(trackers); j++) { + for (trackerItem = json_array_get_elements(trackers); trackerItem; trackerItem = g_list_next(trackerItem)) { JsonObject *tracker = - json_array_get_object_element(trackers, j); + json_node_get_object((JsonNode*)trackerItem->data); const gchar *announceUrl = tracker_get_announce(tracker); gchar *announceHost = trg_gregex_get_first(priv->urlHostRegex, announceUrl); @@ -290,6 +307,8 @@ void trg_state_selector_update(TrgStateSelector * s) } } + g_list_free(torrentItemRefs); + cruft.serial = client->updateSerial; if (priv->showTrackers) { -- cgit v1.2.3