aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2013-11-13 04:35:12 -0800
committerWladimir J. van der Laan <laanwj@gmail.com>2013-11-13 04:35:12 -0800
commit2830a9051d19fa8ba29e26ef0440107a13b15975 (patch)
treec58c52e5deb98c8a7d79e2a73fad00ecbffbbdf1
parentd6c434d97e93f46704d472997574787f81c318fd (diff)
parent146ba964e4b784171c29600e959a0fae3e2e0c03 (diff)
Merge pull request #3240 from laanwj/2013_11_rebase_no_wallet
Introduce disable-wallet / no-wallet mode (rebased)
-rw-r--r--src/init.cpp226
-rw-r--r--src/qt/bitcoin.cpp19
-rw-r--r--src/qt/bitcoingui.cpp21
-rw-r--r--src/qt/bitcoingui.h3
-rw-r--r--src/qt/walletframe.cpp29
-rw-r--r--src/qt/walletframe.h2
6 files changed, 177 insertions, 123 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 6749064ed5..d930f6f693 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -499,6 +499,7 @@ bool AppInit2(boost::thread_group& threadGroup, bool fForceServer)
fPrintToConsole = GetBoolArg("-printtoconsole", false);
fPrintToDebugger = GetBoolArg("-printtodebugger", false);
fLogTimestamps = GetBoolArg("-logtimestamps", true);
+ bool fDisableWallet = GetBoolArg("-disablewallet", false);
if (mapArgs.count("-timeout"))
{
@@ -587,49 +588,51 @@ bool AppInit2(boost::thread_group& threadGroup, bool fForceServer)
// ********************************************************* Step 5: verify wallet database integrity
- uiInterface.InitMessage(_("Verifying wallet..."));
+ if (!fDisableWallet) {
+ uiInterface.InitMessage(_("Verifying wallet..."));
- if (!bitdb.Open(GetDataDir()))
- {
- // try moving the database env out of the way
- boost::filesystem::path pathDatabase = GetDataDir() / "database";
- boost::filesystem::path pathDatabaseBak = GetDataDir() / strprintf("database.%"PRId64".bak", GetTime());
- try {
- boost::filesystem::rename(pathDatabase, pathDatabaseBak);
- LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string().c_str(), pathDatabaseBak.string().c_str());
- } catch(boost::filesystem::filesystem_error &error) {
- // failure is ok (well, not really, but it's not worse than what we started with)
- }
+ if (!bitdb.Open(GetDataDir()))
+ {
+ // try moving the database env out of the way
+ boost::filesystem::path pathDatabase = GetDataDir() / "database";
+ boost::filesystem::path pathDatabaseBak = GetDataDir() / strprintf("database.%"PRId64".bak", GetTime());
+ try {
+ boost::filesystem::rename(pathDatabase, pathDatabaseBak);
+ LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string().c_str(), pathDatabaseBak.string().c_str());
+ } catch(boost::filesystem::filesystem_error &error) {
+ // failure is ok (well, not really, but it's not worse than what we started with)
+ }
- // try again
- if (!bitdb.Open(GetDataDir())) {
- // if it still fails, it probably means we can't even create the database env
- string msg = strprintf(_("Error initializing wallet database environment %s!"), strDataDir.c_str());
- return InitError(msg);
+ // try again
+ if (!bitdb.Open(GetDataDir())) {
+ // if it still fails, it probably means we can't even create the database env
+ string msg = strprintf(_("Error initializing wallet database environment %s!"), strDataDir.c_str());
+ return InitError(msg);
+ }
}
- }
- if (GetBoolArg("-salvagewallet", false))
- {
- // Recover readable keypairs:
- if (!CWalletDB::Recover(bitdb, strWalletFile, true))
- return false;
- }
+ if (GetBoolArg("-salvagewallet", false))
+ {
+ // Recover readable keypairs:
+ if (!CWalletDB::Recover(bitdb, strWalletFile, true))
+ return false;
+ }
- if (filesystem::exists(GetDataDir() / strWalletFile))
- {
- CDBEnv::VerifyResult r = bitdb.Verify(strWalletFile, CWalletDB::Recover);
- if (r == CDBEnv::RECOVER_OK)
+ if (filesystem::exists(GetDataDir() / strWalletFile))
{
- string msg = strprintf(_("Warning: wallet.dat corrupt, data salvaged!"
- " Original wallet.dat saved as wallet.{timestamp}.bak in %s; if"
- " your balance or transactions are incorrect you should"
- " restore from a backup."), strDataDir.c_str());
- InitWarning(msg);
+ CDBEnv::VerifyResult r = bitdb.Verify(strWalletFile, CWalletDB::Recover);
+ if (r == CDBEnv::RECOVER_OK)
+ {
+ string msg = strprintf(_("Warning: wallet.dat corrupt, data salvaged!"
+ " Original wallet.dat saved as wallet.{timestamp}.bak in %s; if"
+ " your balance or transactions are incorrect you should"
+ " restore from a backup."), strDataDir.c_str());
+ InitWarning(msg);
+ }
+ if (r == CDBEnv::RECOVER_FAIL)
+ return InitError(_("wallet.dat corrupt, salvage failed"));
}
- if (r == CDBEnv::RECOVER_FAIL)
- return InitError(_("wallet.dat corrupt, salvage failed"));
- }
+ } // (!fDisableWallet)
// ********************************************************* Step 6: network initialization
@@ -898,92 +901,97 @@ bool AppInit2(boost::thread_group& threadGroup, bool fForceServer)
// ********************************************************* Step 8: load wallet
- uiInterface.InitMessage(_("Loading wallet..."));
+ if (fDisableWallet) {
+ pwalletMain = NULL;
+ LogPrintf("Wallet disabled!\n");
+ } else {
+ uiInterface.InitMessage(_("Loading wallet..."));
- nStart = GetTimeMillis();
- bool fFirstRun = true;
- pwalletMain = new CWallet(strWalletFile);
- DBErrors nLoadWalletRet = pwalletMain->LoadWallet(fFirstRun);
- if (nLoadWalletRet != DB_LOAD_OK)
- {
- if (nLoadWalletRet == DB_CORRUPT)
- strErrors << _("Error loading wallet.dat: Wallet corrupted") << "\n";
- else if (nLoadWalletRet == DB_NONCRITICAL_ERROR)
+ nStart = GetTimeMillis();
+ bool fFirstRun = true;
+ pwalletMain = new CWallet(strWalletFile);
+ DBErrors nLoadWalletRet = pwalletMain->LoadWallet(fFirstRun);
+ if (nLoadWalletRet != DB_LOAD_OK)
{
- string msg(_("Warning: error reading wallet.dat! All keys read correctly, but transaction data"
- " or address book entries might be missing or incorrect."));
- InitWarning(msg);
+ if (nLoadWalletRet == DB_CORRUPT)
+ strErrors << _("Error loading wallet.dat: Wallet corrupted") << "\n";
+ else if (nLoadWalletRet == DB_NONCRITICAL_ERROR)
+ {
+ string msg(_("Warning: error reading wallet.dat! All keys read correctly, but transaction data"
+ " or address book entries might be missing or incorrect."));
+ InitWarning(msg);
+ }
+ else if (nLoadWalletRet == DB_TOO_NEW)
+ strErrors << _("Error loading wallet.dat: Wallet requires newer version of Bitcoin") << "\n";
+ else if (nLoadWalletRet == DB_NEED_REWRITE)
+ {
+ strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n";
+ LogPrintf("%s", strErrors.str().c_str());
+ return InitError(strErrors.str());
+ }
+ else
+ strErrors << _("Error loading wallet.dat") << "\n";
}
- else if (nLoadWalletRet == DB_TOO_NEW)
- strErrors << _("Error loading wallet.dat: Wallet requires newer version of Bitcoin") << "\n";
- else if (nLoadWalletRet == DB_NEED_REWRITE)
+
+ if (GetBoolArg("-upgradewallet", fFirstRun))
{
- strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n";
- LogPrintf("%s", strErrors.str().c_str());
- return InitError(strErrors.str());
+ int nMaxVersion = GetArg("-upgradewallet", 0);
+ if (nMaxVersion == 0) // the -upgradewallet without argument case
+ {
+ LogPrintf("Performing wallet upgrade to %i\n", FEATURE_LATEST);
+ nMaxVersion = CLIENT_VERSION;
+ pwalletMain->SetMinVersion(FEATURE_LATEST); // permanently upgrade the wallet immediately
+ }
+ else
+ LogPrintf("Allowing wallet upgrade up to %i\n", nMaxVersion);
+ if (nMaxVersion < pwalletMain->GetVersion())
+ strErrors << _("Cannot downgrade wallet") << "\n";
+ pwalletMain->SetMaxVersion(nMaxVersion);
}
- else
- strErrors << _("Error loading wallet.dat") << "\n";
- }
- if (GetBoolArg("-upgradewallet", fFirstRun))
- {
- int nMaxVersion = GetArg("-upgradewallet", 0);
- if (nMaxVersion == 0) // the -upgradewallet without argument case
+ if (fFirstRun)
{
- LogPrintf("Performing wallet upgrade to %i\n", FEATURE_LATEST);
- nMaxVersion = CLIENT_VERSION;
- pwalletMain->SetMinVersion(FEATURE_LATEST); // permanently upgrade the wallet immediately
- }
- else
- LogPrintf("Allowing wallet upgrade up to %i\n", nMaxVersion);
- if (nMaxVersion < pwalletMain->GetVersion())
- strErrors << _("Cannot downgrade wallet") << "\n";
- pwalletMain->SetMaxVersion(nMaxVersion);
- }
+ // Create new keyUser and set as default key
+ RandAddSeedPerfmon();
+
+ CPubKey newDefaultKey;
+ if (pwalletMain->GetKeyFromPool(newDefaultKey)) {
+ pwalletMain->SetDefaultKey(newDefaultKey);
+ if (!pwalletMain->SetAddressBook(pwalletMain->vchDefaultKey.GetID(), "", "receive"))
+ strErrors << _("Cannot write default address") << "\n";
+ }
- if (fFirstRun)
- {
- // Create new keyUser and set as default key
- RandAddSeedPerfmon();
-
- CPubKey newDefaultKey;
- if (pwalletMain->GetKeyFromPool(newDefaultKey)) {
- pwalletMain->SetDefaultKey(newDefaultKey);
- if (!pwalletMain->SetAddressBook(pwalletMain->vchDefaultKey.GetID(), "", "receive"))
- strErrors << _("Cannot write default address") << "\n";
+ pwalletMain->SetBestChain(chainActive.GetLocator());
}
- pwalletMain->SetBestChain(chainActive.GetLocator());
- }
-
- LogPrintf("%s", strErrors.str().c_str());
- LogPrintf(" wallet %15"PRId64"ms\n", GetTimeMillis() - nStart);
+ LogPrintf("%s", strErrors.str().c_str());
+ LogPrintf(" wallet %15"PRId64"ms\n", GetTimeMillis() - nStart);
- RegisterWallet(pwalletMain);
+ RegisterWallet(pwalletMain);
- CBlockIndex *pindexRescan = chainActive.Tip();
- if (GetBoolArg("-rescan", false))
- pindexRescan = chainActive.Genesis();
- else
- {
- CWalletDB walletdb(strWalletFile);
- CBlockLocator locator;
- if (walletdb.ReadBestBlock(locator))
- pindexRescan = chainActive.FindFork(locator);
- else
+ CBlockIndex *pindexRescan = chainActive.Tip();
+ if (GetBoolArg("-rescan", false))
pindexRescan = chainActive.Genesis();
- }
- if (chainActive.Tip() && chainActive.Tip() != pindexRescan)
- {
- uiInterface.InitMessage(_("Rescanning..."));
- LogPrintf("Rescanning last %i blocks (from block %i)...\n", chainActive.Height() - pindexRescan->nHeight, pindexRescan->nHeight);
- nStart = GetTimeMillis();
- pwalletMain->ScanForWalletTransactions(pindexRescan, true);
- LogPrintf(" rescan %15"PRId64"ms\n", GetTimeMillis() - nStart);
- pwalletMain->SetBestChain(chainActive.GetLocator());
- nWalletDBUpdated++;
- }
+ else
+ {
+ CWalletDB walletdb(strWalletFile);
+ CBlockLocator locator;
+ if (walletdb.ReadBestBlock(locator))
+ pindexRescan = chainActive.FindFork(locator);
+ else
+ pindexRescan = chainActive.Genesis();
+ }
+ if (chainActive.Tip() && chainActive.Tip() != pindexRescan)
+ {
+ uiInterface.InitMessage(_("Rescanning..."));
+ LogPrintf("Rescanning last %i blocks (from block %i)...\n", chainActive.Height() - pindexRescan->nHeight, pindexRescan->nHeight);
+ nStart = GetTimeMillis();
+ pwalletMain->ScanForWalletTransactions(pindexRescan, true);
+ LogPrintf(" rescan %15"PRId64"ms\n", GetTimeMillis() - nStart);
+ pwalletMain->SetBestChain(chainActive.GetLocator());
+ nWalletDBUpdated++;
+ }
+ } // (!fDisableWallet)
// ********************************************************* Step 9: import blocks
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 54f96f4426..57ce7da361 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -313,11 +313,16 @@ int main(int argc, char *argv[])
splash.finish(&window);
ClientModel clientModel(&optionsModel);
- WalletModel walletModel(pwalletMain, &optionsModel);
+ WalletModel *walletModel = 0;
+ if(pwalletMain)
+ walletModel = new WalletModel(pwalletMain, &optionsModel);
window.setClientModel(&clientModel);
- window.addWallet("~Default", &walletModel);
- window.setCurrentWallet("~Default");
+ if(walletModel)
+ {
+ window.addWallet("~Default", walletModel);
+ window.setCurrentWallet("~Default");
+ }
// If -min option passed, start window minimized.
if(GetBoolArg("-min", false))
@@ -335,8 +340,11 @@ int main(int argc, char *argv[])
&window, SLOT(handlePaymentRequest(SendCoinsRecipient)));
QObject::connect(&window, SIGNAL(receivedURI(QString)),
paymentServer, SLOT(handleURIOrFile(QString)));
- QObject::connect(&walletModel, SIGNAL(coinsSent(CWallet*,SendCoinsRecipient,QByteArray)),
- paymentServer, SLOT(fetchPaymentACK(CWallet*,const SendCoinsRecipient&,QByteArray)));
+ if(walletModel)
+ {
+ QObject::connect(walletModel, SIGNAL(coinsSent(CWallet*,SendCoinsRecipient,QByteArray)),
+ paymentServer, SLOT(fetchPaymentACK(CWallet*,const SendCoinsRecipient&,QByteArray)));
+ }
QObject::connect(paymentServer, SIGNAL(message(QString,QString,unsigned int)),
guiref, SLOT(message(QString,QString,unsigned int)));
QTimer::singleShot(100, paymentServer, SLOT(uiReady()));
@@ -347,6 +355,7 @@ int main(int argc, char *argv[])
window.setClientModel(0);
window.removeAllWallets();
guiref = 0;
+ delete walletModel;
}
// Shutdown the core and its threads, but don't exit Bitcoin-Qt here
threadGroup.interrupt_all();
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index 8b0aba1b5b..a1becc12ec 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -163,6 +163,9 @@ BitcoinGUI::BitcoinGUI(bool fIsTestnet, QWidget *parent) :
// Install event filter to be able to catch status tip events (QEvent::StatusTip)
this->installEventFilter(this);
+
+ // Initially wallet actions should be disabled
+ setWalletActionsEnabled(false);
}
BitcoinGUI::~BitcoinGUI()
@@ -352,6 +355,7 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel)
bool BitcoinGUI::addWallet(const QString& name, WalletModel *walletModel)
{
+ setWalletActionsEnabled(true);
return walletFrame->addWallet(name, walletModel);
}
@@ -362,9 +366,26 @@ bool BitcoinGUI::setCurrentWallet(const QString& name)
void BitcoinGUI::removeAllWallets()
{
+ setWalletActionsEnabled(false);
walletFrame->removeAllWallets();
}
+void BitcoinGUI::setWalletActionsEnabled(bool enabled)
+{
+ overviewAction->setEnabled(enabled);
+ sendCoinsAction->setEnabled(enabled);
+ receiveCoinsAction->setEnabled(enabled);
+ historyAction->setEnabled(enabled);
+ encryptWalletAction->setEnabled(enabled);
+ backupWalletAction->setEnabled(enabled);
+ changePassphraseAction->setEnabled(enabled);
+ signMessageAction->setEnabled(enabled);
+ verifyMessageAction->setEnabled(enabled);
+ usedSendingAddressesAction->setEnabled(enabled);
+ usedReceivingAddressesAction->setEnabled(enabled);
+ openAction->setEnabled(enabled);
+}
+
void BitcoinGUI::createTrayIcon(bool fIsTestnet)
{
#ifndef Q_OS_MAC
diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h
index acbc38c894..b9a8a03139 100644
--- a/src/qt/bitcoingui.h
+++ b/src/qt/bitcoingui.h
@@ -108,6 +108,9 @@ private:
/** Create system tray menu (or setup the dock menu) */
void createTrayIconMenu();
+ /** Enable or disable all wallet-related actions */
+ void setWalletActionsEnabled(bool enabled);
+
signals:
/** Signal raised when a URI was entered or dragged to the GUI */
void receivedURI(const QString &uri);
diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp
index 04eea59169..fead022928 100644
--- a/src/qt/walletframe.cpp
+++ b/src/qt/walletframe.cpp
@@ -10,6 +10,7 @@
#include <cstdio>
#include <QHBoxLayout>
+#include <QLabel>
WalletFrame::WalletFrame(BitcoinGUI *_gui) :
QFrame(_gui),
@@ -21,6 +22,10 @@ WalletFrame::WalletFrame(BitcoinGUI *_gui) :
walletStack = new QStackedWidget(this);
walletFrameLayout->setContentsMargins(0,0,0,0);
walletFrameLayout->addWidget(walletStack);
+
+ QLabel *noWallet = new QLabel(tr("No wallet has been loaded."));
+ noWallet->setAlignment(Qt::AlignCenter);
+ walletStack->addWidget(noWallet);
}
WalletFrame::~WalletFrame()
@@ -85,7 +90,7 @@ void WalletFrame::removeAllWallets()
bool WalletFrame::handlePaymentRequest(const SendCoinsRecipient &recipient)
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (!walletView)
return false;
@@ -130,56 +135,62 @@ void WalletFrame::gotoSendCoinsPage(QString addr)
void WalletFrame::gotoSignMessageTab(QString addr)
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (walletView)
walletView->gotoSignMessageTab(addr);
}
void WalletFrame::gotoVerifyMessageTab(QString addr)
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (walletView)
walletView->gotoVerifyMessageTab(addr);
}
void WalletFrame::encryptWallet(bool status)
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (walletView)
walletView->encryptWallet(status);
}
void WalletFrame::backupWallet()
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (walletView)
walletView->backupWallet();
}
void WalletFrame::changePassphrase()
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (walletView)
walletView->changePassphrase();
}
void WalletFrame::unlockWallet()
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (walletView)
walletView->unlockWallet();
}
void WalletFrame::usedSendingAddresses()
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (walletView)
walletView->usedSendingAddresses();
}
void WalletFrame::usedReceivingAddresses()
{
- WalletView *walletView = (WalletView*)walletStack->currentWidget();
+ WalletView *walletView = currentWalletView();
if (walletView)
walletView->usedReceivingAddresses();
}
+
+WalletView *WalletFrame::currentWalletView()
+{
+ return qobject_cast<WalletView*>(walletStack->currentWidget());
+}
+
diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h
index 8cfaa0e1d4..f1830a0d6b 100644
--- a/src/qt/walletframe.h
+++ b/src/qt/walletframe.h
@@ -45,6 +45,8 @@ private:
bool bOutOfSync;
+ WalletView *currentWalletView();
+
public slots:
/** Switch to overview (home) page */
void gotoOverviewPage();