← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~linuxdcpp-team/linuxdcpp/trunk] Rev 377: Don't show partial finished downloads

 

------------------------------------------------------------
revno: 377
fixes bug(s): https://launchpad.net/bugs/337576
author: Windkracht8 <bartv@xxxxxxxxxxxxxxx>
committer: Steven Sheehy <steven.sheehy@xxxxxxxxx>
branch nick: trunk
timestamp: Thu 2010-08-05 00:31:49 -0500
message:
  Don't show partial finished downloads
modified:
  Changelog.txt
  glade/finishedtransfers.glade
  linux/finishedtransfers.cc
  linux/finishedtransfers.hh


--
lp:linuxdcpp
https://code.launchpad.net/~linuxdcpp-team/linuxdcpp/trunk

Your team LinuxDC++ Team is subscribed to branch lp:linuxdcpp.
To unsubscribe from this branch go to https://code.launchpad.net/~linuxdcpp-team/linuxdcpp/trunk/+edit-subscription
=== modified file 'Changelog.txt'
--- Changelog.txt	2010-06-06 12:13:09 +0000
+++ Changelog.txt	2010-08-05 05:31:49 +0000
@@ -52,6 +52,7 @@
 [2010-04-17] Compilation fixes for OpenSolaris. (thanks Andrew Browne)
 [2010-05-22] lp#317346: Favorite Users tab merged from freedcpp. 
 [2010-06-06] lp#590359: Fix crash with two simultaneous Socket::resolve calls (Razzloss)
+[2010-08-05] lp#337576: Don't show partial finished downloads. (thanks Bart Vullings)
 
 *** 1.0.3 2009-02-01 ***
 [2008-08-10] lp#256236: Fixed a crash on startup when using auto-open options.

=== modified file 'glade/finishedtransfers.glade'
--- glade/finishedtransfers.glade	2008-11-30 20:15:23 +0000
+++ glade/finishedtransfers.glade	2010-08-05 05:31:49 +0000
@@ -7,63 +7,17 @@
     <property name="border_width">4</property>
     <property name="spacing">4</property>
     <child>
-      <widget class="GtkNotebook" id="finishedbook">
+      <widget class="GtkScrolledWindow" id="viewWindowFile">
         <property name="visible">True</property>
         <property name="can_focus">True</property>
-        <child>
-          <widget class="GtkScrolledWindow" id="viewWindowFile">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-            <property name="shadow_type">GTK_SHADOW_IN</property>
-            <child>
-              <widget class="GtkTreeView" id="fileView">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-              </widget>
-            </child>
-          </widget>
-        </child>
-        <child>
-          <widget class="GtkLabel" id="lbl_grpfile">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Grouped by Files</property>
-          </widget>
-          <packing>
-            <property name="type">tab</property>
-            <property name="tab_fill">False</property>
-          </packing>
-        </child>
-        <child>
-          <widget class="GtkScrolledWindow" id="viewWindowUser">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-            <property name="shadow_type">GTK_SHADOW_IN</property>
-            <child>
-              <widget class="GtkTreeView" id="userView">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="headers_clickable">True</property>
-              </widget>
-            </child>
-          </widget>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <widget class="GtkLabel" id="lbl_grpuser">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Grouped by Users</property>
-          </widget>
-          <packing>
-            <property name="type">tab</property>
-            <property name="position">1</property>
-            <property name="tab_fill">False</property>
-          </packing>
+        <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+        <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+        <property name="shadow_type">GTK_SHADOW_IN</property>
+        <child>
+          <widget class="GtkTreeView" id="fileView">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+          </widget>
         </child>
       </widget>
     </child>

=== modified file 'linux/finishedtransfers.cc'
--- linux/finishedtransfers.cc	2010-01-01 00:57:24 +0000
+++ linux/finishedtransfers.cc	2010-08-05 05:31:49 +0000
@@ -42,7 +42,6 @@
 	BookEntry(type, title, "finishedtransfers.glade"),
 	isUpload(isUpload),
 	totalFiles(0),
