← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2311: support SEGA

 

------------------------------------------------------------
revno: 2311
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Sun 2010-11-28 16:52:39 +0100
message:
  support SEGA
modified:
  changelog.txt
  dcpp/AdcCommand.h
  dcpp/AdcHub.cpp
  dcpp/AdcHub.h
  dcpp/SettingsManager.cpp


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

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'changelog.txt'
--- changelog.txt	2010-11-25 18:35:55 +0000
+++ changelog.txt	2010-11-28 15:52:39 +0000
@@ -32,7 +32,7 @@
 * Added notice about the original C implementation of Tiger (you must include this in mods!) (ullner)
 * Add a menu to change the group of a fav hub more easily (poy)
 * [ADC] Support hidden users as per the ADC ext spec (poy)
-* [ADC] Group search extensions with the "GR" param (poy)
+* [ADC] Group search extensions thanks to "SEGA" (poy)
 * Keep search history in file list windows (emtee)
 * Update OpenSSL to version 1.0.0b (poy)
 * [L#378829] Make sure our OpenSSL binaries aren't "optimized for MS-DOS" (poy)

=== modified file 'dcpp/AdcCommand.h'
--- dcpp/AdcCommand.h	2010-04-09 08:08:48 +0000
+++ dcpp/AdcCommand.h	2010-11-28 15:52:39 +0000
@@ -125,6 +125,7 @@
 	void setType(char t) { type = t; }
 	string getFourCC() const { string tmp(4, 0); tmp[0] = type; tmp[1] = cmd[0]; tmp[2] = cmd[1]; tmp[3] = cmd[2]; return tmp; }
 
+	const string& getFeatures() const { return features; }
 	AdcCommand& setFeatures(const string& feat) { features = feat; return *this; }
 
 	StringList& getParameters() { return parameters; }

=== modified file 'dcpp/AdcHub.cpp'
--- dcpp/AdcHub.cpp	2010-11-27 14:48:00 +0000
+++ dcpp/AdcHub.cpp	2010-11-28 15:52:39 +0000
@@ -44,12 +44,15 @@
 const string AdcHub::TCP4_FEATURE("TCP4");
 const string AdcHub::UDP4_FEATURE("UDP4");
 const string AdcHub::NAT0_FEATURE("NAT0");
+const string AdcHub::SEGA_FEATURE("SEGA");
 const string AdcHub::BASE_SUPPORT("ADBASE");
 const string AdcHub::BAS0_SUPPORT("ADBAS0");
 const string AdcHub::TIGR_SUPPORT("ADTIGR");
 const string AdcHub::UCM0_SUPPORT("ADUCM0");
 const string AdcHub::BLO0_SUPPORT("ADBLO0");
 
+const vector<StringList> AdcHub::searchExts;
+
 AdcHub::AdcHub(const string& aHubURL, bool secure) : Client(aHubURL, '\n', secure), oldPassword(false), sid(0) {
 	TimerManager::getInstance()->addListener(this);
 }
@@ -713,76 +716,72 @@
 	}
 }
 
