diff --git a/file.c b/file.c
index 6eee45f..fab36db 100644
--- a/file.c
+++ b/file.c
@@ -360,9 +360,9 @@ static ExtensionType extension_types[] = {
{ ".JPEG", FILE_TYPE_JPEG },
{ ".PNG", FILE_TYPE_PNG },
{ ".MP3", FILE_TYPE_MP3 },
+ { ".SFO", FILE_TYPE_SFO },
{ ".VPK", FILE_TYPE_VPK },
{ ".ZIP", FILE_TYPE_ZIP },
- { ".SFO", FILE_TYPE_SFO },
};
int getFileType(char *file) {
diff --git a/file.h b/file.h
index 658e420..6bbd479 100644
--- a/file.h
+++ b/file.h
@@ -35,9 +35,9 @@ enum FileTypes {
FILE_TYPE_JPEG,
FILE_TYPE_PNG,
FILE_TYPE_MP3,
+ FILE_TYPE_SFO,
FILE_TYPE_VPK,
FILE_TYPE_ZIP,
- FILE_TYPE_SFO,
};
enum SortFlags {
diff --git a/package_installer.c b/package_installer.c
index 2649f52..58623ce 100644
--- a/package_installer.c
+++ b/package_installer.c
@@ -24,6 +24,7 @@
#include "message_dialog.h"
#include "language.h"
#include "utils.h"
+#include "sfo.h"
#include "sha1.h"
#include "sysmodule_internal.h"
#include "libpromoter/promoterutil.h"
diff --git a/package_installer.h b/package_installer.h
index 38e08a6..fe6a6a5 100644
--- a/package_installer.h
+++ b/package_installer.h
@@ -19,23 +19,6 @@
#ifndef __PACKAGE_INSTALLER_H__
#define __PACKAGE_INSTALLER_H__
-typedef struct SfoHeader {
- uint32_t magic;
- uint32_t version;
- uint32_t keyofs;
- uint32_t valofs;
- uint32_t count;
-} __attribute__((packed)) SfoHeader;
-
-typedef struct SfoEntry {
- uint16_t nameofs;
- uint8_t alignment;
- uint8_t type;
- uint32_t valsize;
- uint32_t totalsize;
- uint32_t dataofs;
-} __attribute__((packed)) SfoEntry;
-
typedef struct {
char *file;
} InstallArguments;
diff --git a/sfo.c b/sfo.c
index a42cced..a5b8c3f 100644
--- a/sfo.c
+++ b/sfo.c
@@ -1,3 +1,21 @@
+/*
+ VitaShell
+ Copyright (C) 2015-2016, TheFloW
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
#include "main.h"
#include "archive.h"
#include "file.h"
@@ -9,7 +27,7 @@
#include "utils.h"
#include "sfo.h"
-int SFOReader(char* file) {
+int SFOReader(char *file) {
uint8_t *buffer = malloc(BIG_BUFFER_SIZE);
if (!buffer)
return -1;
@@ -27,19 +45,11 @@ int SFOReader(char* file) {
return size;
}
- sfo_header_t *sfo_header = (sfo_header_t*)buffer;
- if (sfo_header->magic != 0x46535000)
- return -1;
+ SfoHeader *sfo_header = (SfoHeader *)buffer;
+ if (sfo_header->magic != SFO_MAGIC)
+ return -1;
- int scroll_allow = sfo_header->indexTableEntries - MAX_ENTRIES;
- if (scroll_allow < 0)
- scroll_allow = 0;
-
- int line_show = sfo_header->indexTableEntries;
- if (line_show > MAX_ENTRIES)
- line_show = MAX_ENTRIES;
-
- int current_pos = 0;
+ int base_pos = 0, rel_pos = 0;
while (1) {
readPad();
@@ -49,11 +59,23 @@ int SFOReader(char* file) {
}
if (hold_buttons & SCE_CTRL_UP || hold2_buttons & SCE_CTRL_LEFT_ANALOG_UP) {
- if (current_pos != 0)
- current_pos--;
+ if (rel_pos > 0) {
+ rel_pos--;
+ } else {
+ if (base_pos > 0) {
+ base_pos--;
+ }
+ }
} else if (hold_buttons & SCE_CTRL_DOWN || hold2_buttons & SCE_CTRL_LEFT_ANALOG_DOWN) {
- if (current_pos != scroll_allow)
- current_pos++;
+ if ((rel_pos + 1) < sfo_header->count) {
+ if ((rel_pos + 1) < MAX_POSITION) {
+ rel_pos++;
+ } else {
+ if ((base_pos + rel_pos + 1) < sfo_header->count) {
+ base_pos++;
+ }
+ }
+ }
}
// Start drawing
@@ -62,26 +84,35 @@ int SFOReader(char* file) {
// Draw shell info
drawShellInfo(file);
- sfo_index_t *sfo_index;
- int i;
+ // Draw scroll bar
+ drawScrollBar(base_pos, sfo_header->count);
- // Draw scroll bar
- if (scroll_allow > 0)
- drawScrollBar(current_pos, sfo_header->indexTableEntries);
+ int i;
+ for (i = 0; i < MAX_ENTRIES && (base_pos + i) < sfo_header->count; i++) {
+ SfoEntry *entries = (SfoEntry *)(buffer + sizeof(SfoHeader) + (sizeof(SfoEntry) * (i + base_pos)));
- for (i = 0; i < line_show; i++) {
- sfo_index = (sfo_index_t*)(buffer + sizeof(sfo_header_t) + (sizeof(sfo_index_t) * (i + current_pos)));
+ uint32_t color = (rel_pos == i) ? FOCUS_COLOR : GENERAL_COLOR;
- char* key = (char*)buffer + sfo_header->keyTableOffset + sfo_index->keyOffset;
- pgf_draw_textf(SHELL_MARGIN_X, START_Y + (FONT_Y_SPACE * i), GENERAL_COLOR, FONT_SIZE, "%s", key);
+ char *name = (char *)buffer + sfo_header->keyofs + entries->nameofs;
+ pgf_draw_textf(SHELL_MARGIN_X, START_Y + (FONT_Y_SPACE * i), color, FONT_SIZE, "%s", name);
- if (sfo_index->param_fmt == 1028) {
- unsigned int* value = (unsigned int*)buffer + sfo_header->dataTableOffset + sfo_index->dataOffset;
- pgf_draw_textf(SHELL_MARGIN_X + 450, START_Y + (FONT_Y_SPACE * i), GENERAL_COLOR, FONT_SIZE, "%d", *value);
- } else {
- char* value = (char*)buffer + sfo_header->dataTableOffset + sfo_index->dataOffset;
- pgf_draw_textf(SHELL_MARGIN_X + 450, START_Y + (FONT_Y_SPACE * i), GENERAL_COLOR, FONT_SIZE, "%s", value);
+ char string[128];
+
+ void *data = (void *)buffer + sfo_header->valofs + entries->dataofs;
+ switch (entries->type) {
+ case PSF_TYPE_BIN:
+ break;
+
+ case PSF_TYPE_STR:
+ snprintf(string, sizeof(string), "%s", data);
+ break;
+
+ case PSF_TYPE_VAL:
+ snprintf(string, sizeof(string), "%X", *(uint32_t *)data);
+ break;
}
+
+ pgf_draw_textf(ALIGN_LEFT(INFORMATION_X, vita2d_pgf_text_width(font, FONT_SIZE, string)), START_Y + (FONT_Y_SPACE * i), color, FONT_SIZE, string);
}
// End drawing
diff --git a/sfo.h b/sfo.h
index b2b0f4e..1ff3cb7 100644
--- a/sfo.h
+++ b/sfo.h
@@ -1,27 +1,50 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
+/*
+ VitaShell
+ Copyright (C) 2015-2016, TheFloW
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+
+#ifndef __SFO_H__
+#define __SFO_H__
// Struct from : http://www.vitadevwiki.com/index.php?title=System_File_Object_(SFO)_(PSF)
-typedef struct{
- int magic; //PSF
- int version; //1.1
- int keyTableOffset;
- int dataTableOffset;
- int indexTableEntries;
-} sfo_header_t;
+#define SFO_MAGIC 0x46535000
-typedef struct{
- uint16_t keyOffset; //offset of keytable + keyOffset
- uint16_t param_fmt; //enum (see below)
- uint32_t paramLen;
- uint32_t paramMaxLen;
- uint32_t dataOffset; //offset of datatable + dataOffset
-} sfo_index_t;
+#define PSF_TYPE_BIN 0
+#define PSF_TYPE_STR 2
+#define PSF_TYPE_VAL 4
-int SFOReader(char* file);
\ No newline at end of file
+typedef struct SfoHeader {
+ uint32_t magic;
+ uint32_t version;
+ uint32_t keyofs;
+ uint32_t valofs;
+ uint32_t count;
+} __attribute__((packed)) SfoHeader;
+
+typedef struct SfoEntry {
+ uint16_t nameofs;
+ uint8_t alignment;
+ uint8_t type;
+ uint32_t valsize;
+ uint32_t totalsize;
+ uint32_t dataofs;
+} __attribute__((packed)) SfoEntry;
+
+int SFOReader(char *file);
+
+#endif
\ No newline at end of file