-	totalUsers(0),
 	totalBytes(0),
 	totalTime(0)
 {
@@ -51,10 +50,10 @@
 	fileView.insertColumn("Time", G_TYPE_STRING, TreeView::STRING, 150);
 	fileView.insertColumn("Filename", G_TYPE_STRING, TreeView::STRING, 100);
 	fileView.insertColumn("Path", G_TYPE_STRING, TreeView::STRING, 200);
-	fileView.insertColumn("Nicks", G_TYPE_STRING, TreeView::STRING, 100);
-	fileView.insertColumn("Transferred", G_TYPE_INT64, TreeView::SIZE, 100);
-	fileView.insertColumn("Speed", G_TYPE_INT64, TreeView::SPEED, 100);
-	fileView.insertColumn("CRC Checked", G_TYPE_STRING, TreeView::STRING, 100);
+	fileView.insertColumn("Users", G_TYPE_STRING, TreeView::STRING, 100);
+	fileView.insertColumn("Size", G_TYPE_INT64, TreeView::SIZE, 100);
+	fileView.insertColumn("Average Speed", G_TYPE_INT64, TreeView::SPEED, 125);
+	fileView.insertColumn("CRC Checked", G_TYPE_STRING, TreeView::STRING, 115);
 	fileView.insertHiddenColumn("Target", G_TYPE_STRING);
 	fileView.insertHiddenColumn("Elapsed Time", G_TYPE_INT64);
 	fileView.finalize();
@@ -67,26 +66,6 @@
 	gtk_tree_view_set_fixed_height_mode(fileView.get(), TRUE);
 	gtk_tree_selection_set_mode(gtk_tree_view_get_selection(fileView.get()), GTK_SELECTION_MULTIPLE);
 
-	// Initialize user treeview
-	userView.setView(GTK_TREE_VIEW(getWidget("userView")), true, "finished");
-	userView.insertColumn("Time", G_TYPE_STRING, TreeView::STRING, 150);
-	userView.insertColumn("Nick", G_TYPE_STRING, TreeView::STRING, 100);
-	userView.insertColumn("Hub", G_TYPE_STRING, TreeView::STRING, 200);
-	userView.insertColumn("Files", G_TYPE_STRING, TreeView::STRING, 100);
-	userView.insertColumn("Transferred", G_TYPE_INT64, TreeView::SIZE, 100);
-	userView.insertColumn("Speed", G_TYPE_INT64, TreeView::SPEED, 100);
-	userView.insertHiddenColumn("CID", G_TYPE_STRING);
-	userView.insertHiddenColumn("Elapsed Time", G_TYPE_INT64);
-	userView.finalize();
-	userStore = gtk_list_store_newv(userView.getColCount(), userView.getGTypes());
-	gtk_tree_view_set_model(userView.get(), GTK_TREE_MODEL(userStore));
-	g_object_unref(userStore);
-	userSelection = gtk_tree_view_get_selection(userView.get());
-	gtk_tree_view_column_set_sort_indicator(gtk_tree_view_get_column(userView.get(), userView.col("Time")), TRUE);
-	gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(userStore), userView.col("Time"), GTK_SORT_ASCENDING);
-	gtk_tree_view_set_fixed_height_mode(userView.get(), TRUE);
-	gtk_tree_selection_set_mode(gtk_tree_view_get_selection(userView.get()), GTK_SELECTION_MULTIPLE);
-
 	// Connect the signals to their callback functions.
 	g_signal_connect(getWidget("openItem"), "activate", G_CALLBACK(onOpen_gui), (gpointer)this);
 	g_signal_connect(getWidget("openFolderItem"), "activate", G_CALLBACK(onOpenFolder_gui), (gpointer)this);
@@ -95,10 +74,6 @@
 	g_signal_connect(fileView.get(), "button-press-event", G_CALLBACK(onButtonPressed_gui), (gpointer)this);
 	g_signal_connect(fileView.get(), "button-release-event", G_CALLBACK(onButtonReleased_gui), (gpointer)this);
 	g_signal_connect(fileView.get(), "key-release-event", G_CALLBACK(onKeyReleased_gui), (gpointer)this);
-	g_signal_connect(userView.get(), "button-press-event", G_CALLBACK(onButtonPressed_gui), (gpointer)this);
-	g_signal_connect(userView.get(), "button-release-event", G_CALLBACK(onButtonReleased_gui), (gpointer)this);
-	g_signal_connect(userView.get(), "key-release-event", G_CALLBACK(onKeyReleased_gui), (gpointer)this);
-	g_signal_connect_after(getWidget("finishedbook"), "switch-page", G_CALLBACK(onPageSwitched_gui), (gpointer)this);
 
 }
 
@@ -115,21 +90,6 @@
 	FinishedManager::getInstance()->addListener(this);
 }
 
