linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #02584
[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());
}