mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-26 07:39:56 -06:00
ArchiveUtil : Use QT functions for I/O
* Make it more platform independent, cleaner * Fixes permission related crash on linux Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
This commit is contained in:
@ -18,11 +18,6 @@
|
|||||||
|
|
||||||
#include "ArchiveUtil.h"
|
#include "ArchiveUtil.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <direct.h>
|
|
||||||
#define mkdir(dir, mode) _mkdir(dir)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace Archive
|
namespace Archive
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -82,24 +77,26 @@ QVector<QString> ExtractFileFromArchive(const char* path, const char* wantedFile
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t bytesToWrite = archive_entry_size(entry);
|
size_t bytesToWrite = archive_entry_size(entry);
|
||||||
auto archiveBuffer = std::make_unique<u8[]>(bytesToWrite);
|
QByteArray archiveBuffer(bytesToWrite, '\0');
|
||||||
ssize_t bytesRead = archive_read_data(a, archiveBuffer.get(), bytesToWrite);
|
ssize_t bytesRead = archive_read_data(a, archiveBuffer.data(), bytesToWrite);
|
||||||
|
|
||||||
if (bytesRead < 0)
|
if (bytesRead < 0)
|
||||||
{
|
{
|
||||||
printf(archive_error_string(a));
|
printf(archive_error_string(a));
|
||||||
archiveBuffer.reset(nullptr);
|
|
||||||
return QVector<QString> {"Err", archive_error_string(a)};
|
return QVector<QString> {"Err", archive_error_string(a)};
|
||||||
}
|
}
|
||||||
|
|
||||||
QString extractToFolder = QFileInfo(path).absolutePath() + "/" + QFileInfo(path).baseName();
|
QString extractToFolder = QFileInfo(path).absolutePath() + "/" + QFileInfo(path).baseName();
|
||||||
mkdir(extractToFolder.toUtf8().constData(), 600); // Create directory otherwise fopen will not open the file
|
QDir().mkdir(extractToFolder);
|
||||||
|
|
||||||
QString nameToWrite = extractToFolder + "/" + archive_entry_pathname(entry);
|
QString nameToWrite = extractToFolder + "/" + archive_entry_pathname(entry);
|
||||||
FILE* fileToWrite = fopen(nameToWrite.toUtf8().constData(), "wb");
|
QFile fileToWrite(nameToWrite);
|
||||||
fwrite((char*)archiveBuffer.get(), bytesToWrite, 1, fileToWrite);
|
if(fileToWrite.open(QIODevice::WriteOnly))
|
||||||
fclose(fileToWrite);
|
fileToWrite.write(archiveBuffer);
|
||||||
|
|
||||||
archiveBuffer.reset(nullptr);
|
fileToWrite.close();
|
||||||
archive_read_close(a);
|
archive_read_close(a);
|
||||||
archive_read_free(a);
|
archive_read_free(a);
|
||||||
return QVector<QString> {nameToWrite};
|
return QVector<QString> {nameToWrite};
|
||||||
|
Reference in New Issue
Block a user