//this file is part of eMule
//Copyright (C)2002 Merkur ( merkur-@users.sourceforge.net / http://www.emule-project.net )
//
//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 the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "StdAfx.h"
#include "preferences.h"
#include <time.h>
#include "opcodes.h"
#include "otherfunctions.h"
#include "ini2.h"
#include "stdlib.h"
#include "stdio.h"
#include <locale.h>
#include "resource.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define ELEMENT_COUNT(X) (sizeof(X) / sizeof(X[0]))
CPreferences::CPreferences(){
srand((uint32)time(0)); // we need random numbers sometimes
prefs = new Preferences_Struct;
memset(prefs,0,sizeof(Preferences_Struct));
prefsExt=new Preferences_Ext_Struct;
memset(prefsExt,0,sizeof(Preferences_Ext_Struct));
//get application start directory
char buffer[490];
::GetModuleFileName(0, buffer, 490);
LPTSTR pszFileName = _tcsrchr(buffer, '\\') + 1;
*pszFileName = '\0';
appdir = nstrdup(buffer);
CreateUserHash();
memcpy(&prefs->userhash,&userhash,16);
// load preferences.dat or set standart values
char* fullpath = new char[strlen(appdir)+16];
sprintf(fullpath,"%spreferences.dat",appdir);
FILE* preffile = fopen(fullpath,"rb");
delete[] fullpath;
LoadPreferences();
if (!preffile){
SetStandartValues();
//if (Ask4RegFix(true)) Ask4RegFix(false);
}
else{
fread(prefsExt,sizeof(Preferences_Ext_Struct),1,preffile);
if (ferror(preffile))
SetStandartValues();
// Maella -Memory Leak In Preference-
// import old pref-files
if (prefsExt->version<20) {
if (prefsExt->version>17) {// v0.20b+
Preferences_Import20b_Struct prefsImport20b;
memset(&prefsImport20b,0,sizeof(prefsImport20b));
fseek(preffile,0,0);
fread(&prefsImport20b,sizeof(prefsImport20b),1,preffile);
memcpy(&prefs->userhash,&prefsImport20b.userhash,16);
memcpy(&prefs->incomingdir,&prefsImport20b.incomingdir,510);
memcpy(&prefs->tempdir,&prefsImport20b.tempdir,510);
sprintf(prefs->nick,prefsImport20b.nick);
prefs->totalDownloadedBytes=prefsImport20b.totalDownloadedBytes;
prefs->totalUploadedBytes=prefsImport20b.totalUploadedBytes;
} else if (prefsExt->version>7) { // v0.20a
Preferences_Import20a_Struct prefsImport20a;
memset(&prefsImport20a,0,sizeof(prefsImport20a));
fseek(preffile,0,0);
fread(&prefsImport20a,sizeof(prefsImport20a),1,preffile);
memcpy(&prefs->userhash,&prefsImport20a.userhash,16);
memcpy(&prefs->incomingdir,&prefsImport20a.incomingdir,510);
memcpy(&prefs->tempdir,&prefsImport20a.tempdir,510);
sprintf(prefs->nick,prefsImport20a.nick);
prefs->totalDownloadedBytes=prefsImport20a.totalDownloaded;
prefs->totalUploadedBytes=prefsImport20a.totalUploaded;
} else { //v0.19c-
Preferences_Import19c_Struct prefsImport19c;
memset(&prefsImport19c,0,sizeof(prefsImport19c));
fseek(preffile,0,0);
fread(&prefsImport19c,sizeof(prefsImport19c),1,preffile);
if (prefsExt->version<3) {
CreateUserHash();
memcpy(&prefs->userhash,&userhash,16);
}
//re
else {
memcpy(&prefs->userhash,&prefsImport19c.userhash,16);
}
memcpy(&prefs->incomingdir,&prefsImport19c.incomingdir,510);
memcpy(&prefs->tempdir,&prefsImport19c.tempdir,510);
sprintf(prefs->nick,prefsImport19c.nick);
}
}
else {
memcpy(&prefs->userhash,&prefsExt->userhash,16);
prefs->EmuleWindowPlacement=prefsExt->EmuleWindowPlacement;
}
// Maella end
fclose(preffile);
memcpy(&userhash,&prefs->userhash,16);
prefs->smartidstate=0;
}
// shared directories
fullpath = new char[strlen(appdir)+MAX_PATH]; // i_a
sprintf(fullpath,"%sshareddir.dat",appdir);
CStdioFile* sdirfile = new CStdioFile();
if (sdirfile->Open(fullpath,CFile::modeRead)){
CString toadd;
while (sdirfile->ReadString(toadd))
shareddir_list.AddHead(toadd);
sdirfile->Close();
}
delete sdirfile;
delete[] fullpath;
//serverlist adresses
fullpath = new char[strlen(appdir)+20];
sprintf(fullpath,"%sadresses.dat",appdir);
sdirfile = new CStdioFile();
if (sdirfile->Open(fullpath,CFile::modeRead)){
CString toadd;
while (sdirfile->ReadString(toadd))
adresses_list.AddHead(toadd);
sdirfile->Close();
}
delete sdirfile;
delete[] fullpath;
fullpath=NULL;
userhash[5] = 14;
userhash[14] = 111;
::CreateDirectory(GetIncomingDir(),0);
::CreateDirectory(GetTempDir(),0);
if (!PathFileExists(prefs->incomingdir)) {
sprintf(prefs->incomingdir,"%sincoming",appdir);
::CreateDirectory(prefs->incomingdir,0);
}
if (!PathFileExists(prefs->tempdir)) {
sprintf(prefs->incomingdir,"%stemp",appdir);
::CreateDirectory(prefs->tempdir,0);
}
}
void CPreferences::SetStandartValues(){
CreateUserHash();
memcpy(&prefs->userhash,&userhash,16);
WINDOWPLACEMENT defaultWPM;
defaultWPM.length = sizeof(WINDOWPLACEMENT);
defaultWPM.rcNormalPosition.left=10;defaultWPM.rcNormalPosition.top=10;
defaultWPM.rcNormalPosition.right=700;defaultWPM.rcNormalPosition.bottom=500;
defaultWPM.showCmd=0;
prefs->EmuleWindowPlacement=defaultWPM;
prefs->versioncheckLastAutomatic=0;
Save();
}
// Maella [FAF] -Allow Bandwidth Settings in <1KB Incremements-
float CPreferences::GetMaxDownload() const{
//dont be a Lam3r :)
if(GetMaxUpload() < 4.0f)
return (prefs->maxdownload < 3.0f * GetMaxUpload()) ? prefs->maxdownload : 3.0f * GetMaxUpload();
else if(GetMaxUpload() < 10.0f)
return (prefs->maxdownload < 4.0f * GetMaxUpload()) ? prefs->maxdownload : 4.0f * GetMaxUpload();
else
return prefs->maxdownload;
}
// Maella end
bool CPreferences::Save(){
bool error = false;
char* fullpath = new char[strlen(appdir)+MAX_PATH]; // i_a
sprintf(fullpath,"%spreferences.dat",appdir);
FILE* preffile = fopen(fullpath,"wb");
prefsExt->version = PREFFILE_VERSION;
delete[] fullpath;
if (preffile){
prefsExt->version=PREFFILE_VERSION;
prefsExt->EmuleWindowPlacement=prefs->EmuleWindowPlacement;
memcpy(&prefsExt->userhash,&prefs->userhash,16);
error = fwrite(prefsExt,sizeof(Preferences_Ext_Struct),1,preffile);
fclose(preffile);
}
else
error = true;
SavePreferences();
fullpath = new char[strlen(appdir)+14];
sprintf(fullpath,"%sshareddir.dat",appdir);
CStdioFile sdirfile;
if (sdirfile.Open(fullpath,CFile::modeCreate|CFile::modeWrite)){
for (POSITION pos = shareddir_list.GetHeadPosition();pos != 0;shareddir_list.GetNext(pos)){
sdirfile.WriteString(shareddir_list.GetAt(pos).GetBuffer());
sdirfile.Write("\n",1);
}
sdirfile.Close();
}
else
error = true;
delete[] fullpath;
fullpath=NULL;
::CreateDirectory(GetIncomingDir(),0);
::CreateDirectory(GetTempDir(),0);
return error;
}
void CPreferences::CreateUserHash(){
for (int i = 0;i != 8; i++){
uint16 random = rand();
memcpy(&userhash[i*2],&random,2);
}
// mark as emule client. that will be need in later version
userhash[5] = 14;
userhash[14] = 111;
}
int CPreferences::GetColumnWidth(Table t, int index) const {
switch(t) {
case tableDownload:
return prefs->downloadColumnWidths[index];
case tableUpload:
return prefs->uploadColumnWidths[index];
case tableQueue:
return prefs->queueColumnWidths[index];
case tableSearch:
return prefs->searchColumnWidths[index];
case tableShared:
return prefs->sharedColumnWidths[index];
case tableServer:
return prefs->serverColumnWidths[index];
}
return 0;
}
void CPreferences::SetColumnWidth(Table t, int index, int width) {
switch(t) {
case tableDownload:
prefs->downloadColumnWidths[index] = width;
break;
case tableUpload:
prefs->uploadColumnWidths[index] = width;
break;
case tableQueue:
prefs->queueColumnWidths[index] = width;
break;
case tableSearch:
prefs->searchColumnWidths[index] = width;
break;
case tableShared:
prefs->sharedColumnWidths[index] = width;
break;
case tableServer:
prefs->serverColumnWidths[index] = width;
break;
}
}
BOOL CPreferences::GetColumnHidden(Table t, int index) const {
switch(t) {
case tableDownload:
return prefs->downloadColumnHidden[index];
case tableUpload:
return prefs->uploadColumnHidden[index];
case tableQueue:
return prefs->queueColumnHidden[index];
case tableSearch:
return prefs->searchColumnHidden[index];
case tableShared:
return prefs->sharedColumnHidden[index];
case tableServer:
return prefs->serverColumnHidden[index];
}
return FALSE;
}
void CPreferences::SetColumnHidden(Table t, int index, BOOL bHidden) {
switch(t) {
case tableDownload:
prefs->downloadColumnHidden[index] = bHidden;
break;
case tableUpload:
prefs->uploadColumnHidden[index] = bHidden;
break;
case tableQueue:
prefs->queueColumnHidden[index] = bHidden;
break;
case tableSearch:
prefs->searchColumnHidden[index] = bHidden;
break;
case tableShared:
prefs->sharedColumnHidden[index] = bHidden;
break;
case tableServer:
prefs->serverColumnHidden[index] = bHidden;
break;
}
}
int CPreferences::GetColumnOrder(Table t, int index) const {
switch(t) {
case tableDownload:
return prefs->downloadColumnOrder[index];
case tableUpload:
return prefs->uploadColumnOrder[index];
case tableQueue:
return prefs->queueColumnOrder[index];
case tableSearch:
return prefs->searchColumnOrder[index];
case tableShared:
return prefs->sharedColumnOrder[index];
case tableServer:
return prefs->serverColumnOrder[index];
}
return 0;
}
void CPreferences::SetColumnOrder(Table t, INT *piOrder) {
switch(t) {
case tableDownload:
memcpy(prefs->downloadColumnOrder, piOrder, sizeof(prefs->downloadColumnOrder));
break;
case tableUpload:
memcpy(prefs->uploadColumnOrder, piOrder, sizeof(prefs->uploadColumnOrder));
break;
case tableQueue:
memcpy(prefs->queueColumnOrder, piOrder, sizeof(prefs->queueColumnOrder));
break;
case tableSearch:
memcpy(prefs->searchColumnOrder, piOrder, sizeof(prefs->searchColumnOrder));
break;
case tableShared:
memcpy(prefs->sharedColumnOrder, piOrder, sizeof(prefs->sharedColumnOrder));
break;
case tableServer:
memcpy(prefs->serverColumnOrder, piOrder, sizeof(prefs->serverColumnOrder));
break;
}
}
CPreferences::~CPreferences(){
delete[] appdir;
delete prefs;
delete prefsExt;
}
int CPreferences::GetRecommendedMaxConnections() {
int iRealMax = ::GetMaxConnections();
if(iRealMax == -1 || iRealMax > 520)
return 500;
if(iRealMax < 20)
return iRealMax;
if(iRealMax <= 256)
return iRealMax - 10;
return iRealMax - 20;
}
void CPreferences::SavePreferences(){
CString buffer;
char* fullpath = new char[strlen(appdir)+MAX_PATH]; // i_a
sprintf(fullpath,"%spreferences.ini",appdir);
CIni ini( fullpath, "eMule" );
delete[] fullpath;
fullpath=NULL;
//---
ini.WriteString("AppVersion", CURRENT_VERSION_LONG);
//---
buffer.Format("%s",prefs->nick);
ini.WriteString("Nick",buffer);
buffer.Format("%s",prefs->incomingdir);
ini.WriteString("IncomingDir",buffer );
buffer.Format("%s",prefs->tempdir);
ini.WriteString("TempDir",buffer );
// Maella [FAF] -Allow Bandwidth Settings in <1KB Incremements-
ini.WriteFloat("MaxUpload", prefs->maxupload);
ini.WriteFloat("MaxDownload", prefs->maxdownload);
ini.WriteFloat("DownloadCapacity", prefs->maxGraphDownloadRate);
ini.WriteFloat("UploadCapacity", prefs->maxGraphUploadRate);
// Maella end
// Maella => -Enable/Disable source exchange in preference- (Tarod)
ini.WriteBool("DisableXS", prefs->disablexs);
// Maella end
// Maella => -Graph: display zoom-
ini.WriteInt("ZoomFactor", prefs->zoomFactor);
// Maella end
// Maella => -Defeat 0-filled Part Senders- (Idea of xrmb)
ini.WriteBool("EnableZeroFilledTest", prefs->enableZeroFilledTest);
// Maella end
// Maella => -Overhead compensation (pseudo full rate control)-
ini.WriteBool("CompensateOverhead", prefs->m_bCompensateOverhead);
// Maella end
// Maella => -MTU Configuration-
ini.WriteInt("MTU", prefs->MTU);
// Maella end
ini.WriteInt("MaxConnections",prefs->maxconnections);
ini.WriteInt("RemoveDeadServer",prefs->deadserver);
ini.WriteInt("Port",prefs->port);
ini.WriteInt("UDPPort",prefs->udpport);
ini.WriteInt("MaxSourcesPerFile",prefs->maxsourceperfile );
ini.WriteWORD("Language",prefs->languageID);
ini.WriteInt("SeeShare",prefs->m_iSeeShares);
ini.WriteInt("ToolTipDelay",prefs->m_iToolDelayTime);
ini.WriteInt("StatGraphsInterval",prefs->trafficOMeterInterval);
ini.WriteInt("StatsInterval",prefs->statsInterval);
ini.WriteInt("DeadServerRetry",prefs->deadserverretries);
ini.WriteInt("SplitterbarPosition",prefs->splitterbarPosition+2);
ini.WriteInt("VariousStatisticsMaxValue",prefs->statsMax);
ini.WriteInt("StatsAverageMinutes",prefs->statsAverageMinutes);
ini.WriteInt("MaxConnectionsPerFiveSeconds",prefs->MaxConperFive);
ini.WriteInt("Check4NewVersionDelay",prefs->versioncheckdays);
ini.WriteBool("Reconnect",prefs->reconnect);
ini.WriteBool("Scoresystem",prefs->scorsystem);
ini.WriteBool("ICH",prefs->ICH);
ini.WriteBool("Serverlist",prefs->autoserverlist);
ini.WriteBool("UpdateNotify",prefs->updatenotify);
ini.WriteBool("MinToTray",prefs->mintotray);
ini.WriteBool("AddServersFromServer",prefs->addserversfromserver);
ini.WriteBool("AddServersFromClient",prefs->addserversfromclient);
ini.WriteBool("Splashscreen",prefs->splashscreen);
ini.WriteBool("BringToFront",prefs->bringtoforeground);
ini.WriteBool("TransferDoubleClick",prefs->transferDoubleclick);
ini.WriteBool("BeepOnError",prefs->beepOnError);
ini.WriteBool("ConfirmExit",prefs->confirmExit);
ini.WriteBool("FilterBadIPs",prefs->filerBadIP);
ini.WriteBool("Autoconnect",prefs->autoconnect);
ini.WriteBool("OnlineSignature",prefs->onlineSig);
ini.WriteBool("StartupMinimized",prefs->startMinimized);
ini.WriteBool("SafeServerConnect",prefs->safeServerConnect);
ini.WriteBool("ShowRatesOnTitle",prefs->showRatesInTitle);
// Barry - New properties...
ini.WriteBool("AutoConnectStaticOnly", prefs->autoconnectstaticonly);
ini.WriteBool("AutoTakeED2KLinks", prefs->autotakeed2klinks);
ini.WriteBool("AddNewFilesPaused", prefs->addnewfilespaused);
ini.WriteInt ("3DDepth", prefs->depth3D);
ini.WriteBool("UAP", prefs->UAP) ;
ini.WriteBool("NotifyOnDownload",prefs->useDownloadNotifier); // Added by enkeyDEV
ini.WriteBool("NotifyOnChat",prefs->useChatNotifier);
ini.WriteBool("NotifyOnLog",prefs->useLogNotifier);
ini.WriteBool("NotifierUseSound",prefs->useSoundInNotifier);
ini.WriteBool("NotifierPopEveryChatMessage",prefs->notifierPopsEveryChatMsg);
ini.WriteBool("NotifierPopNewVersion",prefs->notifierNewVersion);
buffer.Format("%s",prefs->notifierSoundFilePath);
ini.WriteString("NotifierSoundPath",buffer);
ini.WriteString("TxtEditor",prefs->TxtEditor);
ini.WriteString("VideoPlayer",prefs->VideoPlayer);
ini.WriteString("MessageFilter",prefs->messageFilter);
ini.WriteString("DefaultIRCServer",prefs->m_sircserver);
ini.WriteString("IRCNick",prefs->m_sircnick);
ini.WriteBool("IRCAddTimestamp", prefs->m_bircaddtimestamp);
ini.WriteString("IRCFilterName", prefs->m_sircchannamefilter);
ini.WriteInt("IRCFilterUser", prefs->m_iircchanneluserfilter);
ini.WriteBool("IRCUseFilter", prefs->m_bircusechanfilter);
ini.WriteString("IRCPerformString", prefs->m_sircperformstring);
ini.WriteBool("IRCUsePerform", prefs->m_bircuseperform);
ini.WriteBool("IRCListOnConnect", prefs->m_birclistonconnect);
ini.WriteBool("IRCAcceptLinks", prefs->m_bircacceptlinks);
ini.WriteBool("IRCIgnoreInfoMessage", prefs->m_bircignoreinfomessage);
ini.WriteBool("IRCIgnoreEmuleProtoInfoMessage", prefs->m_bircignoreemuleprotoinfomessage);
ini.WriteBool("NotifyOnImportantError", prefs->notifierImportantError);
ini.WriteBool("SmartIdCheck", prefs->smartidcheck);
ini.WriteBool("Verbose", prefs->m_bVerbose);
ini.WriteBool("PreviewPrio", prefs->m_bpreviewprio);
ini.WriteBool("UpdateQueueListPref", prefs->m_bupdatequeuelist);
ini.WriteBool("ManualHighPrio", prefs->m_bmanualhighprio);
ini.WriteBool("FullChunkTransfers", prefs->m_btransferfullchunks);
ini.WriteBool("StartNextFile", prefs->m_bstartnextfile);
ini.WriteBool("ShowOverhead", prefs->m_bshowoverhead);
ini.WriteBool("VideoPreviewBackupped", prefs->moviePreviewBackup);
ini.WriteInt("FileBufferSizePref", prefs->m_iFileBufferSize);
ini.WriteInt("QueueSizePref", prefs->m_iQueueSize);
ini.WriteInt("VersionCheckLastAutomatic", prefs->versioncheckLastAutomatic);
ini.SerGet(false, prefs->downloadColumnWidths,
ELEMENT_COUNT(prefs->downloadColumnWidths), "DownloadColumnWidths");
ini.SerGet(false, prefs->downloadColumnHidden,
ELEMENT_COUNT(prefs->downloadColumnHidden), "DownloadColumnHidden");
ini.SerGet(false, prefs->downloadColumnOrder,
ELEMENT_COUNT(prefs->downloadColumnOrder), "DownloadColumnOrder");
ini.SerGet(false, prefs->uploadColumnWidths,
ELEMENT_COUNT(prefs->uploadColumnWidths), "UploadColumnWidths");
ini.SerGet(false, prefs->uploadColumnHidden,
ELEMENT_COUNT(prefs->uploadColumnHidden), "UploadColumnHidden");
ini.SerGet(false, prefs->uploadColumnOrder,
ELEMENT_COUNT(prefs->uploadColumnOrder), "UploadColumnOrder");
ini.SerGet(false, prefs->queueColumnWidths,
ELEMENT_COUNT(prefs->queueColumnWidths), "QueueColumnWidths");
ini.SerGet(false, prefs->queueColumnHidden,
ELEMENT_COUNT(prefs->queueColumnHidden), "QueueColumnHidden");
ini.SerGet(false, prefs->queueColumnOrder,
ELEMENT_COUNT(prefs->queueColumnOrder), "QueueColumnOrder");
ini.SerGet(false, prefs->searchColumnWidths,
ELEMENT_COUNT(prefs->searchColumnWidths), "SearchColumnWidths");
ini.SerGet(false, prefs->searchColumnHidden,
ELEMENT_COUNT(prefs->searchColumnHidden), "SearchColumnHidden");
ini.SerGet(false, prefs->searchColumnOrder,
ELEMENT_COUNT(prefs->searchColumnOrder), "SearchColumnOrder");
ini.SerGet(false, prefs->sharedColumnWidths,
ELEMENT_COUNT(prefs->sharedColumnWidths), "SharedColumnWidths");
ini.SerGet(false, prefs->sharedColumnHidden,
ELEMENT_COUNT(prefs->sharedColumnHidden), "SharedColumnHidden");
ini.SerGet(false, prefs->sharedColumnOrder,
ELEMENT_COUNT(prefs->sharedColumnOrder), "SharedColumnOrder");
ini.SerGet(false, prefs->serverColumnWidths,
ELEMENT_COUNT(prefs->serverColumnWidths), "ServerColumnWidths");
ini.SerGet(false, prefs->serverColumnHidden,
ELEMENT_COUNT(prefs->serverColumnHidden), "ServerColumnHidden");
ini.SerGet(false, prefs->serverColumnOrder,
ELEMENT_COUNT(prefs->serverColumnOrder), "ServerColumnOrder");
// Barry - Provide a mechanism for all tables to store/retrieve sort order
ini.WriteInt("TableSortItemDownload", prefs->tableSortItemDownload);
ini.WriteInt("TableSortItemUpload", prefs->tableSortItemUpload);
ini.WriteInt("TableSortItemQueue", prefs->tableSortItemQueue);
ini.WriteInt("TableSortItemSearch", prefs->tableSortItemSearch);
ini.WriteInt("TableSortItemShared", prefs->tableSortItemShared);
ini.WriteInt("TableSortItemServer", prefs->tableSortItemServer);
ini.WriteBool("TableSortAscendingDownload", prefs->tableSortAscendingDownload);
ini.WriteBool("TableSortAscendingUpload", prefs->tableSortAscendingUpload);
ini.WriteBool("TableSortAscendingQueue", prefs->tableSortAscendingQueue);
ini.WriteBool("TableSortAscendingSearch", prefs->tableSortAscendingSearch);
ini.WriteBool("TableSortAscendingShared", prefs->tableSortAscendingShared);
ini.WriteBool("TableSortAscendingServer", prefs->tableSortAscendingServer);
CString buffer2;
for (int i=0;i<15;i++) {
buffer.Format("%I64Lu",GetStatsColor(i));
buffer2.Format("StatColor%i",i);
ini.WriteString(buffer2,buffer);
}
buffer.Format("%I64Lu",prefs->totalDownloadedBytes);
ini.WriteString("TotalDownloadedBytes",buffer ,"Statistics");
buffer.Format("%I64Lu",prefs->totalUploadedBytes);
ini.WriteString("TotalUploadedBytes",buffer ,"Statistics");
}
void CPreferences::ResetStatsColor(int index){
switch(index) {
case 0 : prefs->statcolors[0]=RGB(0,0,64);break;
case 1 : prefs->statcolors[1]=RGB(192,192,255);break;
case 2 : prefs->statcolors[2]=RGB(128, 255, 128);break;
case 3 : prefs->statcolors[3]=RGB(0, 210, 0);break;
case 4 : prefs->statcolors[4]=RGB(0, 128, 0);break;
case 5 : prefs->statcolors[5]=RGB(255, 128, 128);break;
case 6 : prefs->statcolors[6]=RGB(200, 0, 0);break;
case 7 : prefs->statcolors[7]=RGB(140, 0, 0);break;
case 8 : prefs->statcolors[8]=RGB(150, 150, 255);break;
case 9 : prefs->statcolors[9]=RGB(192, 0, 192);break;
case 10 : prefs->statcolors[10]=RGB(255, 255, 128);break;
case 11 : prefs->statcolors[11]=RGB(0, 0, 0);break;
case 12 : prefs->statcolors[12]=RGB(255, 255, 255);break;
default:break;
}
}
void CPreferences::LoadPreferences(){
char buffer[200];
//--- Quick hack to add version tag to preferences.ini-file and solve the issue with the FlatStatusBar tag...
CString strFileName;
strFileName.Format("%spreferences.ini", appdir);
CIni* pIni = new CIni(strFileName, "eMule");
CString strCurrVersion, strPrefsVersion;
strCurrVersion = CURRENT_VERSION_LONG;
strPrefsVersion = pIni->GetString("AppVersion");
delete pIni;
CFileFind findFileName;
if ((strCurrVersion != strPrefsVersion) && findFileName.FindFile(strFileName)){
CFile file;
CFileFind findNewName;
CString strNewName;
strNewName.Format("%spreferences.ini.old", appdir);
if (findNewName.FindFile(strNewName))
file.Remove(strNewName);
file.Rename(strFileName, strNewName);
strFileName = strNewName;
}
CIni ini(strFileName, "eMule");
//--- end Ozon :)
sprintf(prefs->nick,"%s",ini.GetString("Nick","http://emule-project.net"));
sprintf(buffer,"%sIncoming",appdir);
sprintf(prefs->incomingdir,"%s",ini.GetString("IncomingDir",buffer ));
sprintf(buffer,"%sTemp",appdir);
sprintf(prefs->tempdir,"%s",ini.GetString("TempDir",buffer));
// Maella [FAF] -Allow Bandwidth Settings in <1KB Incremements-
prefs->maxupload=ini.GetFloat("MaxUpload", UNLIMITED);
prefs->maxdownload=ini.GetFloat("MaxDownload", UNLIMITED);
prefs->maxGraphDownloadRate=ini.GetFloat("DownloadCapacity", (prefs->maxdownload >= UNLIMITED) ? 96.0f : prefs->maxdownload);
prefs->maxGraphUploadRate=ini.GetFloat("UploadCapacity", (prefs->maxupload >= UNLIMITED) ? 16.0f : prefs->maxupload);
// Maella end
// Maella => -Enable/Disable source exchange in preference- (Tarod)
prefs->disablexs = ini.GetBool("DisableXS", true);
// Maella end
// Maella => -Graph: display zoom-
prefs->zoomFactor = ini.GetInt("ZoomFactor", 1);
// Maella end
// Maella => -Defeat 0-filled Part Senders- (Idea of xrmb)
prefs->enableZeroFilledTest = ini.GetBool("EnableZeroFilledTest", false);
// Maella end
// Maella => -Overhead compensation (pseudo full rate control)-
prefs->m_bCompensateOverhead=ini.GetBool("CompensateOverhead",false);
// Maella end
// Maella => -MTU Configuration-
prefs->MTU=ini.GetInt("MTU",1340);
// Maella end
prefs->maxconnections=ini.GetInt("MaxConnections",GetRecommendedMaxConnections());
prefs->deadserver=ini.GetInt("RemoveDeadServer",2);
prefs->port=ini.GetInt("Port",4662);
prefs->udpport=ini.GetInt("UDPPort",prefs->port+10);
prefs->maxsourceperfile=ini.GetInt("MaxSourcesPerFile",400 );
prefs->languageID=ini.GetWORD("Language",0);
prefs->m_iSeeShares=ini.GetInt("SeeShare",2);
prefs->m_iToolDelayTime=ini.GetInt("ToolTipDelay",1);
prefs->trafficOMeterInterval=ini.GetInt("StatGraphsInterval",3);
prefs->statsInterval=ini.GetInt("statsInterval",5);
prefs->deadserverretries=ini.GetInt("DeadServerRetry",1);
prefs->splitterbarPosition=ini.GetInt("SplitterbarPosition",75);
prefs->statsMax=ini.GetInt("VariousStatisticsMaxValue",100);
prefs->statsAverageMinutes=ini.GetInt("StatsAverageMinutes",5);
prefs->MaxConperFive=ini.GetInt("MaxConnectionsPerFiveSeconds",GetDefaultMaxConperFive());
prefs->reconnect=ini.GetBool("Reconnect",true);
prefs->scorsystem=ini.GetBool("Scoresystem",true);
prefs->ICH=ini.GetBool("ICH",true);
prefs->autoserverlist=ini.GetBool("Serverlist",false);
prefs->updatenotify=ini.GetBool("UpdateNotify",false);
prefs->mintotray=ini.GetBool("MinToTray",false);
prefs->addserversfromserver=ini.GetBool("AddServersFromServer",true);
prefs->addserversfromclient=ini.GetBool("AddServersFromClient",true);
prefs->splashscreen=ini.GetBool("Splashscreen",true);
prefs->bringtoforeground=ini.GetBool("BringToFront",true);
prefs->transferDoubleclick=ini.GetBool("TransferDoubleClick",true);
prefs->beepOnError=ini.GetBool("BeepOnError",true);
prefs->confirmExit=ini.GetBool("ConfirmExit",false);
prefs->filerBadIP=ini.GetBool("FilterBadIPs",true);
prefs->autoconnect=ini.GetBool("Autoconnect",false);
prefs->showRatesInTitle=ini.GetBool("ShowRatesOnTitle",false);
prefs->onlineSig=ini.GetBool("OnlineSignature",false);
prefs->startMinimized=ini.GetBool("StartupMinimized",false);
prefs->safeServerConnect =ini.GetBool("SafeServerConnect",false);
// Barry - New properties...
prefs->autoconnectstaticonly = ini.GetBool("AutoConnectStaticOnly",false);
prefs->autotakeed2klinks = ini.GetBool("AutoTakeED2KLinks",true);
prefs->addnewfilespaused = ini.GetBool("AddNewFilesPaused",false);
prefs->depth3D = ini.GetInt("3DDepth", 0);
// as temporarial converter for previous versions
if (strPrefsVersion < "0.25a") // before 0.25a
if (ini.GetBool("FlatStatusBar",false))
prefs->depth3D = 0;
else
prefs->depth3D = 5;
prefs->UAP = ini.GetBool("UAP", false) ;
prefs->useDownloadNotifier=ini.GetBool("NotifyOnDownload",false); // Added by enkeyDEV
prefs->useChatNotifier=ini.GetBool("NotifyOnChat",false);
prefs->useLogNotifier=ini.GetBool("NotifyOnLog",false);
prefs->useSoundInNotifier=ini.GetBool("NotifierUseSound",false);
prefs->notifierPopsEveryChatMsg=ini.GetBool("NotifierPopEveryChatMessage",false);
prefs->notifierImportantError=ini.GetBool("NotifyOnImportantError",false);
prefs->notifierNewVersion=ini.GetBool("NotifierPopNewVersion",false);
sprintf(prefs->notifierSoundFilePath,"%s",ini.GetString("NotifierSoundPath",""));
sprintf(prefs->m_sircserver,"%s",ini.GetString("DefaultIRCServer","irc.emule-project.net"));
sprintf(prefs->m_sircnick,"%s",ini.GetString("IRCNick","eMule"));
prefs->m_bircaddtimestamp=ini.GetBool("IRCAddTimestamp",true);
sprintf(prefs->m_sircchannamefilter,"%s",ini.GetString("IRCFilterName", "" ));
prefs->m_bircusechanfilter=ini.GetBool("IRCUseFilter", false);
prefs->m_iircchanneluserfilter=ini.GetInt("IRCFilterUser", 0);
sprintf(prefs->m_sircperformstring,"%s",ini.GetString("IRCPerformString", "/join #emule" ));
prefs->m_bircuseperform=ini.GetBool("IRCUsePerform", false);
prefs->m_birclistonconnect=ini.GetBool("IRCListOnConnect", true);
prefs->m_bircacceptlinks=ini.GetBool("IRCAcceptLinks", false);
prefs->m_bircignoreinfomessage=ini.GetBool("IRCIgnoreInfoMessage", false);
prefs->m_bircignoreemuleprotoinfomessage=ini.GetBool("IRCIgnoreEmuleProtoInfoMessage", true);
prefs->smartidcheck=ini.GetBool("SmartIdCheck",true);
prefs->m_bVerbose=ini.GetBool("Verbose",false);
prefs->m_bpreviewprio=ini.GetBool("PreviewPrio",false);
prefs->m_bupdatequeuelist=ini.GetBool("UpdateQueueListPref",false);
prefs->m_bmanualhighprio=ini.GetBool("ManualHighPrio",false);
prefs->m_btransferfullchunks=ini.GetBool("FullChunkTransfers",true);
prefs->m_bstartnextfile=ini.GetBool("StartNextFile",false);
prefs->m_bshowoverhead=ini.GetBool("ShowOverhead",false);
prefs->moviePreviewBackup=ini.GetBool("VideoPreviewBackupped",true);
prefs->m_iFileBufferSize=ini.GetInt("FileBufferSizePref",16);
prefs->m_iQueueSize=ini.GetInt("QueueSizePref",50);
prefs->versioncheckdays=ini.GetInt("Check4NewVersionDelay",5);
prefs->versioncheckLastAutomatic=ini.GetInt("VersionCheckLastAutomatic",0);
sprintf(prefs->TxtEditor,"%s",ini.GetString("TxtEditor","notepad.exe"));
sprintf(prefs->VideoPlayer,"%s",ini.GetString("VideoPlayer",""));
sprintf(prefs->messageFilter,"%s",ini.GetString("MessageFilter","Your client has an infinite queue"));
//if (prefs->maxGraphDownloadRate<prefs->maxdownload) prefs->maxdownload=UNLIMITED;
//if (prefs->maxGraphUploadRate<prefs->maxupload) prefs->maxupload=UNLIMITED;
ini.SerGet(true, prefs->downloadColumnWidths,
ELEMENT_COUNT(prefs->downloadColumnWidths), "DownloadColumnWidths");
ini.SerGet(true, prefs->downloadColumnHidden,
ELEMENT_COUNT(prefs->downloadColumnHidden), "DownloadColumnHidden");
ini.SerGet(true, prefs->downloadColumnOrder,
ELEMENT_COUNT(prefs->downloadColumnOrder), "DownloadColumnOrder");
ini.SerGet(true, prefs->uploadColumnWidths,
ELEMENT_COUNT(prefs->uploadColumnWidths), "UploadColumnWidths");
ini.SerGet(true, prefs->uploadColumnHidden,
ELEMENT_COUNT(prefs->uploadColumnHidden), "UploadColumnHidden");
ini.SerGet(true, prefs->uploadColumnOrder,
ELEMENT_COUNT(prefs->uploadColumnOrder), "UploadColumnOrder");
ini.SerGet(true, prefs->queueColumnWidths,
ELEMENT_COUNT(prefs->queueColumnWidths), "QueueColumnWidths");
ini.SerGet(true, prefs->queueColumnHidden,
ELEMENT_COUNT(prefs->queueColumnHidden), "QueueColumnHidden");
ini.SerGet(true, prefs->queueColumnOrder,
ELEMENT_COUNT(prefs->queueColumnOrder), "QueueColumnOrder");
ini.SerGet(true, prefs->searchColumnWidths,
ELEMENT_COUNT(prefs->searchColumnWidths), "SearchColumnWidths");
ini.SerGet(true, prefs->searchColumnHidden,
ELEMENT_COUNT(prefs->searchColumnHidden), "SearchColumnHidden");
ini.SerGet(true, prefs->searchColumnOrder,
ELEMENT_COUNT(prefs->searchColumnOrder), "SearchColumnOrder");
ini.SerGet(true, prefs->sharedColumnWidths,
ELEMENT_COUNT(prefs->sharedColumnWidths), "SharedColumnWidths");
ini.SerGet(true, prefs->sharedColumnHidden,
ELEMENT_COUNT(prefs->sharedColumnHidden), "SharedColumnHidden");
ini.SerGet(true, prefs->sharedColumnOrder,
ELEMENT_COUNT(prefs->sharedColumnOrder), "SharedColumnOrder");
ini.SerGet(true, prefs->serverColumnWidths,
ELEMENT_COUNT(prefs->serverColumnWidths), "ServerColumnWidths");
ini.SerGet(true, prefs->serverColumnHidden,
ELEMENT_COUNT(prefs->serverColumnHidden), "ServerColumnHidden");
ini.SerGet(true, prefs->serverColumnOrder,
ELEMENT_COUNT(prefs->serverColumnOrder), "ServerColumnOrder");
// Barry - Provide a mechanism for all tables to store/retrieve sort order
prefs->tableSortItemDownload = ini.GetInt("TableSortItemDownload", 0);
prefs->tableSortItemUpload = ini.GetInt("TableSortItemUpload", 0);
prefs->tableSortItemQueue = ini.GetInt("TableSortItemQueue", 0);
prefs->tableSortItemSearch = ini.GetInt("TableSortItemSearch", 0);
prefs->tableSortItemShared = ini.GetInt("TableSortItemShared", 0);
prefs->tableSortItemServer = ini.GetInt("TableSortItemServer", 0);
prefs->tableSortAscendingDownload = ini.GetBool("TableSortAscendingDownload", true);
prefs->tableSortAscendingUpload = ini.GetBool("TableSortAscendingUpload", true);
prefs->tableSortAscendingQueue = ini.GetBool("TableSortAscendingQueue", true);
prefs->tableSortAscendingSearch = ini.GetBool("TableSortAscendingSearch", true);
prefs->tableSortAscendingShared = ini.GetBool("TableSortAscendingShared", true);
prefs->tableSortAscendingServer = ini.GetBool("TableSortAscendingServer", true);
if (prefs->statsAverageMinutes<1) prefs->statsAverageMinutes=5;
CString buffer2;
for (int i=0;i<15;i++) {
buffer2.Format("StatColor%i",i);
sprintf(buffer,ini.GetString(buffer2,"0"));
prefs->statcolors[i]=_atoi64(buffer);
if (prefs->statcolors[i]==0) {ResetStatsColor(i);}
}
sprintf(buffer,ini.GetString("TotalDownloadedBytes",0,"Statistics"));
prefs->totalDownloadedBytes=_atoi64(buffer);
sprintf(buffer,ini.GetString("TotalUploadedBytes",0,"Statistics"));
prefs->totalUploadedBytes=_atoi64(buffer);
SetLanguage();
}
WORD CPreferences::GetWindowsVersion(){
static bWinVerAlreadyDetected = false;
if(!bWinVerAlreadyDetected)
{
bWinVerAlreadyDetected = true;
m_wWinVer = DetectWinVersion();
}
return m_wWinVer;
}
uint16 CPreferences::GetMaxConperFive(){
return prefs->MaxConperFive;
}
uint16 CPreferences::GetDefaultMaxConperFive(){
switch (GetWindowsVersion()){
case _WINVER_98_:
return 5;
case _WINVER_95_:
case _WINVER_ME_:
return MAXCON5WIN9X;
case _WINVER_2K_:
case _WINVER_XP_:
return MAXCONPER5SEC;
default:
return MAXCONPER5SEC;
}
}
// Barry - Provide a mechanism for all tables to store/retrieve sort order
int CPreferences::GetColumnSortItem(Table t) const
{
switch(t)
{
case tableDownload:
return prefs->tableSortItemDownload;
case tableUpload:
return prefs->tableSortItemUpload;
case tableQueue:
return prefs->tableSortItemQueue;
case tableSearch:
return prefs->tableSortItemSearch;
case tableShared:
return prefs->tableSortItemShared;
case tableServer:
return prefs->tableSortItemServer;
}
return 0;
}
// Barry - Provide a mechanism for all tables to store/retrieve sort order
bool CPreferences::GetColumnSortAscending(Table t) const
{
switch(t)
{
case tableDownload:
return prefs->tableSortAscendingDownload;
case tableUpload:
return prefs->tableSortAscendingUpload;
case tableQueue:
return prefs->tableSortAscendingQueue;
case tableSearch:
return prefs->tableSortAscendingSearch;
case tableShared:
return prefs->tableSortAscendingShared;
case tableServer:
return prefs->tableSortAscendingServer;
}
return true;
}
// Barry - Provide a mechanism for all tables to store/retrieve sort order
void CPreferences::SetColumnSortItem(Table t, int sortItem)
{
switch(t)
{
case tableDownload:
prefs->tableSortItemDownload = sortItem;
break;
case tableUpload:
prefs->tableSortItemUpload = sortItem;
break;
case tableQueue:
prefs->tableSortItemQueue = sortItem;
break;
case tableSearch:
prefs->tableSortItemSearch = sortItem;
break;
case tableShared:
prefs->tableSortItemShared = sortItem;
break;
case tableServer:
prefs->tableSortItemServer = sortItem;
break;
}
}
// Barry - Provide a mechanism for all tables to store/retrieve sort order
void CPreferences::SetColumnSortAscending(Table t, bool sortAscending)
{
switch(t)
{
case tableDownload:
prefs->tableSortAscendingDownload = sortAscending;
break;
case tableUpload:
prefs->tableSortAscendingUpload = sortAscending;
break;
case tableQueue:
prefs->tableSortAscendingQueue = sortAscending;
break;
case tableSearch:
prefs->tableSortAscendingSearch = sortAscending;
break;
case tableShared:
prefs->tableSortAscendingShared = sortAscending;
break;
case tableServer:
prefs->tableSortAscendingServer = sortAscending;
break;
}
}
void CPreferences::SetLanguage() {
switch(prefs->languageID) {
// read from ini and supported by the program?
case MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT):setlocale( LC_ALL, "english");break;
case MAKELANGID(LANG_GERMAN,SUBLANG_DEFAULT):setlocale( LC_ALL, "german");break;
case MAKELANGID(LANG_FRENCH,SUBLANG_DEFAULT):setlocale( LC_ALL, "french");break;
case MAKELANGID(LANG_DANISH,SUBLANG_DEFAULT):setlocale( LC_ALL, "danish");break;
case MAKELANGID(LANG_SPANISH,SUBLANG_SPANISH):setlocale( LC_ALL, "spanish");break;
case MAKELANGID(LANG_DUTCH,SUBLANG_DEFAULT):setlocale( LC_ALL, "dutch");break;
case MAKELANGID(LANG_RUSSIAN,SUBLANG_DEFAULT):setlocale( LC_ALL, "russian");break;
case MAKELANGID(LANG_SLOVENIAN,SUBLANG_DEFAULT):setlocale( LC_ALL, "");break;
case MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED):setlocale( LC_ALL, "chs");break;
case MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_TRADITIONAL):setlocale( LC_ALL, "cht");break;
case MAKELANGID(LANG_LITHUANIAN,SUBLANG_DEFAULT):setlocale( LC_ALL, "");break;
case MAKELANGID(LANG_POLISH,SUBLANG_DEFAULT):setlocale( LC_ALL, "polish");break;
case MAKELANGID(LANG_KOREAN,SUBLANG_DEFAULT):setlocale( LC_ALL, "korean");break;
case MAKELANGID(LANG_PORTUGUESE,SUBLANG_PORTUGUESE_BRAZILIAN):setlocale( LC_ALL, "ptb");break;
case MAKELANGID(LANG_PORTUGUESE,SUBLANG_PORTUGUESE):setlocale( LC_ALL, "ptg");break;
case MAKELANGID(LANG_SWEDISH,SUBLANG_DEFAULT):setlocale( LC_ALL, "swedish");break;
case MAKELANGID(LANG_NORWEGIAN,SUBLANG_NORWEGIAN_BOKMAL):setlocale( LC_ALL, "norwegian");break;
case MAKELANGID(LANG_FINNISH,SUBLANG_DEFAULT):setlocale( LC_ALL, "finnish");break;
case MAKELANGID(LANG_ITALIAN,SUBLANG_DEFAULT):setlocale( LC_ALL, "italian");break;
case MAKELANGID(LANG_BULGARIAN,SUBLANG_DEFAULT):setlocale( LC_ALL, "hun");break;
case MAKELANGID(LANG_CATALAN,SUBLANG_DEFAULT):setlocale( LC_ALL, "");break;
case MAKELANGID(LANG_GREEK,SUBLANG_DEFAULT):setlocale( LC_ALL, "greek");break;
case MAKELANGID(LANG_LATVIAN ,SUBLANG_DEFAULT):setlocale( LC_ALL, "");break;
case MAKELANGID(LANG_TURKISH ,SUBLANG_DEFAULT):setlocale( LC_ALL, "turkish");break;
case MAKELANGID(LANG_HUNGARIAN ,SUBLANG_DEFAULT):setlocale( LC_ALL, "hungarian");break;
case MAKELANGID(LANG_ESTONIAN ,SUBLANG_DEFAULT):setlocale( LC_ALL, "");break;
default:{
uint8 nLocalLang = ::GetThreadLocale();
CString strLng1 = GetResString(IDS_MB_LANGUAGEINFO,MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT));
CString strLng2 = "";
switch(nLocalLang) {
case LANG_GREEK:
case LANG_GERMAN:
case LANG_FRENCH:
case LANG_DANISH:
case LANG_SPANISH:
case LANG_DUTCH:
case LANG_RUSSIAN:
case LANG_SLOVENIAN:
case LANG_CHINESE:
case LANG_LITHUANIAN:
case LANG_NORWEGIAN:
case LANG_POLISH:
case LANG_KOREAN:
case LANG_PORTUGUESE:
case LANG_SWEDISH:
case LANG_FINNISH:
case LANG_ITALIAN:
case LANG_BULGARIAN:
case LANG_CATALAN:
case LANG_LATVIAN:
case LANG_TURKISH:
case LANG_HUNGARIAN:
case LANG_ESTONIAN:
{
prefs->languageID = MAKELANGID(nLocalLang,SUBLANG_DEFAULT);
SetThreadLocale(prefs->languageID);
strLng2 = GetResString(IDS_MB_LANGUAGEINFO,prefs->languageID);
break;
}
default:
prefs->languageID = MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT);
SetThreadLocale(prefs->languageID);
}
CString strMessage = strLng1 + CString("\n\n") + strLng2;;
MessageBox(0, strMessage.GetBuffer(),"Language",64);
}
}
SetThreadLocale(prefs->languageID);
// if loading a string fails, set language to English
if (GetResString(IDS_MB_LANGUAGEINFO,prefs->languageID).GetLength()==0) {
prefs->languageID = MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT);
SetThreadLocale(prefs->languageID);
}
}