← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~linuxdcpp-team/linuxdcpp/trunk] Rev 339: Added unordered_map<CID, vector<SearchResultPtr> > to search, fixes adding 'old' results to queue...

 

Merge authors:
  Razzloss (razzloss)
------------------------------------------------------------
revno: 339 [merge]
committer: Razzloss <razzloss@xxxxxxxxx>
branch nick: master
timestamp: Mon 2009-11-02 05:24:22 +0200
message:
  Added unordered_map<CID, vector<SearchResultPtr> > to search, fixes adding 'old' results to queue and improves addResult performance
modified:
  Changelog.txt
  linux/search.cc
  linux/search.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	2009-10-22 03:11:11 +0000
+++ Changelog.txt	2009-11-02 03:24:22 +0000
@@ -35,6 +35,7 @@
 [2009-10-20] Improved the look of the application icon in the title bar. (Steven)
 [2009-10-20] Application icons now install into theme search path. Allows for visiblity in other apps (e.g. notification daemon). (Steven)
 [2009-10-21] Added a debian folder, man page and desktop file. (Steven)
+[2009-11-02] lp#442475: Fixed crash when adding a search results from user who has left the hub. (Razzloss)
 
 *** 1.0.3 2009-02-01 ***
 [2008-08-10] lp#256236: Fixed a crash on startup when using auto-open options.

=== modified file 'linux/search.cc'
--- linux/search.cc	2009-10-14 17:04:43 +0000
+++ linux/search.cc	2009-11-02 03:24:22 +0000
@@ -419,6 +419,7 @@
 	}
 
 	gtk_tree_store_clear(resultStore);
+	results.clear();
 	int64_t llsize = static_cast<int64_t>(lsize);
 	searchlist = StringTokenizer<string>(text, ' ').getTokens();
 
@@ -480,12 +481,8 @@
 	}
 }
 
-void Search::addResult_gui(StringMap resultMap)
+void Search::addResult_gui(const SearchResultPtr result)
 {
-	GroupType groupBy = (GroupType)gtk_combo_box_get_active(GTK_COMBO_BOX(getWidget("comboboxGroupBy")));
-	string groupColumn = getGroupingColumn(groupBy);
-	string groupStr = resultMap[groupColumn];
-
 	// Check that it's not a duplicate and find parent for grouping
 	GtkTreeIter iter;
 	GtkTreeIter parent;
@@ -494,20 +491,26 @@
 	bool foundParent = FALSE;
 	bool createParent = FALSE;
 
-	gboolean valid = gtk_tree_model_get_iter_first(m, &iter);
-	while (valid)
+	vector<SearchResultPtr> &existingResults = results[result->getUser()->getCID().toBase32()];
+	for (vector<SearchResultPtr>::iterator it = existingResults.begin(); it != existingResults.end(); it++)
 	{
 		// Check if it's a duplicate
-		if (resultMap["CID"] == resultView.getString(&iter, "CID", m) &&
-		    resultMap["Filename"] == resultView.getString(&iter, "Filename", m) &&
-		    resultMap["Path"] == resultView.getString(&iter, "Path", m))
-		{
+		if (result->getFile() == (*it)->getFile())
 			return;
-		}
-
-		// Find grouping parent
-		if (!foundParent && groupBy != NOGROUPING && !groupStr.empty() &&
-		    resultView.getString(&iter, "Grouping String", m) == groupStr)
+	}
+	existingResults.push_back(result);
+
+	dcpp::StringMap resultMap;
+	parseSearchResult_gui(result, resultMap);
+
+	// Find grouping parent
+	GroupType groupBy = (GroupType)gtk_combo_box_get_active(GTK_COMBO_BOX(getWidget("comboboxGroupBy")));
+	string groupColumn = getGroupingColumn(groupBy);
+	string groupStr = resultMap[groupColumn];
+	gboolean valid = gtk_tree_model_get_iter_first(m, &iter);
+	while (valid && groupBy != NOGROUPING && !foundParent && !groupStr.empty())
+	{
+		if (resultView.getString(&iter, "Grouping String", m) == groupStr)
 		{
 			// Parent row
 			if (gtk_tree_model_iter_has_child(m, &iter))
@@ -1492,6 +1495,8 @@
 	}
 }
 
+// Removing a row from treeStore still leaves the SearchResultPtr to results map. This way if a duplicate
+// result comes in later it won't be readded, before the results map is cleared with a new search. 
 void Search::onRemoveClicked_gui(GtkMenuItem *item, gpointer data)
 {
 	Search *s = (Search *)data;
@@ -1563,7 +1568,7 @@
 	}
 }
 
-void Search::parseSearchResult_client(SearchResultPtr result, StringMap &resultMap)
+void Search::parseSearchResult_gui(SearchResultPtr result, StringMap &resultMap)
 {
 	if (result->getType() == SearchResult::TYPE_FILE)
 	{
@@ -1797,18 +1802,15 @@
 			    (*i->begin() == '-' && i->size() != 1 && Util::findSubString(result->getFile(), i->substr(1)) != (string::size_type)-1))
 			{
 				++droppedResult;
-				F2 *func = new F2(this, &Search::setStatus_gui, "statusbar3", Util::toString(droppedResult) + _(" filtered"));
+				F2 *func = new F2(this, &Search::setStatus_gui, "statusbar3", Util::toString(droppedResult) + _(" dropped"));
 				WulforManager::get()->dispatchGuiFunc(func);
 				return;
 			}
 		}
 	}
 
-	StringMap resultMap;
-	parseSearchResult_client(result, resultMap);
-
-	typedef Func1<Search, StringMap> F1;
-	F1 *func = new F1(this, &Search::addResult_gui, resultMap);
+	typedef Func1<Search, SearchResultPtr> F1;
+	F1 *func = new F1(this, &Search::addResult_gui, result);
 	WulforManager::get()->dispatchGuiFunc(func);
 }
 

=== modified file 'linux/search.hh'
--- linux/search.hh	2009-08-15 04:40:26 +0000
+++ linux/search.hh	2009-11-02 03:16:59 +0000
@@ -68,7 +68,7 @@
 		void popupMenu_gui();
 		void setStatus_gui(std::string statusBar, std::string text);
 		void search_gui();
-		void addResult_gui(dcpp::StringMap resultMap);
+		void addResult_gui(const dcpp::SearchResultPtr result);
 		void updateParentRow_gui(GtkTreeIter *parent, GtkTreeIter *child = NULL);
 		void ungroup_gui();
 		void regroup_gui();
@@ -105,8 +105,10 @@
 		static void onRemoveUserFromQueueClicked_gui(GtkMenuItem *item, gpointer data);
 		static void onRemoveClicked_gui(GtkMenuItem *item, gpointer data);
 
+		// GUI functions
+		void parseSearchResult_gui(dcpp::SearchResultPtr result, dcpp::StringMap &resultMap);
+
 		// Client functions
-		void parseSearchResult_client(dcpp::SearchResultPtr result, dcpp::StringMap &resultMap);
 		void download_client(std::string target, std::string cid, std::string filename, int64_t size, std::string tth, std::string hubUrl);
 		void downloadDir_client(std::string target, std::string cid, std::string filename, std::string hubUrl);
 		void addSource_client(std::string source, std::string cid, int64_t size, std::string tth, std::string hubUrl);
@@ -137,6 +139,7 @@
 		bool onlyFree;
 		UserCommandMenu *userCommandMenu;
 		GroupType previousGrouping;
+		std::tr1::unordered_map<std::string, std::vector<dcpp::SearchResultPtr> > results;
 };
 
 #else