mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-29 17:19:54 -06:00
Custom path support (#1333)
also including: * getting rid of shitty strings * all new, cleaner ROM handling code * base for DSi savestates * GBA slot addons (for now, memory cart)
This commit is contained in:
@ -17,52 +17,37 @@
|
||||
*/
|
||||
|
||||
#include "ArchiveUtil.h"
|
||||
#include "Platform.h"
|
||||
|
||||
namespace Archive
|
||||
{
|
||||
|
||||
QVector<QString> ListArchive(const char* path)
|
||||
#ifdef __WIN32__
|
||||
#define melon_archive_open(a, f, b) archive_read_open_filename_w(a, (const wchar_t*)f.utf16(), b)
|
||||
#else
|
||||
#define melon_archive_open(a, f, b) archive_read_open_filename(a, f.toUtf8().constData(), b)
|
||||
#endif // __WIN32__
|
||||
|
||||
bool compareCI(const QString& s1, const QString& s2)
|
||||
{
|
||||
return s1.toLower() < s2.toLower();
|
||||
}
|
||||
|
||||
QVector<QString> ListArchive(QString path)
|
||||
{
|
||||
struct archive *a;
|
||||
struct archive_entry *entry;
|
||||
int r;
|
||||
|
||||
QVector<QString> fileList = {"OK"};
|
||||
|
||||
QVector<QString> fileList;
|
||||
|
||||
a = archive_read_new();
|
||||
|
||||
archive_read_support_filter_all(a);
|
||||
archive_read_support_format_all(a);
|
||||
r = archive_read_open_filename(a, path, 10240);
|
||||
if (r != ARCHIVE_OK)
|
||||
{
|
||||
return QVector<QString> {"Err"};
|
||||
}
|
||||
|
||||
while (archive_read_next_header(a, &entry) == ARCHIVE_OK)
|
||||
{
|
||||
fileList.push_back(archive_entry_pathname(entry));
|
||||
archive_read_data_skip(a);
|
||||
}
|
||||
archive_read_close(a);
|
||||
archive_read_free(a);
|
||||
if (r != ARCHIVE_OK)
|
||||
{
|
||||
return QVector<QString> {"Err"};
|
||||
}
|
||||
|
||||
return fileList;
|
||||
}
|
||||
|
||||
QVector<QString> ExtractFileFromArchive(const char* path, const char* wantedFile, QByteArray *romBuffer)
|
||||
{
|
||||
struct archive *a = archive_read_new();
|
||||
struct archive_entry *entry;
|
||||
int r;
|
||||
|
||||
archive_read_support_format_all(a);
|
||||
archive_read_support_filter_all(a);
|
||||
|
||||
r = archive_read_open_filename(a, path, 10240);
|
||||
//r = archive_read_open_filename(a, path, 10240);
|
||||
r = melon_archive_open(a, path, 10240);
|
||||
if (r != ARCHIVE_OK)
|
||||
{
|
||||
return QVector<QString> {"Err"};
|
||||
@ -70,7 +55,46 @@ QVector<QString> ExtractFileFromArchive(const char* path, const char* wantedFile
|
||||
|
||||
while (archive_read_next_header(a, &entry) == ARCHIVE_OK)
|
||||
{
|
||||
if (strcmp(wantedFile, archive_entry_pathname(entry)) == 0)
|
||||
if (archive_entry_filetype(entry) != AE_IFREG)
|
||||
continue;
|
||||
|
||||
fileList.push_back(archive_entry_pathname_utf8(entry));
|
||||
archive_read_data_skip(a);
|
||||
}
|
||||
|
||||
archive_read_close(a);
|
||||
archive_read_free(a);
|
||||
|
||||
if (r != ARCHIVE_OK)
|
||||
{
|
||||
return QVector<QString> {"Err"};
|
||||
}
|
||||
|
||||
std::stable_sort(fileList.begin(), fileList.end(), compareCI);
|
||||
fileList.prepend("OK");
|
||||
|
||||
return fileList;
|
||||
}
|
||||
|
||||
QVector<QString> ExtractFileFromArchive(QString path, QString wantedFile, QByteArray *romBuffer)
|
||||
{
|
||||
struct archive *a = archive_read_new();
|
||||
struct archive_entry *entry;
|
||||
int r;
|
||||
|
||||
archive_read_support_format_all(a);
|
||||
archive_read_support_filter_all(a);
|
||||
|
||||
//r = archive_read_open_filename(a, path, 10240);
|
||||
r = melon_archive_open(a, path, 10240);
|
||||
if (r != ARCHIVE_OK)
|
||||
{
|
||||
return QVector<QString> {"Err"};
|
||||
}
|
||||
|
||||
while (archive_read_next_header(a, &entry) == ARCHIVE_OK)
|
||||
{
|
||||
if (strcmp(wantedFile.toUtf8().constData(), archive_entry_pathname_utf8(entry)) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
@ -92,7 +116,45 @@ QVector<QString> ExtractFileFromArchive(const char* path, const char* wantedFile
|
||||
|
||||
}
|
||||
|
||||
u32 ExtractFileFromArchive(const char* path, const char* wantedFile, u8 **romdata)
|
||||
u32 ExtractFileFromArchive(QString path, QString wantedFile, u8** filedata, u32* filesize)
|
||||
{
|
||||
struct archive *a = archive_read_new();
|
||||
struct archive_entry *entry;
|
||||
int r;
|
||||
|
||||
if (!filedata) return -1;
|
||||
|
||||
archive_read_support_format_all(a);
|
||||
archive_read_support_filter_all(a);
|
||||
|
||||
//r = archive_read_open_filename(a, path, 10240);
|
||||
r = melon_archive_open(a, path, 10240);
|
||||
if (r != ARCHIVE_OK)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (archive_read_next_header(a, &entry) == ARCHIVE_OK)
|
||||
{
|
||||
if (strcmp(wantedFile.toUtf8().constData(), archive_entry_pathname_utf8(entry)) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
size_t bytesToRead = archive_entry_size(entry);
|
||||
if (filesize) *filesize = bytesToRead;
|
||||
*filedata = new u8[bytesToRead];
|
||||
ssize_t bytesRead = archive_read_data(a, *filedata, bytesToRead);
|
||||
|
||||
archive_read_close(a);
|
||||
archive_read_free(a);
|
||||
|
||||
return (u32)bytesRead;
|
||||
|
||||
}
|
||||
|
||||
/*u32 ExtractFileFromArchive(const char* path, const char* wantedFile, u8 **romdata)
|
||||
{
|
||||
QByteArray romBuffer;
|
||||
QVector<QString> extractResult = ExtractFileFromArchive(path, wantedFile, &romBuffer);
|
||||
@ -107,6 +169,6 @@ u32 ExtractFileFromArchive(const char* path, const char* wantedFile, u8 **romdat
|
||||
memcpy(*romdata, romBuffer.data(), len);
|
||||
|
||||
return len;
|
||||
}
|
||||
}*/
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user