Difference Analysis Generated by HtmlDiff on 01.03.2003 16:52  

Base file: eMule0.26d.Maella.v2.0.beta6\src\emule.cpp

Modified file: vampirev1esrc\src\emule.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 "emule.h"
#include "emuleDlg.h"
#include "opcodes.h"
#include "mdump.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW

static CMemoryState oldMemState, newMemState, diffMemState;

#endif


const static UINT UWM_ARE_YOU_EMULE=RegisterWindowMessage(_T(EMULE_GUID));

// CemuleApp

BEGIN_MESSAGE_MAP(CemuleApp, CWinApp)
    ON_COMMAND(ID_HELP, OnHelp)
END_MESSAGE_MAP()


CemuleApp::CemuleApp()
{
}


CemuleApp theApp;


// CemuleApp Initialisierung

BOOL CemuleApp::InitInstance()
{
#ifdef _DEBUG
    oldMemState.Checkpoint();
#endif
    //afxMemDF = allocMemDF | delayFreeMemDF;

#ifdef _DUMP
    MiniDumper dumper(CURRENT_VERSION_LONG);
#endif
  
    pendinglink = 0;
    if (ProcessCommandline())
        return false;
    // InitCommonControls() ist für Windows XP erforderlich, wenn ein Anwendungsmanifest
    // die Verwendung von ComCtl32.dll Version 6 oder höher zum Aktivieren
    // von visuellen Stilen angibt. Ansonsten treten beim Erstellen von Fenstern Fehler auf.!
    InitCommonControls();

    CWinApp::InitInstance();

    if (!AfxSocketInit())
    {
        AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
        return FALSE;
    }
    AfxEnableControlContainer();
    AfxSocketInit();
    CemuleDlg dlg;
    emuledlg = &dlg;
    m_pMainWnd = &dlg;

    // create & initalize all the important stuff 
    glob_prefs = new CPreferences();

    // Barry - Auto-take ed2k links
    if (glob_prefs->AutoTakeED2KLinks())
        Ask4RegFix(false, true);

    clientlist = new CClientList();
    friendlist = new CFriendList();
    searchlist = new CSearchList();
    knownfiles = new CKnownFileList(glob_prefs->GetAppDir());
    serverlist = new CServerList(glob_prefs);
    serverconnect = new CServerConnect(serverlist,theApp.glob_prefs);
    sharedfiles = new CSharedFileList(glob_prefs,serverconnect,knownfiles);
    listensocket = new CListenSocket(glob_prefs);
    clientudp   = new CClientUDPSocket();
    clientcredits = new CClientCreditsList(glob_prefs);
    downloadqueue = new CDownloadQueue(glob_prefs,sharedfiles); // bugfix - do this before creating the uploadqueue
    uploadqueue = new CUploadQueue(glob_prefs);
    ipfilter    = new CIPFilter();
    
    // Maella => [patch] -Bandwidth: overall bandwidth measure- 
    theApp.stat_overallReceivedBytes=0;
    theApp.stat_overallSentBytes=0;
    theApp.stat_receivedBytes=0;
    theApp.stat_sentBytes=0;
    theApp.stat_receivedUnzippedBytes=0;
    theApp.stat_sentUnzippedBytes=0;
    theApp.stat_reconnects=0;
    theApp.stat_transferStarttime=0;
    theApp.stat_serverConnectTime=0;
    theApp.stat_filteredclients=0;
    // Maella end

    INT_PTR nResponse = dlg.DoModal();

    ::CloseHandle(m_hMutexOneInstance);
#ifdef _DEBUG
    newMemState.Checkpoint();
    if (diffMemState.Difference(oldMemState, newMemState))
    {
        TRACE("Memory usage:\n");
        diffMemState.DumpStatistics();
    }
#endif //_DEBUG
    return FALSE;
}

bool CemuleApp::ProcessCommandline(){
     HWND maininst = NULL;
     bool bAlreadyRunning;

     CCommandLineInfo cmdInfo;
     ParseCommandLine(cmdInfo);

     m_hMutexOneInstance = ::CreateMutex(NULL, FALSE,_T(EMULE_GUID));
     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("://")>0) {
            sendstruct.cbData = command.GetLength()+1; 
            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; 
            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; 
} 

CString CemuleApp::StripInvalidFilenameChars(CString strText, bool bKeepSpaces)
{
    LPTSTR pszBuffer = strText.GetBuffer();
    LPTSTR pszSource = pszBuffer;
    LPTSTR pszDest = pszBuffer;

    while (*pszSource != '\0')
    {
        if (!((*pszSource <= 31 && *pszSource >= 0) || // lots of invalid chars for filenames in windows :=)
            *pszSource == '\"' || *pszSource == '*' || *pszSource == '<'  || *pszSource == '>' ||
            *pszSource == '?'  || *pszSource == '|' || *pszSource == '\\' || *pszSource == '/' || 
            *pszSource == ':') )
        {
            if (!bKeepSpaces && *pszSource == ' ')
                *pszDest = '.';
            *pszDest = *pszSource;
            pszDest++;
        }
        pszSource++;
    }
    *pszDest = '\0';
    strText.ReleaseBuffer();
    return strText;
}

CString CemuleApp::CreateED2kLink( CAbstractFile* f )
{
    CString strLink;
    strLink.Format("ed2k://|file|%s|%u|%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x|/",
        StripInvalidFilenameChars(f->GetFileName(), false), // spaces to dots
        f->GetFileSize(),
        f->GetFileHash()[0],f->GetFileHash()[1],f->GetFileHash()[2],f->GetFileHash()[3],f->GetFileHash()[4],f->GetFileHash()[5],f->GetFileHash()[6],f->GetFileHash()[7],
        f->GetFileHash()[8],f->GetFileHash()[9],f->GetFileHash()[10],f->GetFileHash()[11],f->GetFileHash()[12],f->GetFileHash()[13],f->GetFileHash()[14],f->GetFileHash()[15]);
    return strLink;
}

CString CemuleApp::CreateED2kSourceLink( CAbstractFile* f )
{
    if (!serverconnect->IsConnected() || serverconnect->IsLowID()){
        emuledlg->AddLogLine(true,GetResString(IDS_SOURCELINKFAILED));
        return CString("");
    }
    uint32 dwID = serverconnect->GetClientID();
    CString strLink;
    strLink.Format("ed2k://|file|%s|%u|%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x|/|sources,%i.%i.%i.%i:%i|/",
        StripInvalidFilenameChars(f->GetFileName(), false), // spaces to dots
        f->GetFileSize(),
        f->GetFileHash()[0],f->GetFileHash()[1],f->GetFileHash()[2],f->GetFileHash()[3],f->GetFileHash()[4],f->GetFileHash()[5],f->GetFileHash()[6],f->GetFileHash()[7],
        f->GetFileHash()[8],f->GetFileHash()[9],f->GetFileHash()[10],f->GetFileHash()[11],f->GetFileHash()[12],f->GetFileHash()[13],f->GetFileHash()[14],f->GetFileHash()[15],
        (uint8)dwID,(uint8)(dwID>>8),(uint8)(dwID>>16),(uint8)(dwID>>24), glob_prefs->GetPort());
    return strLink;
}

CString CemuleApp::CreateHTMLED2kLink( CAbstractFile* f )
{
    CString strCode = "<a href=\"" + CreateED2kLink(f) + "\">" + StripInvalidFilenameChars(f->GetFileName(), true) + "</a>";
    return strCode;
}

bool CemuleApp::CopyTextToClipboard( CString strText )
{
    //allocate global memory & lock it
    HGLOBAL hGlobal = GlobalAlloc(GHND|GMEM_SHARE,strText.GetLength() + 1);
    if(hGlobal == NULL)
        return false;

    PTSTR pGlobal = static_cast<PTSTR>(GlobalLock(hGlobal));
    if( pGlobal == NULL )
        return false;

    //copy the text
    strcpy(pGlobal,(LPCTSTR)strText);

    GlobalUnlock(hGlobal);

    //Open the Clipboard and insert the handle into the global memory
    if( OpenClipboard(NULL) == NULL )
        return false;

    if(!EmptyClipboard())
        return false;

    if( SetClipboardData(CF_TEXT,hGlobal) == NULL )
        return false;

    CloseClipboard();

    return true;
}

void CemuleApp::OnlineSig() // Added By Bouc7 
{ 
    if (!theApp.glob_prefs->IsOnlineSignatureEnabled()) return;

    char* fullpath = new char[strlen(glob_prefs->GetAppDir())+MAX_PATH]; 
    sprintf(fullpath,"%sonlinesig.dat",glob_prefs->GetAppDir()); 
    CFile file; 
    if (!file.Open(fullpath,CFile::modeCreate|CFile::modeReadWrite)){ 
        theApp.emuledlg->AddLogLine(true,GetResString(IDS_ERROR_SAVEFILE)+CString(" OnlineSig.dat"));
    } 
    char buffer[20]; 
    if (serverconnect->IsConnected()) 
    { 
      file.Write("1",1); 
      file.Write("|",1); 
      file.Write(serverconnect->GetCurrentServer()->GetListName(),strlen(serverconnect->GetCurrentServer()->GetListName())); 
      // Not : file.Write(serverconnect->GetCurrentServer()->GetListName(),strlen(serverconnect->GetCurrentServer()- >GetRealName())); 

      file.Write("|",1); 
      file.Write(serverconnect->GetCurrentServer()->GetFullIP(),strlen(serverconnect->GetCurrentServer()->GetFullIP())); 
      file.Write("|",1); 
      itoa(serverconnect->GetCurrentServer()->GetPort(),buffer,10); 
      file.Write(buffer,strlen(buffer)); 
    } 
    else 
      file.Write("0",1); 

    file.Write("\n",1); 
    sprintf(buffer,"%.1f",(float)downloadqueue->GetDownDatarate()/1024); 
    file.Write(buffer,strlen(buffer)); 
    file.Write("|",1); 
    sprintf(buffer,"%.1f",(float)uploadqueue->GetUpDatarate()/1024); 
    file.Write(buffer,strlen(buffer)); 
    file.Write("|",1); 
    itoa(uploadqueue->GetWaitingUserCount(),buffer,10); 
    file.Write(buffer,strlen(buffer)); 

    file.Close(); 
    delete[] fullpath; 
    fullpath=NULL;
} //End Added By Bouc7

void CemuleApp::OnHelp() {

    // Change extension for help file
    CString strHelpFile = m_pszHelpFilePath;
    CFileFind ff;

    if (glob_prefs->GetLanguageID()!=MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT)) {
        int pos=strHelpFile.ReverseFind('.');
        CString temp;
        temp.Format("%s.%u.chm",strHelpFile.Left(pos),glob_prefs->GetLanguageID());
        if (pos>0) strHelpFile=temp;
        
        // if not exists, use original help (english)
        if (!ff.FindFile(strHelpFile, 0)) strHelpFile = m_pszHelpFilePath;
    }
    strHelpFile.Replace(".HLP", ".chm");

    // lets just open the helpfile by associated program, instead of more windows-dependency :)
    if (ff.FindFile(strHelpFile, 0)) ShellOpenFile(strHelpFile); else AfxMessageBox(GetResString(IDS_ERR_NOHELP)+"\n"+strHelpFile, MB_OK | MB_ICONERROR);
    ff.Close();
}