-namespace {
-static vector<StringList> searchExts;
-
-static void defineSearchExts() {
+const vector<StringList>& AdcHub::getSearchExts() {
 	if(!searchExts.empty())
-		return;
-
-	searchExts.resize(6);
+		return searchExts;
+
+	// the list is always immutable except for this function where it is initially being filled.
+	auto& xSearchExts = const_cast<vector<StringList>&>(searchExts);
+
+	xSearchExts.resize(6);
 
 	/// @todo simplify this as searchExts[0] = { "mp3", "etc" } when VC++ supports initializer lists
 
-	{
-		StringList& l = searchExts[0];
-		l.push_back("mp3"); l.push_back("flac"); l.push_back("ogg"); l.push_back("mpc");
-		l.push_back("ape"); l.push_back("wma");l.push_back("wav"); l.push_back("m4a");
-		l.push_back("mp2"); l.push_back("mid"); l.push_back("au"); l.push_back("aiff");
-		l.push_back("ra");
-		sort(l.begin(), l.end());
-	}
-
-	{
-		StringList& l = searchExts[1];
-		l.push_back("rar"); l.push_back("7z"); l.push_back("zip"); l.push_back("tar");
-		l.push_back("gz"); l.push_back("bz2"); l.push_back("z"); l.push_back("ace");
-		l.push_back("lha"); l.push_back("lzh"); l.push_back("arj");
-		sort(l.begin(), l.end());
-	}
-
-	{
-		StringList& l = searchExts[2];
-		l.push_back("doc"); l.push_back("xls"); l.push_back("ppt"); l.push_back("docx");
-		l.push_back("xlsx"); l.push_back("pptx"); l.push_back("odf"); l.push_back("odt");
-		l.push_back("ods"); l.push_back("odp"); l.push_back("pdf"); l.push_back("xps");
-		l.push_back("htm"); l.push_back("html"); l.push_back("xml"); l.push_back("txt");
-		l.push_back("nfo"); l.push_back("rtf");
-		sort(l.begin(), l.end());
-	}
-
-	{
-		StringList& l = searchExts[3];
-		l.push_back("exe"); l.push_back("com"); l.push_back("bat"); l.push_back("cmd");
-		l.push_back("dll"); l.push_back("vbs"); l.push_back("ps1"); l.push_back("msi");
-		sort(l.begin(), l.end());
-	}
-
-	{
-		StringList& l = searchExts[4];
-		l.push_back("bmp"); l.push_back("ico"); l.push_back("jpg"); l.push_back("jpeg");
-		l.push_back("png"); l.push_back("gif"); l.push_back("tga"); l.push_back("ai");
-		l.push_back("ps"); l.push_back("pict"); l.push_back("eps"); l.push_back("img");
-		l.push_back("pct"); l.push_back("psp"); l.push_back("tif"); l.push_back("rle");
-		l.push_back("pcx"); l.push_back("sfw"); l.push_back("psd"); l.push_back("cdr");
-		sort(l.begin(), l.end());
-	}
-
-	{
-		StringList& l = searchExts[5];
-		l.push_back("mpg"); l.push_back("avi"); l.push_back("mkv"); l.push_back("wmv");
-		l.push_back("mov"); l.push_back("mp4"); l.push_back("3gp"); l.push_back("qt");
-		l.push_back("asx"); l.push_back("divx"); l.push_back("asf"); l.push_back("pxp");
-		l.push_back("ogm"); l.push_back("flv"); l.push_back("rm"); l.push_back("rmvb");
-		l.push_back("webm"); l.push_back("mpeg");
-		sort(l.begin(), l.end());
-	}
-}
+	// these extensions *must* be sorted alphabetically!
+
+	{
+		StringList& l = xSearchExts[0];
+		l.push_back("ape"); l.push_back("flac"); l.push_back("m4a"); l.push_back("mid");
+		l.push_back("mp3"); l.push_back("mpc"); l.push_back("ogg"); l.push_back("ra");
+		l.push_back("wav"); l.push_back("wma");
+	}
+
+	{
+		StringList& l = xSearchExts[1];
+		l.push_back("7z"); l.push_back("ace"); l.push_back("arj"); l.push_back("bz2");
+		l.push_back("gz"); l.push_back("lha"); l.push_back("lzh"); l.push_back("rar");
+		l.push_back("tar"); l.push_back("z"); l.push_back("zip");
+	}
+
+	{
+		StringList& l = xSearchExts[2];
+		l.push_back("doc"); l.push_back("docx"); l.push_back("htm"); l.push_back("html");
+		l.push_back("nfo"); l.push_back("odf"); l.push_back("odp"); l.push_back("ods");
+		l.push_back("odt"); l.push_back("pdf"); l.push_back("ppt"); l.push_back("pptx");
+		l.push_back("rtf"); l.push_back("txt"); l.push_back("xls"); l.push_back("xlsx");
+		l.push_back("xml"); l.push_back("xps");
+	}
+
+	{
+		StringList& l = xSearchExts[3];
+		l.push_back("app"); l.push_back("bat"); l.push_back("cmd"); l.push_back("com");
+		l.push_back("dll"); l.push_back("exe"); l.push_back("jar"); l.push_back("msi");
+		l.push_back("ps1"); l.push_back("vbs"); l.push_back("wsf");
+	}
+
+	{
+		StringList& l = xSearchExts[4];
+		l.push_back("bmp"); l.push_back("cdr"); l.push_back("eps"); l.push_back("gif");
+		l.push_back("ico"); l.push_back("img"); l.push_back("jpeg"); l.push_back("jpg");
+		l.push_back("png"); l.push_back("ps"); l.push_back("psd"); l.push_back("sfw");
+		l.push_back("tga"); l.push_back("tif"); l.push_back("webp");
+	}
+
+	{
+		StringList& l = xSearchExts[5];
+		l.push_back("3gp"); l.push_back("asf"); l.push_back("asx"); l.push_back("avi");
+		l.push_back("divx"); l.push_back("flv"); l.push_back("mkv"); l.push_back("mov");
+		l.push_back("mp4"); l.push_back("mpeg"); l.push_back("mpg"); l.push_back("ogm");
+		l.push_back("pxp"); l.push_back("qt"); l.push_back("rm"); l.push_back("rmvb");
+		l.push_back("swf"); l.push_back("vob"); l.push_back("webm"); l.push_back("wmv");
+	}
+
+	return searchExts;
 }
 
 StringList AdcHub::parseSearchExts(int flag) {
-	defineSearchExts();
 	StringList ret;
+	const auto& searchExts = getSearchExts();
 	for(auto i = searchExts.cbegin(), iend = searchExts.cend(); i != iend; ++i) {
 		if(flag & (1 << (i - searchExts.cbegin()))) {
 			ret.insert(ret.begin(), i->begin(), i->end());
@@ -797,6 +796,9 @@
 
 	AdcCommand c(AdcCommand::CMD_SCH, AdcCommand::TYPE_BROADCAST);
 
+	if(!aToken.empty())
+		c.addParam("TO", aToken);
+
 	if(aFileType == SearchManager::TYPE_TTH) {
 		c.addParam("TR", aString);
 
@@ -823,8 +825,9 @@
 				sort(exts.begin(), exts.end());
 
 				uint8_t gr = 0;
+				StringList rx;
 
-				defineSearchExts();
+				const auto& searchExts = getSearchExts();
 				for(auto i = searchExts.cbegin(), iend = searchExts.cend(); i != iend; ++i) {
 					const StringList& def = *i;
 
@@ -856,36 +859,56 @@
 
 					exts = temp; // the exts to still add (that were not defined in the group)
 
-					for(auto rmi = rm.cbegin(), rmiend = rm.cend(); rmi != rmiend; ++rmi)
-						c.addParam("RX", *rmi);
+					rx.insert(rx.begin(), rm.begin(), rm.end());
 
 					if(exts.size() <= 2)
 						break;
 					// keep looping to see if there are more exts that can be grouped
 				}
 
-				if(gr)
-					c.addParam("GR", Util::toString(gr));
+				if(gr) {
+					// some extensions can be grouped; let's send a command with grouped exts.
+					AdcCommand c_gr(AdcCommand::CMD_SCH, AdcCommand::TYPE_FEATURE);
+					c_gr.setFeatures('+' + SEGA_FEATURE);
+
+					const auto& params = c.getParameters();
+					for(auto i = params.cbegin(), iend = params.cend(); i != iend; ++i)
+						c_gr.addParam(*i);
+
+					for(auto i = exts.cbegin(), iend = exts.cend(); i != iend; ++i)
+						c_gr.addParam("EX", *i);
+					c_gr.addParam("GR", Util::toString(gr));
+					for(auto i = rx.cbegin(), iend = rx.cend(); i != iend; ++i)
+						c_gr.addParam("RX", *i);
+
+					sendSearch(c_gr);
+
+					// make sure users with the feature don't receive the search twice.
+					c.setType(AdcCommand::TYPE_FEATURE);
+					c.setFeatures('-' + SEGA_FEATURE);
+				}
 			}
 
-			for(auto i = exts.cbegin(), iend = exts.cend(); i != iend; ++i)
+			for(auto i = aExtList.cbegin(), iend = aExtList.cend(); i != iend; ++i)
 				c.addParam("EX", *i);
 		}
 	}
 
-	if(!aToken.empty())
-		c.addParam("TO", aToken);
+	sendSearch(c);
+}
 
+void AdcHub::sendSearch(AdcCommand& c) {
 	if(ClientManager::getInstance()->isActive()) {
 		send(c);
 	} else {
 		c.setType(AdcCommand::TYPE_FEATURE);
+		string features = c.getFeatures();
 #ifndef DISABLE_NAT_TRAVERSAL
-		c.setFeatures("+TCP4-NAT0");
-		send(c);		
-		c.setFeatures("+NAT0");
+		c.setFeatures(features + '+' + TCP4_FEATURE + '-' + NAT0_FEATURE);
+		send(c);
+		c.setFeatures(features + '+' + NAT0_FEATURE);
 #else
-		c.setFeatures("+TCP4");
+		c.setFeatures(features + '+' + TCP4_FEATURE);
 #endif
 		send(c);
 	}
@@ -968,9 +991,10 @@
 		addParam(lastInfoMap, c, "US", Util::toString((long)(Util::toDouble(SETTING(UPLOAD_SPEED))*1024*1024/8)));
 	}
 
-	string su;
+	string su(SEGA_FEATURE);
+
 	if(CryptoManager::getInstance()->TLSOk()) {
-		su += ADCS_FEATURE + ",";
+		su += "," + ADCS_FEATURE;
 	}
 
 #ifndef DISABLE_NAT_TRAVERSAL
@@ -981,11 +1005,11 @@
 	}
 	if(ClientManager::getInstance()->isActive()) {
 		addParam(lastInfoMap, c, "U4", Util::toString(SearchManager::getInstance()->getPort()));
-		su += TCP4_FEATURE + ",";
-		su += UDP4_FEATURE + ",";
+		su += "," + TCP4_FEATURE;
+		su += "," + UDP4_FEATURE;
 	} else {
 		addParam(lastInfoMap, c, "U4", "");
-		su += NAT0_FEATURE + ",";
+		su += "," + NAT0_FEATURE;
 	}
 #else
 	if(ClientManager::getInstance()->isActive()) {
@@ -995,17 +1019,14 @@
 			addParam(lastInfoMap, c, "I4", "0.0.0.0");
 		}
 		addParam(lastInfoMap, c, "U4", Util::toString(SearchManager::getInstance()->getPort()));
