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:
Wladimir J. van der Laan 2014-03-22 10:22:42 +01:00
parent e3f5d4338d
commit 7e591c19e7
3 changed files with 47 additions and 6 deletions

View File

@ -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

View File

@ -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

View File

@ -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)