diff --git a/main.cpp b/main.cpp index c2339182a..aa1d67aac 100644 --- a/main.cpp +++ b/main.cpp @@ -1579,10 +1579,10 @@ bool CheckDiskSpace(int64 nAdditionalBytes) if (nFreeBytesAvailable < (int64)15000000 + nAdditionalBytes) { fShutdown = true; - printf("*** %s***\n", _("Warning: Disk space is low ")); -#ifdef GUI - ThreadSafeMessageBox(_("Warning: Disk space is low "), "Bitcoin", wxOK | wxICON_EXCLAMATION); -#endif + string strMessage = _("Warning: Disk space is low "); + strWarning = strMessage; + printf("*** %s\n", strMessage.c_str()); + ThreadSafeMessageBox(strMessage, "Bitcoin", wxOK | wxICON_EXCLAMATION); CreateThread(Shutdown, NULL); return false; } diff --git a/noui.h b/noui.h index 45ef4bc96..47110e40b 100644 --- a/noui.h +++ b/noui.h @@ -3,7 +3,35 @@ // file license.txt or http://www.opensource.org/licenses/mit-license.php. -inline int MyMessageBox(const string& message, const string& caption="Message", int style=4, void* parent=NULL, int x=-1, int y=-1) +typedef void wxWindow; +#define wxYES 0x00000002 +#define wxOK 0x00000004 +#define wxNO 0x00000008 +#define wxYES_NO (wxYES|wxNO) +#define wxCANCEL 0x00000010 +#define wxAPPLY 0x00000020 +#define wxCLOSE 0x00000040 +#define wxOK_DEFAULT 0x00000000 +#define wxYES_DEFAULT 0x00000000 +#define wxNO_DEFAULT 0x00000080 +#define wxCANCEL_DEFAULT 0x80000000 +#define wxICON_EXCLAMATION 0x00000100 +#define wxICON_HAND 0x00000200 +#define wxICON_WARNING wxICON_EXCLAMATION +#define wxICON_ERROR wxICON_HAND +#define wxICON_QUESTION 0x00000400 +#define wxICON_INFORMATION 0x00000800 +#define wxICON_STOP wxICON_HAND +#define wxICON_ASTERISK wxICON_INFORMATION +#define wxICON_MASK (0x00000100|0x00000200|0x00000400|0x00000800) +#define wxFORWARD 0x00001000 +#define wxBACKWARD 0x00002000 +#define wxRESET 0x00004000 +#define wxHELP 0x00008000 +#define wxMORE 0x00010000 +#define wxSETUP 0x00020000 + +inline int MyMessageBox(const string& message, const string& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1) { printf("%s: %s\n", caption.c_str(), message.c_str()); fprintf(stderr, "%s: %s\n", caption.c_str(), message.c_str()); @@ -11,12 +39,12 @@ inline int MyMessageBox(const string& message, const string& caption="Message", } #define wxMessageBox MyMessageBox -inline int ThreadSafeMessageBox(const string& message, const string& caption, int style, void* parent, int x, int y) +inline int ThreadSafeMessageBox(const string& message, const string& caption, int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1) { return MyMessageBox(message, caption, style, parent, x, y); } -inline bool ThreadSafeAskFee(int64 nFeeRequired, const string& strCaption, void* parent) +inline bool ThreadSafeAskFee(int64 nFeeRequired, const string& strCaption, wxWindow* parent) { return true; } diff --git a/rpc.cpp b/rpc.cpp index 679951af2..a93a6bcff 100644 --- a/rpc.cpp +++ b/rpc.cpp @@ -247,6 +247,7 @@ Value getinfo(const Array& params, bool fHelp) obj.push_back(Pair("genproclimit", (int)(fLimitProcessors ? nLimitProcessors : -1))); obj.push_back(Pair("difficulty", (double)GetDifficulty())); obj.push_back(Pair("hashespersec", gethashespersec(params, false))); + obj.push_back(Pair("status", strWarning)); return obj; } diff --git a/serialize.h b/serialize.h index 260e84975..2cc9ab314 100644 --- a/serialize.h +++ b/serialize.h @@ -20,7 +20,7 @@ class CDataStream; class CAutoFile; static const int VERSION = 310; -static const char* pszSubVer = ".4"; +static const char* pszSubVer = ".5"; diff --git a/util.cpp b/util.cpp index 8f06e3087..2be841d07 100644 --- a/util.cpp +++ b/util.cpp @@ -14,6 +14,7 @@ char pszSetDataDir[MAX_PATH] = ""; bool fShutdown = false; bool fDaemon = false; bool fCommandLine = false; +string strWarning; @@ -742,14 +743,28 @@ void AddTimeData(unsigned int ip, int64 nTime) { sort(vTimeOffsets.begin(), vTimeOffsets.end()); int64 nMedian = vTimeOffsets[vTimeOffsets.size()/2]; - nTimeOffset = nMedian; - if ((nMedian > 0 ? nMedian : -nMedian) > 70 * 60) + // Only let other nodes change our time by so much + if (abs64(nMedian) < 70 * 60) + { + nTimeOffset = nMedian; + } + else { - // Only let other nodes change our clock so far before we - // go to the NTP servers - /// todo: Get time from NTP servers, then set a flag - /// to make sure it doesn't get changed again nTimeOffset = 0; + // If nobody else has the same time as us, give a warning + bool fMatch = false; + foreach(int64 nOffset, vTimeOffsets) + if (nOffset != 0 && abs64(nOffset) < 10 * 60) + fMatch = true; + static bool fDone; + if (!fMatch && !fDone) + { + fDone = true; + string strMessage = _("Warning: Check your system date and time, you may not be able to generate or receive the most recent blocks!"); + strWarning = strMessage; + printf("*** %s\n", strMessage.c_str()); + boost::thread(bind(ThreadSafeMessageBox, strMessage+" ", string("Bitcoin"), wxOK | wxICON_EXCLAMATION, (wxWindow*)NULL, -1, -1)); + } } foreach(int64 n, vTimeOffsets) printf("%+"PRI64d" ", n); diff --git a/util.h b/util.h index bf8cf300f..f61896f40 100644 --- a/util.h +++ b/util.h @@ -143,6 +143,7 @@ extern char pszSetDataDir[MAX_PATH]; extern bool fShutdown; extern bool fDaemon; extern bool fCommandLine; +extern string strWarning; void RandAddSeed(); void RandAddSeedPerfmon(); @@ -298,6 +299,11 @@ inline int64 roundint64(double d) return (int64)(d > 0 ? d + 0.5 : d - 0.5); } +inline int64 abs64(int64 n) +{ + return (n >= 0 ? n : -n); +} + template string HexStr(const T itbegin, const T itend, bool fSpaces=true) {