aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/qt_sdl/ArchiveUtil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/qt_sdl/ArchiveUtil.cpp')
-rw-r--r--src/frontend/qt_sdl/ArchiveUtil.cpp94
1 files changed, 78 insertions, 16 deletions
diff --git a/src/frontend/qt_sdl/ArchiveUtil.cpp b/src/frontend/qt_sdl/ArchiveUtil.cpp
index 6919d48..af8e4a9 100644
--- a/src/frontend/qt_sdl/ArchiveUtil.cpp
+++ b/src/frontend/qt_sdl/ArchiveUtil.cpp
@@ -17,43 +17,66 @@
*/
#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);
+
+ //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)
+
+ while (archive_read_next_header(a, &entry) == ARCHIVE_OK)
{
- fileList.push_back(archive_entry_pathname(entry));
- archive_read_data_skip(a);
+ 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);
+ 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(const char* path, const char* wantedFile, QByteArray *romBuffer)
+QVector<QString> ExtractFileFromArchive(QString path, QString wantedFile, QByteArray *romBuffer)
{
struct archive *a = archive_read_new();
struct archive_entry *entry;
@@ -61,8 +84,9 @@ QVector<QString> ExtractFileFromArchive(const char* path, const char* wantedFile
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 +94,7 @@ 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 (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;
-}
+}*/
}