-bool FinishedTransfers::findUser_gui(GtkTreeIter* iter, const string& cid)
-{
-	bool valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(userStore), iter);
-
-	while (valid)
-	{
-		if (userView.getString(iter, "CID") == cid)
-			return TRUE;
-
-		valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(userStore), iter);
-	}
-
-	return FALSE;
-}
-
 bool FinishedTransfers::findFile_gui(GtkTreeIter* iter, const string& item)
 {
 	bool valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(fileStore), iter);
@@ -145,56 +105,11 @@
 	return FALSE;
 }
 
-void FinishedTransfers::addUser_gui(StringMap params, bool update)
-{
-	GtkTreeIter iter;
-	int64_t transferred = Util::toInt64(params["Transferred"]);
-	int64_t speed = Util::toInt64(params["Speed"]);
-	int64_t time = Util::toInt64(params["Elapsed Time"]);
-	int64_t addTime = time;
-	int64_t addSize = transferred;
-
-	if (!findUser_gui(&iter, params["CID"]))
-	{
-		gtk_list_store_append(userStore, &iter);
-		totalUsers++;
-	}
-	else
-	{	
-		addSize = transferred - userView.getValue<int64_t>(&iter, "Transferred");
-		addTime = time - userView.getValue<int64_t>(&iter, "Elapsed Time");
-	}
-
-	gtk_list_store_set(userStore, &iter,
-		userView.col("Time"), params["Time"].c_str(),
-		userView.col("Nick"), params["Nick"].c_str(),
-		userView.col("Hub"), params["Hub"].c_str(),
-		userView.col("Files"), params["Files"].c_str(),
-		userView.col("Transferred"), transferred,
-		userView.col("Speed"), speed,
-		userView.col("CID"), params["CID"].c_str(),
-		userView.col("Elapsed Time"), time,
-		-1);
-
-	totalBytes += addSize;
-	totalTime += addTime;
-
-	if (update)
-	{
-		updateStatus_gui();
-
-		if ((!isUpload && BOOLSETTING(BOLD_FINISHED_DOWNLOADS)) ||
-		     (isUpload && BOOLSETTING(BOLD_FINISHED_UPLOADS)))
-		{
-			setBold_gui();
-		}
-	}
-}
 void FinishedTransfers::addFile_gui(StringMap params, bool update)
 {
 	GtkTreeIter iter;
-	int64_t transferred = Util::toInt64(params["Transferred"]);
-	int64_t speed = Util::toInt64(params["Speed"]);
+	int64_t size = Util::toInt64(params["Size"]);
+	int64_t speed = Util::toInt64(params["Average Speed"]);
 	int64_t time = Util::toInt64(params["Elapsed Time"]);
 
 	if (!findFile_gui(&iter, params["Target"]))
@@ -206,9 +121,9 @@
 		fileView.col("Time"), params["Time"].c_str(),
 		fileView.col("Filename"), params["Filename"].c_str(),
 		fileView.col("Path"), params["Path"].c_str(),
-		fileView.col("Nicks"), params["Nicks"].c_str(),
-		fileView.col("Transferred"), transferred,
-		fileView.col("Speed"), speed,
+		fileView.col("Users"), params["Users"].c_str(),
+		fileView.col("Size"), size,
+		fileView.col("Average Speed"), speed,
 		fileView.col("CRC Checked"), params["CRC Checked"].c_str(),
 		fileView.col("Target"), params["Target"].c_str(),
 		fileView.col("Elapsed Time"), time,
@@ -228,12 +143,7 @@
 
 void FinishedTransfers::updateStatus_gui()
 {
-	string status;
-	if(gtk_notebook_get_current_page(GTK_NOTEBOOK(getWidget("finishedbook"))) == 
-			gtk_notebook_page_num(GTK_NOTEBOOK(getWidget("finishedbook")), getWidget("viewWindowFile")))
-		status = Util::toString(totalFiles) + _(" files");
-	else
-		status = Util::toString(totalUsers) + _(" users");
+	string status = Util::toString(totalFiles) + _(" files");
 
 	string size = Util::formatBytes(totalBytes);
 	string speed = Util::formatBytes((totalTime > 0) ? totalBytes * ((int64_t)1000) / totalTime : 0) + "/s";
@@ -246,27 +156,13 @@
 gboolean FinishedTransfers::onButtonPressed_gui(GtkWidget *widget, GdkEventButton *event, gpointer data)
 {
 	FinishedTransfers *ft = (FinishedTransfers *)data;
-	GtkTreeSelection *selection;
-	TreeView *view;
-	if(gtk_notebook_get_current_page(GTK_NOTEBOOK(ft->getWidget("finishedbook"))) == 
-			gtk_notebook_page_num(GTK_NOTEBOOK(ft->getWidget("finishedbook")), ft->getWidget("viewWindowFile")))
-	{
-		selection = ft->fileSelection;
-		view = &ft->fileView;
-	}
-	else
-	{
-		selection = ft->userSelection;
-		view = &ft->userView;
-	}
-	
 
 	if (event->button == 3)
 	{
 		GtkTreePath *path;
-		if (gtk_tree_view_get_path_at_pos(view->get(), (gint)event->x, (gint)event->y, &path, NULL, NULL, NULL))
+		if (gtk_tree_view_get_path_at_pos(ft->fileView.get(), (gint)event->x, (gint)event->y, &path, NULL, NULL, NULL))
 		{
-			bool selected = gtk_tree_selection_path_is_selected(selection, path);
+			bool selected = gtk_tree_selection_path_is_selected(ft->fileSelection, path);
 			gtk_tree_path_free(path);
 
 			if (selected)
@@ -281,34 +177,12 @@
 gboolean FinishedTransfers::onButtonReleased_gui(GtkWidget *widget, GdkEventButton *event, gpointer data)
 {
 	FinishedTransfers *ft = (FinishedTransfers *)data;
-	GtkTreeSelection *selection;
-	TreeView *view;
-	if(gtk_notebook_get_current_page(GTK_NOTEBOOK(ft->getWidget("finishedbook"))) == 
-			gtk_notebook_page_num(GTK_NOTEBOOK(ft->getWidget("finishedbook")), ft->getWidget("viewWindowFile")))
-	{
-		selection = ft->fileSelection;
-		view = &ft->fileView;
-	}
-	else
-	{
-		selection = ft->userSelection;
-		view = &ft->userView;
-	}
-	int count = gtk_tree_selection_count_selected_rows(selection);
+
+	int count = gtk_tree_selection_count_selected_rows(ft->fileSelection);
 
 	if (event->button == 3 && count > 0)
 	{
 		gtk_menu_popup(GTK_MENU(ft->getWidget("menu")), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
-		if (view == &ft->fileView)
-		{
-			gtk_widget_set_sensitive(ft->getWidget("openItem"), TRUE);
-			gtk_widget_set_sensitive(ft->getWidget("openFolderItem"), TRUE);
-		}
-		else
-		{
-			gtk_widget_set_sensitive(ft->getWidget("openItem"), FALSE);
-			gtk_widget_set_sensitive(ft->getWidget("openFolderItem"), FALSE);
-		}
 		gtk_widget_show_all(ft->getWidget("menu"));
 	}
 
@@ -318,24 +192,12 @@
 gboolean FinishedTransfers::onKeyReleased_gui(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
 	FinishedTransfers *ft = (FinishedTransfers *)data;
-	GtkTreeSelection *selection;
-	TreeView *view;
-	if(gtk_notebook_get_current_page(GTK_NOTEBOOK(ft->getWidget("finishedbook"))) == 
-			gtk_notebook_page_num(GTK_NOTEBOOK(ft->getWidget("finishedbook")), ft->getWidget("viewWindowFile")))
-	{
-		selection = ft->fileSelection;
-		view = &ft->fileView;
-	}
-	else
-	{
-		selection = ft->userSelection;
-		view = &ft->userView;
-	}
-	int count = gtk_tree_selection_count_selected_rows(selection);
+
+	int count = gtk_tree_selection_count_selected_rows(ft->fileSelection);
 
 	if (count > 0)
 	{
-		if (view == &ft->fileView && (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter))
+		if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter)
 		{
 			onOpen_gui(NULL, data);
 		}
@@ -379,11 +241,6 @@
 
 }
 
-void FinishedTransfers::onPageSwitched_gui(GtkNotebook *notebook, GtkNotebookPage *page, guint num, gpointer data)
-{
-	((FinishedTransfers*)data)->updateStatus_gui(); // Switch the total count between users and files
-}
-
 void FinishedTransfers::onOpenFolder_gui(GtkMenuItem *item, gpointer data)
 {
 	FinishedTransfers *ft = (FinishedTransfers *)data;
@@ -413,27 +270,11 @@
 void FinishedTransfers::onRemoveItems_gui(GtkMenuItem *item, gpointer data)
 {
 	FinishedTransfers *ft = (FinishedTransfers *)data;
-	GtkTreeSelection *selection;
-	TreeView *view;
-	GtkListStore *store;
-	if(gtk_notebook_get_current_page(GTK_NOTEBOOK(ft->getWidget("finishedbook"))) == 
-			gtk_notebook_page_num(GTK_NOTEBOOK(ft->getWidget("finishedbook")), ft->getWidget("viewWindowFile")))
-	{
-		selection = ft->fileSelection;
-		view = &ft->fileView;
-		store = ft->fileStore;
-	}
-	else
-	{
-		selection = ft->userSelection;
-		view = &ft->userView;
-		store = ft->userStore;
-	}
 
 	string target;
 	GtkTreeIter iter;
 	GtkTreePath *path;
-	GList *list = gtk_tree_selection_get_selected_rows(selection, NULL);
+	GList *list = gtk_tree_selection_get_selected_rows(ft->fileSelection, NULL);
 
 	typedef Func1<FinishedTransfers, string> F1;
 	F1 *func;
@@ -441,20 +282,10 @@
 	for (GList *i = list; i; i = i->next)
 	{
 		path = (GtkTreePath *)i->data;
-		if (gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
+		if (gtk_tree_model_get_iter(GTK_TREE_MODEL(ft->fileStore), &iter, path))
 		{
-			if (view == &ft->fileView)
-			{
-				target = view->getString(&iter, "Target");
-				func = new F1(ft, &FinishedTransfers::removeFile_client, target);
-			}
-			else
-			{
-				target = view->getString(&iter, "CID");
-				func = new F1(ft, &FinishedTransfers::removeUser_client, target);
-			}
-
-
+			target = ft->fileView.getString(&iter, "Target");
+			func = new F1(ft, &FinishedTransfers::removeFile_client, target);
 			WulforManager::get()->dispatchClientFunc(func);
 		}
 		gtk_tree_path_free(path);
@@ -464,25 +295,6 @@
 	ft->updateStatus_gui();		// Why? model won't change until after the _client call.
 }
 
-void FinishedTransfers::removeUser_gui(string target)
-{
-	GtkTreeIter iter;
-	GtkTreeModel *m = GTK_TREE_MODEL(userStore);
-	bool valid = gtk_tree_model_get_iter_first(m, &iter);
-
-	while (valid)
-	{
-		if (target == userView.getString(&iter, "CID"))
-		{
-			gtk_list_store_remove(userStore, &iter);
-			totalUsers--;
-			updateStatus_gui();
-			return;
-		}
-		valid = gtk_tree_model_iter_next(m, &iter);
-	}
-}
-
 void FinishedTransfers::removeFile_gui(string target)
 {
 	GtkTreeIter iter;
@@ -493,7 +305,7 @@
 	{
 		if (target == fileView.getString(&iter, "Target"))
 		{
-			totalBytes -= fileView.getValue<gint64>(&iter, "Transferred");
+			totalBytes -= fileView.getValue<gint64>(&iter, "Size");
 			totalTime -= fileView.getValue<gint64>(&iter, "Elapsed Time");
 			gtk_list_store_remove(fileStore, &iter);
 			totalFiles--;
@@ -508,12 +320,10 @@
 {
 	FinishedTransfers *ft = (FinishedTransfers *)data;
 
-	gtk_list_store_clear(ft->userStore);
 	gtk_list_store_clear(ft->fileStore);
 	ft->totalBytes = 0;
 	ft->totalTime = 0;
 	ft->totalFiles = 0;
-	ft->totalUsers = 0;
 	ft->updateStatus_gui();
 
 	typedef Func0<FinishedTransfers> F0;
@@ -528,7 +338,6 @@
 	//F2 *func;
 	FinishedManager::getInstance()->lockLists();
 	const FinishedManager::MapByFile &list = FinishedManager::getInstance()->getMapByFile(isUpload); 
-	const FinishedManager::MapByUser &user = FinishedManager::getInstance()->getMapByUser(isUpload); 
 
 	for (FinishedManager::MapByFile::const_iterator it = list.begin(); it != list.end(); ++it)
 	{
@@ -539,15 +348,6 @@
 		//WulforManager::get()->dispatchGuiFunc(func);
 	}
 
-	for (FinishedManager::MapByUser::const_iterator uit = user.begin(); uit != user.end(); ++uit)
-	{
-		params.clear();
-		getFinishedParams_client(uit->second, uit->first, params);
-		addUser_gui(params, FALSE);
-		//func = new F2(this, &FinishedTransfers::addItem_gui, params, FALSE);
-		//WulforManager::get()->dispatchGuiFunc(func);
-	}
-
 	FinishedManager::getInstance()->unLockLists();
 
 	updateStatus_gui();
@@ -564,43 +364,14 @@
 	{
 		nicks += WulforUtil::getNicks(it->get()->getCID()) + ", ";
 	}
-	params["Nicks"] = nicks.substr(0, nicks.length() - 2);
-	// item->getFileSize() seems to return crap. I guess there's no way to get 
-	// the real file size with this core version? Only the transferred part (I guess
-	// the size could be asked from QueueManager (if the file isn't complete)?)
-	params["Transferred"] = Util::toString(item->getTransferred());
-	params["Speed"] = Util::toString(item->getAverageSpeed());
+	params["Users"] = nicks.substr(0, nicks.length() - 2);
+	params["Size"] = Util::toString(item->getTransferred());
+	params["Average Speed"] = Util::toString(item->getAverageSpeed());
 	params["CRC Checked"] = item->getCrc32Checked() ? _("Yes") : _("No");
 	params["Target"] = file;
 	params["Elapsed Time"] = Util::toString(item->getMilliSeconds());
 }
 
-void FinishedTransfers::getFinishedParams_client(const FinishedUserItemPtr& item, const UserPtr& user, StringMap &params)
-{
-	std::string files;
-	params["Time"] = Util::formatTime("%Y-%m-%d %H:%M:%S", item->getTime());	
-	params["Nick"] = WulforUtil::getNicks(user->getCID());
-	params["Hub"] = Util::toString(ClientManager::getInstance()->getHubNames(user->getCID()));
-	for (StringList::const_iterator it = item->getFiles().begin(); it != item->getFiles().end(); ++it)
-	{
-		files += *it + ", ";
-	}
-	params["Files"] = files.substr(0, files.length() - 2);
-	params["Transferred"] = Util::toString(item->getTransferred());
-	params["Speed"] = Util::toString(item->getAverageSpeed());
-	params["CID"] = user->getCID().toBase32();
-	params["Elapsed Time"] = Util::toString(item->getMilliSeconds());
-}
-
-void FinishedTransfers::removeUser_client(std::string cid)
-{
-	UserPtr user = ClientManager::getInstance()->findUser(CID(cid));
-
-	if (user)
-		FinishedManager::getInstance()->remove(isUpload, user);
-	
-}
-
 void FinishedTransfers::removeFile_client(std::string target)
 {
 
@@ -616,7 +387,8 @@
 
 void FinishedTransfers::on(FinishedManagerListener::AddedFile, bool upload, const string& file, const FinishedFileItemPtr& item) throw()
 {
-	if (isUpload == upload)
+	// Show partial uploads, but only full downloads
+	if (isUpload == upload && (upload || item->isFull()))
 	{
 		StringMap params;
 		getFinishedParams_client(item, file, params);
@@ -627,22 +399,10 @@
 	}
 }
 
-void FinishedTransfers::on(FinishedManagerListener::AddedUser, bool upload, const UserPtr& user, const FinishedUserItemPtr& item) throw()
-{
-	if (isUpload == upload)
-	{
-		StringMap params;
-		getFinishedParams_client(item, user, params);
-	
-		typedef Func2<FinishedTransfers, StringMap, bool> F2;
-		F2 *func = new F2(this, &FinishedTransfers::addUser_gui, params, TRUE);
-		WulforManager::get()->dispatchGuiFunc(func);
-	}
-}
-
 void FinishedTransfers::on(FinishedManagerListener::UpdatedFile, bool upload, const string& file, const FinishedFileItemPtr& item) throw()
 {
-	if (isUpload == upload)
+	// Show partial uploads, but only full downloads
+	if (isUpload == upload && (upload || item->isFull()))
 	{
 		StringMap params;
 		getFinishedParams_client(item, file, params);
@@ -653,26 +413,6 @@
 	}
 }
 
-void FinishedTransfers::on(FinishedManagerListener::UpdatedUser, bool upload, const UserPtr& user) throw()
-{
-	if (isUpload == upload)
-	{
-		const FinishedManager::MapByUser &umap = FinishedManager::getInstance()->getMapByUser(isUpload);
-		FinishedManager::MapByUser::const_iterator userit = umap.find(user);
-		if (userit == umap.end())
-			return;
-
-		const FinishedUserItemPtr &item = userit->second;
-
-		StringMap params;
-		getFinishedParams_client(item, user, params);
-
-		typedef Func2<FinishedTransfers, StringMap, bool> F2;
-		F2 *func = new F2(this, &FinishedTransfers::addUser_gui, params, TRUE);
-		WulforManager::get()->dispatchGuiFunc(func);
-	}
-}
-
 void FinishedTransfers::on(FinishedManagerListener::RemovedFile, bool upload, const string& item) throw()
 {
 	if (isUpload == upload)
@@ -683,12 +423,3 @@
 	}
 }
 
-void FinishedTransfers::on(FinishedManagerListener::RemovedUser, bool upload, const UserPtr& user) throw()
-{
-	if (isUpload == upload)
-	{
-		typedef Func1<FinishedTransfers, std::string> F1;
-		F1 *func = new F1(this, &FinishedTransfers::removeUser_gui, user->getCID().toBase32());
-		WulforManager::get()->dispatchGuiFunc(func);
-	}
-}

=== modified file 'linux/finishedtransfers.hh'
--- linux/finishedtransfers.hh	2009-03-12 05:47:55 +0000
+++ linux/finishedtransfers.hh	2010-08-05 05:31:49 +0000
@@ -44,12 +44,9 @@
 
 		// GUI functions
 		void addFile_gui(dcpp::StringMap params, bool update);
-		void addUser_gui(dcpp::StringMap params, bool update);
 		void removeFile_gui(std::string target);
-		void removeUser_gui(std::string cid);
 		void updateStatus_gui();
 		bool findFile_gui(GtkTreeIter* iter, const std::string& item);
-		bool findUser_gui(GtkTreeIter* iter, const std::string& cid);
 
 		// GUI callbacks
 		static gboolean onButtonPressed_gui(GtkWidget *widget, GdkEventButton *event, gpointer data);
@@ -59,32 +56,24 @@
 		static void onOpenFolder_gui(GtkMenuItem *item, gpointer data);
 		static void onRemoveItems_gui(GtkMenuItem *item, gpointer data);
 		static void onRemoveAll_gui(GtkMenuItem *item, gpointer data);
-		static void onPageSwitched_gui(GtkNotebook *notebook, GtkNotebookPage *page, guint num, gpointer data);
 
 		// Client functions
 		void initializeList_client();
 		void getFinishedParams_client(const dcpp::FinishedFileItemPtr &item, const std::string &file,  dcpp::StringMap &params);
-		void getFinishedParams_client(const dcpp::FinishedUserItemPtr &item, const dcpp::UserPtr &user,  dcpp::StringMap &params);
 		void removeFile_client(std::string target);
-		void removeUser_client(std::string cid);
 		void removeAll_client();
 
 		// Client callbacks
 		virtual void on(dcpp::FinishedManagerListener::AddedFile, bool upload, const std::string &file, const dcpp::FinishedFileItemPtr &item) throw();
-		virtual void on(dcpp::FinishedManagerListener::AddedUser, bool upload, const dcpp::UserPtr &user, const dcpp::FinishedUserItemPtr &item) throw();
 		virtual void on(dcpp::FinishedManagerListener::UpdatedFile, bool upload, const std::string &file, const dcpp::FinishedFileItemPtr &item) throw();
 		virtual void on(dcpp::FinishedManagerListener::RemovedFile, bool upload, const std::string &file) throw();
-		virtual void on(dcpp::FinishedManagerListener::UpdatedUser, bool upload, const dcpp::UserPtr &user) throw();
-		virtual void on(dcpp::FinishedManagerListener::RemovedUser, bool upload, const dcpp::UserPtr &user) throw();
 		/* virtual void on(dcpp::FinishedManagerListener::RemoveAll, bool upload) throw();  Implement? */
 
-		GtkListStore *fileStore, *userStore;
-		TreeView userView;
+		GtkListStore *fileStore;
 		TreeView fileView;
-		GtkTreeSelection *fileSelection,*userSelection;
+		GtkTreeSelection *fileSelection;
 		bool isUpload;
 		int totalFiles;
-		int totalUsers;
 		int64_t totalBytes, totalTime;
 };