more work. also, make archive shito somewhat better.

This commit is contained in:
Arisotura
2021-12-26 00:46:24 +01:00
parent 3383c396cd
commit aa443c6bce
14 changed files with 1151 additions and 83 deletions

View File

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