📄 emuledlg.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.
// emuleDlg.cpp : Implementierungsdatei
//
#include "stdafx.h"
#include "afxinet.h"
#include "emule.h"
#include "emuleDlg.h"
#include "sockets.h"
#include "knownfilelist.h"
#include "knownfile.h"
#include "serverlist.h"
#include "opcodes.h"
#include "sharedfilelist.h"
#include "creditsdlg.h"
#include "ED2KLink.h"
#include "math.h"
#include "Splashscreen.h"
#pragma comment(lib, "winmm.lib")
#include "Mmsystem.h"
#include "enbitmap.h"
#include "wizard.h"
#include "InputBox.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//extern volatile BYTE g_byHashThreadRunning; // declared in SharedFileList.cpp
extern void URLDecode(CString& result, const char* buff);
const static UINT UWM_ARE_YOU_EMULE=RegisterWindowMessage(_T(EMULE_GUID));
// CemuleDlg Dialog
CemuleDlg::CemuleDlg(CWnd* pParent /*=NULL*/)
: CTrayDialog(CemuleDlg::IDD, pParent){
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_app_state = APP_STATE_RUNNING;
ready = false; startUpMinimized=false;
lastuprate = 0;
lastdownrate = 0;
status = 0;
connicons[0] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_NOTCONNECTED),IMAGE_ICON,16,16,0);
connicons[1] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_CONNECTED),IMAGE_ICON,16,16,0);
connicons[2] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_CONNECTEDHIGH),IMAGE_ICON,16,16,0);
transicons[0] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_UPDOWN),IMAGE_ICON,16,16,0);
transicons[1] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_UP0DOWN1),IMAGE_ICON,16,16,0);
transicons[2] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_UP1DOWN0),IMAGE_ICON,16,16,0);
transicons[3] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_UP1DOWN1),IMAGE_ICON,16,16,0);
imicons[0] =0;
imicons[1] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_MESSAGE),IMAGE_ICON,16,16,0);
imicons[2] = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_MPENDING),IMAGE_ICON,16,16,0);
sourceTrayIcon= (HICON)LoadImage(AfxGetInstanceHandle() ,MAKEINTRESOURCE(IDR_TRAYICON),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
sourceTrayIconGrey= (HICON)LoadImage(AfxGetInstanceHandle() ,MAKEINTRESOURCE(IDR_TRAYICON_GREY),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
usericon = (HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_USER),IMAGE_ICON,16,16,0);
}
CemuleDlg::~CemuleDlg()
{
::DestroyIcon(m_hIcon);
::DestroyIcon(connicons[0]);
::DestroyIcon(connicons[1]);
::DestroyIcon(connicons[2]);
::DestroyIcon(transicons[0]);
::DestroyIcon(transicons[1]);
::DestroyIcon(transicons[2]);
::DestroyIcon(transicons[3]);
::DestroyIcon(imicons[1]);
::DestroyIcon(imicons[2]);
::DestroyIcon(sourceTrayIcon);
::DestroyIcon(sourceTrayIconGrey);
::DestroyIcon(usericon);
}
void CemuleDlg::DoDataExchange(CDataExchange* pDX){
CTrayDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CemuleDlg, CTrayDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_WM_CLOSE()
ON_COMMAND(MP_CONNECT, StartConnection)
ON_COMMAND(MP_DISCONNECT, CloseConnection)
ON_COMMAND(MP_EXIT, OnClose )
ON_MESSAGE(WM_TASKBARNOTIFIERCLICKED, OnTaskbarNotifierClicked)
ON_MESSAGE(WM_COPYDATA, OnWMData)
ON_MESSAGE(TM_FINISHEDHASHING,OnFileHashed)
ON_COMMAND(MP_RESTORE, RestoreWindow)
// quick-speed changer --
ON_COMMAND_RANGE(MP_QS_U10, MP_QS_UP10, QuickSpeedUpload)
ON_COMMAND_RANGE(MP_QS_D10, MP_QS_DC, QuickSpeedDownload)
//--- quickspeed - paralize all ---
ON_COMMAND_RANGE(MP_QS_PA, MP_QS_UA, QuickSpeedOther)
// quick-speed changer -- based on xrmb
ON_REGISTERED_MESSAGE(UWM_ARE_YOU_EMULE, OnAreYouEmule)
ON_WM_QUERYENDSESSION()
ON_BN_CLICKED(IDC_HOTMENU, OnBnClickedHotmenu)
//Webserver [kuchin]
ON_MESSAGE(WEB_CONNECT_TO_SERVER, OnWebServerConnect)
ON_MESSAGE(WEB_REMOVE_SERVER, OnWebServerRemove)
ON_MESSAGE(WEB_SHARED_FILES_RELOAD, OnWebSharedFilesReload)
END_MESSAGE_MAP()
// CemuleDlg eventhandler
LRESULT CemuleDlg::OnAreYouEmule(WPARAM, LPARAM)
{
return UWM_ARE_YOU_EMULE;
}
BOOL CemuleDlg::OnInitDialog(){
CTrayDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL){
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, GetResString(IDS_ABOUTBOX));
pSysMenu->AppendMenu(MF_STRING, MP_VERSIONCHECK, GetResString(IDS_VERSIONCHECK));
switch (theApp.glob_prefs->GetWindowsVersion()){
case _WINVER_98_:
case _WINVER_95_:
case _WINVER_ME_:
break;
default: {
CMenu optionsM;
optionsM.CreateMenu();
AddSpeedSelectorSys(&optionsM);
// set connect/disconnect to enabled and disabled
optionsM.AppendMenu(MF_STRING ,MP_CONNECT, GetResString(IDS_CONNECTTOANYSERVER));
optionsM.AppendMenu(MF_STRING ,MP_DISCONNECT, GetResString(IDS_MAIN_BTN_DISCONNECT));
pSysMenu->AppendMenu(MF_STRING|MF_POPUP, (UINT_PTR)optionsM.m_hMenu, GetResString(IDS_EM_PREFS));
}
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
toolbar.Create(WS_CHILD | WS_VISIBLE , CRect(0,0,0,0), this, IDC_TOOLBAR);
toolbar.Init();
//set title
char buffer[50];
sprintf(buffer,"eMule v%s",CURRENT_VERSION_LONG);
SetWindowText(buffer);
//START - enkeyDEV(kei-kun) -TaskbarNotifier-
m_wndTaskbarNotifier.Create(this);
if (_tcscmp(theApp.glob_prefs->GetNotifierConfiguration(),"") == 0) {
CString defaultTBN;
defaultTBN.Format("%sNotifier.ini", theApp.glob_prefs->GetAppDir());
LoadNotifier(defaultTBN);
theApp.glob_prefs->SetNotifierConfiguration(defaultTBN);
}
else
LoadNotifier(theApp.glob_prefs->GetNotifierConfiguration());
//END - enkeyDEV(kei-kun) -TaskbarNotifier-
// set statusbar
statusbar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM,CRect(0,0,0,0), this, IDC_STATUSBAR) ;
statusbar.EnableToolTips(true);
CRect rect;
statusbar.GetClientRect(&rect);
int widths[5] = { rect.right-650, rect.right-410, rect.right-220,rect.right-25, -1 };
statusbar.SetParts(5, widths);
statusbar.SetIcon(1,usericon);
statusbar.SetText(GetResString(IDS_UUSERS)+": 0",1,0);
// create dialog pages
preferenceswnd.SetPrefs(theApp.glob_prefs);
serverwnd.Create(IDD_SERVER);
sharedfileswnd.Create(IDD_FILES);
searchwnd.Create(IDD_SEARCH);
chatwnd.Create(IDD_CHAT);
transferwnd.Create(IDD_TRANSFER);
statisticswnd.Create(IDD_STATISTICS);
ircwnd.Create(IDD_IRC);
serverwnd.ShowWindow(SW_SHOW);
activewnd = &serverwnd;
// set updateintervall of graphic rate display (in seconds)
//ShowConnectionState(false);
// anchors
AddAnchor(serverwnd,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(transferwnd,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(sharedfileswnd,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(searchwnd,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(chatwnd,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(ircwnd,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(statusbar,BOTTOM_LEFT,BOTTOM_RIGHT);
AddAnchor(statisticswnd,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(toolbar,TOP_LEFT, TOP_RIGHT);
statisticswnd.ShowInterval();
// tray icon
TraySetMinimizeToTray(theApp.glob_prefs->GetMinTrayPTR());
TrayMinimizeToTrayChange();
ShowTransferRate(true);
searchwnd.UpdateCatTabs();
// Restore saved window placement
WINDOWPLACEMENT wp;wp.length=sizeof(wp);
wp=theApp.glob_prefs->GetEmuleWindowPlacement();
SetWindowPlacement(&wp);
Localize();
theApp.webserver->StartServer();
m_hTimer = ::SetTimer(NULL, // Window to associate with
NULL, // ID of timer (ignored if window = null)
300, // Time out duration
(TIMERPROC)CemuleDlg::Timer); // Proc to run
// splashscreen
if (theApp.glob_prefs->UseSplashScreen() && !theApp.glob_prefs->GetStartMinimized()){
CSplashScreen splash(this);
splash.DoModal();
}
if (!m_hTimer)
theApp.emuledlg->AddLogLine(false, GetResString(IDS_ERR_TIMERCREATEFAILED));
theApp.stat_starttime=GetTickCount();
if( theApp.glob_prefs->IsFirstStart() && AfxMessageBox(GetResString(IDS_FIRSTRUNASSIST),MB_YESNO|MB_DEFBUTTON1)==IDYES )
RunFirstStartWizard();
return TRUE;
}
void CemuleDlg::DoVersioncheck(bool manual) {
if (!manual && theApp.glob_prefs->GetLastVC()!=0) {
CTime last(theApp.glob_prefs->GetLastVC());
time_t tLast=mktime(last.GetLocalTm());
time_t tNow=mktime(CTime::GetCurrentTime().GetLocalTm());
if ( (difftime(tNow,tLast) / 86400)<theApp.glob_prefs->GetUpdateDays() ) return;
}
switch (IsNewVersionAvailable()){
case 1 :
theApp.glob_prefs->UpdateLastVC();
SetActiveWindow();
AddLogLine(true,GetResString(IDS_NEWVERSIONAVL));
ShowNotifier(GetResString(IDS_NEWVERSIONAVLPOPUP), TBN_NEWVERSION);
if (!theApp.glob_prefs->GetNotifierPopOnNewVersion())
if (AfxMessageBox(GetResString(IDS_NEWVERSIONAVL)+GetResString(IDS_VISITVERSIONCHECK),MB_YESNO)==IDYES) {
CString theUrl;
theUrl.Format("http://vcheck.emule-project.net/en/version_check.php?version=%i&language=%i",CURRENT_VERSION_CHECK,theApp.glob_prefs->GetLanguageID());
ShellExecute(NULL, NULL, theUrl, NULL, theApp.glob_prefs->GetAppDir(), SW_SHOWDEFAULT);
}
break;
case 0:
theApp.glob_prefs->UpdateLastVC();
if (manual) AddLogLine(true,GetResString(IDS_NONEWERVERSION));
break;
case -1 :
AddLogLine(true,GetResString(IDS_NEWVERSIONFAILED));
break;
}
}
void CALLBACK CemuleDlg::Timer(HWND hwnd, UINT uiMsg, UINT idEvent, DWORD dwTime)
{
switch(theApp.emuledlg->status){
case 0:
theApp.emuledlg->status++;
theApp.emuledlg->ready = true;
theApp.sharedfiles->SetOutputCtrl(&theApp.emuledlg->sharedfileswnd.sharedfilesctrl);
break;
case 1:
theApp.emuledlg->status++;
theApp.serverlist->Init();
theApp.emuledlg->status++;
break;
case 2:
break;
case 3:
theApp.emuledlg->status++;
theApp.downloadqueue->Init();
if(!theApp.listensocket->StartListening())
theApp.emuledlg->AddLogLine(false, GetResString(IDS_MAIN_SOCKETERROR),theApp.glob_prefs->GetPort());
if(!theApp.clientudp->Create())
theApp.emuledlg->AddLogLine(false, GetResString(IDS_MAIN_SOCKETERROR),theApp.glob_prefs->GetPort());
theApp.emuledlg->AddLogLine(true, GetResString(IDS_MAIN_READY),CURRENT_VERSION_LONG);
if(theApp.glob_prefs->DoAutoConnect())
theApp.emuledlg->OnBnClickedButton2();
break;
default:
theApp.emuledlg->StopTimer();
}
}
void CemuleDlg::StopTimer(){
try {
if (m_hTimer)
::KillTimer(NULL, m_hTimer);
} catch (...) {}
if (theApp.glob_prefs->UpdateNotify()) DoVersioncheck(false);
if (theApp.pendinglink){
OnWMData(NULL,(LPARAM) &theApp.sendstruct);//changed by Cax2 28/10/02
delete theApp.pendinglink;
}
}
void CemuleDlg::OnSysCommand(UINT nID, LPARAM lParam){
// Systemmenu-Speedselector
if (nID>=MP_QS_U10 && nID<=10512) {
QuickSpeedUpload(nID);
return;
}
if (nID>=MP_QS_D10 && nID<=10531) {
QuickSpeedDownload(nID);
return;
}
if (nID==MP_QS_PA || nID==MP_QS_UA) {
QuickSpeedOther(nID);
return;
}
switch (nID /*& 0xFFF0*/){
case IDM_ABOUTBOX : {
CCreditsDlg dlgAbout;
dlgAbout.DoModal();
break;
}
case MP_VERSIONCHECK:
DoVersioncheck(true);
break;
case MP_CONNECT : {
theApp.serverconnect->ConnectToAnyServer();
break;
}
case MP_DISCONNECT : {
theApp.serverconnect->Disconnect();
break;
}
default:{
CTrayDialog::OnSysCommand(nID, lParam);
}
}
if (
(nID & 0xFFF0) == SC_MINIMIZE ||
(nID & 0xFFF0) == SC_MINIMIZETRAY ||
(nID & 0xFFF0) == SC_RESTORE ||
(nID & 0xFFF0) == SC_MAXIMIZE ) ShowTransferRate(true);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -