linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #00066
[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