00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <gccore.h>
00011 #include <stdio.h>
00012 #include <stdlib.h>
00013 #include <string.h>
00014 #include <wiiuse/wpad.h>
00015 #include <sys/dir.h>
00016 #include <malloc.h>
00017
00018 #include "filebrowser.h"
00019 #include "menu.h"
00020
00021 BROWSERINFO browser;
00022 BROWSERENTRY * browserList = NULL;
00023
00024 char rootdir[10];
00025
00026
00027
00028
00029
00030 void ResetBrowser()
00031 {
00032 browser.numEntries = 0;
00033 browser.selIndex = 0;
00034 browser.pageIndex = 0;
00035
00036
00037 if(browserList != NULL)
00038 {
00039 free(browserList);
00040 browserList = NULL;
00041 }
00042
00043 browserList = (BROWSERENTRY *)malloc(sizeof(BROWSERENTRY));
00044 memset(browserList, 0, sizeof(BROWSERENTRY));
00045 }
00046
00047
00048
00049
00050
00051 int UpdateDirName()
00052 {
00053 int size=0;
00054 char * test;
00055 char temp[1024];
00056
00057
00058 if (strcmp(browserList[browser.selIndex].filename,".") == 0)
00059 {
00060 return 0;
00061 }
00062
00063 else if (strcmp(browserList[browser.selIndex].filename,"..") == 0)
00064 {
00065
00066 sprintf(temp,"%s",browser.dir);
00067 test = strtok(temp,"/");
00068 while (test != NULL)
00069 {
00070 size = strlen(test);
00071 test = strtok(NULL,"/");
00072 }
00073
00074
00075 size = strlen(browser.dir) - size - 1;
00076 browser.dir[size] = 0;
00077
00078 return 1;
00079 }
00080
00081 else
00082 {
00083
00084 if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) < MAXPATHLEN)
00085 {
00086
00087 sprintf(browser.dir, "%s/%s",browser.dir, browserList[browser.selIndex].filename);
00088 return 1;
00089 }
00090 else
00091 {
00092 return -1;
00093 }
00094 }
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 int FileSortCallback(const void *f1, const void *f2)
00107 {
00108
00109 if(((BROWSERENTRY *)f1)->filename[0] == '.' || ((BROWSERENTRY *)f2)->filename[0] == '.')
00110 {
00111 if(strcmp(((BROWSERENTRY *)f1)->filename, ".") == 0) { return -1; }
00112 if(strcmp(((BROWSERENTRY *)f2)->filename, ".") == 0) { return 1; }
00113 if(strcmp(((BROWSERENTRY *)f1)->filename, "..") == 0) { return -1; }
00114 if(strcmp(((BROWSERENTRY *)f2)->filename, "..") == 0) { return 1; }
00115 }
00116
00117
00118 if(((BROWSERENTRY *)f1)->isdir && !(((BROWSERENTRY *)f2)->isdir)) return -1;
00119 if(!(((BROWSERENTRY *)f1)->isdir) && ((BROWSERENTRY *)f2)->isdir) return 1;
00120
00121 return stricmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename);
00122 }
00123
00124
00125
00126
00127 int
00128 ParseDirectory()
00129 {
00130 DIR_ITER *dir = NULL;
00131 char fulldir[MAXPATHLEN];
00132 char filename[MAXPATHLEN];
00133 struct stat filestat;
00134
00135
00136 ResetBrowser();
00137
00138
00139 sprintf(fulldir, "%s%s", rootdir, browser.dir);
00140 dir = diropen(fulldir);
00141
00142
00143 if (dir == NULL)
00144 {
00145 sprintf(browser.dir,"/");
00146 dir = diropen(rootdir);
00147 if (dir == NULL)
00148 {
00149 return -1;
00150 }
00151 }
00152
00153
00154 int entryNum = 0;
00155
00156 while(dirnext(dir,filename,&filestat) == 0)
00157 {
00158 if(strcmp(filename,".") != 0)
00159 {
00160 BROWSERENTRY * newBrowserList = (BROWSERENTRY *)realloc(browserList, (entryNum+1) * sizeof(BROWSERENTRY));
00161
00162 if(!newBrowserList)
00163 {
00164 ResetBrowser();
00165 entryNum = -1;
00166 break;
00167 }
00168 else
00169 {
00170 browserList = newBrowserList;
00171 }
00172 memset(&(browserList[entryNum]), 0, sizeof(BROWSERENTRY));
00173
00174 strncpy(browserList[entryNum].filename, filename, MAXJOLIET);
00175
00176 if(strcmp(filename,"..") == 0)
00177 {
00178 sprintf(browserList[entryNum].displayname, "Up One Level");
00179 }
00180 else
00181 {
00182 strncpy(browserList[entryNum].displayname, filename, MAXDISPLAY);
00183 }
00184
00185 browserList[entryNum].length = filestat.st_size;
00186 browserList[entryNum].isdir = (filestat.st_mode & _IFDIR) == 0 ? 0 : 1;
00187
00188 entryNum++;
00189 }
00190 }
00191
00192
00193 dirclose(dir);
00194
00195
00196 qsort(browserList, entryNum, sizeof(BROWSERENTRY), FileSortCallback);
00197
00198 browser.numEntries = entryNum;
00199 return entryNum;
00200 }
00201
00202
00203
00204
00205
00206
00207 int BrowserChangeFolder()
00208 {
00209 if(!UpdateDirName())
00210 return -1;
00211
00212 ParseDirectory();
00213
00214 return browser.numEntries;
00215 }
00216
00217
00218
00219
00220
00221 int BrowseDevice()
00222 {
00223 sprintf(browser.dir, "/");
00224 sprintf(rootdir, "sd:/");
00225 ParseDirectory();
00226 return browser.numEntries;
00227 }