usbloadergx/source/homebrewboot/HomebrewFiles.cpp
giantpune 19067967bc change the onscreen keyboard to filebrowser for custom paths
no button to create a new file and a little bug with the scrolling, but better than typing stuff in.

added channel launcher.  currently doesnt show the actual name, only the u32 and ID.  also, it is only showing 0x00010001 channels, so no Mii, weather, or other crappy channels,  just the good stuff.

fixed bug that showed the MacOS hidden files as extra homebrew entries.
2009-07-25 09:39:01 +00:00

103 lines
2.5 KiB
C++

/****************************************************************************
* HomebrewFiles Class
* for USB Loader GX
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/dir.h>
#include "HomebrewFiles.h"
HomebrewFiles::HomebrewFiles(const char * path)
{
filecount = 0;
this->LoadPath(path);
this->SortList();
}
HomebrewFiles::~HomebrewFiles()
{
}
bool HomebrewFiles::LoadPath(const char * folderpath)
{
struct stat st;
DIR_ITER *dir = NULL;
char filename[1024];
dir = diropen(folderpath);
if(dir == NULL) {
return false;
}
while (dirnext(dir,filename,&st) == 0)
{
if((st.st_mode & S_IFDIR) != 0) {
if(strcmp(filename,".") != 0 && strcmp(filename,"..") != 0) {
char currentname[200];
snprintf(currentname, sizeof(currentname), "%s%s/", folderpath, filename);
this->LoadPath(currentname);
}
} else {
char temp[5];
for(int i = 0; i < 5; i++) {
temp[i] = filename[strlen(filename)-4+i];
}
if((strncasecmp(temp, ".dol", 4) == 0 || strncasecmp(temp, ".elf", 4) == 0)
&& filecount < MAXHOMEBREWS && filename[0]!='.') {
strncpy(FileInfo[filecount].FilePath, folderpath, sizeof(FileInfo[filecount].FilePath));
strncpy(FileInfo[filecount].FileName, filename, sizeof(FileInfo[filecount].FileName));
FileInfo[filecount].FileSize = st.st_size;
filecount++;
}
}
}
dirclose(dir);
return true;
}
char * HomebrewFiles::GetFilename(int ind)
{
if(ind > filecount)
return NULL;
else
return FileInfo[ind].FileName;
}
char * HomebrewFiles::GetFilepath(int ind)
{
if(ind > filecount)
return NULL;
else
return FileInfo[ind].FilePath;
}
unsigned int HomebrewFiles::GetFilesize(int ind)
{
if(ind > filecount)
return NULL;
else
return FileInfo[ind].FileSize;
}
int HomebrewFiles::GetFilecount()
{
return filecount;
}
int ListCompare(const void *a, const void *b)
{
FileInfos *ab = (FileInfos*) a;
FileInfos *bb = (FileInfos*) b;
return stricmp((char *) ab->FilePath, (char *) bb->FilePath);
}
void HomebrewFiles::SortList()
{
qsort(FileInfo, filecount, sizeof(FileInfos), ListCompare);
}