#include #include #include "client.h" #include "Config.h" #include "Proxy.h" using namespace std; Config* Config::self = NULL; Config *Config::CurrentConfig() { if (self == NULL) self = new Config(); return self; } Config::Config(): StaticProxySpeedLow(50), configValid(0) { } void Config::AcquireConfig() { /* reset existing values */ configValid = false; genericProxy.clear(); staticProxy.clear(); /* read new values */ if (ReadGenericProxy()) return ; if (ReadStaticProxy()) return ; configValid = true; } bool Config::IsConfigValid() { return configValid; } vector Config::GetCountries() { vector countries; for (unsigned i = 0; i < genericProxy.size(); i++) { countries.push_back(genericProxy[i].country); } sort(countries.begin(), countries.end()); vector::iterator end = unique(countries.begin(), countries.end()); countries.resize(end - countries.begin()); return countries; } vector Config::GetStates(string &country) { vector states; for (unsigned i = 0; i < genericProxy.size(); i++) { if ((genericProxy[i].state != "-") && (genericProxy[i].country == country)) { states.push_back(genericProxy[i].state); } } if (!states.empty()) { sort(states.begin(), states.end()); vector::iterator end = unique(states.begin(), states.end()); states.resize(end - states.begin()); } return states; } vector Config::GetCities(string &country) { string defState = "-"; return GetCities(country, defState); } vector Config::GetCities(string &country, string &state) { vector cities; for (unsigned i = 0; i < genericProxy.size(); i++) { if ((genericProxy[i].state == state) && (genericProxy[i].country == country)) { cities.push_back(genericProxy[i].city); } } sort(cities.begin(), cities.end()); vector::iterator end = unique(cities.begin(), cities.end()); cities.resize(end - cities.begin()); return cities; } vector Config::GetProxies(string &country, string &city) { string defState = "-"; return GetProxies(country, defState, city); } vector Config::GetProxies(string &country, string &state, string &city) { vector proxies; for (unsigned i = 0; i < genericProxy.size(); i++) { if ((genericProxy[i].state == state) && (genericProxy[i].country == country) && (genericProxy[i].city == city)) { proxies.push_back(genericProxy[i].host); } } sort(proxies.begin(), proxies.end()); return proxies; } vector Config::GetStaticProxyGuiLine(unsigned line) { vector staticProxyLine; for (unsigned i = 0; i < staticProxy.size(); i++) { if (staticProxy[i].position != line) staticProxyLine.push_back(staticProxy[i]); } /* sort manually using bubble sort - not too efficient, * but I suppose we're not going too sort millions of records */ for (unsigned i = 0; i < staticProxyLine.size(); i++) { for (unsigned j = 1; j < staticProxyLine.size(); j++) { if (staticProxyLine[j].speed > staticProxyLine[j-1].speed) swap(staticProxyLine[j], staticProxyLine[j-1]); } } return staticProxyLine; } unsigned Config::GetStaticProxyGuiLines() { unsigned maxLine = 0; for (unsigned i = 0; i < staticProxy.size(); i++) { if (staticProxy[i].position > maxLine) maxLine = staticProxy[i].position; } return maxLine; } int Config::ReadGenericProxy() { Logger::Info("Parsing generic proxy list\n"); ifstream proxyFile("./config/proxy_list.cfg", std::ios::in); if (!proxyFile) { Logger::Error("Can't open file ./config/proxy_list.cfg"); return -1; } const int str_size = 512; char str[str_size] = {0}; while (!proxyFile.eof()) { proxyFile.getline(str, str_size, ';'); proxyFile.ignore(2, '\n'); if (proxyFile.eof()) break; string entry = str; ProxyEntryGeneric *proxy = new ProxyEntryGeneric; proxy->Parse(entry); genericProxy.push_back(*proxy); } proxyFile.close(); return 0; } int Config::ReadStaticProxy() { Logger::Info("Parsing static proxy list\n"); ifstream proxyFile("./config/static_proxy_list.cfg", std::ios::in); if (!proxyFile) { Logger::Error("Can't open file ./config/static_proxy_list.cfg\n"); return -1; } const int str_size = 512; char str[str_size] = {0}; while (!proxyFile.eof()) { proxyFile.getline(str, str_size, ';'); proxyFile.ignore(2, '\n'); if (proxyFile.eof()) break; string entry = str; ProxyEntryStatic *proxy = new ProxyEntryStatic; proxy->Parse(entry); staticProxy.push_back(*proxy); } proxyFile.close(); return 0; }