diff --git a/headers.h b/headers.h index 73b09ed57..b53de8245 100644 --- a/headers.h +++ b/headers.h @@ -59,6 +59,10 @@ #include #include #include +#include +#include +#include +#include #ifdef __WXMSW__ #include diff --git a/init.cpp b/init.cpp index b97a2d0c7..4660ccd3b 100644 --- a/init.cpp +++ b/init.cpp @@ -4,6 +4,8 @@ #include "headers.h" +extern string GetDefaultDataDir(); /// todo: delete this later, just used by debug test + @@ -59,40 +61,6 @@ void Shutdown(void* parg) // #ifdef __WXMSW__ -typedef WINSHELLAPI BOOL (WINAPI *PSHGETSPECIALFOLDERPATHA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate); - -string MyGetSpecialFolderPath(int nFolder, bool fCreate) -{ - char pszPath[MAX_PATH+100] = ""; - - // SHGetSpecialFolderPath is not usually available on NT 4.0 - HMODULE hShell32 = LoadLibraryA("shell32.dll"); - if (hShell32) - { - PSHGETSPECIALFOLDERPATHA pSHGetSpecialFolderPath = - (PSHGETSPECIALFOLDERPATHA)GetProcAddress(hShell32, "SHGetSpecialFolderPathA"); - if (pSHGetSpecialFolderPath) - (*pSHGetSpecialFolderPath)(NULL, pszPath, nFolder, fCreate); - FreeModule(hShell32); - } - - // Backup option - if (pszPath[0] == '\0') - { - if (nFolder == CSIDL_STARTUP) - { - strcpy(pszPath, getenv("USERPROFILE")); - strcat(pszPath, "\\Start Menu\\Programs\\Startup"); - } - else if (nFolder == CSIDL_APPDATA) - { - strcpy(pszPath, getenv("APPDATA")); - } - } - - return pszPath; -} - string StartupShortcutPath() { return MyGetSpecialFolderPath(CSIDL_STARTUP, true) + "\\Bitcoin.lnk"; @@ -100,7 +68,7 @@ string StartupShortcutPath() bool GetStartOnSystemStartup() { - return wxFileExists(StartupShortcutPath()); + return filesystem::exists(StartupShortcutPath().c_str()); } void SetStartOnSystemStartup(bool fAutoStart) @@ -166,7 +134,7 @@ void SetStartOnSystemStartup(bool fAutoStart) { } // // Define a new application -class CMyApp: public wxApp +class CMyApp : public wxApp { public: wxLocale m_locale; @@ -216,7 +184,10 @@ bool CMyApp::Initialize(int& argc, wxChar** argv) #ifdef __WXMSW__ if (str.size() >= 1 && str[0] == '/') str[0] = '-'; - str = str.MakeLower(); + 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") @@ -356,18 +327,14 @@ bool CMyApp::OnInit2() " -daemon \t " + _("Run in the background as a daemon and accept commands\n") + " -? \t " + _("This help message\n"); - - if (fWindows && fGUI) - { - // 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()); - } +#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; } @@ -387,6 +354,15 @@ bool CMyApp::OnInit2() 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()); + /// debug - for now, just watching if these match + if (pszSetDataDir[0] == 0) + { + if (GetDefaultDataDir() != GetDataDir()) + printf("**** GetDefaultDataDir() %s != %s\n", GetDefaultDataDir().c_str(), GetDataDir().c_str()); + else + printf("OK GetDefaultDataDir() %s == %s\n", GetDefaultDataDir().c_str(), GetDataDir().c_str()); + } + if (mapArgs.count("-loadblockindextest")) { CTxDB txdb("r"); diff --git a/locale/de/LC_MESSAGES/bitcoin.mo b/locale/de/LC_MESSAGES/bitcoin.mo index e6c860eec..d53b22f7b 100644 Binary files a/locale/de/LC_MESSAGES/bitcoin.mo and b/locale/de/LC_MESSAGES/bitcoin.mo differ diff --git a/locale/de/LC_MESSAGES/bitcoin.po b/locale/de/LC_MESSAGES/bitcoin.po index fa3b8a4c1..9d1b6b08c 100644 --- a/locale/de/LC_MESSAGES/bitcoin.po +++ b/locale/de/LC_MESSAGES/bitcoin.po @@ -692,6 +692,8 @@ msgstr "Version" msgid "" "Copyright (c) 2009-2010 Satoshi Nakamoto.\n" "\n" +"This is experimental software.\n" +"\n" "Distributed under the MIT/X11 software license, see the accompanying file \n" "license.txt or http://www.opensource.org/licenses/mit-license.php.\n" "\n" @@ -701,6 +703,8 @@ msgid "" msgstr "" "Copyright (c) 2009-2010 Satoshi Nakamoto.\n" "\n" +"Dies ist experimentelle Software.\n" +"\n" "Lizensiert unter der MIT/X11 Software-Lizenz. Beachten Sie die beiliegende\n" "Datei license.txt oder http://www.opensource.org/licenses/mit-license.php.\n" "\n" diff --git a/locale/it/LC_MESSAGES/bitcoin.mo b/locale/it/LC_MESSAGES/bitcoin.mo index b3160d135..dc7b94edf 100644 Binary files a/locale/it/LC_MESSAGES/bitcoin.mo and b/locale/it/LC_MESSAGES/bitcoin.mo differ diff --git a/locale/it/LC_MESSAGES/bitcoin.po b/locale/it/LC_MESSAGES/bitcoin.po index 6d6e10f4c..7a267079f 100644 --- a/locale/it/LC_MESSAGES/bitcoin.po +++ b/locale/it/LC_MESSAGES/bitcoin.po @@ -690,6 +690,8 @@ msgstr "versione" msgid "" "Copyright (c) 2009-2010 Satoshi Nakamoto.\n" "\n" +"This is experimental software.\n" +"\n" "Distributed under the MIT/X11 software license, see the accompanying file \n" "license.txt or http://www.opensource.org/licenses/mit-license.php.\n" "\n" @@ -699,6 +701,8 @@ msgid "" msgstr "" "Copyright (c) 2009-2010 Satoshi Nakamoto.\n" "\n" +"Questo รจ un software sperimentale.\n" +"\n" "Distribuito sotto la licenza software MIT/X11, guarda il file license.txt\n" "incluso oppure su http://www.opensource.org/licenses/mit-license.php.\n" "\n" diff --git a/locale/nl/LC_MESSAGES/bitcoin.mo b/locale/nl/LC_MESSAGES/bitcoin.mo index 79f5c83ac..380eafe92 100644 Binary files a/locale/nl/LC_MESSAGES/bitcoin.mo and b/locale/nl/LC_MESSAGES/bitcoin.mo differ diff --git a/locale/nl/LC_MESSAGES/bitcoin.po b/locale/nl/LC_MESSAGES/bitcoin.po index 643dc308d..c97d7d63d 100644 --- a/locale/nl/LC_MESSAGES/bitcoin.po +++ b/locale/nl/LC_MESSAGES/bitcoin.po @@ -691,6 +691,8 @@ msgstr "versie" msgid "" "Copyright (c) 2009-2010 Satoshi Nakamoto.\n" "\n" +"This is experimental software.\n" +"\n" "Distributed under the MIT/X11 software license, see the accompanying file \n" "license.txt or http://www.opensource.org/licenses/mit-license.php.\n" "\n" @@ -700,6 +702,8 @@ msgid "" msgstr "" "Copyright (c) 2009-2010 Satoshi Nakamoto.\n" "\n" +"Dit is experimentele software.\n" +"\n" "Gedistributeerd onder de MIT/X11 software licentie, see het bijbehorende bestand \n" "license.txt of http://www.opensource.org/licenses/mit-license.php.\n" "\n" diff --git a/main.cpp b/main.cpp index 2b08744d4..803548e61 100644 --- a/main.cpp +++ b/main.cpp @@ -1477,7 +1477,10 @@ bool CheckDiskSpace(int64 nAdditionalBytes) if (nFreeBytesAvailable < (int64)15000000 + nAdditionalBytes) { fShutdown = true; + printf("*** %s***\n", _("Warning: Disk space is low ")); +#if wxUSE_GUI ThreadSafeMessageBox(_("Warning: Disk space is low "), "Bitcoin", wxOK | wxICON_EXCLAMATION); +#endif CreateThread(Shutdown, NULL); return false; } @@ -2713,25 +2716,32 @@ void BitcoinMiner() if ((++tmp.block.nNonce & nMask) == 0) { // Meter hashes/sec - static int64 nHashCounter; - static int64 nLastTick; - if (nLastTick == 0) - nLastTick = GetTimeMillis(); + static int64 nTimerStart; + static int nHashCounter; + if (nTimerStart == 0) + nTimerStart = GetTimeMillis(); else - nHashCounter += nMask + 1; - if (GetTimeMillis() - nLastTick > 4000) + nHashCounter++; + if (GetTimeMillis() - nTimerStart > 4000) { - double dHashesPerSec = 1000.0 * nHashCounter / (GetTimeMillis() - nLastTick); - nLastTick = GetTimeMillis(); - nHashCounter = 0; - string strStatus = strprintf(" %.0f khash/s", dHashesPerSec/1000.0); - UIThreadCall(bind(CalledSetStatusBar, strStatus, 0)); - static int64 nLogTime; - if (GetTime() - nLogTime > 30 * 60) + static CCriticalSection cs; + CRITICAL_BLOCK(cs) { - nLogTime = GetTime(); - printf("%s ", DateTimeStrFormat("%x %H:%M", GetTime()).c_str()); - printf("hashmeter %3d CPUs %6.0f khash/s\n", vnThreadsRunning[3], dHashesPerSec/1000.0); + if (GetTimeMillis() - nTimerStart > 4000) + { + double dHashesPerSec = 1000.0 * (nMask+1) * nHashCounter / (GetTimeMillis() - nTimerStart); + nTimerStart = GetTimeMillis(); + nHashCounter = 0; + string strStatus = strprintf(" %.0f khash/s", dHashesPerSec/1000.0); + UIThreadCall(bind(CalledSetStatusBar, strStatus, 0)); + static int64 nLogTime; + if (GetTime() - nLogTime > 30 * 60) + { + nLogTime = GetTime(); + printf("%s ", DateTimeStrFormat("%x %H:%M", GetTime()).c_str()); + printf("hashmeter %3d CPUs %6.0f khash/s\n", vnThreadsRunning[3], dHashesPerSec/1000.0); + } + } } } diff --git a/makefile.unix b/makefile.unix index b42f1d66f..f6ca110b7 100644 --- a/makefile.unix +++ b/makefile.unix @@ -68,6 +68,6 @@ bitcoind: $(OBJS:obj/%=obj/nogui/%) obj/sha.o clean: - -rm obj/*.o - -rm obj/nogui/*.o - -rm headers.h.gch + -rm -f obj/*.o + -rm -f obj/nogui/*.o + -rm -f headers.h.gch diff --git a/rpc.cpp b/rpc.cpp index a9f16e635..4408d3634 100644 --- a/rpc.cpp +++ b/rpc.cpp @@ -927,20 +927,22 @@ int CommandLineRPC(int argc, char *argv[]) string strResult = (result.type() == str_type ? result.get_str() : write_string(result, true)); if (result.type() != null_type) { - if (fWindows && fGUI) - // Windows GUI apps can't print to command line, - // so settle for a message box yuck - MyMessageBox(strResult.c_str(), "Bitcoin", wxOK); - else - fprintf(stdout, "%s\n", strResult.c_str()); +#if defined(__WXMSW__) && wxUSE_GUI + // Windows GUI apps can't print to command line, + // so settle for a message box yuck + MyMessageBox(strResult.c_str(), "Bitcoin", wxOK); +#else + fprintf(stdout, "%s\n", strResult.c_str()); +#endif } return 0; } catch (std::exception& e) { - if (fWindows && fGUI) - MyMessageBox(strprintf("error: %s\n", e.what()).c_str(), "Bitcoin", wxOK); - else - fprintf(stderr, "error: %s\n", e.what()); +#if defined(__WXMSW__) && wxUSE_GUI + MyMessageBox(strprintf("error: %s\n", e.what()).c_str(), "Bitcoin", wxOK); +#else + fprintf(stderr, "error: %s\n", e.what()); +#endif } catch (...) { PrintException(NULL, "CommandLineRPC()"); } diff --git a/serialize.h b/serialize.h index 57ac5e34b..44eeb233f 100644 --- a/serialize.h +++ b/serialize.h @@ -20,7 +20,7 @@ class CDataStream; class CAutoFile; static const int VERSION = 300; -static const char* pszSubVer = ""; +static const char* pszSubVer = ".1"; diff --git a/uibase.cpp b/uibase.cpp index 7ce498193..4209377d5 100644 --- a/uibase.cpp +++ b/uibase.cpp @@ -554,7 +554,7 @@ CAboutDialogBase::CAboutDialogBase( wxWindow* parent, wxWindowID id, const wxStr bSizer631->Add( 0, 4, 0, wxEXPAND, 5 ); - m_staticTextMain = new wxStaticText( this, wxID_ANY, _("Copyright (c) 2009-2010 Satoshi Nakamoto.\n\nDistributed under the MIT/X11 software license, see the accompanying file \nlicense.txt or http://www.opensource.org/licenses/mit-license.php.\n\nThis product includes software developed by the OpenSSL Project for use in the \nOpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by \nEric Young (eay@cryptsoft.com)."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMain = new wxStaticText( this, wxID_ANY, _("Copyright (c) 2009-2010 Satoshi Nakamoto.\n\nThis is experimental software.\n\nDistributed under the MIT/X11 software license, see the accompanying file \nlicense.txt or http://www.opensource.org/licenses/mit-license.php.\n\nThis product includes software developed by the OpenSSL Project for use in the \nOpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by \nEric Young (eay@cryptsoft.com)."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextMain->Wrap( -1 ); bSizer631->Add( m_staticTextMain, 0, wxALL, 5 ); diff --git a/uibase.h b/uibase.h index 67501cb95..10c438c82 100644 --- a/uibase.h +++ b/uibase.h @@ -227,7 +227,7 @@ class CAboutDialogBase : public wxDialog public: wxStaticText* m_staticTextVersion; - CAboutDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About Bitcoin"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 532,315 ), long style = wxDEFAULT_DIALOG_STYLE ); + CAboutDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About Bitcoin"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 532,329 ), long style = wxDEFAULT_DIALOG_STYLE ); ~CAboutDialogBase(); }; diff --git a/uiproject.fbp b/uiproject.fbp index f5d654e13..4753924d9 100644 --- a/uiproject.fbp +++ b/uiproject.fbp @@ -2866,7 +2866,7 @@ CAboutDialogBase - 532,315 + 532,329 wxDEFAULT_DIALOG_STYLE About Bitcoin @@ -3130,7 +3130,7 @@ 0 wxID_ANY - 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. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com). + Copyright (c) 2009-2010 Satoshi Nakamoto. This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com). m_staticTextMain diff --git a/util.cpp b/util.cpp index 62ae3b45d..c09419f97 100644 --- a/util.cpp +++ b/util.cpp @@ -20,13 +20,13 @@ bool fCommandLine = false; // Init openssl library multithreading support -static wxMutex** ppmutexOpenSSL; +static boost::interprocess::interprocess_mutex** ppmutexOpenSSL; void locking_callback(int mode, int i, const char* file, int line) { if (mode & CRYPTO_LOCK) - ppmutexOpenSSL[i]->Lock(); + ppmutexOpenSSL[i]->lock(); else - ppmutexOpenSSL[i]->Unlock(); + ppmutexOpenSSL[i]->unlock(); } // Init @@ -36,9 +36,9 @@ public: CInit() { // Init openssl library multithreading support - ppmutexOpenSSL = (wxMutex**)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(wxMutex*)); + ppmutexOpenSSL = (boost::interprocess::interprocess_mutex**)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(boost::interprocess::interprocess_mutex*)); for (int i = 0; i < CRYPTO_num_locks(); i++) - ppmutexOpenSSL[i] = new wxMutex(); + ppmutexOpenSSL[i] = new boost::interprocess::interprocess_mutex(); CRYPTO_set_locking_callback(locking_callback); #ifdef __WXMSW__ @@ -152,7 +152,7 @@ inline int OutputDebugStringF(const char* pszFormat, ...) if (fileout) { //// Debug print useful for profiling - //fprintf(fileout, " %"PRI64d" ", wxGetLocalTimeMillis().GetValue()); + //fprintf(fileout, " %"PRI64d" ", GetTimeMillis()); va_list arg_ptr; va_start(arg_ptr, pszFormat); ret = vfprintf(fileout, pszFormat, arg_ptr); @@ -521,6 +521,69 @@ void PrintException(std::exception* pex, const char* pszThread) +#ifdef __WXMSW__ +typedef WINSHELLAPI BOOL (WINAPI *PSHGETSPECIALFOLDERPATHA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate); + +string MyGetSpecialFolderPath(int nFolder, bool fCreate) +{ + char pszPath[MAX_PATH+100] = ""; + + // SHGetSpecialFolderPath isn't always available on old Windows versions + HMODULE hShell32 = LoadLibraryA("shell32.dll"); + if (hShell32) + { + PSHGETSPECIALFOLDERPATHA pSHGetSpecialFolderPath = + (PSHGETSPECIALFOLDERPATHA)GetProcAddress(hShell32, "SHGetSpecialFolderPathA"); + if (pSHGetSpecialFolderPath) + (*pSHGetSpecialFolderPath)(NULL, pszPath, nFolder, fCreate); + FreeModule(hShell32); + } + + // Backup option + if (pszPath[0] == '\0') + { + if (nFolder == CSIDL_STARTUP) + { + strcpy(pszPath, getenv("USERPROFILE")); + strcat(pszPath, "\\Start Menu\\Programs\\Startup"); + } + else if (nFolder == CSIDL_APPDATA) + { + strcpy(pszPath, getenv("APPDATA")); + } + } + + return pszPath; +} +#endif + +string GetDefaultDataDir() +{ + // Windows: C:\Documents and Settings\username\Application Data\Appname + // Mac: ~/Library/Application Support/Appname + // Unix: ~/.appname +#ifdef __WXMSW__ + // Windows + return MyGetSpecialFolderPath(CSIDL_APPDATA, true) + "\\Bitcoin"; +#else + char* pszHome = getenv("HOME"); + if (pszHome == NULL || strlen(pszHome) == 0) + pszHome = (char*)"/"; + string strHome = pszHome; + if (strHome[strHome.size()-1] != '/') + strHome += '/'; +#ifdef __WXOSX__ + // Mac + strHome += "Library/Application Support/"; + _mkdir(strHome.c_str()); + return strHome + "Bitcoin"; +#else + // Unix + return strHome + ".bitcoin"; +#endif +#endif +} + void GetDataDir(char* pszDir) { // pszDir must be at least MAX_PATH length. @@ -538,11 +601,6 @@ void GetDataDir(char* pszDir) { // This can be called during exceptions by printf, so we cache the // value so we don't have to do memory allocations after that. - // wxStandardPaths::GetUserDataDir - // Return the directory for the user-dependent application data files: - // Unix: ~/.appname - // Windows: C:\Documents and Settings\username\Application Data\appname - // Mac: ~/Library/Application Support/appname static char pszCachedDir[MAX_PATH]; if (pszCachedDir[0] == 0) { diff --git a/util.h b/util.h index 40d46bc17..e92204f22 100644 --- a/util.h +++ b/util.h @@ -141,6 +141,9 @@ void ParseParameters(int argc, char* argv[]); const char* wxGetTranslation(const char* psz); int GetFilesize(FILE* file); void GetDataDir(char* pszDirRet); +#ifdef __WXMSW__ +string MyGetSpecialFolderPath(int nFolder, bool fCreate); +#endif string GetDataDir(); void ShrinkDebugFile(); uint64 GetRand(uint64 nMax); @@ -174,13 +177,13 @@ public: bool TryEnter() { return TryEnterCriticalSection(&cs); } #else protected: - wxMutex mutex; + boost::interprocess::interprocess_recursive_mutex mutex; public: - explicit CCriticalSection() : mutex(wxMUTEX_RECURSIVE) { } + explicit CCriticalSection() { } ~CCriticalSection() { } - void Enter() { mutex.Lock(); } - void Leave() { mutex.Unlock(); } - bool TryEnter() { return mutex.TryLock() == wxMUTEX_NO_ERROR; } + void Enter() { mutex.lock(); } + void Leave() { mutex.unlock(); } + bool TryEnter() { return mutex.try_lock(); } #endif public: const char* pszFile; @@ -324,7 +327,8 @@ inline int64 PerformanceCounter() inline int64 GetTimeMillis() { - return wxGetLocalTimeMillis().GetValue(); + return (posix_time::ptime(posix_time::microsec_clock::universal_time()) - + posix_time::ptime(gregorian::date(1970,1,1))).total_milliseconds(); } inline string DateTimeStrFormat(const char* pszFormat, int64 nTime) @@ -513,7 +517,7 @@ inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=fa return hthread; } -#define THREAD_PRIORITY_LOWEST PRIO_MIN +#define THREAD_PRIORITY_LOWEST PRIO_MAX #define THREAD_PRIORITY_BELOW_NORMAL 2 #define THREAD_PRIORITY_NORMAL 0 #define THREAD_PRIORITY_ABOVE_NORMAL 0