📄 emule.cpp
字号:
serverlist = new CServerList();
serverconnect = new CServerConnect(serverlist);
sharedfiles = new CSharedFileList(serverconnect);
listensocket = new CListenSocket();
clientudp = new CClientUDPSocket();
clientcredits = new CClientCreditsList();
downloadqueue = new CDownloadQueue(sharedfiles); // bugfix - do this before creating the uploadqueue
uploadqueue = new CUploadQueue();
ipfilter = new CIPFilter();
webserver = new CWebServer(); // Webserver [kuchin]
mmserver = new CMMServer();
scheduler = new CScheduler();
m_pPeerCache = new CPeerCacheFinder();
// reset statistic values
theApp.stat_sessionReceivedBytes=0;
theApp.stat_sessionSentBytes=0;
theApp.stat_sessionSentBytesToFriend = 0;
theApp.stat_reconnects=0;
theApp.stat_transferStarttime=0;
theApp.stat_serverConnectTime=0;
theApp.stat_filteredclients=0;
thePerfLog.Startup();
dlg.DoModal();
// Barry - Restore old registry if required
if (thePrefs.AutoTakeED2KLinks())
RevertReg();
::CloseHandle(m_hMutexOneInstance);
#ifdef _DEBUG
if (g_pfnPrevCrtAllocHook)
_CrtSetAllocHook(g_pfnPrevCrtAllocHook);
newMemState.Checkpoint();
if (diffMemState.Difference(oldMemState, newMemState))
{
TRACE("Memory usage:\n");
diffMemState.DumpStatistics();
}
//_CrtDumpMemoryLeaks();
#endif //_DEBUG
emuledlg = NULL;
ClearDebugLogQueue(true);
ClearLogQueue(true);
return FALSE;
}
#ifdef _DEBUG
int CrtDebugReportCB(int reportType, char* message, int* returnValue)
{
FILE* fp = _tfsopen(_szCrtDebugReportFilePath, _T("a"), _SH_DENYWR);
if (fp){
time_t tNow = time(NULL);
TCHAR szTime[40];
_tcsftime(szTime, ARRSIZE(szTime), _T("%H:%M:%S"), localtime(&tNow));
_ftprintf(fp, _T("%s %u %hs"), szTime, reportType, message);
fclose(fp);
}
*returnValue = 0; // avoid invokation of 'AfxDebugBreak' in ASSERT macros
return TRUE; // avoid further processing of this debug report message by the CRT
}
// allocation hook - for memory statistics gatering
int eMuleAllocHook(int mode, void* pUserData, size_t nSize, int nBlockUse, long lRequest, const unsigned char* pszFileName, int nLine)
{
UINT count = 0;
g_allocations.Lookup(pszFileName, count);
if (mode == _HOOK_ALLOC) {
_CrtSetAllocHook(g_pfnPrevCrtAllocHook);
g_allocations.SetAt(pszFileName, count + 1);
_CrtSetAllocHook(&eMuleAllocHook);
}
else if (mode == _HOOK_FREE){
_CrtSetAllocHook(g_pfnPrevCrtAllocHook);
g_allocations.SetAt(pszFileName, count - 1);
_CrtSetAllocHook(&eMuleAllocHook);
}
return g_pfnPrevCrtAllocHook(mode, pUserData, nSize, nBlockUse, lRequest, pszFileName, nLine);
}
#endif
bool CemuleApp::ProcessCommandline()
{
bool bIgnoreRunningInstances = (GetProfileInt(_T("eMule"), _T("IgnoreInstances"), 0) != 0);
for (int i = 1; i < __argc; i++){
LPCTSTR pszParam = __targv[i];
if (pszParam[0] == _T('-') || pszParam[0] == _T('/')){
pszParam++;
#ifdef _DEBUG
if (_tcscmp(pszParam, _T("assertfile")) == 0)
_CrtSetReportHook(CrtDebugReportCB);
#endif
if (_tcscmp(pszParam, _T("ignoreinstances")) == 0)
bIgnoreRunningInstances = true;
}
}
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// If we create our TCP listen socket with SO_REUSEADDR, we have to ensure that there are
// not 2 emules are running using the same port.
// NOTE: This will not prevent from some other application using that port!
UINT uTcpPort = GetProfileInt(_T("eMule"), _T("Port"), DEFAULT_TCP_PORT);
CString strMutextName;
strMutextName.Format(_T("%s:%u"), EMULE_GUID, uTcpPort);
m_hMutexOneInstance = ::CreateMutex(NULL, FALSE, strMutextName);
HWND maininst = NULL;
bool bAlreadyRunning = false;
if (!bIgnoreRunningInstances){
bAlreadyRunning = ( ::GetLastError() == ERROR_ALREADY_EXISTS ||::GetLastError() == ERROR_ACCESS_DENIED);
if ( bAlreadyRunning ) EnumWindows(SearchEmuleWindow, (LPARAM)&maininst);
}
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) {
CString command = cmdInfo.m_strFileName;
if (command.Find(_T("://"))>0) {
sendstruct.cbData = (command.GetLength() + 1)*sizeof(TCHAR);
sendstruct.dwData = OP_ED2KLINK;
sendstruct.lpData = command.GetBuffer();
if (maininst){
SendMessage(maininst, WM_COPYDATA, (WPARAM)0, (LPARAM)(PCOPYDATASTRUCT)&sendstruct);
return true;
}
else
pendinglink = new CString(command);
} else {
sendstruct.cbData = (command.GetLength() + 1)*sizeof(TCHAR);
sendstruct.dwData = OP_CLCOMMAND;
sendstruct.lpData = command.GetBuffer();
if (maininst){
SendMessage(maininst, WM_COPYDATA, (WPARAM)0, (LPARAM)(PCOPYDATASTRUCT)&sendstruct);
return true;
}
}
}
return (maininst || bAlreadyRunning);
}
BOOL CALLBACK CemuleApp::SearchEmuleWindow(HWND hWnd, LPARAM lParam){
DWORD dwMsgResult;
LRESULT res = ::SendMessageTimeout(hWnd,UWM_ARE_YOU_EMULE,0, 0,SMTO_BLOCK |SMTO_ABORTIFHUNG,10000,&dwMsgResult);
if(res == 0)
return TRUE;
if(dwMsgResult == UWM_ARE_YOU_EMULE){
HWND * target = (HWND *)lParam;
*target = hWnd;
return FALSE;
}
return TRUE;
}
void CemuleApp::UpdateReceivedBytes(uint32 bytesToAdd) {
SetTimeOnTransfer();
stat_sessionReceivedBytes+=bytesToAdd;
}
void CemuleApp::UpdateSentBytes(uint32 bytesToAdd, bool sentToFriend) {
SetTimeOnTransfer();
stat_sessionSentBytes+=bytesToAdd;
if(sentToFriend == true) {
stat_sessionSentBytesToFriend += bytesToAdd;
}
}
void CemuleApp::SetTimeOnTransfer() {
if (stat_transferStarttime>0) return;
stat_transferStarttime=GetTickCount();
}
CString CemuleApp::CreateED2kSourceLink(const CAbstractFile* f)
{
if (!IsConnected() || IsFirewalled()){
AddLogLine(true,GetResString(IDS_SOURCELINKFAILED));
return _T("");
}
uint32 dwID = GetID();
CString strLink;
strLink.Format(_T("ed2k://|file|%s|%u|%s|/|sources,%i.%i.%i.%i:%i|/"),
StripInvalidFilenameChars(f->GetFileName(), false), // spaces to dots
f->GetFileSize(),
EncodeBase16(f->GetFileHash(),16),
(uint8)dwID,(uint8)(dwID>>8),(uint8)(dwID>>16),(uint8)(dwID>>24), thePrefs.GetPort() );
return strLink;
}
CString CemuleApp::CreateED2kHostnameSourceLink(const CAbstractFile* f)
{
CString strLink;
strLink.Format(_T("ed2k://|file|%s|%u|%s|/|sources,%s:%i|/"),
StripInvalidFilenameChars(f->GetFileName(), false), // spaces to dots
f->GetFileSize(),
EncodeBase16(f->GetFileHash(),16),
thePrefs.GetYourHostname(), thePrefs.GetPort() );
return strLink;
}
//TODO: Move to emule-window
bool CemuleApp::CopyTextToClipboard( CString strText )
{
if (strText.IsEmpty())
return false;
//allocate global memory & lock it
HGLOBAL hGlobal = GlobalAlloc(GHND | GMEM_SHARE, (strText.GetLength() + 1)*sizeof(TCHAR));
if(hGlobal == NULL)
return false;
PTSTR pGlobal = static_cast<PTSTR>(GlobalLock(hGlobal));
if( pGlobal == NULL ){
GlobalFree(hGlobal);
return false;
}
//copy the text
_tcscpy(pGlobal, (LPCTSTR)strText);
GlobalUnlock(hGlobal);
//Open the Clipboard and insert the handle into the global memory
bool bResult = false;
if( OpenClipboard(NULL) )
{
if( EmptyClipboard() )
#ifdef _UNICODE
bResult = (SetClipboardData(CF_UNICODETEXT,hGlobal) != NULL);
#else
bResult = (SetClipboardData(CF_TEXT,hGlobal) != NULL);
#endif
CloseClipboard();
}
if (bResult)
IgnoreClipboardLinks(strText); // this is so eMule won't think the clipboard has ed2k links for adding
else
GlobalFree(hGlobal);
return bResult;
}
//TODO: Move to emule-window
CString CemuleApp::CopyTextFromClipboard()
{
HGLOBAL hglb;
LPSTR lptstr;
CString retstring;
if (!IsClipboardFormatAvailable(CF_TEXT))
return _T("");
if (!OpenClipboard(NULL))
return _T("");
hglb = GetClipboardData(CF_TEXT);
if (hglb != NULL)
{
lptstr = (LPSTR)GlobalLock(hglb);
if (lptstr != NULL)
retstring = lptstr;
}
CloseClipboard();
return retstring;
}
void CemuleApp::OnlineSig() // Added By Bouc7
{
if (!thePrefs.IsOnlineSignatureEnabled())
return;
static const TCHAR _szFileName[] = _T("onlinesig.dat");
CString strFullPath = thePrefs.GetAppDir();
strFullPath += _szFileName;
// The 'onlinesig.dat' is potentially read by other applications at more or less frequent intervals.
// - Set the file shareing mode to allow other processes to read the file while we are writing
// it (see also next point).
// - Try to write the hole file data at once, so other applications are always reading
// a consistent amount of file data. C-RTL uses a 4 KB buffer, this is large enough to write
// those 2 lines into the onlinesig.dat file with one IO operation.
// - Although this file is a text file, we set the file mode to 'binary' because of backward
// compatibility with older eMule versions.
CSafeBufferedFile file;
CFileException fexp;
if (!file.Open(strFullPath, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite | CFile::typeBinary, &fexp)){
CString strError = GetResString(IDS_ERROR_SAVEFILE) + _T(" ") + CString(_szFileName);
TCHAR szError[MAX_CFEXP_ERRORMSG];
fexp.GetErrorMessage(szError, ARRSIZE(szError));
strError += _T(" - ");
strError += szError;
AddLogLine(true, _T("%s"), strError);
return;
}
try
{
USES_CONVERSION;
char buffer[20];
CStringA strBuff;
if (IsConnected()){
file.Write("1",1);
file.Write("|",1);
if(serverconnect->IsConnected()){
strBuff = serverconnect->GetCurrentServer()->GetListName();
file.Write(strBuff, strBuff.GetLength());
}
else{
strBuff = "Kademlia";
file.Write(strBuff,strBuff.GetLength());
}
file.Write("|",1);
if(serverconnect->IsConnected()){
strBuff = serverconnect->GetCurrentServer()->GetFullIP();
file.Write(strBuff,strBuff.GetLength());
}
else{
strBuff = "0.0.0.0";
file.Write(strBuff,strBuff.GetLength());
}
file.Write("|",1);
if(serverconnect->IsConnected()){
itoa(serverconnect->GetCurrentServer()->GetPort(),buffer,10);
file.Write(buffer,strlen(buffer));
}
else{
strBuff = "0";
file.Write(strBuff,strBuff.GetLength());
}
}
else
file.Write("0",1);
file.Write("\n",1);
sprintf(buffer,"%.1f",(float)downloadqueue->GetDatarate()/1024);
file.Write(buffer,strlen(buffer));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -