mirror of
https://github.com/joel16/VitaShell.git
synced 2024-11-23 03:39:39 +00:00
Finished libarchive port
This commit is contained in:
parent
cc320b16d4
commit
77bddb8836
@ -98,7 +98,6 @@ add_executable(VitaShell
|
|||||||
elf.c
|
elf.c
|
||||||
sha1.c
|
sha1.c
|
||||||
minizip/zip.c
|
minizip/zip.c
|
||||||
minizip/unzip.c
|
|
||||||
minizip/ioapi.c
|
minizip/ioapi.c
|
||||||
bm.c
|
bm.c
|
||||||
audio/vita_audio.c
|
audio/vita_audio.c
|
||||||
|
91
archive.c
91
archive.c
@ -32,11 +32,88 @@ char *uncompressBuffer(const Elf32_Ehdr *ehdr, const Elf32_Phdr *phdr, const seg
|
|||||||
const char *buffer);
|
const char *buffer);
|
||||||
|
|
||||||
int archiveCheckFilesForUnsafeFself() {
|
int archiveCheckFilesForUnsafeFself() {
|
||||||
// TODO
|
FileListEntry *archive_entry = archive_list.head;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < archive_list.length; i++) {
|
||||||
|
char path[MAX_PATH_LENGTH];
|
||||||
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s/%s", archive_file, archive_entry->name);
|
||||||
|
|
||||||
|
// Open
|
||||||
|
SceUID fd = archiveFileOpen(path, SCE_O_RDONLY, 0);
|
||||||
|
if (fd >= 0) {
|
||||||
|
uint32_t magic = 0;
|
||||||
|
archiveFileRead(fd, &magic, sizeof(uint32_t));
|
||||||
|
|
||||||
|
// SCE magic
|
||||||
|
if (magic == 0x00454353) {
|
||||||
|
char sce_header[0x84];
|
||||||
|
archiveFileRead(fd, sce_header, sizeof(sce_header));
|
||||||
|
|
||||||
|
uint64_t elf1_offset = *(uint64_t *)(sce_header + 0x3C);
|
||||||
|
uint64_t phdr_offset = *(uint64_t *)(sce_header + 0x44);
|
||||||
|
uint64_t section_info_offset = *(uint64_t *)(sce_header + 0x54);
|
||||||
|
|
||||||
|
// jump to elf1
|
||||||
|
// Until here we have read 0x88 bytes
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < elf1_offset - 0x88; i += sizeof(uint32_t)) {
|
||||||
|
uint32_t dummy = 0;
|
||||||
|
archiveFileRead(fd, &dummy, sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check imports
|
||||||
|
char *buffer = malloc(archive_entry->size);
|
||||||
|
if (buffer) {
|
||||||
|
archiveFileRead(fd, buffer, archive_entry->size);
|
||||||
|
|
||||||
|
Elf32_Ehdr *elf1 = (Elf32_Ehdr*)buffer;
|
||||||
|
Elf32_Phdr *phdr = (Elf32_Phdr*)(buffer + phdr_offset - elf1_offset);
|
||||||
|
segment_info *info = (segment_info*)(buffer + section_info_offset - elf1_offset);
|
||||||
|
|
||||||
|
// segment is elf2 section
|
||||||
|
char *segment = buffer + info->offset - elf1_offset;
|
||||||
|
|
||||||
|
// zlib compress magic
|
||||||
|
char *uncompressed_buffer = NULL;
|
||||||
|
if (segment[0] == 0x78) {
|
||||||
|
// uncompressedBuffer will return elf2 section
|
||||||
|
uncompressed_buffer = uncompressBuffer(elf1, phdr, info, segment);
|
||||||
|
if (uncompressed_buffer) {
|
||||||
|
segment = uncompressed_buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int unsafe = checkForUnsafeImports(segment);
|
||||||
|
|
||||||
|
if (uncompressed_buffer)
|
||||||
|
free(uncompressed_buffer);
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
if (unsafe) {
|
||||||
|
archiveFileClose(fd);
|
||||||
|
return unsafe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check authid flag
|
||||||
|
uint64_t authid = *(uint64_t *)(sce_header + 0x7C);
|
||||||
|
if (authid != 0x2F00000000000002) {
|
||||||
|
archiveFileClose(fd);
|
||||||
|
return 1; // Unsafe
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
archiveFileClose(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next
|
||||||
|
archive_entry = archive_entry->next;
|
||||||
|
}
|
||||||
|
|
||||||
return 0; // Safe
|
return 0; // Safe
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: improve traversal
|
|
||||||
int fileListGetArchiveEntries(FileList *list, const char *path, int sort) {
|
int fileListGetArchiveEntries(FileList *list, const char *path, int sort) {
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
@ -74,12 +151,13 @@ int fileListGetArchiveEntries(FileList *list, const char *path, int sort) {
|
|||||||
|
|
||||||
strcpy(entry->name, archive_entry->name + name_length);
|
strcpy(entry->name, archive_entry->name + name_length);
|
||||||
|
|
||||||
entry->is_folder = archive_entry->is_folder;
|
if (p || archive_entry->is_folder) {
|
||||||
if (entry->is_folder) {
|
|
||||||
addEndSlash(entry->name);
|
addEndSlash(entry->name);
|
||||||
|
entry->is_folder = 1;
|
||||||
entry->type = FILE_TYPE_UNKNOWN;
|
entry->type = FILE_TYPE_UNKNOWN;
|
||||||
list->folders++;
|
list->folders++;
|
||||||
} else {
|
} else {
|
||||||
|
entry->is_folder = 0;
|
||||||
entry->type = getFileType(entry->name);
|
entry->type = getFileType(entry->name);
|
||||||
list->files++;
|
list->files++;
|
||||||
}
|
}
|
||||||
@ -295,7 +373,6 @@ int archiveFileGetstat(const char *file, SceIoStat *stat) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: use cache
|
|
||||||
int archiveFileOpen(const char *file, int flags, SceMode mode) {
|
int archiveFileOpen(const char *file, int flags, SceMode mode) {
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
@ -307,6 +384,7 @@ int archiveFileOpen(const char *file, int flags, SceMode mode) {
|
|||||||
|
|
||||||
// Initialize
|
// Initialize
|
||||||
archive_fd = archive_read_new();
|
archive_fd = archive_read_new();
|
||||||
|
archive_read_support_filter_gzip(archive_fd);
|
||||||
archive_read_support_format_all(archive_fd);
|
archive_read_support_format_all(archive_fd);
|
||||||
|
|
||||||
// Open archive file
|
// Open archive file
|
||||||
@ -383,6 +461,7 @@ int archiveOpen(const char *file) {
|
|||||||
|
|
||||||
// Initialize
|
// Initialize
|
||||||
struct archive *archive = archive_read_new();
|
struct archive *archive = archive_read_new();
|
||||||
|
archive_read_support_filter_gzip(archive);
|
||||||
archive_read_support_format_all(archive);
|
archive_read_support_format_all(archive);
|
||||||
|
|
||||||
// Open archive file
|
// Open archive file
|
||||||
@ -401,7 +480,7 @@ int archiveOpen(const char *file) {
|
|||||||
archive_read_free(archive);
|
archive_read_free(archive);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *name = archive_entry_pathname(archive_entry);
|
const char *name = archive_entry_pathname(archive_entry);
|
||||||
const struct stat *stat = archive_entry_stat(archive_entry);
|
const struct stat *stat = archive_entry_stat(archive_entry);
|
||||||
|
|
||||||
|
219
archiveRAR.c
219
archiveRAR.c
@ -1,219 +0,0 @@
|
|||||||
#include "archiveRAR.h"
|
|
||||||
#include "main.h"
|
|
||||||
|
|
||||||
static ArchiveFileNode* root = NULL;
|
|
||||||
static int32_t filePathLength = -1;
|
|
||||||
|
|
||||||
|
|
||||||
int archiveRAROpen(const char *file) {
|
|
||||||
root = openRARFile(file);
|
|
||||||
if (!root) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
filePathLength = strlen(file);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fileListGetRARArchiveEntries(FileList *list, const char *path, int sort) {
|
|
||||||
if (!root)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
FileListEntry *entry = malloc(sizeof(FileListEntry));
|
|
||||||
strcpy(entry->name, DIR_UP);
|
|
||||||
entry->name_length = strlen(DIR_UP);
|
|
||||||
entry->is_folder = 1;
|
|
||||||
entry->type = FILE_TYPE_UNKNOWN;
|
|
||||||
fileListAddEntry(list, entry, sort);
|
|
||||||
|
|
||||||
ArchiveFileNode* node = NULL;
|
|
||||||
if (strlen(path) == (filePathLength + sizeof(char)))
|
|
||||||
node = root;
|
|
||||||
else
|
|
||||||
node = getFloderNodeFromPath(root,path + filePathLength + sizeof(char));
|
|
||||||
|
|
||||||
uint32_t i = 0;
|
|
||||||
for (; i < node->childCount; i++) {
|
|
||||||
ArchiveFileNode* _t = (ArchiveFileNode*)(node->childPt[i]);
|
|
||||||
FileListEntry * childentry = malloc(sizeof(FileListEntry));
|
|
||||||
|
|
||||||
strcpy(childentry->name,_t->nodeName);
|
|
||||||
childentry->name_length = strlen(childentry->name);
|
|
||||||
childentry->size = _t->data.UnpSize;
|
|
||||||
childentry->size2 = _t->data.PackSize;
|
|
||||||
|
|
||||||
sceRtcSetDosTime(&childentry->atime,_t->data.FileTime);
|
|
||||||
sceRtcSetDosTime(&childentry->ctime,_t->data.FileTime);
|
|
||||||
sceRtcSetDosTime(&childentry->mtime,_t->data.FileTime);
|
|
||||||
|
|
||||||
if (_t->data.Flags == 0x20) {
|
|
||||||
addEndSlash(childentry->name);
|
|
||||||
childentry->is_folder = 1;
|
|
||||||
list->folders++;
|
|
||||||
} else {
|
|
||||||
childentry->type = getFileType(childentry->name);
|
|
||||||
childentry->is_folder = 0;
|
|
||||||
list->files++;
|
|
||||||
}
|
|
||||||
fileListAddEntry(list, childentry, sort);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ReadArchiveRARFile(const char *file, void *buf, int size) {
|
|
||||||
if (filePathLength < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
char filepath[filePathLength + sizeof(char)];
|
|
||||||
strncpy(filepath,file,filePathLength);
|
|
||||||
filepath[filePathLength] = '\0';
|
|
||||||
struct ExtractHeader header = {memPtr:buf,offset:0,bufferSize:size,file:0,param:NULL};
|
|
||||||
if (extractRAR(filepath,file + (filePathLength + sizeof(char)),&header) > 0)
|
|
||||||
return header.offset;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int archiveRARFileGetstat(const char *file, SceIoStat *stat) {
|
|
||||||
if (!root)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
const char* p = file + (filePathLength + sizeof(char));
|
|
||||||
uint32_t p_length = strlen(p);
|
|
||||||
|
|
||||||
if (p[p_length-1] == '/')
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
ArchiveFileNode* filenode = getFileNodeFromFilePath(root,p);
|
|
||||||
if (!filenode)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (stat) {
|
|
||||||
stat->st_size = filenode->data.UnpSize;
|
|
||||||
sceRtcSetDosTime(&stat->st_atime,filenode->data.FileTime);
|
|
||||||
sceRtcSetDosTime(&stat->st_ctime,filenode->data.FileTime);
|
|
||||||
sceRtcSetDosTime(&stat->st_mtime,filenode->data.FileTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getRARArchivePathInfo(const char *path, uint64_t *size, uint32_t *folders, uint32_t *files) {
|
|
||||||
if (!root)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
SceIoStat stat;
|
|
||||||
memset(&stat, 0, sizeof(SceIoStat));
|
|
||||||
if (archiveRARFileGetstat(path, &stat) < 0) {
|
|
||||||
FileList list;
|
|
||||||
memset(&list, 0, sizeof(FileList));
|
|
||||||
fileListGetRARArchiveEntries(&list, path, SORT_NONE);
|
|
||||||
|
|
||||||
FileListEntry *entry = list.head->next; // Ignore ..
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < list.length-1; i++) {
|
|
||||||
char *new_path = malloc(strlen(path) + strlen(entry->name) + 2);
|
|
||||||
snprintf(new_path, MAX_PATH_LENGTH, "%s%s", path, entry->name);
|
|
||||||
|
|
||||||
getRARArchivePathInfo(new_path, size, folders, files);
|
|
||||||
|
|
||||||
free(new_path);
|
|
||||||
|
|
||||||
entry = entry->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (folders)
|
|
||||||
(*folders)++;
|
|
||||||
|
|
||||||
fileListEmpty(&list);
|
|
||||||
} else {
|
|
||||||
if (size)
|
|
||||||
(*size) += stat.st_size;
|
|
||||||
|
|
||||||
if (files)
|
|
||||||
(*files)++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int extractRARArchivePath(const char *src, const char *dst, FileProcessParam *param) {
|
|
||||||
if (!root)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
SceIoStat stat;
|
|
||||||
memset(&stat, 0, sizeof(SceIoStat));
|
|
||||||
if (archiveRARFileGetstat(src, &stat) < 0) {
|
|
||||||
FileList list;
|
|
||||||
memset(&list, 0, sizeof(FileList));
|
|
||||||
fileListGetRARArchiveEntries(&list, src, SORT_NONE);
|
|
||||||
|
|
||||||
int ret = sceIoMkdir(dst, 0777);
|
|
||||||
if (ret < 0 && ret != SCE_ERROR_ERRNO_EEXIST) {
|
|
||||||
fileListEmpty(&list);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (param) {
|
|
||||||
if (param->value)
|
|
||||||
(*param->value) += DIRECTORY_SIZE;
|
|
||||||
|
|
||||||
if (param->SetProgress)
|
|
||||||
param->SetProgress(param->value ? *param->value : 0, param->max);
|
|
||||||
|
|
||||||
if (param->cancelHandler && param->cancelHandler()) {
|
|
||||||
fileListEmpty(&list);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FileListEntry *entry = list.head->next; // Ignore ..
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < list.length-1; i++) {
|
|
||||||
char *src_path = malloc(strlen(src) + strlen(entry->name) + 2);
|
|
||||||
snprintf(src_path, MAX_PATH_LENGTH, "%s%s", src, entry->name);
|
|
||||||
|
|
||||||
char *dst_path = malloc(strlen(dst) + strlen(entry->name) + 2);
|
|
||||||
snprintf(dst_path, MAX_PATH_LENGTH, "%s%s", dst, entry->name);
|
|
||||||
|
|
||||||
int ret = extractRARArchivePath(src_path, dst_path, param);
|
|
||||||
|
|
||||||
free(dst_path);
|
|
||||||
free(src_path);
|
|
||||||
|
|
||||||
if (ret <= 0) {
|
|
||||||
fileListEmpty(&list);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
entry = entry->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
fileListEmpty(&list);
|
|
||||||
} else {
|
|
||||||
char filepath[filePathLength + sizeof(char)];
|
|
||||||
strncpy(filepath,src,filePathLength);
|
|
||||||
filepath[filePathLength] = '\0';
|
|
||||||
|
|
||||||
SceUID fddst = sceIoOpen(dst, SCE_O_WRONLY | SCE_O_CREAT | SCE_O_TRUNC, 0777);
|
|
||||||
|
|
||||||
struct ExtractHeader header = {file:fddst,offset:0,memPtr:NULL,bufferSize:0,param:param};
|
|
||||||
|
|
||||||
int result = extractRAR(filepath, (const char *)(src + (filePathLength + sizeof(char))), &header);
|
|
||||||
sceIoClose(fddst);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int archiveRARClose() {
|
|
||||||
filePathLength = -1;
|
|
||||||
if (!root) {
|
|
||||||
closeRARFile(root);
|
|
||||||
root = NULL;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
28
archiveRAR.h
28
archiveRAR.h
@ -1,28 +0,0 @@
|
|||||||
#ifndef ARCHIVERAR_H_INC
|
|
||||||
#define ARCHIVERAR_H_INC
|
|
||||||
|
|
||||||
#include <psp2/types.h>
|
|
||||||
#include <psp2/io/stat.h>
|
|
||||||
#include <psp2/rtc.h>
|
|
||||||
|
|
||||||
#include "file.h"
|
|
||||||
#include "unrarlib/unrarlibutils.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
|
|
||||||
int fileListGetRARArchiveEntries(FileList *list, const char *path, int sort);
|
|
||||||
|
|
||||||
int getRARArchivePathInfo(const char *path, uint64_t *size, uint32_t *folders, uint32_t *files);
|
|
||||||
int extractRARArchivePath(const char *src, const char *dst, FileProcessParam *param);
|
|
||||||
|
|
||||||
int archiveRARFileGetstat(const char *file, SceIoStat *stat);
|
|
||||||
int archiveRARFileOpen(const char *file, int flags, SceMode mode);
|
|
||||||
int archiveRARFileRead(SceUID fd, void *data, SceSize size);
|
|
||||||
int archiveRARFileClose(SceUID fd);
|
|
||||||
|
|
||||||
int ReadArchiveRARFile(const char *file, void *buf, int size);
|
|
||||||
|
|
||||||
int archiveRARClose();
|
|
||||||
int archiveRAROpen(const char *file);
|
|
||||||
|
|
||||||
#endif // ARCHIVERAR_H_INC
|
|
@ -137,13 +137,13 @@ vita2d_texture *getAlternativeCoverImage(const char *file) {
|
|||||||
if (p) {
|
if (p) {
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s/cover.jpg", file);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s/cover.jpg", file);
|
||||||
if (checkFileExist(path)) {
|
if (checkFileExist(path)) {
|
||||||
*p = '/';
|
*p = '/';
|
||||||
return vita2d_load_JPEG_file(path);
|
return vita2d_load_JPEG_file(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s/folder.jpg", file);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s/folder.jpg", file);
|
||||||
if (checkFileExist(path)) {
|
if (checkFileExist(path)) {
|
||||||
*p = '/';
|
*p = '/';
|
||||||
return vita2d_load_JPEG_file(path);
|
return vita2d_load_JPEG_file(path);
|
||||||
@ -327,7 +327,7 @@ int audioPlayer(const char *file, int type, FileList *list, FileListEntry *entry
|
|||||||
|
|
||||||
if (!entry->is_folder) {
|
if (!entry->is_folder) {
|
||||||
char path[MAX_PATH_LENGTH];
|
char path[MAX_PATH_LENGTH];
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", list->path, entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", list->path, entry->name);
|
||||||
int type = getFileType(path);
|
int type = getFileType(path);
|
||||||
if (type == FILE_TYPE_MP3 || type == FILE_TYPE_OGG) {
|
if (type == FILE_TYPE_MP3 || type == FILE_TYPE_OGG) {
|
||||||
file = path;
|
file = path;
|
||||||
|
47
file.c
47
file.c
@ -594,21 +594,24 @@ typedef struct {
|
|||||||
|
|
||||||
static ExtensionType extension_types[] = {
|
static ExtensionType extension_types[] = {
|
||||||
{ ".PSP2DMP", FILE_TYPE_PSP2DMP },
|
{ ".PSP2DMP", FILE_TYPE_PSP2DMP },
|
||||||
{ ".TMP", FILE_TYPE_PSP2DMP },
|
{ ".TMP", FILE_TYPE_PSP2DMP },
|
||||||
{ ".BMP", FILE_TYPE_BMP },
|
{ ".7Z", FILE_TYPE_7Z },
|
||||||
{ ".INI", FILE_TYPE_INI },
|
{ ".BMP", FILE_TYPE_BMP },
|
||||||
{ ".JPG", FILE_TYPE_JPEG },
|
{ ".GZ", FILE_TYPE_GZ },
|
||||||
{ ".JPEG", FILE_TYPE_JPEG },
|
{ ".INI", FILE_TYPE_INI },
|
||||||
{ ".MP3", FILE_TYPE_MP3 },
|
{ ".ISO", FILE_TYPE_ISO },
|
||||||
{ ".MP4", FILE_TYPE_MP4 },
|
{ ".JPG", FILE_TYPE_JPEG },
|
||||||
{ ".OGG", FILE_TYPE_OGG },
|
{ ".JPEG", FILE_TYPE_JPEG },
|
||||||
{ ".PNG", FILE_TYPE_PNG },
|
{ ".MP3", FILE_TYPE_MP3 },
|
||||||
{ ".RAR", FILE_TYPE_RAR },
|
{ ".MP4", FILE_TYPE_MP4 },
|
||||||
{ ".SFO", FILE_TYPE_SFO },
|
{ ".OGG", FILE_TYPE_OGG },
|
||||||
{ ".TXT", FILE_TYPE_TXT },
|
{ ".PNG", FILE_TYPE_PNG },
|
||||||
{ ".VPK", FILE_TYPE_VPK },
|
{ ".RAR", FILE_TYPE_RAR },
|
||||||
{ ".XML", FILE_TYPE_XML },
|
{ ".SFO", FILE_TYPE_SFO },
|
||||||
{ ".ZIP", FILE_TYPE_ZIP },
|
{ ".TXT", FILE_TYPE_TXT },
|
||||||
|
{ ".VPK", FILE_TYPE_VPK },
|
||||||
|
{ ".XML", FILE_TYPE_XML },
|
||||||
|
{ ".ZIP", FILE_TYPE_ZIP },
|
||||||
};
|
};
|
||||||
|
|
||||||
int getFileType(const char *file) {
|
int getFileType(const char *file) {
|
||||||
@ -625,6 +628,20 @@ int getFileType(const char *file) {
|
|||||||
return FILE_TYPE_UNKNOWN;
|
return FILE_TYPE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int isArchiveType(int type) {
|
||||||
|
switch (type) {
|
||||||
|
case FILE_TYPE_7Z:
|
||||||
|
case FILE_TYPE_GZ:
|
||||||
|
case FILE_TYPE_ISO:
|
||||||
|
case FILE_TYPE_RAR:
|
||||||
|
case FILE_TYPE_ZIP:
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int getNumberOfDevices() {
|
int getNumberOfDevices() {
|
||||||
return N_DEVICES;
|
return N_DEVICES;
|
||||||
}
|
}
|
||||||
|
6
file.h
6
file.h
@ -37,8 +37,11 @@
|
|||||||
enum FileTypes {
|
enum FileTypes {
|
||||||
FILE_TYPE_UNKNOWN,
|
FILE_TYPE_UNKNOWN,
|
||||||
FILE_TYPE_PSP2DMP,
|
FILE_TYPE_PSP2DMP,
|
||||||
|
FILE_TYPE_7Z,
|
||||||
FILE_TYPE_BMP,
|
FILE_TYPE_BMP,
|
||||||
|
FILE_TYPE_GZ,
|
||||||
FILE_TYPE_INI,
|
FILE_TYPE_INI,
|
||||||
|
FILE_TYPE_ISO,
|
||||||
FILE_TYPE_JPEG,
|
FILE_TYPE_JPEG,
|
||||||
FILE_TYPE_MP3,
|
FILE_TYPE_MP3,
|
||||||
FILE_TYPE_MP4,
|
FILE_TYPE_MP4,
|
||||||
@ -61,7 +64,7 @@ enum FileSortFlags {
|
|||||||
|
|
||||||
enum FileMoveFlags {
|
enum FileMoveFlags {
|
||||||
MOVE_INTEGRATE = 0x1, // Integrate directories
|
MOVE_INTEGRATE = 0x1, // Integrate directories
|
||||||
MOVE_REPLACE = 0x2, // Replace files
|
MOVE_REPLACE = 0x2, // Replace files
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -111,6 +114,7 @@ int copyPath(const char *src_path, const char *dst_path, FileProcessParam *param
|
|||||||
int movePath(const char *src_path, const char *dst_path, int flags, FileProcessParam *param);
|
int movePath(const char *src_path, const char *dst_path, int flags, FileProcessParam *param);
|
||||||
|
|
||||||
int getFileType(const char *file);
|
int getFileType(const char *file);
|
||||||
|
int isArchiveType(int type);
|
||||||
|
|
||||||
int getNumberOfDevices();
|
int getNumberOfDevices();
|
||||||
char **getDevices();
|
char **getDevices();
|
||||||
|
@ -117,7 +117,7 @@ int delete_thread(SceSize args_size, DeleteArguments *args) {
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name);
|
||||||
getPathInfo(path, NULL, &folders, &files, NULL);
|
getPathInfo(path, NULL, &folders, &files, NULL);
|
||||||
mark_entry = mark_entry->next;
|
mark_entry = mark_entry->next;
|
||||||
}
|
}
|
||||||
@ -131,7 +131,7 @@ int delete_thread(SceSize args_size, DeleteArguments *args) {
|
|||||||
mark_entry = head;
|
mark_entry = head;
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name);
|
||||||
|
|
||||||
FileProcessParam param;
|
FileProcessParam param;
|
||||||
param.value = &value;
|
param.value = &value;
|
||||||
@ -531,7 +531,7 @@ int export_thread(SceSize args_size, ExportArguments *args) {
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name);
|
||||||
getPathInfo(path, &size, NULL, &files, mediaPathHandler);
|
getPathInfo(path, &size, NULL, &files, mediaPathHandler);
|
||||||
mark_entry = mark_entry->next;
|
mark_entry = mark_entry->next;
|
||||||
}
|
}
|
||||||
@ -557,7 +557,7 @@ int export_thread(SceSize args_size, ExportArguments *args) {
|
|||||||
mark_entry = head;
|
mark_entry = head;
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name);
|
||||||
|
|
||||||
FileProcessParam param;
|
FileProcessParam param;
|
||||||
param.value = &value;
|
param.value = &value;
|
||||||
|
@ -260,7 +260,7 @@ void loadLanguage(int id) {
|
|||||||
if (use_custom_config) {
|
if (use_custom_config) {
|
||||||
if (id >= 0 && id < (sizeof(lang) / sizeof(char *))) {
|
if (id >= 0 && id < (sizeof(lang) / sizeof(char *))) {
|
||||||
char path[MAX_PATH_LENGTH];
|
char path[MAX_PATH_LENGTH];
|
||||||
snprintf(path, MAX_PATH_LENGTH, "ux0:VitaShell/language/%s.txt", lang[id]);
|
snprintf(path, MAX_PATH_LENGTH - 1, "ux0:VitaShell/language/%s.txt", lang[id]);
|
||||||
readConfig(path, language_entries, sizeof(language_entries) / sizeof(ConfigEntry));
|
readConfig(path, language_entries, sizeof(language_entries) / sizeof(ConfigEntry));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
28
main.c
28
main.c
@ -74,7 +74,6 @@ int file_type = FILE_TYPE_UNKNOWN;
|
|||||||
// Archive
|
// Archive
|
||||||
static int is_in_archive = 0;
|
static int is_in_archive = 0;
|
||||||
static char dir_level_archive = -1;
|
static char dir_level_archive = -1;
|
||||||
enum FileTypes archive_type = FILE_TYPE_ZIP;
|
|
||||||
|
|
||||||
// FTP
|
// FTP
|
||||||
static char vita_ip[16];
|
static char vita_ip[16];
|
||||||
@ -119,10 +118,6 @@ void dirLevelUp() {
|
|||||||
rel_pos = 0;
|
rel_pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum FileTypes getArchiveType(){
|
|
||||||
return archive_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
int isInArchive() {
|
int isInArchive() {
|
||||||
return is_in_archive;
|
return is_in_archive;
|
||||||
}
|
}
|
||||||
@ -233,7 +228,7 @@ static void refreshMarkList() {
|
|||||||
FileListEntry *next = entry->next;
|
FileListEntry *next = entry->next;
|
||||||
|
|
||||||
char path[MAX_PATH_LENGTH];
|
char path[MAX_PATH_LENGTH];
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, entry->name);
|
||||||
|
|
||||||
// Check if the entry still exits. If not, remove it from list
|
// Check if the entry still exits. If not, remove it from list
|
||||||
SceIoStat stat;
|
SceIoStat stat;
|
||||||
@ -257,7 +252,7 @@ static void refreshCopyList() {
|
|||||||
FileListEntry *next = entry->next;
|
FileListEntry *next = entry->next;
|
||||||
|
|
||||||
char path[MAX_PATH_LENGTH];
|
char path[MAX_PATH_LENGTH];
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", copy_list.path, entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", copy_list.path, entry->name);
|
||||||
|
|
||||||
// Check if the entry still exits. If not, remove it from list
|
// Check if the entry still exits. If not, remove it from list
|
||||||
SceIoStat stat;
|
SceIoStat stat;
|
||||||
@ -278,6 +273,9 @@ static int handleFile(const char *file, FileListEntry *entry) {
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case FILE_TYPE_PSP2DMP:
|
case FILE_TYPE_PSP2DMP:
|
||||||
|
case FILE_TYPE_7Z:
|
||||||
|
case FILE_TYPE_GZ:
|
||||||
|
case FILE_TYPE_ISO:
|
||||||
case FILE_TYPE_MP3:
|
case FILE_TYPE_MP3:
|
||||||
case FILE_TYPE_OGG:
|
case FILE_TYPE_OGG:
|
||||||
case FILE_TYPE_RAR:
|
case FILE_TYPE_RAR:
|
||||||
@ -312,10 +310,6 @@ static int handleFile(const char *file, FileListEntry *entry) {
|
|||||||
res = audioPlayer(file, type, &file_list, entry, &base_pos, &rel_pos);
|
res = audioPlayer(file, type, &file_list, entry, &base_pos, &rel_pos);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FILE_TYPE_RAR:
|
|
||||||
res = archiveOpen(file);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FILE_TYPE_SFO:
|
case FILE_TYPE_SFO:
|
||||||
res = SFOReader(file);
|
res = SFOReader(file);
|
||||||
break;
|
break;
|
||||||
@ -325,6 +319,10 @@ static int handleFile(const char *file, FileListEntry *entry) {
|
|||||||
setDialogStep(DIALOG_STEP_INSTALL_QUESTION);
|
setDialogStep(DIALOG_STEP_INSTALL_QUESTION);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FILE_TYPE_7Z:
|
||||||
|
case FILE_TYPE_GZ:
|
||||||
|
case FILE_TYPE_ISO:
|
||||||
|
case FILE_TYPE_RAR:
|
||||||
case FILE_TYPE_ZIP:
|
case FILE_TYPE_ZIP:
|
||||||
res = archiveOpen(file);
|
res = archiveOpen(file);
|
||||||
break;
|
break;
|
||||||
@ -884,7 +882,7 @@ static int dialogSteps() {
|
|||||||
setDialogStep(DIALOG_STEP_NONE);
|
setDialogStep(DIALOG_STEP_NONE);
|
||||||
} else {
|
} else {
|
||||||
char path[MAX_PATH_LENGTH];
|
char path[MAX_PATH_LENGTH];
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, name);
|
||||||
|
|
||||||
int res = sceIoMkdir(path, 0777);
|
int res = sceIoMkdir(path, 0777);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
@ -1392,9 +1390,8 @@ static int fileBrowserMenuCtrl() {
|
|||||||
int type = handleFile(cur_file, file_entry);
|
int type = handleFile(cur_file, file_entry);
|
||||||
|
|
||||||
// Archive mode
|
// Archive mode
|
||||||
if (type == FILE_TYPE_ZIP || type == FILE_TYPE_RAR) {
|
if (isArchiveType(type)) {
|
||||||
is_in_archive = 1;
|
is_in_archive = 1;
|
||||||
archive_type = type;
|
|
||||||
dir_level_archive = dir_level;
|
dir_level_archive = dir_level;
|
||||||
|
|
||||||
snprintf(archive_path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name);
|
snprintf(archive_path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name);
|
||||||
@ -1545,6 +1542,9 @@ static int shellMain() {
|
|||||||
icon = image_icon;
|
icon = image_icon;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FILE_TYPE_7Z:
|
||||||
|
case FILE_TYPE_GZ:
|
||||||
|
case FILE_TYPE_ISO:
|
||||||
case FILE_TYPE_RAR:
|
case FILE_TYPE_RAR:
|
||||||
case FILE_TYPE_VPK:
|
case FILE_TYPE_VPK:
|
||||||
case FILE_TYPE_ZIP:
|
case FILE_TYPE_ZIP:
|
||||||
|
@ -436,7 +436,7 @@ void setContextMenuMoreVisibilities() {
|
|||||||
menu_more_entries[MENU_MORE_ENTRY_OPEN_DECRYPTED].visibility = CTX_INVISIBLE;
|
menu_more_entries[MENU_MORE_ENTRY_OPEN_DECRYPTED].visibility = CTX_INVISIBLE;
|
||||||
} else {
|
} else {
|
||||||
char path[MAX_PATH_LENGTH];
|
char path[MAX_PATH_LENGTH];
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%ssce_pfs", file_list.path, file_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%ssce_pfs", file_list.path, file_entry->name);
|
||||||
|
|
||||||
if (!checkFolderExist(path))
|
if (!checkFolderExist(path))
|
||||||
menu_more_entries[MENU_MORE_ENTRY_OPEN_DECRYPTED].visibility = CTX_INVISIBLE;
|
menu_more_entries[MENU_MORE_ENTRY_OPEN_DECRYPTED].visibility = CTX_INVISIBLE;
|
||||||
@ -713,9 +713,9 @@ static int contextMenuMainEnterCallback(int sel, void *context) {
|
|||||||
int count = 1;
|
int count = 1;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (count == 1) {
|
if (count == 1) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, language_container[NEW_FOLDER]);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, language_container[NEW_FOLDER]);
|
||||||
} else {
|
} else {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s (%d)", file_list.path, language_container[NEW_FOLDER], count);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s (%d)", file_list.path, language_container[NEW_FOLDER], count);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checkFolderExist(path))
|
if (!checkFolderExist(path))
|
||||||
@ -824,7 +824,7 @@ static int contextMenuMoreEnterCallback(int sel, void *context) {
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; i < file_list.length - 1; i++) {
|
for (i = 0; i < file_list.length - 1; i++) {
|
||||||
char path[MAX_PATH_LENGTH];
|
char path[MAX_PATH_LENGTH];
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, file_entry->name);
|
||||||
|
|
||||||
int type = getFileType(path);
|
int type = getFileType(path);
|
||||||
if (type == FILE_TYPE_VPK) {
|
if (type == FILE_TYPE_VPK) {
|
||||||
@ -894,14 +894,14 @@ static int contextMenuMoreEnterCallback(int sel, void *context) {
|
|||||||
|
|
||||||
gameDataUmount();
|
gameDataUmount();
|
||||||
|
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, file_entry->name);
|
||||||
res = gameDataMount(path);
|
res = gameDataMount(path);
|
||||||
|
|
||||||
// In case we're at ux0:patch or grw0:patch we need to apply the mounting at ux0:app or gro0:app
|
// In case we're at ux0:patch or grw0:patch we need to apply the mounting at ux0:app or gro0:app
|
||||||
snprintf(path, MAX_PATH_LENGTH, "ux0:app/%s", file_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "ux0:app/%s", file_entry->name);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
res = gameDataMount(path);
|
res = gameDataMount(path);
|
||||||
snprintf(path, MAX_PATH_LENGTH, "gro:app/%s", file_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "gro:app/%s", file_entry->name);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
res = gameDataMount(path);
|
res = gameDataMount(path);
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ int compress_thread(SceSize args_size, CompressArguments *args) {
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name);
|
||||||
getPathInfo(path, &size, &folders, &files, NULL);
|
getPathInfo(path, &size, &folders, &files, NULL);
|
||||||
mark_entry = mark_entry->next;
|
mark_entry = mark_entry->next;
|
||||||
}
|
}
|
||||||
@ -294,7 +294,7 @@ int compress_thread(SceSize args_size, CompressArguments *args) {
|
|||||||
mark_entry = head;
|
mark_entry = head;
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name);
|
||||||
|
|
||||||
FileProcessParam param;
|
FileProcessParam param;
|
||||||
param.value = &value;
|
param.value = &value;
|
||||||
|
1952
minizip/unzip.c
1952
minizip/unzip.c
File diff suppressed because it is too large
Load Diff
319
minizip/unzip.h
319
minizip/unzip.h
@ -1,319 +0,0 @@
|
|||||||
/* unzip.h -- IO for uncompress .zip files using zlib
|
|
||||||
Version 1.1, February 14h, 2010
|
|
||||||
part of the MiniZip project
|
|
||||||
|
|
||||||
Copyright (C) 1998-2010 Gilles Vollant
|
|
||||||
http://www.winimage.com/zLibDll/minizip.html
|
|
||||||
Modifications of Unzip for Zip64
|
|
||||||
Copyright (C) 2007-2008 Even Rouault
|
|
||||||
Modifications for Zip64 support on both zip and unzip
|
|
||||||
Copyright (C) 2009-2010 Mathias Svensson
|
|
||||||
http://result42.com
|
|
||||||
|
|
||||||
This program is distributed under the terms of the same license as zlib.
|
|
||||||
See the accompanying LICENSE file for the full text of the license.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _UNZ_H
|
|
||||||
#define _UNZ_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _ZLIB_H
|
|
||||||
#include "zlib.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _ZLIBIOAPI_H
|
|
||||||
#include "ioapi.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_BZIP2
|
|
||||||
#include "bzlib.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define Z_BZIP2ED 12
|
|
||||||
|
|
||||||
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
|
|
||||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
|
||||||
from (void*) without cast */
|
|
||||||
typedef struct TagunzFile__ { int unused; } unzFile__;
|
|
||||||
typedef unzFile__ *unzFile;
|
|
||||||
#else
|
|
||||||
typedef voidp unzFile;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UNZ_OK (0)
|
|
||||||
#define UNZ_END_OF_LIST_OF_FILE (-100)
|
|
||||||
#define UNZ_ERRNO (Z_ERRNO)
|
|
||||||
#define UNZ_EOF (0)
|
|
||||||
#define UNZ_PARAMERROR (-102)
|
|
||||||
#define UNZ_BADZIPFILE (-103)
|
|
||||||
#define UNZ_INTERNALERROR (-104)
|
|
||||||
#define UNZ_CRCERROR (-105)
|
|
||||||
|
|
||||||
/* tm_unz contain date/time info */
|
|
||||||
typedef struct tm_unz_s
|
|
||||||
{
|
|
||||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
|
||||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
|
||||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
|
||||||
uInt tm_mday; /* day of the month - [1,31] */
|
|
||||||
uInt tm_mon; /* months since January - [0,11] */
|
|
||||||
uInt tm_year; /* years - [1980..2044] */
|
|
||||||
} tm_unz;
|
|
||||||
|
|
||||||
/* unz_global_info structure contain global data about the ZIPfile
|
|
||||||
These data comes from the end of central dir */
|
|
||||||
typedef struct unz_global_info64_s
|
|
||||||
{
|
|
||||||
ZPOS64_T number_entry; /* total number of entries in the central dir on this disk */
|
|
||||||
uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
|
|
||||||
uLong size_comment; /* size of the global comment of the zipfile */
|
|
||||||
} unz_global_info64;
|
|
||||||
|
|
||||||
typedef struct unz_global_info_s
|
|
||||||
{
|
|
||||||
uLong number_entry; /* total number of entries in the central dir on this disk */
|
|
||||||
uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
|
|
||||||
uLong size_comment; /* size of the global comment of the zipfile */
|
|
||||||
} unz_global_info;
|
|
||||||
|
|
||||||
/* unz_file_info contain information about a file in the zipfile */
|
|
||||||
typedef struct unz_file_info64_s
|
|
||||||
{
|
|
||||||
uLong version; /* version made by 2 bytes */
|
|
||||||
uLong version_needed; /* version needed to extract 2 bytes */
|
|
||||||
uLong flag; /* general purpose bit flag 2 bytes */
|
|
||||||
uLong compression_method; /* compression method 2 bytes */
|
|
||||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
|
||||||
uLong crc; /* crc-32 4 bytes */
|
|
||||||
ZPOS64_T compressed_size; /* compressed size 8 bytes */
|
|
||||||
ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */
|
|
||||||
uLong size_filename; /* filename length 2 bytes */
|
|
||||||
uLong size_file_extra; /* extra field length 2 bytes */
|
|
||||||
uLong size_file_comment; /* file comment length 2 bytes */
|
|
||||||
|
|
||||||
uLong disk_num_start; /* disk number start 2 bytes */
|
|
||||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
|
||||||
uLong external_fa; /* external file attributes 4 bytes */
|
|
||||||
|
|
||||||
tm_unz tmu_date;
|
|
||||||
ZPOS64_T disk_offset;
|
|
||||||
uLong size_file_extra_internal;
|
|
||||||
} unz_file_info64;
|
|
||||||
|
|
||||||
typedef struct unz_file_info_s
|
|
||||||
{
|
|
||||||
uLong version; /* version made by 2 bytes */
|
|
||||||
uLong version_needed; /* version needed to extract 2 bytes */
|
|
||||||
uLong flag; /* general purpose bit flag 2 bytes */
|
|
||||||
uLong compression_method; /* compression method 2 bytes */
|
|
||||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
|
||||||
uLong crc; /* crc-32 4 bytes */
|
|
||||||
uLong compressed_size; /* compressed size 4 bytes */
|
|
||||||
uLong uncompressed_size; /* uncompressed size 4 bytes */
|
|
||||||
uLong size_filename; /* filename length 2 bytes */
|
|
||||||
uLong size_file_extra; /* extra field length 2 bytes */
|
|
||||||
uLong size_file_comment; /* file comment length 2 bytes */
|
|
||||||
|
|
||||||
uLong disk_num_start; /* disk number start 2 bytes */
|
|
||||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
|
||||||
uLong external_fa; /* external file attributes 4 bytes */
|
|
||||||
|
|
||||||
tm_unz tmu_date;
|
|
||||||
uLong disk_offset;
|
|
||||||
} unz_file_info;
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/* Opening and close a zip file */
|
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
|
||||||
extern unzFile ZEXPORT unzOpen64 OF((const void *path));
|
|
||||||
/* Open a Zip file.
|
|
||||||
|
|
||||||
path should contain the full pathname (by example, on a Windows XP computer
|
|
||||||
"c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip".
|
|
||||||
return NULL if zipfile cannot be opened or doesn't exist
|
|
||||||
return unzFile handle if no error
|
|
||||||
|
|
||||||
NOTE: The "64" function take a const void* pointer, because the path is just the value passed to the
|
|
||||||
open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path
|
|
||||||
is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* does not describe the reality */
|
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def));
|
|
||||||
/* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */
|
|
||||||
extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, zlib_filefunc64_def* pzlib_filefunc_def));
|
|
||||||
/* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzClose OF((unzFile file));
|
|
||||||
/* Close a ZipFile opened with unzOpen. If there is files inside the .Zip opened with unzOpenCurrentFile,
|
|
||||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
|
||||||
|
|
||||||
return UNZ_OK if there is no error */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info));
|
|
||||||
extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, unz_global_info64 *pglobal_info));
|
|
||||||
/* Write info about the ZipFile in the *pglobal_info structure.
|
|
||||||
|
|
||||||
return UNZ_OK if no error */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *comment, uLong comment_size));
|
|
||||||
/* Get the global comment string of the ZipFile, in the comment buffer.
|
|
||||||
|
|
||||||
uSizeBuf is the size of the szComment buffer.
|
|
||||||
return the number of byte copied or an error code <0 */
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/* Reading the content of the current zipfile, you can open it, read data from it, and close it
|
|
||||||
(you can close it before reading all the file) */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
|
||||||
/* Open for reading data the current file in the zipfile.
|
|
||||||
|
|
||||||
return UNZ_OK if no error */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password));
|
|
||||||
/* Open for reading data the current file in the zipfile.
|
|
||||||
password is a crypting password
|
|
||||||
|
|
||||||
return UNZ_OK if no error */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw));
|
|
||||||
/* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
|
||||||
if raw==1 *method will receive method of compression, *level will receive level of compression
|
|
||||||
|
|
||||||
NOTE: you can set level parameter as NULL (if you did not want known level,
|
|
||||||
but you CANNOT set method parameter as NULL */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password));
|
|
||||||
/* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len));
|
|
||||||
/* Read bytes from the current file (opened by unzOpenCurrentFile)
|
|
||||||
buf contain buffer where data must be copied
|
|
||||||
len the size of buf.
|
|
||||||
|
|
||||||
return the number of byte copied if somes bytes are copied
|
|
||||||
return 0 if the end of file was reached
|
|
||||||
return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *filename,
|
|
||||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
|
|
||||||
extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
|
|
||||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
|
|
||||||
/* Get Info about the current file
|
|
||||||
|
|
||||||
pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file
|
|
||||||
filename if != NULL, the file name string will be copied in filename
|
|
||||||
filename_size is the size of the filename buffer
|
|
||||||
extrafield if != NULL, the extra field information from the central header will be copied in to
|
|
||||||
extrafield_size is the size of the extraField buffer
|
|
||||||
comment if != NULL, the comment string of the file will be copied in to
|
|
||||||
comment_size is the size of the comment buffer */
|
|
||||||
|
|
||||||
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len));
|
|
||||||
/* Read extra field from the current file (opened by unzOpenCurrentFile)
|
|
||||||
This is the local-header version of the extra field (sometimes, there is
|
|
||||||
more info in the local-header version than in the central-header)
|
|
||||||
|
|
||||||
if buf == NULL, it return the size of the local extra field
|
|
||||||
if buf != NULL, len is the size of the buffer, the extra header is copied in buf.
|
|
||||||
|
|
||||||
return number of bytes copied in buf, or (if <0) the error code */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
|
||||||
/* Close the file in zip opened with unzOpenCurrentFile
|
|
||||||
|
|
||||||
return UNZ_CRCERROR if all the file was read but the CRC is not good */
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/* Browse the directory of the zipfile */
|
|
||||||
|
|
||||||
typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2);
|
|
||||||
typedef int (*unzIteratorFunction)(unzFile file);
|
|
||||||
typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
|
||||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size);
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
|
||||||
/* Set the current file of the zipfile to the first file.
|
|
||||||
|
|
||||||
return UNZ_OK if no error */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToFirstFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
|
|
||||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
|
|
||||||
/* Set the current file of the zipfile to the first file and retrieves the current info on success.
|
|
||||||
Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo.
|
|
||||||
|
|
||||||
return UNZ_OK if no error */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
|
||||||
/* Set the current file of the zipfile to the next file.
|
|
||||||
|
|
||||||
return UNZ_OK if no error
|
|
||||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToNextFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
|
|
||||||
uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
|
|
||||||
/* Set the current file of the zipfile to the next file and retrieves the current
|
|
||||||
info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo.
|
|
||||||
|
|
||||||
return UNZ_OK if no error
|
|
||||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzLocateFile OF((unzFile file, const char *filename, unzFileNameComparer filename_compare_func));
|
|
||||||
/* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function.
|
|
||||||
|
|
||||||
return UNZ_OK if the file is found (it becomes the current file)
|
|
||||||
return UNZ_END_OF_LIST_OF_FILE if the file is not found */
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/* Raw access to zip file */
|
|
||||||
|
|
||||||
typedef struct unz_file_pos_s
|
|
||||||
{
|
|
||||||
uLong pos_in_zip_directory; /* offset in zip file directory */
|
|
||||||
uLong num_of_file; /* # of file */
|
|
||||||
} unz_file_pos;
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGetFilePos OF((unzFile file, unz_file_pos* file_pos));
|
|
||||||
extern int ZEXPORT unzGoToFilePos OF((unzFile file, unz_file_pos* file_pos));
|
|
||||||
|
|
||||||
typedef struct unz64_file_pos_s
|
|
||||||
{
|
|
||||||
ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */
|
|
||||||
ZPOS64_T num_of_file; /* # of file */
|
|
||||||
} unz64_file_pos;
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGetFilePos64 OF((unzFile file, unz64_file_pos* file_pos));
|
|
||||||
extern int ZEXPORT unzGoToFilePos64 OF((unzFile file, const unz64_file_pos* file_pos));
|
|
||||||
|
|
||||||
extern uLong ZEXPORT unzGetOffset OF((unzFile file));
|
|
||||||
extern ZPOS64_T ZEXPORT unzGetOffset64 OF((unzFile file));
|
|
||||||
/* Get the current file offset */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzSetOffset OF((unzFile file, uLong pos));
|
|
||||||
extern int ZEXPORT unzSetOffset64 OF((unzFile file, ZPOS64_T pos));
|
|
||||||
/* Set the current file offset */
|
|
||||||
|
|
||||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
|
||||||
extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));
|
|
||||||
/* return current position in uncompressed data */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzseek OF((unzFile file, z_off_t offset, int origin));
|
|
||||||
extern int ZEXPORT unzseek64 OF((unzFile file, ZPOS64_T offset, int origin));
|
|
||||||
/* Seek within the uncompressed data if compression method is storage */
|
|
||||||
|
|
||||||
extern int ZEXPORT unzeof OF((unzFile file));
|
|
||||||
/* return 1 if the end of file was reached, 0 elsewhere */
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _UNZ_H */
|
|
@ -318,7 +318,7 @@ int install_thread(SceSize args_size, InstallArguments *args) {
|
|||||||
|
|
||||||
if (SCE_S_ISDIR(stat.st_mode)) {
|
if (SCE_S_ISDIR(stat.st_mode)) {
|
||||||
// Check for param.sfo
|
// Check for param.sfo
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s/sce_sys/param.sfo", args->file);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s/sce_sys/param.sfo", args->file);
|
||||||
if (sceIoGetstat(path, &stat) < 0 || SCE_S_ISDIR(stat.st_mode)) {
|
if (sceIoGetstat(path, &stat) < 0 || SCE_S_ISDIR(stat.st_mode)) {
|
||||||
closeWaitDialog();
|
closeWaitDialog();
|
||||||
errorDialog(-2);
|
errorDialog(-2);
|
||||||
@ -326,7 +326,7 @@ int install_thread(SceSize args_size, InstallArguments *args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check permissions
|
// Check permissions
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s/eboot.bin", args->file);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s/eboot.bin", args->file);
|
||||||
SceUID fd = sceIoOpen(path, SCE_O_RDONLY, 0);
|
SceUID fd = sceIoOpen(path, SCE_O_RDONLY, 0);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
char buffer[0x88];
|
char buffer[0x88];
|
||||||
@ -388,7 +388,7 @@ int install_thread(SceSize args_size, InstallArguments *args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check for param.sfo
|
// Check for param.sfo
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s/sce_sys/param.sfo", args->file);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s/sce_sys/param.sfo", args->file);
|
||||||
if (archiveFileGetstat(path, NULL) < 0) {
|
if (archiveFileGetstat(path, NULL) < 0) {
|
||||||
closeWaitDialog();
|
closeWaitDialog();
|
||||||
errorDialog(-2);
|
errorDialog(-2);
|
||||||
|
2
photo.c
2
photo.c
@ -224,7 +224,7 @@ int photoViewer(const char *file, int type, FileList *list, FileListEntry *entry
|
|||||||
|
|
||||||
if (!entry->is_folder) {
|
if (!entry->is_folder) {
|
||||||
char path[MAX_PATH_LENGTH];
|
char path[MAX_PATH_LENGTH];
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s%s", list->path, entry->name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", list->path, entry->name);
|
||||||
int type = getFileType(path);
|
int type = getFileType(path);
|
||||||
if (type == FILE_TYPE_BMP || type == FILE_TYPE_JPEG || type == FILE_TYPE_PNG) {
|
if (type == FILE_TYPE_BMP || type == FILE_TYPE_JPEG || type == FILE_TYPE_PNG) {
|
||||||
vita2d_wait_rendering_done();
|
vita2d_wait_rendering_done();
|
||||||
|
@ -64,7 +64,7 @@ PropertyEntry property_entries[] = {
|
|||||||
{ PROPERTY_TYPE, PROPERTY_ENTRY_VISIBLE, property_type, sizeof(property_type) },
|
{ PROPERTY_TYPE, PROPERTY_ENTRY_VISIBLE, property_type, sizeof(property_type) },
|
||||||
{ PROPERTY_FSELF_MODE, PROPERTY_ENTRY_VISIBLE, property_fself_mode, sizeof(property_fself_mode) },
|
{ PROPERTY_FSELF_MODE, PROPERTY_ENTRY_VISIBLE, property_fself_mode, sizeof(property_fself_mode) },
|
||||||
{ PROPERTY_SIZE, PROPERTY_ENTRY_VISIBLE, property_size, sizeof(property_size) },
|
{ PROPERTY_SIZE, PROPERTY_ENTRY_VISIBLE, property_size, sizeof(property_size) },
|
||||||
{ PROPERTY_COMPRESSED_SIZE, PROPERTY_ENTRY_VISIBLE, property_compressed_size, sizeof(property_compressed_size) },
|
// { PROPERTY_COMPRESSED_SIZE, PROPERTY_ENTRY_VISIBLE, property_compressed_size, sizeof(property_compressed_size) },
|
||||||
{ PROPERTY_CONTAINS, PROPERTY_ENTRY_VISIBLE, property_contains, sizeof(property_contains) },
|
{ PROPERTY_CONTAINS, PROPERTY_ENTRY_VISIBLE, property_contains, sizeof(property_contains) },
|
||||||
{ -1, PROPERTY_ENTRY_UNUSED, NULL },
|
{ -1, PROPERTY_ENTRY_UNUSED, NULL },
|
||||||
{ PROPERTY_CREATION_DATE, PROPERTY_ENTRY_VISIBLE, property_creation_date, sizeof(property_creation_date) },
|
{ PROPERTY_CREATION_DATE, PROPERTY_ENTRY_VISIBLE, property_creation_date, sizeof(property_creation_date) },
|
||||||
@ -76,7 +76,7 @@ enum PropertyEntries {
|
|||||||
PROPERTY_ENTRY_TYPE,
|
PROPERTY_ENTRY_TYPE,
|
||||||
PROPERTY_ENTRY_FSELF_MODE,
|
PROPERTY_ENTRY_FSELF_MODE,
|
||||||
PROPERTY_ENTRY_SIZE,
|
PROPERTY_ENTRY_SIZE,
|
||||||
PROPERTY_ENTRY_COMPRESSED_SIZE,
|
// PROPERTY_ENTRY_COMPRESSED_SIZE,
|
||||||
PROPERTY_ENTRY_CONTAINS,
|
PROPERTY_ENTRY_CONTAINS,
|
||||||
PROPERTY_ENTRY_EMPTY_1,
|
PROPERTY_ENTRY_EMPTY_1,
|
||||||
PROPERTY_ENTRY_CREATION_DATE,
|
PROPERTY_ENTRY_CREATION_DATE,
|
||||||
@ -287,18 +287,18 @@ int initPropertyDialog(char *path, FileListEntry *entry) {
|
|||||||
property_entries[PROPERTY_ENTRY_CONTAINS].visibility = PROPERTY_ENTRY_VISIBLE;
|
property_entries[PROPERTY_ENTRY_CONTAINS].visibility = PROPERTY_ENTRY_VISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_INVISIBLE;
|
// property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_INVISIBLE;
|
||||||
} else {
|
} else {
|
||||||
getSizeString(property_size, entry->size);
|
getSizeString(property_size, entry->size);
|
||||||
property_entries[PROPERTY_ENTRY_CONTAINS].visibility = PROPERTY_ENTRY_INVISIBLE;
|
property_entries[PROPERTY_ENTRY_CONTAINS].visibility = PROPERTY_ENTRY_INVISIBLE;
|
||||||
|
/*
|
||||||
// Compressed size
|
// Compressed size
|
||||||
if (isInArchive()) {
|
if (isInArchive()) {
|
||||||
getSizeString(property_compressed_size, entry->size2);
|
getSizeString(property_compressed_size, entry->size2);
|
||||||
property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_VISIBLE;
|
property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_VISIBLE;
|
||||||
} else {
|
} else {
|
||||||
property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_INVISIBLE;
|
property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_INVISIBLE;
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dates
|
// Dates
|
||||||
|
@ -199,7 +199,7 @@ void app_callback(void* data, const char* dir, const char* subdir)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (refresh_data->refresh_pass) {
|
if (refresh_data->refresh_pass) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s/%s", dir, subdir);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s/%s", dir, subdir);
|
||||||
if (refreshNeeded(path)) {
|
if (refreshNeeded(path)) {
|
||||||
// Move the directory to temp for installation
|
// Move the directory to temp for installation
|
||||||
removePath(APP_TEMP, NULL);
|
removePath(APP_TEMP, NULL);
|
||||||
@ -226,7 +226,7 @@ void dlc_callback_inner(void* data, const char* dir, const char* subdir)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (dlc_data->refresh_data->refresh_pass) {
|
if (dlc_data->refresh_data->refresh_pass) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "%s/%s", dir, subdir);
|
snprintf(path, MAX_PATH_LENGTH - 1, "%s/%s", dir, subdir);
|
||||||
if (dlc_data->list_size < MAX_DLC_PER_TITLE)
|
if (dlc_data->list_size < MAX_DLC_PER_TITLE)
|
||||||
dlc_data->list[dlc_data->list_size++] = strdup(path);
|
dlc_data->list[dlc_data->list_size++] = strdup(path);
|
||||||
} else {
|
} else {
|
||||||
@ -252,7 +252,7 @@ void dlc_callback_outer(void* data, const char* dir, const char* subdir)
|
|||||||
// 2. Refresh the moved dlc_data
|
// 2. Refresh the moved dlc_data
|
||||||
for (int i = 0; i < dlc_data.list_size; i++) {
|
for (int i = 0; i < dlc_data.list_size; i++) {
|
||||||
if (refreshNeeded(dlc_data.list[i])) {
|
if (refreshNeeded(dlc_data.list[i])) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, DLC_TEMP "/%s", &dlc_data.list[i][len + 1]);
|
snprintf(path, MAX_PATH_LENGTH - 1, DLC_TEMP "/%s", &dlc_data.list[i][len + 1]);
|
||||||
removePath(path, NULL);
|
removePath(path, NULL);
|
||||||
sceIoRename(dlc_data.list[i], path);
|
sceIoRename(dlc_data.list[i], path);
|
||||||
} else {
|
} else {
|
||||||
@ -265,7 +265,7 @@ void dlc_callback_outer(void* data, const char* dir, const char* subdir)
|
|||||||
// Now that the dlc we need are out of addcont/title_id, refresh them
|
// Now that the dlc we need are out of addcont/title_id, refresh them
|
||||||
for (int i = 0; i < dlc_data.list_size; i++) {
|
for (int i = 0; i < dlc_data.list_size; i++) {
|
||||||
if (dlc_data.list[i] != NULL) {
|
if (dlc_data.list[i] != NULL) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, DLC_TEMP "/%s", &dlc_data.list[i][len + 1]);
|
snprintf(path, MAX_PATH_LENGTH - 1, DLC_TEMP "/%s", &dlc_data.list[i][len + 1]);
|
||||||
if (refreshApp(path) == 1)
|
if (refreshApp(path) == 1)
|
||||||
refresh_data->refreshed++;
|
refresh_data->refreshed++;
|
||||||
else
|
else
|
||||||
|
6
theme.c
6
theme.c
@ -241,16 +241,16 @@ void loadTheme() {
|
|||||||
|
|
||||||
if (theme_name) {
|
if (theme_name) {
|
||||||
// Load colors config
|
// Load colors config
|
||||||
snprintf(path, MAX_PATH_LENGTH, "ux0:VitaShell/theme/%s/colors.txt", theme_name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "ux0:VitaShell/theme/%s/colors.txt", theme_name);
|
||||||
readConfig(path, colors_entries, sizeof(colors_entries) / sizeof(ConfigEntry));
|
readConfig(path, colors_entries, sizeof(colors_entries) / sizeof(ConfigEntry));
|
||||||
|
|
||||||
// Font
|
// Font
|
||||||
snprintf(path, MAX_PATH_LENGTH, "ux0:VitaShell/theme/%s/font.pgf", theme_name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "ux0:VitaShell/theme/%s/font.pgf", theme_name);
|
||||||
font = vita2d_load_custom_pgf(path);
|
font = vita2d_load_custom_pgf(path);
|
||||||
|
|
||||||
// Load theme
|
// Load theme
|
||||||
for (i = 0; i < N_THEME_IMAGES; i++) {
|
for (i = 0; i < N_THEME_IMAGES; i++) {
|
||||||
snprintf(path, MAX_PATH_LENGTH, "ux0:VitaShell/theme/%s/%s", theme_name, theme_images[i].name);
|
snprintf(path, MAX_PATH_LENGTH - 1, "ux0:VitaShell/theme/%s/%s", theme_name, theme_images[i].name);
|
||||||
if (theme_images[i].texture && *(theme_images[i].texture) == NULL)
|
if (theme_images[i].texture && *(theme_images[i].texture) == NULL)
|
||||||
*(theme_images[i].texture) = vita2d_load_PNG_file(path);
|
*(theme_images[i].texture) = vita2d_load_PNG_file(path);
|
||||||
}
|
}
|
||||||
|
@ -1,155 +0,0 @@
|
|||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifndef _UNRAR_C_WRAPPER_H_INC
|
|
||||||
#define _UNRAR_C_WRAPPER_H_INC
|
|
||||||
|
|
||||||
#define ERAR_SUCCESS 0
|
|
||||||
#define ERAR_END_ARCHIVE 10
|
|
||||||
#define ERAR_NO_MEMORY 11
|
|
||||||
#define ERAR_BAD_DATA 12
|
|
||||||
#define ERAR_BAD_ARCHIVE 13
|
|
||||||
#define ERAR_UNKNOWN_FORMAT 14
|
|
||||||
#define ERAR_EOPEN 15
|
|
||||||
#define ERAR_ECREATE 16
|
|
||||||
#define ERAR_ECLOSE 17
|
|
||||||
#define ERAR_EREAD 18
|
|
||||||
#define ERAR_EWRITE 19
|
|
||||||
#define ERAR_SMALL_BUF 20
|
|
||||||
#define ERAR_UNKNOWN 21
|
|
||||||
#define ERAR_MISSING_PASSWORD 22
|
|
||||||
#define ERAR_EREFERENCE 23
|
|
||||||
#define ERAR_BAD_PASSWORD 24
|
|
||||||
|
|
||||||
#define RAR_OM_LIST 0
|
|
||||||
#define RAR_OM_EXTRACT 1
|
|
||||||
#define RAR_OM_LIST_INCSPLIT 2
|
|
||||||
|
|
||||||
#define RAR_SKIP 0
|
|
||||||
#define RAR_TEST 1
|
|
||||||
#define RAR_EXTRACT 2
|
|
||||||
|
|
||||||
#define RAR_VOL_ASK 0
|
|
||||||
#define RAR_VOL_NOTIFY 1
|
|
||||||
|
|
||||||
#define RAR_DLL_VERSION 6
|
|
||||||
|
|
||||||
#define RAR_HASH_NONE 0
|
|
||||||
#define RAR_HASH_CRC32 1
|
|
||||||
#define RAR_HASH_BLAKE2 2
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef _UNIX
|
|
||||||
#define CALLBACK
|
|
||||||
#define PASCAL
|
|
||||||
#define LONG long
|
|
||||||
#define HANDLE void *
|
|
||||||
#define LPARAM long
|
|
||||||
#define UINT unsigned int
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RHDF_SPLITBEFORE 0x01
|
|
||||||
#define RHDF_SPLITAFTER 0x02
|
|
||||||
#define RHDF_ENCRYPTED 0x04
|
|
||||||
#define RHDF_SOLID 0x10
|
|
||||||
#define RHDF_DIRECTORY 0x20
|
|
||||||
|
|
||||||
|
|
||||||
struct RARHeaderData
|
|
||||||
{
|
|
||||||
char ArcName[260];
|
|
||||||
char FileName[260];
|
|
||||||
unsigned int Flags;
|
|
||||||
unsigned int PackSize;
|
|
||||||
unsigned int UnpSize;
|
|
||||||
unsigned int HostOS;
|
|
||||||
unsigned int FileCRC;
|
|
||||||
unsigned int FileTime;
|
|
||||||
unsigned int UnpVer;
|
|
||||||
unsigned int Method;
|
|
||||||
unsigned int FileAttr;
|
|
||||||
char *CmtBuf;
|
|
||||||
unsigned int CmtBufSize;
|
|
||||||
unsigned int CmtSize;
|
|
||||||
unsigned int CmtState;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct RARHeaderDataEx
|
|
||||||
{
|
|
||||||
char ArcName[1024];
|
|
||||||
wchar_t ArcNameW[1024];
|
|
||||||
char FileName[1024];
|
|
||||||
wchar_t FileNameW[1024];
|
|
||||||
unsigned int Flags;
|
|
||||||
unsigned int PackSize;
|
|
||||||
unsigned int PackSizeHigh;
|
|
||||||
unsigned int UnpSize;
|
|
||||||
unsigned int UnpSizeHigh;
|
|
||||||
unsigned int HostOS;
|
|
||||||
unsigned int FileCRC;
|
|
||||||
unsigned int FileTime;
|
|
||||||
unsigned int UnpVer;
|
|
||||||
unsigned int Method;
|
|
||||||
unsigned int FileAttr;
|
|
||||||
char *CmtBuf;
|
|
||||||
unsigned int CmtBufSize;
|
|
||||||
unsigned int CmtSize;
|
|
||||||
unsigned int CmtState;
|
|
||||||
unsigned int DictSize;
|
|
||||||
unsigned int HashType;
|
|
||||||
char Hash[32];
|
|
||||||
unsigned int Reserved[1014];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct RAROpenArchiveData
|
|
||||||
{
|
|
||||||
char *ArcName;
|
|
||||||
unsigned int OpenMode;
|
|
||||||
unsigned int OpenResult;
|
|
||||||
char *CmtBuf;
|
|
||||||
unsigned int CmtBufSize;
|
|
||||||
unsigned int CmtSize;
|
|
||||||
unsigned int CmtState;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2);
|
|
||||||
|
|
||||||
struct RAROpenArchiveDataEx
|
|
||||||
{
|
|
||||||
char *ArcName;
|
|
||||||
wchar_t *ArcNameW;
|
|
||||||
unsigned int OpenMode;
|
|
||||||
unsigned int OpenResult;
|
|
||||||
char *CmtBuf;
|
|
||||||
unsigned int CmtBufSize;
|
|
||||||
unsigned int CmtSize;
|
|
||||||
unsigned int CmtState;
|
|
||||||
unsigned int Flags;
|
|
||||||
UNRARCALLBACK Callback;
|
|
||||||
LPARAM UserData;
|
|
||||||
unsigned int Reserved[28];
|
|
||||||
};
|
|
||||||
|
|
||||||
enum UNRARCALLBACK_MESSAGES {
|
|
||||||
UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD,UCM_CHANGEVOLUMEW,
|
|
||||||
UCM_NEEDPASSWORDW
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode);
|
|
||||||
typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size);
|
|
||||||
|
|
||||||
extern HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData);
|
|
||||||
extern HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData);
|
|
||||||
extern int PASCAL RARCloseArchive(HANDLE hArcData);
|
|
||||||
extern int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData);
|
|
||||||
extern int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData);
|
|
||||||
extern int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName, bool TestMode);
|
|
||||||
extern int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName, bool TestMode);
|
|
||||||
extern void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LPARAM UserData);
|
|
||||||
extern void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc);
|
|
||||||
extern void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc);
|
|
||||||
extern void PASCAL RARSetPassword(HANDLE hArcData,char *Password);
|
|
||||||
extern int PASCAL RARGetDllVersion();
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,275 +0,0 @@
|
|||||||
#include "unrarlibutils.h"
|
|
||||||
|
|
||||||
int getcwd() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fsync() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *rar_open(const char *filename, unsigned int om) {
|
|
||||||
struct RAROpenArchiveData arc_open;
|
|
||||||
arc_open.ArcName = (char*)filename;
|
|
||||||
arc_open.OpenMode = om;
|
|
||||||
arc_open.CmtBuf = NULL;
|
|
||||||
HANDLE rar_file = RAROpenArchive(&arc_open);
|
|
||||||
if (arc_open.OpenResult != 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return rar_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArchiveFileNode *createNode(const char *name) {
|
|
||||||
ArchiveFileNode *node = malloc(sizeof(ArchiveFileNode));
|
|
||||||
node->nodeName = malloc((strlen(name) + 2) *sizeof(char));
|
|
||||||
strcpy(node->nodeName, name);
|
|
||||||
node->childCount = 0;
|
|
||||||
node->childPt = NULL;
|
|
||||||
node->fatherPt = NULL;
|
|
||||||
node->maxCount = 0;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void add_node(ArchiveFileNode *father, ArchiveFileNode *child) {
|
|
||||||
uint32_t count = father->childCount;
|
|
||||||
if( (count + 1) > father->maxCount ) {
|
|
||||||
if(father->maxCount == 0) {
|
|
||||||
father->maxCount = 16;
|
|
||||||
father->childPt = malloc(16 *sizeof(void*));
|
|
||||||
} else {
|
|
||||||
void *n_ptr = realloc((void*)father->childPt,2 *father->maxCount *sizeof(void*));
|
|
||||||
if(n_ptr) {
|
|
||||||
father->childPt = n_ptr;
|
|
||||||
father->maxCount *= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
father->childPt[count] = (void*)child;
|
|
||||||
father->childCount++;
|
|
||||||
|
|
||||||
child->fatherPt = father;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArchiveFileNode *getChildNodeByName(ArchiveFileNode *node, const char *name) {
|
|
||||||
if(node->childCount <= 0 )
|
|
||||||
return NULL;
|
|
||||||
uint32_t i;
|
|
||||||
for(i = 0; i < node->childCount; i++) {
|
|
||||||
ArchiveFileNode *_n = (ArchiveFileNode*)(node->childPt[i]);
|
|
||||||
if(strcmp(_n->nodeName,name) == 0) {
|
|
||||||
return _n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_node(ArchiveFileNode *node) {
|
|
||||||
uint32_t count = node->childCount;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
for(; i < count; i++) {
|
|
||||||
ArchiveFileNode *_n = (ArchiveFileNode*)(node->childPt[i]);
|
|
||||||
free_node(_n);
|
|
||||||
}
|
|
||||||
if(node->childPt != NULL) {
|
|
||||||
free(node->childPt);
|
|
||||||
}
|
|
||||||
if(node->nodeName != NULL) {
|
|
||||||
free(node->nodeName);
|
|
||||||
}
|
|
||||||
free(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
void parse_path(const char *name, struct filelayer *layer) {
|
|
||||||
char *p;
|
|
||||||
char _name[RARMAX_FILENAME];
|
|
||||||
strcpy(_name, name);
|
|
||||||
uint32_t depth = 0;
|
|
||||||
while(1) {
|
|
||||||
p = strrchr(_name, '/');
|
|
||||||
if(!p)
|
|
||||||
break;
|
|
||||||
strcpy(&(layer->name[depth][0]), p + sizeof(char));
|
|
||||||
layer->depth = ++depth;
|
|
||||||
*p = '\0';
|
|
||||||
}
|
|
||||||
strcpy(&(layer->name[depth][0]), _name);
|
|
||||||
}
|
|
||||||
|
|
||||||
ArchiveFileNode *openRARFile(const char *filename) {
|
|
||||||
ArchiveFileNode *root = createNode("root");
|
|
||||||
HANDLE RARFile = rar_open(filename,RAR_OM_LIST);
|
|
||||||
if(!RARFile) {
|
|
||||||
free_node(root);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct RARHeaderData data;
|
|
||||||
while (!RARReadHeader(RARFile, &data)) {
|
|
||||||
struct filelayer layer = {0};
|
|
||||||
parse_path(data.FileName,&layer);
|
|
||||||
ArchiveFileNode *_up = root;
|
|
||||||
int i = layer.depth;
|
|
||||||
for(; i > 0; i--) {
|
|
||||||
ArchiveFileNode *father = getChildNodeByName(_up, &(layer.name[i][0]));
|
|
||||||
if(!father) {
|
|
||||||
father = createNode(&(layer.name[i][0]));
|
|
||||||
add_node(_up,father);
|
|
||||||
}
|
|
||||||
_up = father;
|
|
||||||
}
|
|
||||||
ArchiveFileNode *filenode = getChildNodeByName(_up,&(layer.name[0][0]));
|
|
||||||
|
|
||||||
if(!filenode) {
|
|
||||||
filenode = createNode(&(layer.name[0][0]));
|
|
||||||
add_node(_up, filenode);
|
|
||||||
}
|
|
||||||
|
|
||||||
filenode->data = data;
|
|
||||||
|
|
||||||
RARProcessFile(RARFile, RAR_SKIP,NULL,NULL,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
RARCloseArchive(RARFile);
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
|
|
||||||
int extractToMem(struct ExtractHeader *header, char *extractBuffer, uint64_t bufferSize) {
|
|
||||||
if(header->offset >= header->bufferSize)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if((header->offset + bufferSize) > header->bufferSize)
|
|
||||||
bufferSize = (header->bufferSize - header->offset);//no enough memory
|
|
||||||
|
|
||||||
memcpy((header->memPtr + header->offset),extractBuffer,bufferSize);
|
|
||||||
header->offset += bufferSize;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int extractToFile(struct ExtractHeader *header, char *extractBuffer, uint64_t bufferSize) {
|
|
||||||
if(!header->file)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
FileProcessParam *param = header->param;
|
|
||||||
if (param) {
|
|
||||||
if (param->value)
|
|
||||||
(*param->value) += bufferSize;
|
|
||||||
|
|
||||||
if (param->SetProgress)
|
|
||||||
param->SetProgress(param->value ? *param->value : 0, param->max);
|
|
||||||
|
|
||||||
if (param->cancelHandler && param->cancelHandler()) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sceIoLseek(header->file,header->offset,SCE_SEEK_SET);
|
|
||||||
sceIoWrite(header->file,extractBuffer,bufferSize);
|
|
||||||
header->offset += bufferSize;
|
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int CALLBACK rarCallback(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2) {
|
|
||||||
struct ExtractHeader *header;
|
|
||||||
int rtn = 1;
|
|
||||||
switch(msg) {
|
|
||||||
case UCM_CHANGEVOLUME:
|
|
||||||
if(P2 != RAR_VOL_NOTIFY) {
|
|
||||||
rtn = -1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UCM_PROCESSDATA:
|
|
||||||
header = (struct ExtractHeader*)UserData;
|
|
||||||
if(header->memPtr)
|
|
||||||
extractToMem(header,(char*)P1,P2);
|
|
||||||
else
|
|
||||||
rtn = extractToFile(header,(char*)P1,P2);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
rtn = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return rtn;
|
|
||||||
}
|
|
||||||
|
|
||||||
int extractRAR(const char *path, const char *filename, struct ExtractHeader *header) {
|
|
||||||
|
|
||||||
HANDLE RARFile = rar_open(path,RAR_OM_EXTRACT);
|
|
||||||
if(!RARFile)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
struct RARHeaderData data;
|
|
||||||
int rtn = -1;
|
|
||||||
while (!RARReadHeader(RARFile, &data)) {
|
|
||||||
if(!(strcmp(data.FileName,filename))) {
|
|
||||||
rtn = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
RARProcessFile(RARFile, RAR_SKIP,NULL,NULL,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(rtn > 0) {
|
|
||||||
RARSetCallback(RARFile,rarCallback,(LPARAM)header);
|
|
||||||
int result = RARProcessFile(RARFile, RAR_TEST,NULL,NULL,false);
|
|
||||||
if(result >= 0)
|
|
||||||
rtn = 1;
|
|
||||||
else if(result == -2)
|
|
||||||
rtn = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
RARCloseArchive(RARFile);
|
|
||||||
return rtn;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArchiveFileNode *getFileNodeFromFilePath(ArchiveFileNode *root,const char *filepath) {
|
|
||||||
struct filelayer layer = {0};
|
|
||||||
parse_path(filepath,&layer);
|
|
||||||
int i = layer.depth;
|
|
||||||
ArchiveFileNode *_up = root;
|
|
||||||
|
|
||||||
for(; i > 0; i--) {
|
|
||||||
_up = getChildNodeByName(_up, &(layer.name[i][0]));
|
|
||||||
if(!_up)
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return getChildNodeByName(_up,&(layer.name[0][0]));
|
|
||||||
}
|
|
||||||
|
|
||||||
int getRARArchiveNodeInfo(ArchiveFileNode *root, uint64_t *size, uint32_t *folders, uint32_t *files) {
|
|
||||||
if(root->childCount > 0) {
|
|
||||||
uint32_t count = root->childCount;
|
|
||||||
int i = 0;
|
|
||||||
for(; i < count; i++) {
|
|
||||||
ArchiveFileNode *_n = (ArchiveFileNode*)(root->childPt[i]);
|
|
||||||
getRARArchiveNodeInfo(_n,size,folders,files);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(root->data.Flags == 0x20) {
|
|
||||||
if(folders)
|
|
||||||
(*folders)++;
|
|
||||||
} else {
|
|
||||||
if(size)
|
|
||||||
(*size) += root->data.UnpSize;
|
|
||||||
if(files)
|
|
||||||
(*files) ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArchiveFileNode *getFloderNodeFromPath(ArchiveFileNode *root,const char *path) {
|
|
||||||
uint32_t pathlen = strlen(path);
|
|
||||||
char temp[pathlen];
|
|
||||||
strcpy(temp,path);
|
|
||||||
temp[pathlen - 1] ='\0';
|
|
||||||
return getFileNodeFromFilePath(root,temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void closeRARFile(ArchiveFileNode *root) {
|
|
||||||
free_node(root);
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
#ifndef UNRARLIBUTILS_H_INC
|
|
||||||
#define UNRARLIBUTILS_H_INC
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <psp2/io/stat.h>
|
|
||||||
#include <psp2/io/fcntl.h>
|
|
||||||
|
|
||||||
#include "../file.h"
|
|
||||||
|
|
||||||
#define _UNIX
|
|
||||||
#include "unrar_c_wrapper.h"
|
|
||||||
|
|
||||||
#define RARMAX_HIERARCHY 32//max hierarchy for folder
|
|
||||||
#define RARMAX_FILENAME 262
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *nodeName;
|
|
||||||
void *fatherPt;
|
|
||||||
void* *childPt;
|
|
||||||
uint32_t childCount;
|
|
||||||
uint32_t maxCount;
|
|
||||||
struct RARHeaderData data;
|
|
||||||
} ArchiveFileNode;
|
|
||||||
|
|
||||||
struct filelayer {
|
|
||||||
uint32_t depth;
|
|
||||||
char name[RARMAX_HIERARCHY][RARMAX_FILENAME];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ExtractHeader {
|
|
||||||
SceUID file;
|
|
||||||
uint64_t offset;
|
|
||||||
char *memPtr;
|
|
||||||
uint64_t bufferSize;
|
|
||||||
FileProcessParam *param;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
ArchiveFileNode *openRARFile(const char *filename);//returns the number of files in the rar document archive
|
|
||||||
void closeRARFile(ArchiveFileNode *root);
|
|
||||||
ArchiveFileNode *createNode(const char *name);
|
|
||||||
ArchiveFileNode *getChildNodeByName(ArchiveFileNode *node, const char *name);
|
|
||||||
int extractRAR(const char *path, const char *filename, struct ExtractHeader *header);
|
|
||||||
ArchiveFileNode *getFileNodeFromFilePath(ArchiveFileNode *root, const char *filepath);
|
|
||||||
int getRARArchiveNodeInfo(ArchiveFileNode *root, uint64_t *size, uint32_t *folders, uint32_t *files);
|
|
||||||
void free_node(ArchiveFileNode *node);
|
|
||||||
ArchiveFileNode *getFloderNodeFromPath(ArchiveFileNode *root, const char *path);
|
|
||||||
|
|
||||||
#endif // UNRARLIBUTILS_H_INC
|
|
Loading…
Reference in New Issue
Block a user