From: Wladimir J. van der Laan Date: Sun, 25 Mar 2012 18:17:59 +0000 (+0200) Subject: support RPC stop and encryptwallet with UI X-Git-Tag: v0.4.0-unstable~129^2~110^2~3 X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=1a3f0da9229a8e524d1010cdc8bd3b9da71fe529 support RPC stop and encryptwallet with UI --- diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index 868419e..e511505 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -221,13 +221,9 @@ Value stop(const Array& params, bool fHelp) throw runtime_error( "stop\n" "Stop bitcoin server."); -#ifndef QT_GUI // Shutdown will take long enough that the response should get back - CreateThread(Shutdown, NULL); + QueueShutdown(); return "bitcoin server stopping"; -#else - throw runtime_error("NYI: cannot shut down GUI with RPC command"); -#endif } @@ -1676,11 +1672,6 @@ Value encryptwallet(const Array& params, bool fHelp) if (pwalletMain->IsCrypted()) throw JSONRPCError(-15, "Error: running with an encrypted wallet, but encryptwallet was called."); -#ifdef QT_GUI - // shutting down via RPC while the GUI is running does not work (yet): - throw runtime_error("Not Yet Implemented: use GUI to encrypt wallet, not RPC command"); -#endif - // TODO: get rid of this .c_str() by implementing SecureString::operator=(std::string) // Alternately, find a way to make params[0] mlock()'d to begin with. SecureString strWalletPass; @@ -1698,7 +1689,7 @@ Value encryptwallet(const Array& params, bool fHelp) // BDB seems to have a bad habit of writing old data into // slack space in .dat files; that is bad if the old data is // unencrypted private keys. So: - CreateThread(Shutdown, NULL); + QueueShutdown(); return "wallet encrypted; bitcoin server stopping, restart to run with encrypted wallet"; } @@ -2381,9 +2372,7 @@ void ThreadRPCServer2(void* parg) strWhatAmI.c_str(), GetConfigFile().c_str(), EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32).c_str()); -#ifndef QT_GUI - CreateThread(Shutdown, NULL); -#endif + QueueShutdown(); return; } diff --git a/src/main.cpp b/src/main.cpp index ca589e5..19a6c08 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1812,7 +1812,7 @@ bool CheckDiskSpace(uint64 nAdditionalBytes) strMiscWarning = strMessage; printf("*** %s\n", strMessage.c_str()); ThreadSafeMessageBox(strMessage, "Bitcoin", wxOK | wxICON_EXCLAMATION); - CreateThread(Shutdown, NULL); + QueueShutdown(); return false; } return true; diff --git a/src/noui.h b/src/noui.h index 4010ec3..0cb42ca 100644 --- a/src/noui.h +++ b/src/noui.h @@ -7,6 +7,7 @@ #include #include "wallet.h" +#include "init.h" typedef void wxWindow; #define wxYES 0x00000002 @@ -71,4 +72,10 @@ inline const char* _(const char* psz) return psz; } +inline void QueueShutdown() +{ + // Without UI, Shutdown can simply be started in a new thread + CreateThread(Shutdown, NULL); +} + #endif diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index e91855b..f566476 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -111,6 +111,11 @@ void InitMessage(const std::string &message) } } +void QueueShutdown() +{ + QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection); +} + /* Translate string to current locale using Qt. */ diff --git a/src/qtui.h b/src/qtui.h index 662b231..07451e5 100644 --- a/src/qtui.h +++ b/src/qtui.h @@ -42,6 +42,7 @@ extern bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, extern void ThreadSafeHandleURL(const std::string& strURL); extern void MainFrameRepaint(); extern void AddressBookRepaint(); +extern void QueueShutdown(); extern void InitMessage(const std::string &message); extern std::string _(const char* psz);