5 #if defined(HAVE_CONFIG_H)
6 #include "config/bitcoin-config.h"
16 #include <boost/filesystem.hpp>
18 #include <QFileDialog>
20 #include <QMessageBox>
24 static const uint64_t GB_BYTES = 1000000000LL;
26 static const uint64_t BLOCK_CHAIN_SIZE = 55;
28 static const uint64_t CHAIN_STATE_SIZE = 2;
30 static uint64_t requiredSpace;
58 void reply(
int status,
const QString &message, quint64 available);
73 namespace fs = boost::filesystem;
76 uint64_t freeBytesAvailable = 0;
77 int replyStatus =
ST_OK;
78 QString replyMessage = tr(
"A new data directory will be created.");
81 fs::path parentDir = dataDir;
82 fs::path parentDirOld = fs::path();
83 while(parentDir.has_parent_path() && !fs::exists(parentDir))
85 parentDir = parentDir.parent_path();
88 if (parentDirOld == parentDir)
91 parentDirOld = parentDir;
95 freeBytesAvailable = fs::space(parentDir).available;
96 if(fs::exists(dataDir))
98 if(fs::is_directory(dataDir))
100 QString separator =
"<code>" + QDir::toNativeSeparators(
"/") + tr(
"name") +
"</code>";
102 replyMessage = tr(
"Directory already exists. Add %1 if you intend to create a new directory here.").arg(separator);
105 replyMessage = tr(
"Path already exists, and is not a directory.");
108 }
catch (
const fs::filesystem_error&)
112 replyMessage = tr(
"Cannot create data directory here.");
114 Q_EMIT
reply(replyStatus, replyMessage, freeBytesAvailable);
125 ui->welcomeLabel->setText(
ui->welcomeLabel->text().arg(tr(PACKAGE_NAME)));
126 ui->storageLabel->setText(
ui->storageLabel->text().arg(tr(PACKAGE_NAME)));
127 uint64_t pruneTarget = std::max<int64_t>(0,
GetArg(
"-prune", 0));
128 requiredSpace = BLOCK_CHAIN_SIZE;
130 uint64_t prunedGBs = std::ceil(pruneTarget * 1024 * 1024.0 / GB_BYTES);
131 if (prunedGBs <= requiredSpace) {
132 requiredSpace = prunedGBs;
135 requiredSpace += CHAIN_STATE_SIZE;
136 ui->sizeWarningLabel->setText(
ui->sizeWarningLabel->text().arg(tr(PACKAGE_NAME)).arg(requiredSpace));
150 return ui->dataDirectory->text();
155 ui->dataDirectory->setText(dataDir);
158 ui->dataDirDefault->setChecked(
true);
159 ui->dataDirectory->setEnabled(
false);
160 ui->ellipsisButton->setEnabled(
false);
162 ui->dataDirCustom->setChecked(
true);
163 ui->dataDirectory->setEnabled(
true);
164 ui->ellipsisButton->setEnabled(
true);
175 namespace fs = boost::filesystem;
179 if(!
GetArg(
"-datadir",
"").empty())
184 dataDir = settings.value(
"strDataDir", dataDir).toString();
191 intro.setWindowIcon(QIcon(
":icons/bitcoin"));
204 }
catch (
const fs::filesystem_error&) {
205 QMessageBox::critical(0, tr(PACKAGE_NAME),
206 tr(
"Error: Specified data directory \"%1\" cannot be created.").arg(dataDir));
211 settings.setValue(
"strDataDir", dataDir);
212 settings.setValue(
"fReset",
false);
228 ui->errorMessage->setText(message);
229 ui->errorMessage->setStyleSheet(
"");
232 ui->errorMessage->setText(tr(
"Error") +
": " + message);
233 ui->errorMessage->setStyleSheet(
"QLabel { color: #800000 }");
239 ui->freeSpace->setText(
"");
241 QString freeString = tr(
"%n GB of free space available",
"", bytesAvailable/GB_BYTES);
242 if(bytesAvailable < requiredSpace * GB_BYTES)
244 freeString +=
" " + tr(
"(of %n GB needed)",
"", requiredSpace);
245 ui->freeSpace->setStyleSheet(
"QLabel { color: #800000 }");
247 ui->freeSpace->setStyleSheet(
"");
249 ui->freeSpace->setText(freeString +
".");
258 ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
false);
264 QString dir = QDir::toNativeSeparators(QFileDialog::getExistingDirectory(0,
"Choose data directory",
ui->dataDirectory->text()));
266 ui->dataDirectory->setText(dir);
276 ui->dataDirectory->setEnabled(
true);
277 ui->ellipsisButton->setEnabled(
true);
282 thread =
new QThread(
this);
284 executor->moveToThread(
thread);
286 connect(executor, SIGNAL(reply(
int,QString,quint64)),
this, SLOT(
setStatus(
int,QString,quint64)));
287 connect(
this, SIGNAL(
requestCheck()), executor, SLOT(check()));
289 connect(
this, SIGNAL(
stopThread()), executor, SLOT(deleteLater()));
FreespaceChecker(Intro *intro)
void reply(int status, const QString &message, quint64 available)
Introduction screen (pre-GUI startup).
void setStatus(int status, const QString &message, quint64 bytesAvailable)
void on_ellipsisButton_clicked()
void setDataDirectory(const QString &dataDir)
static bool pickDataDirectory()
Determine data directory.
friend class FreespaceChecker
void on_dataDirectory_textChanged(const QString &arg1)
static QString getDefaultDataDirectory()
Determine default data directory for operating system.
QString getDataDirectory()
void checkPath(const QString &dataDir)
void on_dataDirDefault_clicked()
void on_dataDirCustom_clicked()
boost::filesystem::path qstringToBoostPath(const QString &path)
QString boostPathToQString(const boost::filesystem::path &path)
std::string GetArg(const std::string &strArg, const std::string &strDefault)
Return string argument or default value.
bool TryCreateDirectory(const boost::filesystem::path &p)
Ignores exceptions thrown by Boost's create_directory if the requested directory exists.
bool GetBoolArg(const std::string &strArg, bool fDefault)
Return boolean argument or default value.
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Set an argument if it doesn't already have a value.
boost::filesystem::path GetDefaultDataDir()