📄 emuledlg.cpp
字号:
// Barry - Default all new servers to high priority
if (thePrefs.GetManualHighPrio())
pSrv->SetPreference(SRV_PR_HIGH);
if (!serverwnd->serverlistctrl.AddServer(pSrv,true))
delete pSrv;
else
AddLogLine(true,GetResString(IDS_SERVERADDED), pSrv->GetListName());
}
break;
default:
break;
}
delete pLink;
}
catch(...){
LogWarning(LOG_STATUSBAR, GetResString(IDS_LINKNOTADDED));
ASSERT(0);
}
}
LRESULT CemuleDlg::OnWMData(WPARAM wParam,LPARAM lParam)
{
PCOPYDATASTRUCT data = (PCOPYDATASTRUCT)lParam;
if (data->dwData == OP_ED2KLINK)
{
FlashWindow(true);
if (thePrefs.IsBringToFront())
{
if (IsIconic())
ShowWindow(SW_SHOWNORMAL);
else if (TrayHide())
RestoreWindow();
else
SetForegroundWindow();
}
ProcessED2KLink((LPCTSTR)data->lpData);
}
else if (data->dwData == OP_CLCOMMAND){
// command line command received
CString clcommand((LPCTSTR)data->lpData);
clcommand.MakeLower();
AddLogLine(true,_T("CLI: %s"),clcommand);
if (clcommand==_T("connect")) {StartConnection(); return true;}
if (clcommand==_T("disconnect")) {theApp.serverconnect->Disconnect(); return true;}
if (clcommand==_T("resume")) {theApp.downloadqueue->StartNextFile(); return true;}
if (clcommand==_T("exit")) {OnClose(); return true;}
if (clcommand==_T("restore")) {RestoreWindow();return true;}
if (clcommand==_T("reloadipf")) {theApp.ipfilter->LoadFromDefaultFile(); return true;}
if (clcommand.Left(7).MakeLower()==_T("limits=") && clcommand.GetLength()>8) {
CString down;
CString up=clcommand.Mid(7);
int pos=up.Find(_T(','));
if (pos>0) {
down=up.Mid(pos+1);
up=up.Left(pos);
}
if (down.GetLength()>0) thePrefs.SetMaxDownload(_tstoi(down));
if (up.GetLength()>0) thePrefs.SetMaxUpload(_tstoi(up));
return true;
}
if (clcommand==_T("help") || clcommand==_T("/?")) {
// show usage
return true;
}
if (clcommand==_T("status")) {
CString strBuff;
strBuff.Format(_T("%sstatus.log"),thePrefs.GetAppDir());
FILE* file = _tfsopen(strBuff, _T("wt"), _SH_DENYWR);
if (file){
if (theApp.serverconnect->IsConnected())
strBuff = GetResString(IDS_CONNECTED);
else if (theApp.serverconnect->IsConnecting())
strBuff = GetResString(IDS_CONNECTING);
else
strBuff = GetResString(IDS_DISCONNECTED);
_ftprintf(file, _T("%s\n"), strBuff);
strBuff.Format(GetResString(IDS_UPDOWNSMALL), (float)theApp.uploadqueue->GetDatarate()/1024, (float)theApp.downloadqueue->GetDatarate()/1024);
_ftprintf(file, _T("%s"), strBuff); // next string (getTextList) is already prefixed with '\n'!
_ftprintf(file, _T("%s\n"), transferwnd->downloadlistctrl.getTextList());
fclose(file);
}
return true;
}
// show "unknown command";
}
return true;
}
LRESULT CemuleDlg::OnFileHashed(WPARAM wParam, LPARAM lParam)
{
if (theApp.m_app_state == APP_STATE_SHUTINGDOWN)
return FALSE;
CKnownFile* result = (CKnownFile*)lParam;
ASSERT( result->IsKindOf(RUNTIME_CLASS(CKnownFile)) );
if (wParam)
{
// File hashing finished for a part file when:
// - part file just completed
// - part file was rehashed at startup because the file date of part.met did not match the part file date
CPartFile* requester = (CPartFile*)wParam;
ASSERT( requester->IsKindOf(RUNTIME_CLASS(CPartFile)) );
// SLUGFILLER: SafeHash - could have been canceled
if (theApp.downloadqueue->IsPartFile(requester))
requester->PartFileHashFinished(result);
else
delete result;
// SLUGFILLER: SafeHash
}
else
{
ASSERT( !result->IsKindOf(RUNTIME_CLASS(CPartFile)) );
// File hashing finished for a shared file (none partfile)
// - reading shared directories at startup and hashing files which were not found in known.met
// - reading shared directories during runtime (user hit Reload button, added a shared directory, ...)
theApp.sharedfiles->FileHashingFinished(result);
}
return TRUE;
}
LRESULT CemuleDlg::OnFileOpProgress(WPARAM wParam, LPARAM lParam)
{
if (theApp.m_app_state == APP_STATE_SHUTINGDOWN)
return FALSE;
CKnownFile* pKnownFile = (CKnownFile*)lParam;
ASSERT( pKnownFile->IsKindOf(RUNTIME_CLASS(CKnownFile)) );
if (pKnownFile->IsKindOf(RUNTIME_CLASS(CPartFile)))
{
CPartFile* pPartFile = static_cast<CPartFile*>(pKnownFile);
pPartFile->SetFileOpProgress(wParam);
pPartFile->UpdateDisplayedInfo(true);
}
return 0;
}
// SLUGFILLER: SafeHash
LRESULT CemuleDlg::OnHashFailed(WPARAM wParam, LPARAM lParam)
{
theApp.sharedfiles->HashFailed((UnknownFile_Struct*)lParam);
return 0;
}
// SLUGFILLER: SafeHash
LRESULT CemuleDlg::OnFileAllocExc(WPARAM wParam,LPARAM lParam)
{
if (lParam == 0)
((CPartFile*)wParam)->FlushBuffersExceptionHandler();
else
((CPartFile*)wParam)->FlushBuffersExceptionHandler((CFileException*)lParam);
return 0;
}
LRESULT CemuleDlg::OnFileCompleted(WPARAM wParam, LPARAM lParam)
{
CPartFile* partfile = (CPartFile*)lParam;
ASSERT( partfile != NULL );
if (partfile)
partfile->PerformFileCompleteEnd(wParam);
return 0;
}
bool CemuleDlg::CanClose()
{
if (theApp.m_app_state == APP_STATE_RUNNING && thePrefs.IsConfirmExitEnabled())
{
if (AfxMessageBox(GetResString(IDS_MAIN_EXIT), MB_YESNO | MB_DEFBUTTON2) == IDNO)
return false;
}
return true;
}
void CemuleDlg::OnClose()
{
if (!CanClose())
return;
m_pDropTarget->Revoke();
theApp.m_app_state = APP_STATE_SHUTINGDOWN;
theApp.serverconnect->Disconnect();
theApp.OnlineSig(); // Added By Bouc7
// get main window placement
WINDOWPLACEMENT wp;
wp.length = sizeof(wp);
GetWindowPlacement(&wp);
ASSERT( wp.showCmd == SW_SHOWMAXIMIZED || wp.showCmd == SW_SHOWMINIMIZED || wp.showCmd == SW_SHOWNORMAL );
if (wp.showCmd == SW_SHOWMINIMIZED && (wp.flags & WPF_RESTORETOMAXIMIZED))
wp.showCmd = SW_SHOWMAXIMIZED;
wp.flags = 0;
thePrefs.SetWindowLayout(wp);
// get active main window dialog
if (activewnd){
if (activewnd->IsKindOf(RUNTIME_CLASS(CServerWnd)))
thePrefs.SetLastMainWndDlgID(IDD_SERVER);
else if (activewnd->IsKindOf(RUNTIME_CLASS(CSharedFilesWnd)))
thePrefs.SetLastMainWndDlgID(IDD_FILES);
else if (activewnd->IsKindOf(RUNTIME_CLASS(CSearchDlg)))
thePrefs.SetLastMainWndDlgID(IDD_SEARCH);
else if (activewnd->IsKindOf(RUNTIME_CLASS(CChatWnd)))
thePrefs.SetLastMainWndDlgID(IDD_CHAT);
else if (activewnd->IsKindOf(RUNTIME_CLASS(CTransferWnd)))
thePrefs.SetLastMainWndDlgID(IDD_TRANSFER);
else if (activewnd->IsKindOf(RUNTIME_CLASS(CStatisticsDlg)))
thePrefs.SetLastMainWndDlgID(IDD_STATISTICS);
else if (activewnd->IsKindOf(RUNTIME_CLASS(CKademliaWnd)))
thePrefs.SetLastMainWndDlgID(IDD_KADEMLIAWND);
else if (activewnd->IsKindOf(RUNTIME_CLASS(CIrcWnd)))
thePrefs.SetLastMainWndDlgID(IDD_IRC);
else{
ASSERT(0);
thePrefs.SetLastMainWndDlgID(0);
}
}
Kademlia::CKademlia::stop();
// try to wait untill the hashing thread notices that we are shutting down
CSingleLock sLock1(&theApp.hashing_mut); // only one filehash at a time
sLock1.Lock(2000);
// saving data & stuff
theApp.emuledlg->preferenceswnd->m_wndSecurity.DeleteDDB();
theApp.knownfiles->Save();
transferwnd->downloadlistctrl.SaveSettings(CPreferences::tableDownload);
transferwnd->uploadlistctrl.SaveSettings(CPreferences::tableUpload);
transferwnd->queuelistctrl.SaveSettings(CPreferences::tableQueue);
transferwnd->clientlistctrl.SaveSettings(CPreferences::tableClientList);
searchwnd->SaveAllSettings();
sharedfileswnd->sharedfilesctrl.SaveSettings(CPreferences::tableShared);
serverwnd->SaveAllSettings();
kademliawnd->SaveAllSettings();
theApp.m_pPeerCache->Save();
theApp.scheduler->RestoreOriginals();
thePrefs.Save();
thePerfLog.Shutdown();
// explicitly delete all listview items which may hold ptrs to objects which will get deleted
// by the dtors (some lines below) to avoid potential problems during application shutdown.
transferwnd->downloadlistctrl.DeleteAllItems();
chatwnd->chatselector.DeleteAllItems();
theApp.clientlist->DeleteAll();
searchwnd->DeleteAllSearchListCtrlItems();
sharedfileswnd->sharedfilesctrl.DeleteAllItems();
transferwnd->queuelistctrl.DeleteAllItems();
transferwnd->clientlistctrl.DeleteAllItems();
transferwnd->uploadlistctrl.DeleteAllItems();
CPartFileConvert::CloseGUI();
CPartFileConvert::RemoveAllJobs();
theApp.uploadBandwidthThrottler->EndThread();
theApp.lastCommonRouteFinder->EndThread();
theApp.sharedfiles->DeletePartFileInstances();
searchwnd->SendMessage(WM_CLOSE);
// NOTE: Do not move those dtors into 'CemuleApp::InitInstance' (althought they should be there). The
// dtors are indirectly calling functions which access several windows which would not be available
// after we have closed the main window -> crash!
delete theApp.mmserver; theApp.mmserver = NULL;
delete theApp.listensocket; theApp.listensocket = NULL;
delete theApp.clientudp; theApp.clientudp = NULL;
delete theApp.sharedfiles; theApp.sharedfiles = NULL;
delete theApp.serverconnect; theApp.serverconnect = NULL;
delete theApp.serverlist; theApp.serverlist = NULL;
delete theApp.knownfiles; theApp.knownfiles = NULL;
delete theApp.searchlist; theApp.searchlist = NULL;
delete theApp.clientcredits; theApp.clientcredits = NULL;
delete theApp.downloadqueue; theApp.downloadqueue = NULL;
delete theApp.uploadqueue; theApp.uploadqueue = NULL;
delete theApp.clientlist; theApp.clientlist = NULL;
delete theApp.friendlist; theApp.friendlist = NULL;
delete theApp.scheduler; theApp.scheduler = NULL;
delete theApp.ipfilter; theApp.ipfilter = NULL;
delete theApp.webserver; theApp.webserver = NULL;
delete theApp.m_pPeerCache; theApp.m_pPeerCache = NULL;
delete theApp.m_pFirewallOpener;theApp.m_pFirewallOpener = NULL;
//EastShare Start - added by AndCycle, IP to Country
delete theApp.ip2country; theApp.ip2country = NULL;
//EastShare End - added by AndCycle, IP to Country
delete theApp.uploadBandwidthThrottler; theApp.uploadBandwidthThrottler = NULL;
delete theApp.lastCommonRouteFinder; theApp.lastCommonRouteFinder = NULL;
theApp.m_UPnPNat.clearNATPortMapping(); //VeryCD
thePrefs.Uninit();
CTitleMenu::FreeAPI();
theApp.m_app_state = APP_STATE_DONE;
CTrayDialog::OnCancel();
}
void CemuleDlg::DestroyMiniMule()
{
if (m_pMiniMule)
{
if (!m_pMiniMule->IsInCallback()) // for safety
{
m_pMiniMule->DestroyWindow();
delete m_pMiniMule;
m_pMiniMule = NULL;
}
else
ASSERT(0);
}
}
LRESULT CemuleDlg::OnCloseMiniMule(WPARAM wParam, LPARAM lParam)
{
DestroyMiniMule();
if (wParam)
RestoreWindow();
return 0;
}
void CemuleDlg::OnTrayLButtonUp(CPoint pt)
{
// Avoid reentrancy problems with main window, options dialog and mini mule window
if (IsPreferencesDlgOpen()) {
MessageBeep((UINT)-1);
preferenceswnd->SetForegroundWindow();
preferenceswnd->BringWindowToTop();
return;
}
if (m_pMiniMule) {
m_pMiniMule->ShowWindow(SW_SHOW);
m_pMiniMule->SetForegroundWindow();
m_pMiniMule->BringWindowToTop();
return;
}
if (thePrefs.GetEnableMiniMule())
{
m_pMiniMule = new CMiniMule(this);
m_pMiniMule->Create(CMiniMule::IDD, this);
//m_pMiniMule->ShowWindow(SW_SHOW); // do not explicitly show the window, it will do that for itself when it's ready..
m_pMiniMule->SetForegroundWindow();
m_pMiniMule->BringWindowToTop();
}
}
void CemuleDlg::OnTrayRButtonUp(CPoint pt)
{
// Avoid reentrancy problems with main window, options dialog and mini mule window
if (IsPreferencesDlgOpen()) {
MessageBeep((UINT)-1);
preferenceswnd->SetForegroundWindow();
preferenceswnd->BringWindowToTop();
return;
}
if (m_pMiniMule)
{
if (m_pMiniMule->GetAutoClose())
DestroyMiniMule();
else
{
// Avoid reentrancy problems with main window, options dialog and mini mule window
if (m_pMiniMule->m_hWnd && !m_pMiniMule->IsWindowEnabled()) {
MessageBeep((UINT)-1);
return;
}
}
}
if (m_pSystrayDlg) {
m_pSystrayDlg->BringWindowToTop();
return;
}
m_pSystrayDlg = new CMuleSystrayDlg(this, pt,
thePrefs.GetMaxGraphUploadRate(), thePrefs.GetMaxGraphDownloadRate(),
thePrefs.GetMaxUpload(), thePrefs.GetMaxDownload());
if (m_pSystrayDlg)
{
UINT nResult = m_pSystrayDlg->DoModal();
delete m_pSystrayDlg;
m_pSystrayDlg = NULL;
switch (nResult)
{
case IDC_TOMAX:
QuickSpeedOther(MP_QS_UA);
break;
case IDC_TOMIN:
QuickSpeedOther(MP_QS_PA);
break;
case IDC_RESTORE:
RestoreWindow();
break;
case IDC_CONNECT:
StartConnection();
break;
case IDC_DISCONNECT:
CloseConnection();
break;
case IDC_EXIT:
OnClose();
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -