📄 ip2country.cpp
字号:
//EastShare Start - added by AndCycle, IP to Country
/*
the IP to country data is provided by http://ip-to-country.webhosting.info/
"IP2Country uses the IP-to-Country Database
provided by WebHosting.Info (http://www.webhosting.info),
available from http://ip-to-country.webhosting.info."
*/
/*
flags are from http://sf.net/projects/flags/
*/
// by Superlexx, based on IPFilter by Bouc7
#include "StdAfx.h"
#include "IP2Country.h"
#include "emule.h"
#include "otherfunctions.h"
#include <flag/resource.h>
//refresh list
#include "serverlist.h"
#include "clientlist.h"
//refresh server list ctrl
#include "emuledlg.h"
#include "serverwnd.h"
#include "serverlistctrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// N/A flag is the first Res, so it should at index zero
#define NO_FLAG 0
CString FirstCharCap(CString target){
target.TrimRight();//clean out the space at the end, prevent exception for index++
if(target.IsEmpty()) return "";
target.MakeLower();
target.SetAt(0, target.Left(1).MakeUpper().GetAt(0));
for(int index = target.Find(' '); index != -1; index = target.Find(' ', index)){
index++;//set the character next to space be Upper
target.SetAt(index, target.Mid(index, 1).MakeUpper().GetAt(0));
}
return target;
}
CIP2Country::CIP2Country(){
m_bRunning = false;
defaultIP2Country.IPstart = 0;
defaultIP2Country.IPend = 0;
defaultIP2Country.ShortCountryName = "N/A";
defaultIP2Country.MidCountryName = "N/A";
defaultIP2Country.LongCountryName = "Not Applicable";
defaultIP2Country.FlagIndex = NO_FLAG;
EnableIP2Country = false;
EnableCountryFlag = false;
if(thePrefs.IsIP2CountryShowFlag()){
Load();
}
//AddLogLine(false, "IP2Country uses the IP-to-Country Database provided by WebHosting.Info (http://www.webhosting.info), available from http://ip-to-country.webhosting.info.");
m_bRunning = true;
}
CIP2Country::~CIP2Country(){
m_bRunning = false;
Unload();
}
void CIP2Country::Load(){
EnableCountryFlag = LoadCountryFlagLib();//flag lib first, so ip range can map to flag
EnableIP2Country = LoadFromFile();
if(m_bRunning) Reset();
AddDebugLogLine(false, "IP2Country loaded");
}
void CIP2Country::Unload(){
EnableIP2Country = false;
EnableCountryFlag = false;
if(m_bRunning) Reset();
RemoveAllIPs();
RemoveAllFlags();
AddDebugLogLine(false, "IP2Country unloaded");
}
void CIP2Country::Reset(){
theApp.serverlist->ResetIP2Country();
theApp.clientlist->ResetIP2Country();
}
void CIP2Country::Refresh(){
theApp.emuledlg->serverwnd->serverlistctrl.RefreshAllServer();
}
bool CIP2Country::LoadFromFile(){
char buffer[1024];
int lenBuf = 1024;
CString ip2countryCSVfile = thePrefs.GetConfigDir()+"ip-to-country.csv";
FILE* readFile = fopen(ip2countryCSVfile, "r");
try{
if (readFile != NULL) {
int count = 0;
while (!feof(readFile)) {
if (fgets(buffer,lenBuf,readFile)==0) break;
CString sbuffer;
sbuffer = buffer;
/*
http://ip-to-country.webhosting.info/node/view/54
This is a sample of how the CSV file is structured:
"0033996344","0033996351","GB","GBR","UNITED KINGDOM"
"0050331648","0083886079","US","USA","UNITED STATES"
"0094585424","0094585439","SE","SWE","SWEDEN"
FIELD DATA TYPE FIELD DESCRIPTION
IP_FROM NUMERICAL (DOUBLE) Beginning of IP address range.
IP_TO NUMERICAL (DOUBLE) Ending of IP address range.
COUNTRY_CODE2 CHAR(2) Two-character country code based on ISO 3166.
COUNTRY_CODE3 CHAR(3) Three-character country code based on ISO 3166.
COUNTRY_NAME VARCHAR(50) Country name based on ISO 3166
*/
// we assume that the ip-to-country.csv is valid and doesn't cause any troubles
// get & process IP range
sbuffer.Remove('"'); // get rid of the " signs
CString tempStr[5];
int curPos;
curPos = 0;
for(int forCount = 0; forCount != 5; forCount++){
tempStr[forCount] = sbuffer.Tokenize(",", curPos);
if(tempStr[forCount].IsEmpty()) {
throw CString(_T("error line in"));
}
}
//tempStr[4] is full country name, capitalize country name from rayita
tempStr[4] = FirstCharCap(tempStr[4]);
count++;
AddIPRange(atoi(tempStr[0]),atoi(tempStr[1]), tempStr[2], tempStr[3], tempStr[4]);
}
fclose(readFile);
}
else{
throw CString(_T("Failed to load in"));
}
}
catch(CString error){
AddLogLine(false, "%s %s", error, ip2countryCSVfile);
RemoveAllIPs();
return false;
}
AddDebugLogLine(false, "IP2Countryfile has been loaded");
return true;
}
bool CIP2Country::LoadCountryFlagLib(){
CString ip2countryCountryFlag;
try{
//detect windows version
//if(thePrefs.GetWindowsVersion() == _WINVER_XP_){
//it's XP, we can use beautiful 32bits flags with alpha channel :)
//ip2countryCountryFlag = thePrefs.GetConfigDir()+"countryflag32.dll";
//}
//else{
//oh~ it's not XP, but we still can load the 24bits flags
ip2countryCountryFlag = thePrefs.GetConfigDir()+"countryflag.dll";
//}
_hCountryFlagDll = LoadLibrary(ip2countryCountryFlag);
if (_hCountryFlagDll == NULL)
{
throw CString(_T("CountryFlag Disabled, failed to load"));
}
uint16 resID[] = {
IDI_COUNTRY_FLAG_NOFLAG,//first res in image list should be N/A
IDI_COUNTRY_FLAG_AD, IDI_COUNTRY_FLAG_AE, IDI_COUNTRY_FLAG_AF, IDI_COUNTRY_FLAG_AG,
IDI_COUNTRY_FLAG_AI, IDI_COUNTRY_FLAG_AL, IDI_COUNTRY_FLAG_AM, IDI_COUNTRY_FLAG_AN,
IDI_COUNTRY_FLAG_AO, IDI_COUNTRY_FLAG_AR, IDI_COUNTRY_FLAG_AS, IDI_COUNTRY_FLAG_AT,
IDI_COUNTRY_FLAG_AU, IDI_COUNTRY_FLAG_AW, IDI_COUNTRY_FLAG_AZ, IDI_COUNTRY_FLAG_BA,
IDI_COUNTRY_FLAG_BB, IDI_COUNTRY_FLAG_BD, IDI_COUNTRY_FLAG_BE, IDI_COUNTRY_FLAG_BF,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -