📄 preferences.cpp
字号:
//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"
#include "emule.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();
// import old pref-files
if (prefsExt->version<20) {
if (prefsExt->version>17) {// v0.20b+
prefsImport20b=new Preferences_Import20b_Struct;
memset(prefsImport20b,0,sizeof(Preferences_Import20b_Struct));
fseek(preffile,0,0);
fread(prefsImport20b,sizeof(Preferences_Import20b_Struct),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
prefsImport20a=new Preferences_Import20a_Struct;
memset(prefsImport20a,0,sizeof(Preferences_Import20a_Struct));
fseek(preffile,0,0);
fread(prefsImport20a,sizeof(Preferences_Import20a_Struct),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-
prefsImport19c=new Preferences_Import19c_Struct;
memset(prefsImport19c,0,sizeof(Preferences_Import19c_Struct));
fseek(preffile,0,0);
fread(prefsImport19c,sizeof(Preferences_Import19c_Struct),1,preffile);
if (prefsExt->version<3) {
CreateUserHash();
memcpy(&prefs->userhash,&userhash,16);
} 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;
}
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);
}
if (((int*)prefs->userhash[0]) == 0 && ((int*)prefs->userhash[1]) == 0 && ((int*)prefs->userhash[2]) == 0 && ((int*)prefs->userhash[3]) == 0)
CreateUserHash();
}
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();
}
uint16 CPreferences::GetMaxDownload(){
//dont be a Lam3r :)
if( GetMaxUpload() < 4 )
return (( (GetMaxUpload() < 10) && (GetMaxUpload()*3 < prefs->maxdownload) )? GetMaxUpload()*3 : prefs->maxdownload);
return (( (GetMaxUpload() < 10) && (GetMaxUpload()*4 < prefs->maxdownload) )? GetMaxUpload()*4 : prefs->maxdownload);
}
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];
case tableClientList:
return prefs->clientListColumnWidths[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;
case tableClientList:
prefs->clientListColumnWidths[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];
case tableClientList:
return prefs->clientListColumnHidden[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;
case tableClientList:
prefs->clientListColumnHidden[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];
case tableClientList:
return prefs->clientListColumnOrder[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;
case tableClientList:
memcpy(prefs->clientListColumnOrder, piOrder, sizeof(prefs->clientListColumnOrder));
break;
}
}
CPreferences::~CPreferences(){
Category_Struct* delcat;
while (!catMap.IsEmpty()) {
delcat=catMap.GetAt(0);
catMap.RemoveAt(0);
delete delcat;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -