]> Git Repo - VerusCoin.git/blobdiff - init.cpp
Fix CRLF
[VerusCoin.git] / init.cpp
index e7382d77faad1a66110a0aa60e363f0f3a3da204..ba57866a4b5feb9e03ad34cbbc16ca38492230e0 100644 (file)
--- a/init.cpp
+++ b/init.cpp
-// Copyright (c) 2009-2010 Satoshi Nakamoto\r
-// Distributed under the MIT/X11 software license, see the accompanying\r
-// file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
-\r
-#include "headers.h"\r
-\r
-\r
-\r
-\r
-void ExitTimeout(void* parg)\r
-{\r
-#ifdef __WXMSW__\r
-    Sleep(5000);\r
-    ExitProcess(0);\r
-#endif\r
-}\r
-\r
-void Shutdown(void* parg)\r
-{\r
-    static CCriticalSection cs_Shutdown;\r
-    static bool fTaken;\r
-    bool fFirstThread;\r
-    CRITICAL_BLOCK(cs_Shutdown)\r
-    {\r
-        fFirstThread = !fTaken;\r
-        fTaken = true;\r
-    }\r
-    static bool fExit;\r
-    if (fFirstThread)\r
-    {\r
-        fShutdown = true;\r
-        nTransactionsUpdated++;\r
-        DBFlush(false);\r
-        StopNode();\r
-        DBFlush(true);\r
-        CreateThread(ExitTimeout, NULL);\r
-        Sleep(50);\r
-        printf("Bitcoin exiting\n\n");\r
-        fExit = true;\r
-        exit(0);\r
-    }\r
-    else\r
-    {\r
-        while (!fExit)\r
-            Sleep(500);\r
-        Sleep(100);\r
-        ExitThread(0);\r
-    }\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-//////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Startup folder\r
-//\r
-\r
-#ifdef __WXMSW__\r
-string StartupShortcutPath()\r
-{\r
-    return MyGetSpecialFolderPath(CSIDL_STARTUP, true) + "\\Bitcoin.lnk";\r
-}\r
-\r
-bool GetStartOnSystemStartup()\r
-{\r
-    return filesystem::exists(StartupShortcutPath().c_str());\r
-}\r
-\r
-void SetStartOnSystemStartup(bool fAutoStart)\r
-{\r
-    // If the shortcut exists already, remove it for updating\r
-    remove(StartupShortcutPath().c_str());\r
-\r
-    if (fAutoStart)\r
-    {\r
-        CoInitialize(NULL);\r
-\r
-        // Get a pointer to the IShellLink interface.\r
-        IShellLink* psl = NULL;\r
-        HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL,\r
-                                CLSCTX_INPROC_SERVER, IID_IShellLink,\r
-                                reinterpret_cast<void**>(&psl));\r
-\r
-        if (SUCCEEDED(hres))\r
-        {\r
-            // Get the current executable path\r
-            TCHAR pszExePath[MAX_PATH];\r
-            GetModuleFileName(NULL, pszExePath, sizeof(pszExePath));\r
-\r
-            // Set the path to the shortcut target\r
-            psl->SetPath(pszExePath);\r
-            PathRemoveFileSpec(pszExePath);\r
-            psl->SetWorkingDirectory(pszExePath);\r
-            psl->SetShowCmd(SW_SHOWMINNOACTIVE);\r
-\r
-            // Query IShellLink for the IPersistFile interface for\r
-            // saving the shortcut in persistent storage.\r
-            IPersistFile* ppf = NULL;\r
-            hres = psl->QueryInterface(IID_IPersistFile,\r
-                                       reinterpret_cast<void**>(&ppf));\r
-            if (SUCCEEDED(hres))\r
-            {\r
-                WCHAR pwsz[MAX_PATH];\r
-                // Ensure that the string is ANSI.\r
-                MultiByteToWideChar(CP_ACP, 0, StartupShortcutPath().c_str(), -1, pwsz, MAX_PATH);\r
-                // Save the link by calling IPersistFile::Save.\r
-                hres = ppf->Save(pwsz, TRUE);\r
-                ppf->Release();\r
-            }\r
-            psl->Release();\r
-        }\r
-        CoUninitialize();\r
-    }\r
-}\r
-\r
-#elif defined(__WXGTK__)\r
-\r
-//\r
-// Follow the Desktop Application Autostart Spec:\r
-//  http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html\r
-//\r
-\r
-boost::filesystem::path GetAutostartDir()\r
-{\r
-    namespace fs = boost::filesystem;\r
-\r
-    char* pszConfigHome = getenv("XDG_CONFIG_HOME");\r
-    if (pszConfigHome) return fs::path(pszConfigHome) / fs::path("autostart");\r
-    char* pszHome = getenv("HOME");\r
-    if (pszHome) return fs::path(pszHome) / fs::path(".config/autostart");\r
-    return fs::path();\r
-}\r
-\r
-boost::filesystem::path GetAutostartFilePath()\r
-{\r
-    return GetAutostartDir() / boost::filesystem::path("bitcoin.desktop");\r
-}\r
-\r
-bool GetStartOnSystemStartup()\r
-{\r
-    boost::filesystem::ifstream optionFile(GetAutostartFilePath());\r
-    if (!optionFile.good())\r
-        return false;\r
-    // Scan through file for "Hidden=true":\r
-    string line;\r
-    while (!optionFile.eof())\r
-    {\r
-        getline(optionFile, line);\r
-        if (line.find("Hidden") != string::npos &&\r
-            line.find("true") != string::npos)\r
-            return false;\r
-    }\r
-    optionFile.close();\r
-\r
-    return true;\r
-}\r
-\r
-void SetStartOnSystemStartup(bool fAutoStart)\r
-{\r
-    if (!fAutoStart)\r
-    {\r
-        unlink(GetAutostartFilePath().native_file_string().c_str());\r
-    }\r
-    else\r
-    {\r
-        boost::filesystem::create_directories(GetAutostartDir());\r
-\r
-        boost::filesystem::ofstream optionFile(GetAutostartFilePath(), ios_base::out|ios_base::trunc);\r
-        if (!optionFile.good())\r
-        {\r
-            wxMessageBox(_("Cannot write autostart/bitcoin.desktop file"), "Bitcoin");\r
-            return;\r
-        }\r
-        // Write a bitcoin.desktop file to the autostart directory:\r
-        char pszExePath[MAX_PATH+1];\r
-        memset(pszExePath, 0, sizeof(pszExePath));\r
-        readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1);\r
-        optionFile << "[Desktop Entry]\n";\r
-        optionFile << "Type=Application\n";\r
-        optionFile << "Name=Bitcoin\n";\r
-        optionFile << "Exec=" << pszExePath << "\n";\r
-        optionFile << "Terminal=false\n";\r
-        optionFile << "Hidden=false\n";\r
-        optionFile.close();\r
-    }\r
-}\r
-#else\r
-\r
-// TODO: OSX startup stuff; see:\r
-// http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/CustomLogin.html\r
-\r
-bool GetStartOnSystemStartup() { return false; }\r
-void SetStartOnSystemStartup(bool fAutoStart) { }\r
-\r
-#endif\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-//////////////////////////////////////////////////////////////////////////////\r
-//\r
-// CMyApp\r
-//\r
-\r
-// Define a new application\r
-class CMyApp : public wxApp\r
-{\r
-public:\r
-    wxLocale m_locale;\r
-\r
-    CMyApp(){};\r
-    ~CMyApp(){};\r
-    bool OnInit();\r
-    bool OnInit2();\r
-    int OnExit();\r
-\r
-    // Hook Initialize so we can start without GUI\r
-    virtual bool Initialize(int& argc, wxChar** argv);\r
-\r
-    // 2nd-level exception handling: we get all the exceptions occurring in any\r
-    // event handler here\r
-    virtual bool OnExceptionInMainLoop();\r
-\r
-    // 3rd, and final, level exception handling: whenever an unhandled\r
-    // exception is caught, this function is called\r
-    virtual void OnUnhandledException();\r
-\r
-    // and now for something different: this function is called in case of a\r
-    // crash (e.g. dereferencing null pointer, division by 0, ...)\r
-    virtual void OnFatalException();\r
-};\r
-\r
-IMPLEMENT_APP(CMyApp)\r
-\r
-bool CMyApp::Initialize(int& argc, wxChar** argv)\r
-{\r
-    if (argc > 1 && argv[1][0] != '-' && (!fWindows || argv[1][0] != '/') &&\r
-        wxString(argv[1]) != "start")\r
-    {\r
-        fCommandLine = true;\r
-    }\r
-    else if (!fGUI)\r
-    {\r
-        fDaemon = true;\r
-    }\r
-    else\r
-    {\r
-        // wxApp::Initialize will remove environment-specific parameters,\r
-        // so it's too early to call ParseParameters yet\r
-        for (int i = 1; i < argc; i++)\r
-        {\r
-            wxString str = argv[i];\r
-            #ifdef __WXMSW__\r
-            if (str.size() >= 1 && str[0] == '/')\r
-                str[0] = '-';\r
-            char pszLower[MAX_PATH];\r
-            strlcpy(pszLower, str.c_str(), sizeof(pszLower));\r
-            strlwr(pszLower);\r
-            str = pszLower;\r
-            #endif\r
-            // haven't decided which argument to use for this yet\r
-            if (str == "-daemon" || str == "-d" || str == "start")\r
-                fDaemon = true;\r
-        }\r
-    }\r
-\r
-#ifdef __WXGTK__\r
-    if (fDaemon || fCommandLine)\r
-    {\r
-        // Call the original Initialize while suppressing error messages\r
-        // and ignoring failure.  If unable to initialize GTK, it fails\r
-        // near the end so hopefully the last few things don't matter.\r
-        {\r
-            wxLogNull logNo;\r
-            wxApp::Initialize(argc, argv);\r
-        }\r
-\r
-        if (fDaemon)\r
-        {\r
-            // Daemonize\r
-            pid_t pid = fork();\r
-            if (pid < 0)\r
-            {\r
-                fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);\r
-                return false;\r
-            }\r
-            if (pid > 0)\r
-                pthread_exit((void*)0);\r
-        }\r
-\r
-        return true;\r
-    }\r
-#endif\r
-\r
-    return wxApp::Initialize(argc, argv);\r
-}\r
-\r
-bool CMyApp::OnInit()\r
-{\r
-    bool fRet = false;\r
-    try\r
-    {\r
-        fRet = OnInit2();\r
-    }\r
-    catch (std::exception& e) {\r
-        PrintException(&e, "OnInit()");\r
-    } catch (...) {\r
-        PrintException(NULL, "OnInit()");\r
-    }\r
-    if (!fRet)\r
-        Shutdown(NULL);\r
-    return fRet;\r
-}\r
-\r
-extern int g_isPainting;\r
-\r
-bool CMyApp::OnInit2()\r
-{\r
-#ifdef _MSC_VER\r
-    // Turn off microsoft heap dump noise\r
-    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);\r
-    _CrtSetReportFile(_CRT_WARN, CreateFileA("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));\r
-#endif\r
-#if _MSC_VER >= 1400\r
-    // Disable confusing "helpful" text message on abort, ctrl-c\r
-    _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);\r
-#endif\r
-#if defined(__WXMSW__) && defined(__WXDEBUG__) && wxUSE_GUI\r
-    // Disable malfunctioning wxWidgets debug assertion\r
-    g_isPainting = 10000;\r
-#endif\r
-#if wxUSE_GUI\r
-    wxImage::AddHandler(new wxPNGHandler);\r
-#endif\r
-#if defined(__WXMSW__ ) || defined(__WXMAC__)\r
-    SetAppName("Bitcoin");\r
-#else\r
-    SetAppName("bitcoin");\r
-#endif\r
-#ifndef __WXMSW__\r
-    umask(077);\r
-#endif\r
-#ifdef __WXMSW__\r
-#if wxUSE_UNICODE\r
-    // Hack to set wxConvLibc codepage to UTF-8 on Windows,\r
-    // may break if wxMBConv_win32 implementation in strconv.cpp changes.\r
-    class wxMBConv_win32 : public wxMBConv\r
-    {\r
-    public:\r
-        long m_CodePage;\r
-        size_t m_minMBCharWidth;\r
-    };\r
-    if (((wxMBConv_win32*)&wxConvLibc)->m_CodePage == CP_ACP)\r
-        ((wxMBConv_win32*)&wxConvLibc)->m_CodePage = CP_UTF8;\r
-#endif\r
-#endif\r
-\r
-    // Load locale/<lang>/LC_MESSAGES/bitcoin.mo language file\r
-    m_locale.Init(wxLANGUAGE_DEFAULT, 0);\r
-    m_locale.AddCatalogLookupPathPrefix("locale");\r
-    if (!fWindows)\r
-    {\r
-        m_locale.AddCatalogLookupPathPrefix("/usr/share/locale");\r
-        m_locale.AddCatalogLookupPathPrefix("/usr/local/share/locale");\r
-    }\r
-    m_locale.AddCatalog("wxstd"); // wxWidgets standard translations, if any\r
-    m_locale.AddCatalog("bitcoin");\r
-\r
-    //\r
-    // Parameters\r
-    //\r
-    if (fCommandLine)\r
-    {\r
-        int ret = CommandLineRPC(argc, argv);\r
-        exit(ret);\r
-    }\r
-\r
-    ParseParameters(argc, argv);\r
-    if (mapArgs.count("-?") || mapArgs.count("--help"))\r
-    {\r
-        wxString strUsage = string() +\r
-          _("Usage:") + "\t\t\t\t\t\t\t\t\t\t\n" +\r
-            "  bitcoin [options]       \t" + "\n" +\r
-            "  bitcoin [command]       \t" + _("Send command to bitcoin running with -server or -daemon\n") +\r
-            "  bitcoin [command] -?    \t" + _("Get help for a command\n") +\r
-            "  bitcoin help            \t" + _("List commands\n") +\r
-          _("Options:\n") +\r
-            "  -gen            \t  " + _("Generate coins\n") +\r
-            "  -gen=0          \t  " + _("Don't generate coins\n") +\r
-            "  -min            \t  " + _("Start minimized\n") +\r
-            "  -datadir=<dir>  \t  " + _("Specify data directory\n") +\r
-            "  -proxy=<ip:port>\t  " + _("Connect through socks4 proxy\n") +\r
-            "  -addnode=<ip>   \t  " + _("Add a node to connect to\n") +\r
-            "  -connect=<ip>   \t  " + _("Connect only to the specified node\n") +\r
-            "  -server         \t  " + _("Accept command line and JSON-RPC commands\n") +\r
-            "  -daemon         \t  " + _("Run in the background as a daemon and accept commands\n") +\r
-            "  -?              \t  " + _("This help message\n");\r
-\r
-#if defined(__WXMSW__) && wxUSE_GUI\r
-        // Tabs make the columns line up in the message box\r
-        wxMessageBox(strUsage, "Bitcoin", wxOK);\r
-#else\r
-        // Remove tabs\r
-        strUsage.Replace("\t", "");\r
-        fprintf(stderr, "%s", ((string)strUsage).c_str());\r
-#endif\r
-        return false;\r
-    }\r
-\r
-    if (mapArgs.count("-datadir"))\r
-        strlcpy(pszSetDataDir, mapArgs["-datadir"].c_str(), sizeof(pszSetDataDir));\r
-\r
-    if (mapArgs.count("-debug"))\r
-        fDebug = true;\r
-\r
-    if (mapArgs.count("-printtodebugger"))\r
-        fPrintToDebugger = true;\r
-\r
-    if (!fDebug && !pszSetDataDir[0])\r
-        ShrinkDebugFile();\r
-    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");\r
-    printf("Bitcoin version %d.%d.%d%s beta, OS version %s\n", VERSION/10000, (VERSION/100)%100, VERSION%100, pszSubVer, ((string)wxGetOsDescription()).c_str());\r
-    printf("System default language is %d %s\n", m_locale.GetSystemLanguage(), ((string)m_locale.GetSysName()).c_str());\r
-    printf("Language file %s (%s)\n", (string("locale/") + (string)m_locale.GetCanonicalName() + "/LC_MESSAGES/bitcoin.mo").c_str(), ((string)m_locale.GetLocale()).c_str());\r
-    printf("Default data directory %s\n", GetDefaultDataDir().c_str());\r
-\r
-    if (mapArgs.count("-loadblockindextest"))\r
-    {\r
-        CTxDB txdb("r");\r
-        txdb.LoadBlockIndex();\r
-        PrintBlockTree();\r
-        return false;\r
-    }\r
-\r
-    //\r
-    // Limit to single instance per user\r
-    // Required to protect the database files if we're going to keep deleting log.*\r
-    //\r
-#ifdef __WXMSW__\r
-    // todo: wxSingleInstanceChecker wasn't working on Linux, never deleted its lock file\r
-    //  maybe should go by whether successfully bind port 8333 instead\r
-    wxString strMutexName = wxString("bitcoin_running.") + getenv("HOMEPATH");\r
-    for (int i = 0; i < strMutexName.size(); i++)\r
-        if (!isalnum(strMutexName[i]))\r
-            strMutexName[i] = '.';\r
-    wxSingleInstanceChecker* psingleinstancechecker = new wxSingleInstanceChecker(strMutexName);\r
-    if (psingleinstancechecker->IsAnotherRunning())\r
-    {\r
-        printf("Existing instance found\n");\r
-        unsigned int nStart = GetTime();\r
-        loop\r
-        {\r
-            // TODO: find out how to do this in Linux, or replace with wxWidgets commands\r
-            // Show the previous instance and exit\r
-            HWND hwndPrev = FindWindowA("wxWindowClassNR", "Bitcoin");\r
-            if (hwndPrev)\r
-            {\r
-                if (IsIconic(hwndPrev))\r
-                    ShowWindow(hwndPrev, SW_RESTORE);\r
-                SetForegroundWindow(hwndPrev);\r
-                return false;\r
-            }\r
-\r
-            if (GetTime() > nStart + 60)\r
-                return false;\r
-\r
-            // Resume this instance if the other exits\r
-            delete psingleinstancechecker;\r
-            Sleep(1000);\r
-            psingleinstancechecker = new wxSingleInstanceChecker(strMutexName);\r
-            if (!psingleinstancechecker->IsAnotherRunning())\r
-                break;\r
-        }\r
-    }\r
-#endif\r
-\r
-    // Bind to the port early so we can tell if another instance is already running.\r
-    // This is a backup to wxSingleInstanceChecker, which doesn't work on Linux.\r
-    string strErrors;\r
-    if (!BindListenPort(strErrors))\r
-    {\r
-        wxMessageBox(strErrors, "Bitcoin");\r
-        return false;\r
-    }\r
-\r
-    //\r
-    // Load data files\r
-    //\r
-    if (fDaemon)\r
-        fprintf(stdout, "bitcoin server starting\n");\r
-    strErrors = "";\r
-    int64 nStart;\r
-\r
-    printf("Loading addresses...\n");\r
-    nStart = GetTimeMillis();\r
-    if (!LoadAddresses())\r
-        strErrors += _("Error loading addr.dat      \n");\r
-    printf(" addresses   %15"PRI64d"ms\n", GetTimeMillis() - nStart);\r
-\r
-    printf("Loading block index...\n");\r
-    nStart = GetTimeMillis();\r
-    if (!LoadBlockIndex())\r
-        strErrors += _("Error loading blkindex.dat      \n");\r
-    printf(" block index %15"PRI64d"ms\n", GetTimeMillis() - nStart);\r
-\r
-    printf("Loading wallet...\n");\r
-    nStart = GetTimeMillis();\r
-    bool fFirstRun;\r
-    if (!LoadWallet(fFirstRun))\r
-        strErrors += _("Error loading wallet.dat      \n");\r
-    printf(" wallet      %15"PRI64d"ms\n", GetTimeMillis() - nStart);\r
-\r
-    printf("Done loading\n");\r
-\r
-        //// debug print\r
-        printf("mapBlockIndex.size() = %d\n",   mapBlockIndex.size());\r
-        printf("nBestHeight = %d\n",            nBestHeight);\r
-        printf("mapKeys.size() = %d\n",         mapKeys.size());\r
-        printf("mapPubKeys.size() = %d\n",      mapPubKeys.size());\r
-        printf("mapWallet.size() = %d\n",       mapWallet.size());\r
-        printf("mapAddressBook.size() = %d\n",  mapAddressBook.size());\r
-\r
-    if (!strErrors.empty())\r
-    {\r
-        wxMessageBox(strErrors, "Bitcoin");\r
-        return false;\r
-    }\r
-\r
-    // Add wallet transactions that aren't already in a block to mapTransactions\r
-    ReacceptWalletTransactions();\r
-\r
-    //\r
-    // Parameters\r
-    //\r
-    if (mapArgs.count("-printblockindex") || mapArgs.count("-printblocktree"))\r
-    {\r
-        PrintBlockTree();\r
-        return false;\r
-    }\r
-\r
-    if (mapArgs.count("-printblock"))\r
-    {\r
-        string strMatch = mapArgs["-printblock"];\r
-        int nFound = 0;\r
-        for (map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.begin(); mi != mapBlockIndex.end(); ++mi)\r
-        {\r
-            uint256 hash = (*mi).first;\r
-            if (strncmp(hash.ToString().c_str(), strMatch.c_str(), strMatch.size()) == 0)\r
-            {\r
-                CBlockIndex* pindex = (*mi).second;\r
-                CBlock block;\r
-                block.ReadFromDisk(pindex);\r
-                block.BuildMerkleTree();\r
-                block.print();\r
-                printf("\n");\r
-                nFound++;\r
-            }\r
-        }\r
-        if (nFound == 0)\r
-            printf("No blocks matching %s were found\n", strMatch.c_str());\r
-        return false;\r
-    }\r
-\r
-    if (mapArgs.count("-gen"))\r
-    {\r
-        if (mapArgs["-gen"].empty())\r
-            fGenerateBitcoins = true;\r
-        else\r
-            fGenerateBitcoins = (atoi(mapArgs["-gen"].c_str()) != 0);\r
-    }\r
-\r
-    if (mapArgs.count("-proxy"))\r
-    {\r
-        fUseProxy = true;\r
-        addrProxy = CAddress(mapArgs["-proxy"]);\r
-        if (!addrProxy.IsValid())\r
-        {\r
-            wxMessageBox(_("Invalid -proxy address"), "Bitcoin");\r
-            return false;\r
-        }\r
-    }\r
-\r
-    if (mapArgs.count("-addnode"))\r
-    {\r
-        foreach(string strAddr, mapMultiArgs["-addnode"])\r
-        {\r
-            CAddress addr(strAddr, NODE_NETWORK);\r
-            addr.nTime = 0; // so it won't relay unless successfully connected\r
-            if (addr.IsValid())\r
-                AddAddress(addr);\r
-        }\r
-    }\r
-\r
-    //\r
-    // Create the main window and start the node\r
-    //\r
-    if (!fDaemon)\r
-        CreateMainWindow();\r
-\r
-    if (!CheckDiskSpace())\r
-        return false;\r
-\r
-    RandAddSeedPerfmon();\r
-\r
-    if (!CreateThread(StartNode, NULL))\r
-        wxMessageBox("Error: CreateThread(StartNode) failed", "Bitcoin");\r
-\r
-    if (mapArgs.count("-server") || fDaemon)\r
-        CreateThread(ThreadRPCServer, NULL);\r
-\r
-    if (fFirstRun)\r
-        SetStartOnSystemStartup(true);\r
-\r
-    return true;\r
-}\r
-\r
-int CMyApp::OnExit()\r
-{\r
-    Shutdown(NULL);\r
-    return wxApp::OnExit();\r
-}\r
-\r
-bool CMyApp::OnExceptionInMainLoop()\r
-{\r
-    try\r
-    {\r
-        throw;\r
-    }\r
-    catch (std::exception& e)\r
-    {\r
-        PrintException(&e, "CMyApp::OnExceptionInMainLoop()");\r
-        wxLogWarning("Exception %s %s", typeid(e).name(), e.what());\r
-        Sleep(1000);\r
-        throw;\r
-    }\r
-    catch (...)\r
-    {\r
-        PrintException(NULL, "CMyApp::OnExceptionInMainLoop()");\r
-        wxLogWarning("Unknown exception");\r
-        Sleep(1000);\r
-        throw;\r
-    }\r
-    return true;\r
-}\r
-\r
-void CMyApp::OnUnhandledException()\r
-{\r
-    // this shows how we may let some exception propagate uncaught\r
-    try\r
-    {\r
-        throw;\r
-    }\r
-    catch (std::exception& e)\r
-    {\r
-        PrintException(&e, "CMyApp::OnUnhandledException()");\r
-        wxLogWarning("Exception %s %s", typeid(e).name(), e.what());\r
-        Sleep(1000);\r
-        throw;\r
-    }\r
-    catch (...)\r
-    {\r
-        PrintException(NULL, "CMyApp::OnUnhandledException()");\r
-        wxLogWarning("Unknown exception");\r
-        Sleep(1000);\r
-        throw;\r
-    }\r
-}\r
-\r
-void CMyApp::OnFatalException()\r
-{\r
-    wxMessageBox(_("Program has crashed and will terminate.  "), "Bitcoin", wxOK | wxICON_ERROR);\r
-}\r
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Distributed under the MIT/X11 software license, see the accompanying
+// file license.txt or http://www.opensource.org/licenses/mit-license.php.
+
+#include "headers.h"
+
+
+
+
+void ExitTimeout(void* parg)
+{
+#ifdef __WXMSW__
+    Sleep(5000);
+    ExitProcess(0);
+#endif
+}
+
+void Shutdown(void* parg)
+{
+    static CCriticalSection cs_Shutdown;
+    static bool fTaken;
+    bool fFirstThread;
+    CRITICAL_BLOCK(cs_Shutdown)
+    {
+        fFirstThread = !fTaken;
+        fTaken = true;
+    }
+    static bool fExit;
+    if (fFirstThread)
+    {
+        fShutdown = true;
+        nTransactionsUpdated++;
+        DBFlush(false);
+        StopNode();
+        DBFlush(true);
+        CreateThread(ExitTimeout, NULL);
+        Sleep(50);
+        printf("Bitcoin exiting\n\n");
+        fExit = true;
+        exit(0);
+    }
+    else
+    {
+        while (!fExit)
+            Sleep(500);
+        Sleep(100);
+        ExitThread(0);
+    }
+}
+
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// Startup folder
+//
+
+#ifdef __WXMSW__
+string StartupShortcutPath()
+{
+    return MyGetSpecialFolderPath(CSIDL_STARTUP, true) + "\\Bitcoin.lnk";
+}
+
+bool GetStartOnSystemStartup()
+{
+    return filesystem::exists(StartupShortcutPath().c_str());
+}
+
+void SetStartOnSystemStartup(bool fAutoStart)
+{
+    // If the shortcut exists already, remove it for updating
+    remove(StartupShortcutPath().c_str());
+
+    if (fAutoStart)
+    {
+        CoInitialize(NULL);
+
+        // Get a pointer to the IShellLink interface.
+        IShellLink* psl = NULL;
+        HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL,
+                                CLSCTX_INPROC_SERVER, IID_IShellLink,
+                                reinterpret_cast<void**>(&psl));
+
+        if (SUCCEEDED(hres))
+        {
+            // Get the current executable path
+            TCHAR pszExePath[MAX_PATH];
+            GetModuleFileName(NULL, pszExePath, sizeof(pszExePath));
+
+            // Set the path to the shortcut target
+            psl->SetPath(pszExePath);
+            PathRemoveFileSpec(pszExePath);
+            psl->SetWorkingDirectory(pszExePath);
+            psl->SetShowCmd(SW_SHOWMINNOACTIVE);
+
+            // Query IShellLink for the IPersistFile interface for
+            // saving the shortcut in persistent storage.
+            IPersistFile* ppf = NULL;
+            hres = psl->QueryInterface(IID_IPersistFile,
+                                       reinterpret_cast<void**>(&ppf));
+            if (SUCCEEDED(hres))
+            {
+                WCHAR pwsz[MAX_PATH];
+                // Ensure that the string is ANSI.
+                MultiByteToWideChar(CP_ACP, 0, StartupShortcutPath().c_str(), -1, pwsz, MAX_PATH);
+                // Save the link by calling IPersistFile::Save.
+                hres = ppf->Save(pwsz, TRUE);
+                ppf->Release();
+            }
+            psl->Release();
+        }
+        CoUninitialize();
+    }
+}
+
+#elif defined(__WXGTK__)
+
+//
+// Follow the Desktop Application Autostart Spec:
+//  http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
+//
+
+boost::filesystem::path GetAutostartDir()
+{
+    namespace fs = boost::filesystem;
+
+    char* pszConfigHome = getenv("XDG_CONFIG_HOME");
+    if (pszConfigHome) return fs::path(pszConfigHome) / fs::path("autostart");
+    char* pszHome = getenv("HOME");
+    if (pszHome) return fs::path(pszHome) / fs::path(".config/autostart");
+    return fs::path();
+}
+
+boost::filesystem::path GetAutostartFilePath()
+{
+    return GetAutostartDir() / boost::filesystem::path("bitcoin.desktop");
+}
+
+bool GetStartOnSystemStartup()
+{
+    boost::filesystem::ifstream optionFile(GetAutostartFilePath());
+    if (!optionFile.good())
+        return false;
+    // Scan through file for "Hidden=true":
+    string line;
+    while (!optionFile.eof())
+    {
+        getline(optionFile, line);
+        if (line.find("Hidden") != string::npos &&
+            line.find("true") != string::npos)
+            return false;
+    }
+    optionFile.close();
+
+    return true;
+}
+
+void SetStartOnSystemStartup(bool fAutoStart)
+{
+    if (!fAutoStart)
+    {
+        unlink(GetAutostartFilePath().native_file_string().c_str());
+    }
+    else
+    {
+        boost::filesystem::create_directories(GetAutostartDir());
+
+        boost::filesystem::ofstream optionFile(GetAutostartFilePath(), ios_base::out|ios_base::trunc);
+        if (!optionFile.good())
+        {
+            wxMessageBox(_("Cannot write autostart/bitcoin.desktop file"), "Bitcoin");
+            return;
+        }
+        // Write a bitcoin.desktop file to the autostart directory:
+        char pszExePath[MAX_PATH+1];
+        memset(pszExePath, 0, sizeof(pszExePath));
+        readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1);
+        optionFile << "[Desktop Entry]\n";
+        optionFile << "Type=Application\n";
+        optionFile << "Name=Bitcoin\n";
+        optionFile << "Exec=" << pszExePath << "\n";
+        optionFile << "Terminal=false\n";
+        optionFile << "Hidden=false\n";
+        optionFile.close();
+    }
+}
+#else
+
+// TODO: OSX startup stuff; see:
+// http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/CustomLogin.html
+
+bool GetStartOnSystemStartup() { return false; }
+void SetStartOnSystemStartup(bool fAutoStart) { }
+
+#endif
+
+
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// CMyApp
+//
+
+// Define a new application
+class CMyApp : public wxApp
+{
+public:
+    wxLocale m_locale;
+
+    CMyApp(){};
+    ~CMyApp(){};
+    bool OnInit();
+    bool OnInit2();
+    int OnExit();
+
+    // Hook Initialize so we can start without GUI
+    virtual bool Initialize(int& argc, wxChar** argv);
+
+    // 2nd-level exception handling: we get all the exceptions occurring in any
+    // event handler here
+    virtual bool OnExceptionInMainLoop();
+
+    // 3rd, and final, level exception handling: whenever an unhandled
+    // exception is caught, this function is called
+    virtual void OnUnhandledException();
+
+    // and now for something different: this function is called in case of a
+    // crash (e.g. dereferencing null pointer, division by 0, ...)
+    virtual void OnFatalException();
+};
+
+IMPLEMENT_APP(CMyApp)
+
+bool CMyApp::Initialize(int& argc, wxChar** argv)
+{
+    if (argc > 1 && argv[1][0] != '-' && (!fWindows || argv[1][0] != '/') &&
+        wxString(argv[1]) != "start")
+    {
+        fCommandLine = true;
+    }
+    else if (!fGUI)
+    {
+        fDaemon = true;
+    }
+    else
+    {
+        // wxApp::Initialize will remove environment-specific parameters,
+        // so it's too early to call ParseParameters yet
+        for (int i = 1; i < argc; i++)
+        {
+            wxString str = argv[i];
+            #ifdef __WXMSW__
+            if (str.size() >= 1 && str[0] == '/')
+                str[0] = '-';
+            char pszLower[MAX_PATH];
+            strlcpy(pszLower, str.c_str(), sizeof(pszLower));
+            strlwr(pszLower);
+            str = pszLower;
+            #endif
+            // haven't decided which argument to use for this yet
+            if (str == "-daemon" || str == "-d" || str == "start")
+                fDaemon = true;
+        }
+    }
+
+#ifdef __WXGTK__
+    if (fDaemon || fCommandLine)
+    {
+        // Call the original Initialize while suppressing error messages
+        // and ignoring failure.  If unable to initialize GTK, it fails
+        // near the end so hopefully the last few things don't matter.
+        {
+            wxLogNull logNo;
+            wxApp::Initialize(argc, argv);
+        }
+
+        if (fDaemon)
+        {
+            // Daemonize
+            pid_t pid = fork();
+            if (pid < 0)
+            {
+                fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);
+                return false;
+            }
+            if (pid > 0)
+                pthread_exit((void*)0);
+        }
+
+        return true;
+    }
+#endif
+
+    return wxApp::Initialize(argc, argv);
+}
+
+bool CMyApp::OnInit()
+{
+    bool fRet = false;
+    try
+    {
+        fRet = OnInit2();
+    }
+    catch (std::exception& e) {
+        PrintException(&e, "OnInit()");
+    } catch (...) {
+        PrintException(NULL, "OnInit()");
+    }
+    if (!fRet)
+        Shutdown(NULL);
+    return fRet;
+}
+
+extern int g_isPainting;
+
+bool CMyApp::OnInit2()
+{
+#ifdef _MSC_VER
+    // Turn off microsoft heap dump noise
+    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
+    _CrtSetReportFile(_CRT_WARN, CreateFileA("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));
+#endif
+#if _MSC_VER >= 1400
+    // Disable confusing "helpful" text message on abort, ctrl-c
+    _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+#endif
+#if defined(__WXMSW__) && defined(__WXDEBUG__) && wxUSE_GUI
+    // Disable malfunctioning wxWidgets debug assertion
+    g_isPainting = 10000;
+#endif
+#if wxUSE_GUI
+    wxImage::AddHandler(new wxPNGHandler);
+#endif
+#if defined(__WXMSW__ ) || defined(__WXMAC__)
+    SetAppName("Bitcoin");
+#else
+    SetAppName("bitcoin");
+#endif
+#ifndef __WXMSW__
+    umask(077);
+#endif
+#ifdef __WXMSW__
+#if wxUSE_UNICODE
+    // Hack to set wxConvLibc codepage to UTF-8 on Windows,
+    // may break if wxMBConv_win32 implementation in strconv.cpp changes.
+    class wxMBConv_win32 : public wxMBConv
+    {
+    public:
+        long m_CodePage;
+        size_t m_minMBCharWidth;
+    };
+    if (((wxMBConv_win32*)&wxConvLibc)->m_CodePage == CP_ACP)
+        ((wxMBConv_win32*)&wxConvLibc)->m_CodePage = CP_UTF8;
+#endif
+#endif
+
+    // Load locale/<lang>/LC_MESSAGES/bitcoin.mo language file
+    m_locale.Init(wxLANGUAGE_DEFAULT, 0);
+    m_locale.AddCatalogLookupPathPrefix("locale");
+    if (!fWindows)
+    {
+        m_locale.AddCatalogLookupPathPrefix("/usr/share/locale");
+        m_locale.AddCatalogLookupPathPrefix("/usr/local/share/locale");
+    }
+    m_locale.AddCatalog("wxstd"); // wxWidgets standard translations, if any
+    m_locale.AddCatalog("bitcoin");
+
+    //
+    // Parameters
+    //
+    if (fCommandLine)
+    {
+        int ret = CommandLineRPC(argc, argv);
+        exit(ret);
+    }
+
+    ParseParameters(argc, argv);
+    if (mapArgs.count("-?") || mapArgs.count("--help"))
+    {
+        wxString strUsage = string() +
+          _("Usage:") + "\t\t\t\t\t\t\t\t\t\t\n" +
+            "  bitcoin [options]       \t" + "\n" +
+            "  bitcoin [command]       \t" + _("Send command to bitcoin running with -server or -daemon\n") +
+            "  bitcoin [command] -?    \t" + _("Get help for a command\n") +
+            "  bitcoin help            \t" + _("List commands\n") +
+          _("Options:\n") +
+            "  -gen            \t  " + _("Generate coins\n") +
+            "  -gen=0          \t  " + _("Don't generate coins\n") +
+            "  -min            \t  " + _("Start minimized\n") +
+            "  -datadir=<dir>  \t  " + _("Specify data directory\n") +
+            "  -proxy=<ip:port>\t  " + _("Connect through socks4 proxy\n") +
+            "  -addnode=<ip>   \t  " + _("Add a node to connect to\n") +
+            "  -connect=<ip>   \t  " + _("Connect only to the specified node\n") +
+            "  -server         \t  " + _("Accept command line and JSON-RPC commands\n") +
+            "  -daemon         \t  " + _("Run in the background as a daemon and accept commands\n") +
+            "  -?              \t  " + _("This help message\n");
+
+#if defined(__WXMSW__) && wxUSE_GUI
+        // Tabs make the columns line up in the message box
+        wxMessageBox(strUsage, "Bitcoin", wxOK);
+#else
+        // Remove tabs
+        strUsage.Replace("\t", "");
+        fprintf(stderr, "%s", ((string)strUsage).c_str());
+#endif
+        return false;
+    }
+
+    if (mapArgs.count("-datadir"))
+        strlcpy(pszSetDataDir, mapArgs["-datadir"].c_str(), sizeof(pszSetDataDir));
+
+    if (mapArgs.count("-debug"))
+        fDebug = true;
+
+    if (mapArgs.count("-printtodebugger"))
+        fPrintToDebugger = true;
+
+    if (!fDebug && !pszSetDataDir[0])
+        ShrinkDebugFile();
+    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
+    printf("Bitcoin version %d.%d.%d%s beta, OS version %s\n", VERSION/10000, (VERSION/100)%100, VERSION%100, pszSubVer, ((string)wxGetOsDescription()).c_str());
+    printf("System default language is %d %s\n", m_locale.GetSystemLanguage(), ((string)m_locale.GetSysName()).c_str());
+    printf("Language file %s (%s)\n", (string("locale/") + (string)m_locale.GetCanonicalName() + "/LC_MESSAGES/bitcoin.mo").c_str(), ((string)m_locale.GetLocale()).c_str());
+    printf("Default data directory %s\n", GetDefaultDataDir().c_str());
+
+    if (mapArgs.count("-loadblockindextest"))
+    {
+        CTxDB txdb("r");
+        txdb.LoadBlockIndex();
+        PrintBlockTree();
+        return false;
+    }
+
+    //
+    // Limit to single instance per user
+    // Required to protect the database files if we're going to keep deleting log.*
+    //
+#ifdef __WXMSW__
+    // todo: wxSingleInstanceChecker wasn't working on Linux, never deleted its lock file
+    //  maybe should go by whether successfully bind port 8333 instead
+    wxString strMutexName = wxString("bitcoin_running.") + getenv("HOMEPATH");
+    for (int i = 0; i < strMutexName.size(); i++)
+        if (!isalnum(strMutexName[i]))
+            strMutexName[i] = '.';
+    wxSingleInstanceChecker* psingleinstancechecker = new wxSingleInstanceChecker(strMutexName);
+    if (psingleinstancechecker->IsAnotherRunning())
+    {
+        printf("Existing instance found\n");
+        unsigned int nStart = GetTime();
+        loop
+        {
+            // TODO: find out how to do this in Linux, or replace with wxWidgets commands
+            // Show the previous instance and exit
+            HWND hwndPrev = FindWindowA("wxWindowClassNR", "Bitcoin");
+            if (hwndPrev)
+            {
+                if (IsIconic(hwndPrev))
+                    ShowWindow(hwndPrev, SW_RESTORE);
+                SetForegroundWindow(hwndPrev);
+                return false;
+            }
+
+            if (GetTime() > nStart + 60)
+                return false;
+
+            // Resume this instance if the other exits
+            delete psingleinstancechecker;
+            Sleep(1000);
+            psingleinstancechecker = new wxSingleInstanceChecker(strMutexName);
+            if (!psingleinstancechecker->IsAnotherRunning())
+                break;
+        }
+    }
+#endif
+
+    // Bind to the port early so we can tell if another instance is already running.
+    // This is a backup to wxSingleInstanceChecker, which doesn't work on Linux.
+    string strErrors;
+    if (!BindListenPort(strErrors))
+    {
+        wxMessageBox(strErrors, "Bitcoin");
+        return false;
+    }
+
+    //
+    // Load data files
+    //
+    if (fDaemon)
+        fprintf(stdout, "bitcoin server starting\n");
+    strErrors = "";
+    int64 nStart;
+
+    printf("Loading addresses...\n");
+    nStart = GetTimeMillis();
+    if (!LoadAddresses())
+        strErrors += _("Error loading addr.dat      \n");
+    printf(" addresses   %15"PRI64d"ms\n", GetTimeMillis() - nStart);
+
+    printf("Loading block index...\n");
+    nStart = GetTimeMillis();
+    if (!LoadBlockIndex())
+        strErrors += _("Error loading blkindex.dat      \n");
+    printf(" block index %15"PRI64d"ms\n", GetTimeMillis() - nStart);
+
+    printf("Loading wallet...\n");
+    nStart = GetTimeMillis();
+    bool fFirstRun;
+    if (!LoadWallet(fFirstRun))
+        strErrors += _("Error loading wallet.dat      \n");
+    printf(" wallet      %15"PRI64d"ms\n", GetTimeMillis() - nStart);
+
+    printf("Done loading\n");
+
+        //// debug print
+        printf("mapBlockIndex.size() = %d\n",   mapBlockIndex.size());
+        printf("nBestHeight = %d\n",            nBestHeight);
+        printf("mapKeys.size() = %d\n",         mapKeys.size());
+        printf("mapPubKeys.size() = %d\n",      mapPubKeys.size());
+        printf("mapWallet.size() = %d\n",       mapWallet.size());
+        printf("mapAddressBook.size() = %d\n",  mapAddressBook.size());
+
+    if (!strErrors.empty())
+    {
+        wxMessageBox(strErrors, "Bitcoin");
+        return false;
+    }
+
+    // Add wallet transactions that aren't already in a block to mapTransactions
+    ReacceptWalletTransactions();
+
+    //
+    // Parameters
+    //
+    if (mapArgs.count("-printblockindex") || mapArgs.count("-printblocktree"))
+    {
+        PrintBlockTree();
+        return false;
+    }
+
+    if (mapArgs.count("-printblock"))
+    {
+        string strMatch = mapArgs["-printblock"];
+        int nFound = 0;
+        for (map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.begin(); mi != mapBlockIndex.end(); ++mi)
+        {
+            uint256 hash = (*mi).first;
+            if (strncmp(hash.ToString().c_str(), strMatch.c_str(), strMatch.size()) == 0)
+            {
+                CBlockIndex* pindex = (*mi).second;
+                CBlock block;
+                block.ReadFromDisk(pindex);
+                block.BuildMerkleTree();
+                block.print();
+                printf("\n");
+                nFound++;
+            }
+        }
+        if (nFound == 0)
+            printf("No blocks matching %s were found\n", strMatch.c_str());
+        return false;
+    }
+
+    if (mapArgs.count("-gen"))
+    {
+        if (mapArgs["-gen"].empty())
+            fGenerateBitcoins = true;
+        else
+            fGenerateBitcoins = (atoi(mapArgs["-gen"].c_str()) != 0);
+    }
+
+    if (mapArgs.count("-proxy"))
+    {
+        fUseProxy = true;
+        addrProxy = CAddress(mapArgs["-proxy"]);
+        if (!addrProxy.IsValid())
+        {
+            wxMessageBox(_("Invalid -proxy address"), "Bitcoin");
+            return false;
+        }
+    }
+
+    if (mapArgs.count("-addnode"))
+    {
+        foreach(string strAddr, mapMultiArgs["-addnode"])
+        {
+            CAddress addr(strAddr, NODE_NETWORK);
+            addr.nTime = 0; // so it won't relay unless successfully connected
+            if (addr.IsValid())
+                AddAddress(addr);
+        }
+    }
+
+    //
+    // Create the main window and start the node
+    //
+    if (!fDaemon)
+        CreateMainWindow();
+
+    if (!CheckDiskSpace())
+        return false;
+
+    RandAddSeedPerfmon();
+
+    if (!CreateThread(StartNode, NULL))
+        wxMessageBox("Error: CreateThread(StartNode) failed", "Bitcoin");
+
+    if (mapArgs.count("-server") || fDaemon)
+        CreateThread(ThreadRPCServer, NULL);
+
+    if (fFirstRun)
+        SetStartOnSystemStartup(true);
+
+    return true;
+}
+
+int CMyApp::OnExit()
+{
+    Shutdown(NULL);
+    return wxApp::OnExit();
+}
+
+bool CMyApp::OnExceptionInMainLoop()
+{
+    try
+    {
+        throw;
+    }
+    catch (std::exception& e)
+    {
+        PrintException(&e, "CMyApp::OnExceptionInMainLoop()");
+        wxLogWarning("Exception %s %s", typeid(e).name(), e.what());
+        Sleep(1000);
+        throw;
+    }
+    catch (...)
+    {
+        PrintException(NULL, "CMyApp::OnExceptionInMainLoop()");
+        wxLogWarning("Unknown exception");
+        Sleep(1000);
+        throw;
+    }
+    return true;
+}
+
+void CMyApp::OnUnhandledException()
+{
+    // this shows how we may let some exception propagate uncaught
+    try
+    {
+        throw;
+    }
+    catch (std::exception& e)
+    {
+        PrintException(&e, "CMyApp::OnUnhandledException()");
+        wxLogWarning("Exception %s %s", typeid(e).name(), e.what());
+        Sleep(1000);
+        throw;
+    }
+    catch (...)
+    {
+        PrintException(NULL, "CMyApp::OnUnhandledException()");
+        wxLogWarning("Unknown exception");
+        Sleep(1000);
+        throw;
+    }
+}
+
+void CMyApp::OnFatalException()
+{
+    wxMessageBox(_("Program has crashed and will terminate.  "), "Bitcoin", wxOK | wxICON_ERROR);
+}
This page took 0.086813 seconds and 4 git commands to generate.