Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BugFix: Error popup on insufficient permissions during memcard conversion #11825

Merged
merged 1 commit into from
Sep 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/scripts/linux/build-dependencies-qt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ aa27e4454ce631c5a17924ce0624eac736da19fc6f5a2ab15a6c58da7b36950f shaderc-glslan
03ee1a2c06f3b61008478f4abe9423454e53e580b9488b47c8071547c6a9db47 shaderc-spirv-tools-$SHADERC_SPIRVTOOLS.tar.gz
EOF

curl -C - -L \
curl -L \
-O "https://github.com/ianlancetaylor/libbacktrace/archive/$LIBBACKTRACE.zip" \
-O "https://ijg.org/files/jpegsrc.v$LIBJPEG.tar.gz" \
-O "https://downloads.sourceforge.net/project/libpng/libpng16/$LIBPNG/libpng-$LIBPNG.tar.xz" \
Expand Down
41 changes: 31 additions & 10 deletions pcsx2-qt/Settings/MemoryCardConvertDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <QtWidgets/QProgressDialog>

#include "common/Console.h"
#include "common/Error.h"
#include "common/Path.h"
#include "common/StringUtil.h"

Expand Down Expand Up @@ -36,7 +37,7 @@ MemoryCardConvertDialog::MemoryCardConvertDialog(QWidget* parent, QString select
m_ui.progressBar->setRange(0, 100);
m_ui.progressBar->setValue(0);

connect(m_ui.conversionTypeSelect, &QComboBox::currentIndexChanged, this, [this]()
connect(m_ui.conversionTypeSelect, &QComboBox::currentIndexChanged, this, [this]()
{
switch (m_srcCardInfo.type)
{
Expand Down Expand Up @@ -71,7 +72,7 @@ MemoryCardConvertDialog::MemoryCardConvertDialog(QWidget* parent, QString select
}
}
);

disconnect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, nullptr);

connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, this, &MemoryCardConvertDialog::ConvertCard);
Expand Down Expand Up @@ -154,7 +155,7 @@ bool MemoryCardConvertDialog::SetupPicklist()
for (auto dirEntry : rootDir)
{
const std::string_view fileName = Path::GetFileName(dirEntry.FileName);

if (fileName.size() >= 7 && fileName.substr(0, 7).compare("_pcsx2_") == 0)
{
continue;
Expand All @@ -176,7 +177,7 @@ bool MemoryCardConvertDialog::SetupPicklist()
if (sizeBytes < CardCapacity::_8_MB)
{
m_ui.conversionTypeSelect->addItem(tr("8 MB File"), 8);

if (!typeSet)
{
SetType_8();
Expand All @@ -187,7 +188,7 @@ bool MemoryCardConvertDialog::SetupPicklist()
if (sizeBytes < CardCapacity::_16_MB)
{
m_ui.conversionTypeSelect->addItem(tr("16 MB File"), 16);

if (!typeSet)
{
SetType_16();
Expand All @@ -198,7 +199,7 @@ bool MemoryCardConvertDialog::SetupPicklist()
if (sizeBytes < CardCapacity::_32_MB)
{
m_ui.conversionTypeSelect->addItem(tr("32 MB File"), 32);

if (!typeSet)
{
SetType_32();
Expand All @@ -209,7 +210,7 @@ bool MemoryCardConvertDialog::SetupPicklist()
if (sizeBytes < CardCapacity::_64_MB)
{
m_ui.conversionTypeSelect->addItem(tr("64 MB File"), 64);

if (!typeSet)
{
SetType_64();
Expand Down Expand Up @@ -242,7 +243,7 @@ void MemoryCardConvertDialog::ConvertCard()
else
{
QString baseName = m_selectedCard;

// Get our destination file name
size_t extensionPos = baseName.lastIndexOf(".ps2", -1);
// Strip the extension off of it
Expand All @@ -253,15 +254,30 @@ void MemoryCardConvertDialog::ConvertCard()
size_t num = 0;
QString destName = baseName;
destName.append(".ps2");

// If a match is found, revert back to the base name, add a number and the extension, and try again.
// Keep incrementing the number until we get a unique result.
while (m_srcCardInfo.type == MemoryCardType::File ? FileSystem::DirectoryExists(Path::Combine(EmuFolders::MemoryCards, destName.toStdString()).c_str()) : FileSystem::FileExists(Path::Combine(EmuFolders::MemoryCards, destName.toStdString()).c_str()))
{
destName = baseName;
destName.append(StringUtil::StdStringFromFormat("_%02zd.ps2", ++num).c_str());
}


// Check if we have write permission in the memory card directory
const std::string destPath = Path::Combine(EmuFolders::MemoryCards, destName.toStdString());
Error error;
FILE* tmpFile = FileSystem::OpenCFile(destPath.c_str(), "w", &error);
if (tmpFile == nullptr)
{
FileOpenError(error.GetDescription().c_str());
return;
}
else
{
fclose(tmpFile);
FileSystem::DeleteFilePath(destPath.c_str());
}

m_destCardName = destName;
StartThread();
}
Expand Down Expand Up @@ -303,3 +319,8 @@ void MemoryCardConvertDialog::SetType_Folder()
{
SetType(MemoryCardType::Folder, MemoryCardFileType::Unknown, tr("Uses a folder on your PC filesystem, instead of a file. Infinite capacity, while keeping the same compatibility as an 8 MB Memory Card."));
}

void MemoryCardConvertDialog::FileOpenError(const QString errmsg)
{
QMessageBox::critical(this, tr("Cannot Convert Memory Card"),tr("There was an error when accessing the memory card directory. Error message: %0").arg(errmsg));
}
1 change: 1 addition & 0 deletions pcsx2-qt/Settings/MemoryCardConvertDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ private Q_SLOTS:
void SetType_32();
void SetType_64();
void SetType_Folder();
void FileOpenError(const QString errmsg);

Ui::MemoryCardConvertDialog m_ui;

Expand Down