aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2012-03-25 20:17:59 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2012-04-04 09:35:01 +0200
commit1a3f0da9229a8e524d1010cdc8bd3b9da71fe529 (patch)
treeea477d499012b9bbf16402284260c95b43e2cb1f
parent5d7cebdadc991a23195a3519c1e9c038cb4f2290 (diff)
support RPC stop and encryptwallet with UI
-rw-r--r--src/bitcoinrpc.cpp17
-rw-r--r--src/main.cpp2
-rw-r--r--src/noui.h7
-rw-r--r--src/qt/bitcoin.cpp5
-rw-r--r--src/qtui.h1
5 files changed, 17 insertions, 15 deletions
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
index 868419eaa4..e511505c1d 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 ca589e54f4..19a6c08f8a 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 4010ec3c7c..0cb42ca0a4 100644
--- a/src/noui.h
+++ b/src/noui.h
@@ -7,6 +7,7 @@
#include <string>
#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 e91855bec4..f566476e66 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 662b231cde..07451e5f5e 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);