-		su += TCP4_FEATURE + ",";
-		su += UDP4_FEATURE + ",";
+		su += "," + TCP4_FEATURE;
+		su += "," + UDP4_FEATURE;
 	} else {
 		addParam(lastInfoMap, c, "I4", "");
 		addParam(lastInfoMap, c, "U4", "");
 	}
 #endif
 
-	if(!su.empty()) {
-		su.erase(su.size() - 1);
-	}
 	addParam(lastInfoMap, c, "SU", su);
 
 	if(c.getParameters().size() > 0) {

=== modified file 'dcpp/AdcHub.h'
--- dcpp/AdcHub.h	2010-11-19 15:11:20 +0000
+++ dcpp/AdcHub.h	2010-11-28 15:52:39 +0000
@@ -50,6 +50,7 @@
 
 	string getMySID() { return AdcCommand::fromSID(sid); }
 
+	static const vector<StringList>& getSearchExts();
 	static StringList parseSearchExts(int flag);
 
 private:
@@ -84,12 +85,15 @@
 	static const string TCP4_FEATURE;
 	static const string UDP4_FEATURE;
 	static const string NAT0_FEATURE;
+	static const string SEGA_FEATURE;
 	static const string BASE_SUPPORT;
 	static const string BAS0_SUPPORT;
 	static const string TIGR_SUPPORT;
 	static const string UCM0_SUPPORT;
 	static const string BLO0_SUPPORT;
 
+	static const vector<StringList> searchExts;
+
 	virtual string checkNick(const string& nick);
 
 	OnlineUser& getUser(const uint32_t aSID, const CID& aCID);
@@ -117,6 +121,7 @@
 
 	template<typename T> void handle(T, AdcCommand&) { }
 
+	void sendSearch(AdcCommand& c);
 	void sendUDP(const AdcCommand& cmd) throw();
 	void unknownProtocol(uint32_t target, const string& protocol, const string& token);
 	bool secureAvail(uint32_t target, const string& protocol, const string& token);

=== modified file 'dcpp/SettingsManager.cpp'
--- dcpp/SettingsManager.cpp	2010-11-25 18:35:55 +0000
+++ dcpp/SettingsManager.cpp	2010-11-28 15:52:39 +0000
@@ -25,6 +25,7 @@
 #include "Util.h"
 #include "File.h"
 #include "version.h"
+#include "AdcHub.h"
 #include "CID.h"
 #include "SearchManager.h"
 #include "StringTokenizer.h"
@@ -544,57 +545,10 @@
 void SettingsManager::setSearchTypeDefaults() {
 	searchTypes.clear();
 
-	/// @todo simplify this as searchTypes[string(1, '0' + SearchManager::TYPE_AUDIO)] = { "mp3", "etc" } when VC++ supports initializer lists
-
-	/// @todo the default extension list contains some deprecated formats kept around for NMDC, drop them later
-
-	{
-		StringList& l = searchTypes.insert(make_pair(string(1, '0' + SearchManager::TYPE_AUDIO), StringList())).first->second;
-		l.push_back("mp3"); l.push_back("flac"); l.push_back("ogg"); l.push_back("mpc");
-		l.push_back("ape"); l.push_back("wma");l.push_back("wav"); l.push_back("m4a");
-		l.push_back("mp2"); l.push_back("mid"); l.push_back("au"); l.push_back("aiff");
-		l.push_back("ra");
-	}
-
-	{
-		StringList& l = searchTypes.insert(make_pair(string(1, '0' + SearchManager::TYPE_COMPRESSED), StringList())).first->second;
-		l.push_back("rar"); l.push_back("7z"); l.push_back("zip"); l.push_back("tar");
-		l.push_back("gz"); l.push_back("bz2"); l.push_back("z"); l.push_back("ace");
-		l.push_back("lha"); l.push_back("lzh"); l.push_back("arj");
-	}
-
-	{
-		StringList& l = searchTypes.insert(make_pair(string(1, '0' + SearchManager::TYPE_DOCUMENT), StringList())).first->second;
-		l.push_back("doc"); l.push_back("xls"); l.push_back("ppt"); l.push_back("docx");
-		l.push_back("xlsx"); l.push_back("pptx"); l.push_back("odf"); l.push_back("odt");
-		l.push_back("ods"); l.push_back("odp"); l.push_back("pdf"); l.push_back("xps");
-		l.push_back("htm"); l.push_back("html"); l.push_back("xml"); l.push_back("txt");
-		l.push_back("nfo"); l.push_back("rtf");
-	}
-
-	{
-		StringList& l = searchTypes.insert(make_pair(string(1, '0' + SearchManager::TYPE_EXECUTABLE), StringList())).first->second;
-		l.push_back("exe"); l.push_back("com"); l.push_back("bat"); l.push_back("cmd");
-		l.push_back("dll"); l.push_back("vbs"); l.push_back("ps1"); l.push_back("msi");
-	}
-
-	{
-		StringList& l = searchTypes.insert(make_pair(string(1, '0' + SearchManager::TYPE_PICTURE), StringList())).first->second;
-		l.push_back("bmp"); l.push_back("ico"); l.push_back("jpg"); l.push_back("jpeg");
-		l.push_back("png"); l.push_back("gif"); l.push_back("tga"); l.push_back("ai");
-		l.push_back("ps"); l.push_back("pict"); l.push_back("eps"); l.push_back("img");
-		l.push_back("pct"); l.push_back("psp"); l.push_back("tif"); l.push_back("rle");
-		l.push_back("pcx"); l.push_back("sfw"); l.push_back("psd"); l.push_back("cdr");
-	}
-
-	{
-		StringList& l = searchTypes.insert(make_pair(string(1, '0' + SearchManager::TYPE_VIDEO), StringList())).first->second;
-		l.push_back("mpg"); l.push_back("avi"); l.push_back("mkv"); l.push_back("wmv");
-		l.push_back("mov"); l.push_back("mp4"); l.push_back("3gp"); l.push_back("qt");
-		l.push_back("asx"); l.push_back("divx"); l.push_back("asf"); l.push_back("pxp");
-		l.push_back("ogm"); l.push_back("flv"); l.push_back("rm"); l.push_back("rmvb");
-		l.push_back("webm"); l.push_back("mpeg");
-	}
+	// for conveniency, the default search exts will be the same as the ones defined by SEGA.
+	const auto& searchExts = AdcHub::getSearchExts();
+	for(size_t i = 0, n = searchExts.size(); i < n; ++i)
+		searchTypes[string(1, '1' + i)] = searchExts[i];
 
 	fire(SettingsManagerListener::SearchTypesChanged());
 }