Use _wopen under Windows to support unicode filenames

This commit is contained in:
Martchus 2016-12-19 23:53:12 +01:00
parent 77da65ddf7
commit e75ea5526a
9 changed files with 31 additions and 15 deletions

View File

@ -205,7 +205,7 @@ include(BasicConfig)
# find qtutilities # find qtutilities
if(WIDGETS_GUI OR QUICK_GUI) if(WIDGETS_GUI OR QUICK_GUI)
find_package(qtutilities 5.0.0 REQUIRED) find_package(qtutilities 5.3.0 REQUIRED)
use_qt_utilities() use_qt_utilities()
endif() endif()

View File

@ -18,6 +18,7 @@
#include <c++utilities/conversion/conversionexception.h> #include <c++utilities/conversion/conversionexception.h>
#include <c++utilities/io/ansiescapecodes.h> #include <c++utilities/io/ansiescapecodes.h>
#include <c++utilities/io/catchiofailure.h> #include <c++utilities/io/catchiofailure.h>
#include <c++utilities/io/nativefilestream.h>
#include <c++utilities/misc/memory.h> #include <c++utilities/misc/memory.h>
#if defined(GUI_QTWIDGETS) || defined(GUI_QTQUICK) #if defined(GUI_QTWIDGETS) || defined(GUI_QTQUICK)
@ -34,6 +35,7 @@ using namespace std;
using namespace ApplicationUtilities; using namespace ApplicationUtilities;
using namespace ConversionUtilities; using namespace ConversionUtilities;
using namespace ChronoUtilities; using namespace ChronoUtilities;
using namespace IoUtilities;
using namespace EscapeCodes; using namespace EscapeCodes;
using namespace Settings; using namespace Settings;
using namespace Media; using namespace Media;
@ -958,6 +960,7 @@ void displayTagInfo(const Argument &fieldsArg, const Argument &filesArg, const A
fileInfo.open(true); fileInfo.open(true);
fileInfo.parseContainerFormat(); fileInfo.parseContainerFormat();
fileInfo.parseTags(); fileInfo.parseTags();
cout << file << endl;
cout << "Tag information for \"" << file << "\":" << endl; cout << "Tag information for \"" << file << "\":" << endl;
const auto tags = fileInfo.tags(); const auto tags = fileInfo.tags();
if(!tags.empty()) { if(!tags.empty()) {
@ -1379,7 +1382,7 @@ void extractField(const Argument &fieldArg, const Argument &attachmentArg, const
outputFileExtension = BasicFileInfo::extension(outputFileArg.values().front()); outputFileExtension = BasicFileInfo::extension(outputFileArg.values().front());
} }
for(const auto &value : values) { for(const auto &value : values) {
fstream outputFileStream; NativeFileStream outputFileStream;
outputFileStream.exceptions(ios_base::failbit | ios_base::badbit); outputFileStream.exceptions(ios_base::failbit | ios_base::badbit);
auto path = values.size() > 1 ? joinStrings({outputFilePathWithoutExtension, "-", value.second, outputFileExtension}) : outputFileArg.values().front(); auto path = values.size() > 1 ? joinStrings({outputFilePathWithoutExtension, "-", value.second, outputFileExtension}) : outputFileArg.values().front();
try { try {
@ -1427,7 +1430,7 @@ void extractField(const Argument &fieldArg, const Argument &attachmentArg, const
outputFileExtension = BasicFileInfo::extension(outputFileArg.values().front()); outputFileExtension = BasicFileInfo::extension(outputFileArg.values().front());
} }
for(const auto &attachment : attachments) { for(const auto &attachment : attachments) {
fstream outputFileStream; NativeFileStream outputFileStream;
outputFileStream.exceptions(ios_base::failbit | ios_base::badbit); outputFileStream.exceptions(ios_base::failbit | ios_base::badbit);
auto path = attachments.size() > 1 ? joinStrings({outputFilePathWithoutExtension, "-", attachment.second, outputFileExtension}) : outputFileArg.values().front(); auto path = attachments.size() > 1 ? joinStrings({outputFilePathWithoutExtension, "-", attachment.second, outputFileExtension}) : outputFileArg.values().front();
try { try {

View File

@ -132,7 +132,7 @@ inline void HttpResultsModel::addReply(QNetworkReply *reply, Object object, Func
{ {
(m_replies << reply), connect(reply, &QNetworkReply::finished, object, handler); (m_replies << reply), connect(reply, &QNetworkReply::finished, object, handler);
#ifdef DEBUG_BUILD #ifdef DEBUG_BUILD
std::cerr << "HTTP query: " << reply->url().toString().toLocal8Bit().data() << std::endl; std::cerr << "HTTP query: " << reply->url().toString().toUtf8().data() << std::endl;
#endif #endif
} }
@ -145,7 +145,7 @@ inline void HttpResultsModel::addReply(QNetworkReply *reply, Function handler)
{ {
(m_replies << reply), connect(reply, &QNetworkReply::finished, handler); (m_replies << reply), connect(reply, &QNetworkReply::finished, handler);
#ifdef DEBUG_BUILD #ifdef DEBUG_BUILD
std::cerr << "HTTP query: " << reply->url().toString().toLocal8Bit().data() << std::endl; std::cerr << "HTTP query: " << reply->url().toString().toUtf8().data() << std::endl;
#endif #endif
} }

View File

@ -7,8 +7,11 @@
#include <tagparser/mediafileinfo.h> #include <tagparser/mediafileinfo.h>
#include <tagparser/abstractattachment.h> #include <tagparser/abstractattachment.h>
#include <qtutilities/misc/conversion.h>
#include <c++utilities/io/copy.h> #include <c++utilities/io/copy.h>
#include <c++utilities/io/catchiofailure.h> #include <c++utilities/io/catchiofailure.h>
#include <c++utilities/io/nativefilestream.h>
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox> #include <QMessageBox>
@ -17,6 +20,7 @@
using namespace std; using namespace std;
using namespace IoUtilities; using namespace IoUtilities;
using namespace ConversionUtilities;
using namespace Media; using namespace Media;
namespace QtGui { namespace QtGui {
@ -91,7 +95,7 @@ void AttachmentsEdit::addFile(const QString &path)
// create and add attachment // create and add attachment
auto *attachment = fileInfo()->container()->createAttachment(); auto *attachment = fileInfo()->container()->createAttachment();
attachment->setIgnored(true); attachment->setIgnored(true);
attachment->setFile(path.toLocal8Bit().data()); attachment->setFile(toNativeFileName(path).data());
m_addedAttachments << attachment; m_addedAttachments << attachment;
m_model->addAttachment(-1, attachment, true, path); m_model->addAttachment(-1, attachment, true, path);
} else { } else {
@ -124,11 +128,11 @@ void AttachmentsEdit::extractSelected()
if(!fileName.isEmpty()) { if(!fileName.isEmpty()) {
auto *data = attachment->data(); auto *data = attachment->data();
auto &input = attachment->data()->stream(); auto &input = attachment->data()->stream();
fstream file; NativeFileStream file;
file.exceptions(ios_base::badbit | ios_base::failbit); file.exceptions(ios_base::badbit | ios_base::failbit);
try { try {
input.seekg(data->startOffset()); input.seekg(data->startOffset());
file.open(fileName.toLocal8Bit().data(), ios_base::out | ios_base::binary); file.open(toNativeFileName(fileName).data(), ios_base::out | ios_base::binary);
CopyHelper<0x1000> helper; CopyHelper<0x1000> helper;
helper.copy(input, file, data->size()); helper.copy(input, file, data->size());
} catch(...) { } catch(...) {

View File

@ -97,7 +97,7 @@ Media::TagTarget EnterTargetDialog::target() const
{ {
TagTarget target; TagTarget target;
target.setLevel(static_cast<uint64>(m_ui->levelSpinBox->value())); target.setLevel(static_cast<uint64>(m_ui->levelSpinBox->value()));
target.setLevelName(m_ui->levelNameLineEdit->text().toLocal8Bit().data()); target.setLevelName(m_ui->levelNameLineEdit->text().toUtf8().data());
addIds(target.tracks(), m_tracksModel); addIds(target.tracks(), m_tracksModel);
addIds(target.chapters(), m_chaptersModel); addIds(target.chapters(), m_chaptersModel);
addIds(target.editions(), m_editionsModel); addIds(target.editions(), m_editionsModel);

View File

@ -16,6 +16,7 @@
#include <qtutilities/misc/dialogutils.h> #include <qtutilities/misc/dialogutils.h>
#include <qtutilities/misc/desktoputils.h> #include <qtutilities/misc/desktoputils.h>
#include <qtutilities/misc/trylocker.h> #include <qtutilities/misc/trylocker.h>
#include <qtutilities/misc/conversion.h>
#include <c++utilities/conversion/stringconversion.h> #include <c++utilities/conversion/stringconversion.h>
#include <c++utilities/io/path.h> #include <c++utilities/io/path.h>
@ -34,6 +35,7 @@ using namespace Media;
using namespace Dialogs; using namespace Dialogs;
using namespace Widgets; using namespace Widgets;
using namespace ThreadingUtils; using namespace ThreadingUtils;
using namespace ConversionUtilities;
namespace QtGui { namespace QtGui {
@ -502,7 +504,7 @@ void MainWindow::showSaveAsDlg()
const QString path = QFileDialog::getSaveFileName(this, tr("Save changes as - ") + QCoreApplication::applicationName(), const QString path = QFileDialog::getSaveFileName(this, tr("Save changes as - ") + QCoreApplication::applicationName(),
m_ui->tagEditorWidget->currentDir()); m_ui->tagEditorWidget->currentDir());
if(!path.isEmpty()) { if(!path.isEmpty()) {
m_ui->tagEditorWidget->fileInfo().setSaveFilePath(path.toLocal8Bit().data()); m_ui->tagEditorWidget->fileInfo().setSaveFilePath(toNativeFileName(path).data());
m_ui->tagEditorWidget->applyEntriesAndSaveChangings(); m_ui->tagEditorWidget->applyEntriesAndSaveChangings();
} }
} }

View File

@ -12,6 +12,8 @@
#include <tagparser/vorbis/vorbiscomment.h> #include <tagparser/vorbis/vorbiscomment.h>
#include <tagparser/vorbis/vorbiscommentfield.h> #include <tagparser/vorbis/vorbiscommentfield.h>
#include <qtutilities/misc/conversion.h>
#include <c++utilities/misc/memory.h> #include <c++utilities/misc/memory.h>
#include <c++utilities/io/catchiofailure.h> #include <c++utilities/io/catchiofailure.h>
@ -37,6 +39,7 @@
using namespace std; using namespace std;
using namespace Media; using namespace Media;
using namespace ConversionUtilities;
namespace QtGui { namespace QtGui {
@ -314,7 +317,7 @@ void PicturePreviewSelection::addOfSelectedType(const QString &path)
assert(m_currentTypeIndex < static_cast<unsigned int>(m_values.size())); assert(m_currentTypeIndex < static_cast<unsigned int>(m_values.size()));
TagValue &selectedCover = m_values[m_currentTypeIndex]; TagValue &selectedCover = m_values[m_currentTypeIndex];
try { try {
MediaFileInfo fileInfo(path.toLocal8Bit().constData()); MediaFileInfo fileInfo(toNativeFileName(path).constData());
fileInfo.open(true); fileInfo.open(true);
fileInfo.parseContainerFormat(); fileInfo.parseContainerFormat();
auto mimeType = QString::fromLocal8Bit(fileInfo.mimeType()); auto mimeType = QString::fromLocal8Bit(fileInfo.mimeType());
@ -327,7 +330,7 @@ void PicturePreviewSelection::addOfSelectedType(const QString &path)
fileInfo.stream().seekg(0); fileInfo.stream().seekg(0);
fileInfo.stream().read(buff.get(), fileInfo.size()); fileInfo.stream().read(buff.get(), fileInfo.size());
selectedCover.assignData(std::move(buff), fileInfo.size(), TagDataType::Picture); selectedCover.assignData(std::move(buff), fileInfo.size(), TagDataType::Picture);
selectedCover.setMimeType(mimeType.toLocal8Bit().constData()); selectedCover.setMimeType(mimeType.toUtf8().constData());
emit pictureChanged(); emit pictureChanged();
} }
} }
@ -438,7 +441,7 @@ void PicturePreviewSelection::changeMimeTypeOfSelected()
bool ok; bool ok;
mimeType = QInputDialog::getText(this, tr("Enter/confirm mime type"), tr("Confirm or enter the mime type of the selected file."), QLineEdit::Normal, mimeType, &ok); mimeType = QInputDialog::getText(this, tr("Enter/confirm mime type"), tr("Confirm or enter the mime type of the selected file."), QLineEdit::Normal, mimeType, &ok);
if(ok) { if(ok) {
selectedCover.setMimeType(mimeType.toLocal8Bit().data()); selectedCover.setMimeType(mimeType.toUtf8().data());
} }
} }

View File

@ -22,6 +22,7 @@
#include <tagparser/ogg/oggcontainer.h> #include <tagparser/ogg/oggcontainer.h>
#include <qtutilities/misc/dialogutils.h> #include <qtutilities/misc/dialogutils.h>
#include <qtutilities/misc/conversion.h>
#include <qtutilities/widgets/clearlineedit.h> #include <qtutilities/widgets/clearlineedit.h>
#include <c++utilities/conversion/stringconversion.h> #include <c++utilities/conversion/stringconversion.h>
@ -57,6 +58,7 @@ using namespace Dialogs;
using namespace Widgets; using namespace Widgets;
using namespace Media; using namespace Media;
using namespace Models; using namespace Models;
using namespace ConversionUtilities;
namespace QtGui { namespace QtGui {
@ -738,7 +740,7 @@ bool TagEditorWidget::startParsing(const QString &path, bool forceRefresh)
// set path of file info // set path of file info
m_currentPath = path; m_currentPath = path;
m_fileInfo.setSaveFilePath(string()); m_fileInfo.setSaveFilePath(string());
m_fileInfo.setPath(path.toLocal8Bit().data()); m_fileInfo.setPath(toNativeFileName(path).data());
// update file name and directory // update file name and directory
QFileInfo fileInfo(path); QFileInfo fileInfo(path);
m_lastDir = m_currentDir; m_lastDir = m_currentDir;

View File

@ -10,6 +10,8 @@
#include <tagparser/tagvalue.h> #include <tagparser/tagvalue.h>
#include <tagparser/exceptions.h> #include <tagparser/exceptions.h>
#include <qtutilities/misc/conversion.h>
#include <c++utilities/conversion/conversionexception.h> #include <c++utilities/conversion/conversionexception.h>
#include <c++utilities/io/catchiofailure.h> #include <c++utilities/io/catchiofailure.h>
@ -135,7 +137,7 @@ const QString &TagEditorObject::newRelativeDirectory() const
TAGEDITOR_JS_VALUE TagEditorObject::parseFileInfo(const QString &fileName) TAGEDITOR_JS_VALUE TagEditorObject::parseFileInfo(const QString &fileName)
{ {
MediaFileInfo fileInfo(fileName.toLocal8Bit().data()); MediaFileInfo fileInfo(toNativeFileName(fileName).data());
auto fileInfoObject = m_engine->newObject(); auto fileInfoObject = m_engine->newObject();
fileInfoObject.setProperty(QStringLiteral("currentName"), QString::fromLocal8Bit(fileInfo.fileName(false).data())); fileInfoObject.setProperty(QStringLiteral("currentName"), QString::fromLocal8Bit(fileInfo.fileName(false).data()));