mirror of https://github.com/aria2/aria2
Rewritten FeatureConfig into set of functions
parent
e2340efe27
commit
9d294741fd
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* aria2 - The high speed download utility
|
* aria2 - The high speed download utility
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
* Copyright (C) 2012 Tatsuhiro Tsujikawa
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -34,133 +34,106 @@
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#include "FeatureConfig.h"
|
#include "FeatureConfig.h"
|
||||||
|
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
#include "array_fun.h"
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "Request.h"
|
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
SharedHandle<FeatureConfig> FeatureConfig::featureConfig_;
|
uint16_t getDefaultPort(const std::string& protocol)
|
||||||
|
|
||||||
const std::string FeatureConfig::FEATURE_HTTPS("HTTPS");
|
|
||||||
const std::string FeatureConfig::FEATURE_BITTORRENT("BitTorrent");
|
|
||||||
const std::string FeatureConfig::FEATURE_METALINK("Metalink");
|
|
||||||
const std::string FeatureConfig::FEATURE_MESSAGE_DIGEST("Message Digest");
|
|
||||||
const std::string FeatureConfig::FEATURE_ASYNC_DNS("Async DNS");
|
|
||||||
const std::string FeatureConfig::FEATURE_XML_RPC("XML-RPC");
|
|
||||||
const std::string FeatureConfig::FEATURE_GZIP("GZip");
|
|
||||||
const std::string FeatureConfig::FEATURE_FIREFOX3_COOKIE("Firefox3 Cookie");
|
|
||||||
|
|
||||||
#ifdef ENABLE_SSL
|
|
||||||
# define HTTPS_ENABLED true
|
|
||||||
#else // !ENABLE_SSL
|
|
||||||
# define HTTPS_ENABLED false
|
|
||||||
#endif // !ENABLE_SSL
|
|
||||||
|
|
||||||
#ifdef ENABLE_BITTORRENT
|
|
||||||
# define BITTORRENT_ENABLED true
|
|
||||||
#else // !ENABLE_BITTORRENT
|
|
||||||
# define BITTORRENT_ENABLED false
|
|
||||||
#endif // !ENABLE_BITTORRENT
|
|
||||||
|
|
||||||
#ifdef ENABLE_METALINK
|
|
||||||
# define METALINK_ENABLED true
|
|
||||||
#else // !ENABLE_METALINK
|
|
||||||
# define METALINK_ENABLED false
|
|
||||||
#endif // !ENABLE_METALINK
|
|
||||||
|
|
||||||
#ifdef ENABLE_MESSAGE_DIGEST
|
|
||||||
# define MESSAGE_DIGEST_ENABLED true
|
|
||||||
#else // !ENABLE_MESSAGE_DIGEST
|
|
||||||
# define MESSAGE_DIGEST_ENABLED false
|
|
||||||
#endif // !ENABLE_MESSAGE_DIGEST
|
|
||||||
|
|
||||||
#ifdef ENABLE_ASYNC_DNS
|
|
||||||
# define ASYNC_DNS_ENABLED true
|
|
||||||
#else // !ENABLE_ASYNC_DNS
|
|
||||||
# define ASYNC_DNS_ENABLED false
|
|
||||||
#endif // !ENABLE_ASYNC_DNS
|
|
||||||
|
|
||||||
#ifdef ENABLE_XML_RPC
|
|
||||||
# define XML_RPC_ENABLED true
|
|
||||||
#else // !ENABLE_XML_RPC
|
|
||||||
# define XML_RPC_ENABLED false
|
|
||||||
#endif // !ENABLE_XML_RPC
|
|
||||||
|
|
||||||
#ifdef HAVE_ZLIB
|
|
||||||
# define GZIP_ENABLED true
|
|
||||||
#else // !HAVE_ZLIB
|
|
||||||
# define GZIP_ENABLED false
|
|
||||||
#endif // !HAVE_ZLIB
|
|
||||||
|
|
||||||
#ifdef HAVE_SQLITE3
|
|
||||||
# define FIREFOX3_COOKIE_ENABLED true
|
|
||||||
#else // !HAVE_SQLITE3
|
|
||||||
# define FIREFOX3_COOKIE_ENABLED false
|
|
||||||
#endif // !HAVE_SQLITE3
|
|
||||||
|
|
||||||
FeatureConfig::FeatureConfig() {
|
|
||||||
defaultPorts_.insert(PortMap::value_type(Request::PROTO_HTTP, 80));
|
|
||||||
defaultPorts_.insert(PortMap::value_type(Request::PROTO_HTTPS, 443));
|
|
||||||
defaultPorts_.insert(PortMap::value_type(Request::PROTO_FTP, 21));
|
|
||||||
|
|
||||||
FeatureMap::value_type featureArray[] = {
|
|
||||||
FeatureMap::value_type(FEATURE_HTTPS, HTTPS_ENABLED),
|
|
||||||
FeatureMap::value_type(FEATURE_BITTORRENT, BITTORRENT_ENABLED),
|
|
||||||
FeatureMap::value_type(FEATURE_METALINK, METALINK_ENABLED),
|
|
||||||
FeatureMap::value_type(FEATURE_MESSAGE_DIGEST, MESSAGE_DIGEST_ENABLED),
|
|
||||||
FeatureMap::value_type(FEATURE_ASYNC_DNS, ASYNC_DNS_ENABLED),
|
|
||||||
FeatureMap::value_type(FEATURE_XML_RPC, XML_RPC_ENABLED),
|
|
||||||
FeatureMap::value_type(FEATURE_GZIP, GZIP_ENABLED),
|
|
||||||
FeatureMap::value_type(FEATURE_FIREFOX3_COOKIE, FIREFOX3_COOKIE_ENABLED),
|
|
||||||
};
|
|
||||||
|
|
||||||
features_.insert(vbegin(featureArray), vend(featureArray));
|
|
||||||
}
|
|
||||||
|
|
||||||
FeatureConfig::~FeatureConfig() {}
|
|
||||||
|
|
||||||
const SharedHandle<FeatureConfig>& FeatureConfig::getInstance()
|
|
||||||
{
|
{
|
||||||
if(!featureConfig_) {
|
if(protocol == "http") {
|
||||||
featureConfig_.reset(new FeatureConfig());
|
return 80;
|
||||||
}
|
} else if(protocol == "https") {
|
||||||
return featureConfig_;
|
return 443;
|
||||||
}
|
} else if(protocol == "ftp") {
|
||||||
|
return 21;
|
||||||
uint16_t FeatureConfig::getDefaultPort(const std::string& protocol) const
|
} else {
|
||||||
{
|
|
||||||
PortMap::const_iterator itr = defaultPorts_.find(protocol);
|
|
||||||
if(itr == defaultPorts_.end()) {
|
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
|
||||||
return itr->second;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FeatureConfig::isSupported(const std::string& feature) const
|
std::string featureSummary()
|
||||||
{
|
|
||||||
FeatureMap::const_iterator itr = features_.find(feature);
|
|
||||||
if(itr == features_.end()) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return itr->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string FeatureConfig::featureSummary() const
|
|
||||||
{
|
{
|
||||||
std::string s;
|
std::string s;
|
||||||
for(FeatureMap::const_iterator i = features_.begin(), eoi = features_.end();
|
for(int i = 0; i < MAX_FEATURE; ++i) {
|
||||||
i != eoi; ++i) {
|
const char* name = strSupportedFeature(i);
|
||||||
if((*i).second) {
|
if(name) {
|
||||||
s += (*i).first;
|
s += name;
|
||||||
s += ", ";
|
s += ", ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return util::strip(s, ", ");
|
return util::strip(s, ", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* strSupportedFeature(int feature)
|
||||||
|
{
|
||||||
|
switch(feature) {
|
||||||
|
case(FEATURE_ASYNC_DNS):
|
||||||
|
#ifdef ENABLE_ASYNC_DNS
|
||||||
|
return "Async DNS";
|
||||||
|
#else // !ENABLE_ASYNC_DNS
|
||||||
|
return 0;
|
||||||
|
#endif // !ENABLE_ASYNC_DNS
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(FEATURE_BITTORRENT):
|
||||||
|
#ifdef ENABLE_BITTORRENT
|
||||||
|
return "BitTorrent";
|
||||||
|
#else // !ENABLE_BITTORRENT
|
||||||
|
return 0;
|
||||||
|
#endif // !ENABLE_BITTORRENT
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(FEATURE_FF3_COOKIE):
|
||||||
|
#ifdef HAVE_SQLITE3
|
||||||
|
return "Firefox3 Cookie";
|
||||||
|
#else // !HAVE_SQLITE3
|
||||||
|
return 0;
|
||||||
|
#endif // !HAVE_SQLITE3
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(FEATURE_GZIP):
|
||||||
|
#ifdef HAVE_ZLIB
|
||||||
|
return "GZip";
|
||||||
|
#else // !HAVE_ZLIB
|
||||||
|
return 0;
|
||||||
|
#endif // !HAVE_ZLIB
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(FEATURE_HTTPS):
|
||||||
|
#ifdef ENABLE_SSL
|
||||||
|
return "HTTPS";
|
||||||
|
#else // !ENABLE_SSL
|
||||||
|
return 0;
|
||||||
|
#endif // !ENABLE_SSL
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(FEATURE_MESSAGE_DIGEST):
|
||||||
|
#ifdef ENABLE_MESSAGE_DIGEST
|
||||||
|
return "Message Digest";
|
||||||
|
#else // !ENABLE_MESSAGE_DIGEST
|
||||||
|
return 0;
|
||||||
|
#endif // !ENABLE_MESSAGE_DIGEST
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(FEATURE_METALINK):
|
||||||
|
#ifdef ENABLE_METALINK
|
||||||
|
return "Metalink";
|
||||||
|
#else // !ENABLE_METALINK
|
||||||
|
return 0;
|
||||||
|
#endif // !ENABLE_METALINK
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(FEATURE_XML_RPC):
|
||||||
|
#ifdef ENABLE_XML_RPC
|
||||||
|
return "XML-RPC";
|
||||||
|
#else // !ENABLE_XML_RPC
|
||||||
|
return 0;
|
||||||
|
#endif // !ENABLE_XML_RPC
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* aria2 - The high speed download utility
|
* aria2 - The high speed download utility
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
* Copyright (C) 2012 Tatsuhiro Tsujikawa
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -37,50 +37,32 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "SharedHandle.h"
|
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
typedef std::map<std::string, uint16_t> PortMap;
|
// Returns default port for the given |protocol|.
|
||||||
typedef std::map<std::string, bool> FeatureMap;
|
uint16_t getDefaultPort(const std::string& protocol);
|
||||||
|
|
||||||
class FeatureConfig {
|
enum FeatureType {
|
||||||
private:
|
FEATURE_ASYNC_DNS,
|
||||||
static SharedHandle<FeatureConfig> featureConfig_;
|
FEATURE_BITTORRENT,
|
||||||
|
FEATURE_FF3_COOKIE,
|
||||||
PortMap defaultPorts_;
|
FEATURE_GZIP,
|
||||||
FeatureMap features_;
|
FEATURE_HTTPS,
|
||||||
|
FEATURE_MESSAGE_DIGEST,
|
||||||
FeatureConfig();
|
FEATURE_METALINK,
|
||||||
public:
|
FEATURE_XML_RPC,
|
||||||
~FeatureConfig();
|
MAX_FEATURE
|
||||||
|
|
||||||
static const SharedHandle<FeatureConfig>& getInstance();
|
|
||||||
|
|
||||||
uint16_t getDefaultPort(const std::string& protocol) const;
|
|
||||||
|
|
||||||
bool isSupported(const std::string& feature) const;
|
|
||||||
|
|
||||||
std::string featureSummary() const;
|
|
||||||
|
|
||||||
const FeatureMap& getFeatures() const
|
|
||||||
{
|
|
||||||
return features_;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const std::string FEATURE_HTTPS;
|
|
||||||
static const std::string FEATURE_BITTORRENT;
|
|
||||||
static const std::string FEATURE_METALINK;
|
|
||||||
static const std::string FEATURE_MESSAGE_DIGEST;
|
|
||||||
static const std::string FEATURE_ASYNC_DNS;
|
|
||||||
static const std::string FEATURE_XML_RPC;
|
|
||||||
static const std::string FEATURE_GZIP;
|
|
||||||
static const std::string FEATURE_FIREFOX3_COOKIE;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Returns summary string of the available features.
|
||||||
|
std::string featureSummary();
|
||||||
|
|
||||||
|
// Returns the string representation of the given |feature| if it is
|
||||||
|
// available in the build. If it is not available, returns NULL.
|
||||||
|
const char* strSupportedFeature(int feature);
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
||||||
#endif // D_FEATURE_CONFIG_H
|
#endif // D_FEATURE_CONFIG_H
|
||||||
|
|
|
@ -1228,11 +1228,10 @@ SharedHandle<ValueBase> GetVersionRpcMethod::process
|
||||||
SharedHandle<Dict> result = Dict::g();
|
SharedHandle<Dict> result = Dict::g();
|
||||||
result->put(KEY_VERSION, PACKAGE_VERSION);
|
result->put(KEY_VERSION, PACKAGE_VERSION);
|
||||||
SharedHandle<List> featureList = List::g();
|
SharedHandle<List> featureList = List::g();
|
||||||
const FeatureMap& features = FeatureConfig::getInstance()->getFeatures();
|
for(int feat = 0; feat < MAX_FEATURE; ++feat) {
|
||||||
for(FeatureMap::const_iterator i = features.begin(), eoi = features.end();
|
const char* name = strSupportedFeature(feat);
|
||||||
i != eoi;++i){
|
if(name) {
|
||||||
if((*i).second) {
|
featureList->append(name);
|
||||||
featureList->append((*i).first);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result->put(KEY_ENABLED_FEATURES, featureList);
|
result->put(KEY_ENABLED_FEATURES, featureList);
|
||||||
|
|
|
@ -131,8 +131,7 @@ bool parse(UriStruct& result, const std::string& uri)
|
||||||
if(protocolOffset == std::string::npos) return false;
|
if(protocolOffset == std::string::npos) return false;
|
||||||
result.protocol.assign(uri.begin(), uri.begin()+protocolOffset);
|
result.protocol.assign(uri.begin(), uri.begin()+protocolOffset);
|
||||||
uint16_t defPort;
|
uint16_t defPort;
|
||||||
if((defPort = FeatureConfig::getInstance()->
|
if((defPort = getDefaultPort(result.protocol)) == 0) {
|
||||||
getDefaultPort(result.protocol)) == 0) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// find authority
|
// find authority
|
||||||
|
@ -268,8 +267,7 @@ std::string construct(const UriStruct& us)
|
||||||
} else {
|
} else {
|
||||||
res += us.host;
|
res += us.host;
|
||||||
}
|
}
|
||||||
uint16_t defPort= FeatureConfig::getInstance()->
|
uint16_t defPort= getDefaultPort(us.protocol);
|
||||||
getDefaultPort(us.protocol);
|
|
||||||
if(us.port != 0 && defPort != us.port) {
|
if(us.port != 0 && defPort != us.port) {
|
||||||
res += fmt(":%u", us.port);
|
res += fmt(":%u", us.port);
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ void showVersion() {
|
||||||
<< "\n"
|
<< "\n"
|
||||||
<< _("** Configuration **") << "\n"
|
<< _("** Configuration **") << "\n"
|
||||||
<< _("Enabled Features") << ": "
|
<< _("Enabled Features") << ": "
|
||||||
<< FeatureConfig::getInstance()->featureSummary() << "\n"
|
<< featureSummary() << "\n"
|
||||||
#ifdef ENABLE_MESSAGE_DIGEST
|
#ifdef ENABLE_MESSAGE_DIGEST
|
||||||
<< _("Hash Algorithms") << ": "
|
<< _("Hash Algorithms") << ": "
|
||||||
<< MessageDigest::getSupportedHashTypeString() << "\n"
|
<< MessageDigest::getSupportedHashTypeString() << "\n"
|
||||||
|
|
|
@ -14,13 +14,12 @@ class FeatureConfigTest:public CppUnit::TestFixture {
|
||||||
|
|
||||||
CPPUNIT_TEST_SUITE(FeatureConfigTest);
|
CPPUNIT_TEST_SUITE(FeatureConfigTest);
|
||||||
CPPUNIT_TEST(testGetDefaultPort);
|
CPPUNIT_TEST(testGetDefaultPort);
|
||||||
CPPUNIT_TEST(testIsSupported);
|
CPPUNIT_TEST(testStrSupportedFeature);
|
||||||
CPPUNIT_TEST(testFeatureSummary);
|
CPPUNIT_TEST(testFeatureSummary);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void testGetDefaultPort();
|
void testGetDefaultPort();
|
||||||
void testIsSupported();
|
void testStrSupportedFeature();
|
||||||
void testFeatureSummary();
|
void testFeatureSummary();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,26 +27,19 @@ public:
|
||||||
CPPUNIT_TEST_SUITE_REGISTRATION(FeatureConfigTest);
|
CPPUNIT_TEST_SUITE_REGISTRATION(FeatureConfigTest);
|
||||||
|
|
||||||
void FeatureConfigTest::testGetDefaultPort() {
|
void FeatureConfigTest::testGetDefaultPort() {
|
||||||
CPPUNIT_ASSERT_EQUAL((uint16_t)80,
|
CPPUNIT_ASSERT_EQUAL((uint16_t)80, getDefaultPort("http"));
|
||||||
FeatureConfig::getInstance()->getDefaultPort("http"));
|
CPPUNIT_ASSERT_EQUAL((uint16_t)443, getDefaultPort("https"));
|
||||||
CPPUNIT_ASSERT_EQUAL((uint16_t)443,
|
CPPUNIT_ASSERT_EQUAL((uint16_t)21, getDefaultPort("ftp"));
|
||||||
FeatureConfig::getInstance()->getDefaultPort("https"));
|
|
||||||
CPPUNIT_ASSERT_EQUAL((uint16_t)21,
|
|
||||||
FeatureConfig::getInstance()->getDefaultPort("ftp"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeatureConfigTest::testIsSupported() {
|
void FeatureConfigTest::testStrSupportedFeature() {
|
||||||
|
const char* https = strSupportedFeature(FEATURE_HTTPS);
|
||||||
#ifdef ENABLE_SSL
|
#ifdef ENABLE_SSL
|
||||||
CPPUNIT_ASSERT_EQUAL(true,
|
CPPUNIT_ASSERT(https);
|
||||||
FeatureConfig::getInstance()->isSupported
|
|
||||||
(FeatureConfig::FEATURE_HTTPS));
|
|
||||||
#else
|
#else
|
||||||
CPPUNIT_ASSERT_EQUAL(false,
|
CPPUNIT_ASSERT(!https);
|
||||||
FeatureConfig::getInstance()->isSupported
|
|
||||||
(FeatureConfig::FEATURE_HTTPS));
|
|
||||||
#endif // ENABLE_SSL
|
#endif // ENABLE_SSL
|
||||||
CPPUNIT_ASSERT_EQUAL(false,
|
CPPUNIT_ASSERT(!strSupportedFeature(MAX_FEATURE));
|
||||||
FeatureConfig::getInstance()->isSupported("FTPS"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeatureConfigTest::testFeatureSummary() {
|
void FeatureConfigTest::testFeatureSummary() {
|
||||||
|
@ -92,9 +84,8 @@ void FeatureConfigTest::testFeatureSummary() {
|
||||||
std::for_each(vbegin(features), vend(features),
|
std::for_each(vbegin(features), vend(features),
|
||||||
StringAppend(featuresString, delim));
|
StringAppend(featuresString, delim));
|
||||||
featuresString = util::strip(featuresString, delim);
|
featuresString = util::strip(featuresString, delim);
|
||||||
|
|
||||||
CPPUNIT_ASSERT_EQUAL(featuresString,
|
CPPUNIT_ASSERT_EQUAL(featuresString, featureSummary());
|
||||||
FeatureConfig::getInstance()->featureSummary());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -741,9 +741,7 @@ void RpcMethodTest::testGetVersion()
|
||||||
features += s->s();
|
features += s->s();
|
||||||
features += ", ";
|
features += ", ";
|
||||||
}
|
}
|
||||||
|
CPPUNIT_ASSERT_EQUAL(featureSummary()+", ", features);
|
||||||
CPPUNIT_ASSERT_EQUAL(FeatureConfig::getInstance()->featureSummary()+", ",
|
|
||||||
features);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RpcMethodTest::testGatherStoppedDownload()
|
void RpcMethodTest::testGatherStoppedDownload()
|
||||||
|
|
Loading…
Reference in New Issue