qt: Do proper boost::path conversion
Convert from QString unicode from/to the OS-dependent locale as used by boost::filesystem::path as needed. Solves #3916.
This commit is contained in:
parent
e3f5d4338d
commit
7e591c19e7
@ -33,6 +33,9 @@
|
|||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <boost/filesystem/fstream.hpp>
|
#include <boost/filesystem/fstream.hpp>
|
||||||
|
#if BOOST_FILESYSTEM_VERSION >= 3
|
||||||
|
#include <boost/filesystem/detail/utf8_codecvt_facet.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <QAbstractItemView>
|
#include <QAbstractItemView>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
@ -54,6 +57,10 @@
|
|||||||
#include <QUrlQuery>
|
#include <QUrlQuery>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if BOOST_FILESYSTEM_VERSION >= 3
|
||||||
|
static boost::filesystem::detail::utf8_codecvt_facet utf8;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace GUIUtil {
|
namespace GUIUtil {
|
||||||
|
|
||||||
QString dateTimeStr(const QDateTime &date)
|
QString dateTimeStr(const QDateTime &date)
|
||||||
@ -352,7 +359,7 @@ void openDebugLogfile()
|
|||||||
|
|
||||||
/* Open debug.log with the associated application */
|
/* Open debug.log with the associated application */
|
||||||
if (boost::filesystem::exists(pathDebug))
|
if (boost::filesystem::exists(pathDebug))
|
||||||
QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(pathDebug.string())));
|
QDesktopServices::openUrl(QUrl::fromLocalFile(boostPathToQString(pathDebug)));
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolTipToRichTextFilter::ToolTipToRichTextFilter(int size_threshold, QObject *parent) :
|
ToolTipToRichTextFilter::ToolTipToRichTextFilter(int size_threshold, QObject *parent) :
|
||||||
@ -718,4 +725,27 @@ void setClipboard(const QString& str)
|
|||||||
QApplication::clipboard()->setText(str, QClipboard::Selection);
|
QApplication::clipboard()->setText(str, QClipboard::Selection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BOOST_FILESYSTEM_VERSION >= 3
|
||||||
|
boost::filesystem::path qstringToBoostPath(const QString &path)
|
||||||
|
{
|
||||||
|
return boost::filesystem::path(path.toStdString(), utf8);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString boostPathToQString(const boost::filesystem::path &path)
|
||||||
|
{
|
||||||
|
return QString::fromStdString(path.string(utf8));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#warning Conversion between boost path and QString can use invalid character encoding with boost_filesystem v2 and older
|
||||||
|
boost::filesystem::path qstringToBoostPath(const QString &path)
|
||||||
|
{
|
||||||
|
return boost::filesystem::path(path.toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString boostPathToQString(const boost::filesystem::path &path)
|
||||||
|
{
|
||||||
|
return QString::fromStdString(path.string());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace GUIUtil
|
} // namespace GUIUtil
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#include <QTableView>
|
#include <QTableView>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
|
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
class QValidatedLineEdit;
|
class QValidatedLineEdit;
|
||||||
class SendCoinsRecipient;
|
class SendCoinsRecipient;
|
||||||
|
|
||||||
@ -164,6 +166,12 @@ namespace GUIUtil
|
|||||||
/** Restore window size and position */
|
/** Restore window size and position */
|
||||||
void restoreWindowGeometry(const QString& strSetting, const QSize &defaultSizeIn, QWidget *parent);
|
void restoreWindowGeometry(const QString& strSetting, const QSize &defaultSizeIn, QWidget *parent);
|
||||||
|
|
||||||
|
/* Convert QString to OS specific boost path through UTF-8 */
|
||||||
|
boost::filesystem::path qstringToBoostPath(const QString &path);
|
||||||
|
|
||||||
|
/* Convert OS specific boost path to QString through UTF-8 */
|
||||||
|
QString boostPathToQString(const boost::filesystem::path &path);
|
||||||
|
|
||||||
} // namespace GUIUtil
|
} // namespace GUIUtil
|
||||||
|
|
||||||
#endif // GUIUTIL_H
|
#endif // GUIUTIL_H
|
||||||
|
@ -5,9 +5,12 @@
|
|||||||
#include "intro.h"
|
#include "intro.h"
|
||||||
#include "ui_intro.h"
|
#include "ui_intro.h"
|
||||||
|
|
||||||
|
#include "guiutil.h"
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
@ -59,7 +62,7 @@ void FreespaceChecker::check()
|
|||||||
{
|
{
|
||||||
namespace fs = boost::filesystem;
|
namespace fs = boost::filesystem;
|
||||||
QString dataDirStr = intro->getPathToCheck();
|
QString dataDirStr = intro->getPathToCheck();
|
||||||
fs::path dataDir = fs::path(dataDirStr.toStdString());
|
fs::path dataDir = GUIUtil::qstringToBoostPath(dataDirStr);
|
||||||
uint64_t freeBytesAvailable = 0;
|
uint64_t freeBytesAvailable = 0;
|
||||||
int replyStatus = ST_OK;
|
int replyStatus = ST_OK;
|
||||||
QString replyMessage = tr("A new data directory will be created.");
|
QString replyMessage = tr("A new data directory will be created.");
|
||||||
@ -143,7 +146,7 @@ void Intro::setDataDirectory(const QString &dataDir)
|
|||||||
|
|
||||||
QString Intro::getDefaultDataDirectory()
|
QString Intro::getDefaultDataDirectory()
|
||||||
{
|
{
|
||||||
return QString::fromStdString(GetDefaultDataDir().string());
|
return GUIUtil::boostPathToQString(GetDefaultDataDir());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Intro::pickDataDirectory()
|
void Intro::pickDataDirectory()
|
||||||
@ -159,7 +162,7 @@ void Intro::pickDataDirectory()
|
|||||||
/* 2) Allow QSettings to override default dir */
|
/* 2) Allow QSettings to override default dir */
|
||||||
dataDir = settings.value("strDataDir", dataDir).toString();
|
dataDir = settings.value("strDataDir", dataDir).toString();
|
||||||
|
|
||||||
if(!fs::exists(dataDir.toStdString()) || GetBoolArg("-choosedatadir", false))
|
if(!fs::exists(GUIUtil::qstringToBoostPath(dataDir)) || GetBoolArg("-choosedatadir", false))
|
||||||
{
|
{
|
||||||
/* If current default data directory does not exist, let the user choose one */
|
/* If current default data directory does not exist, let the user choose one */
|
||||||
Intro intro;
|
Intro intro;
|
||||||
@ -175,7 +178,7 @@ void Intro::pickDataDirectory()
|
|||||||
}
|
}
|
||||||
dataDir = intro.getDataDirectory();
|
dataDir = intro.getDataDirectory();
|
||||||
try {
|
try {
|
||||||
fs::create_directory(dataDir.toStdString());
|
fs::create_directory(GUIUtil::qstringToBoostPath(dataDir));
|
||||||
break;
|
break;
|
||||||
} catch(fs::filesystem_error &e) {
|
} catch(fs::filesystem_error &e) {
|
||||||
QMessageBox::critical(0, tr("Bitcoin"),
|
QMessageBox::critical(0, tr("Bitcoin"),
|
||||||
@ -186,7 +189,7 @@ void Intro::pickDataDirectory()
|
|||||||
|
|
||||||
settings.setValue("strDataDir", dataDir);
|
settings.setValue("strDataDir", dataDir);
|
||||||
}
|
}
|
||||||
SoftSetArg("-datadir", dataDir.toStdString());
|
SoftSetArg("-datadir", GUIUtil::qstringToBoostPath(dataDir).string()); // use OS locale for path setting
|
||||||
}
|
}
|
||||||
|
|
||||||
void Intro::setStatus(int status, const QString &message, quint64 bytesAvailable)
|
void Intro::setStatus(int status, const QString &message, quint64 bytesAvailable)
|
||||||
|
Loading…
Reference in New Issue
Block a user