📄 filer.c
字号:
#include "launchelf.h"
typedef struct{
char name[256];
char title[16*4+1];
unsigned short attr;
} FILEINFO;
enum
{
COPY,
CUT,
PASTE,
DELETE,
RENAME,
NEWDIR,
GETSIZE,
NUM_MENU
};
unsigned char *elisaFnt=NULL;
size_t freeSpace;
int mcfreeSpace;
int vfreeSpace;
int cut;
int nclipFiles, nmarks, nparties;
int title;
char mountedParty[2][MAX_NAME];
char parties[MAX_PARTITIONS][MAX_NAME];
char clipPath[MAX_PATH], LastDir[MAX_NAME], marks[MAX_ENTRY];
FILEINFO clipFiles[MAX_ENTRY];
int fileMode = FIO_S_IRUSR | FIO_S_IWUSR | FIO_S_IXUSR | FIO_S_IRGRP | FIO_S_IWGRP | FIO_S_IXGRP | FIO_S_IROTH | FIO_S_IWOTH | FIO_S_IXOTH;
///////////////////////////////////////////////////////////////////////////
// HDD偺僷乕僥傿僔儑儞偲僷僗傪庢摼
int getHddParty(const char *path, const FILEINFO *file, char *party, char *dir)
{
char fullpath[MAX_PATH], *p;
if(strncmp(path,"hdd",3)) return -1;
strcpy(fullpath, path);
if(file!=NULL){
strcat(fullpath, file->name);
if(file->attr & FIO_S_IFDIR) strcat(fullpath,"/");
}
if((p=strchr(&fullpath[6], '/'))==NULL) return -1;
if(dir!=NULL) sprintf(dir, "pfs0:%s", p);
*p=0;
if(party!=NULL) sprintf(party, "hdd0:%s", &fullpath[6]);
return 0;
}
///////////////////////////////////////////////////////////////////////////
// 僷乕僥傿僔儑儞偺儅僂儞僩
int mountParty(const char *party)
{
if(!strcmp(party, mountedParty[0]))
return 0;
else if(!strcmp(party, mountedParty[1]))
return 1;
fileXioUmount("pfs0:"); mountedParty[0][0]=0;
if(fileXioMount("pfs0:", party, FIO_MT_RDWR) < 0) return -1;
strcpy(mountedParty[0], party);
return 0;
}
//////////////////////////////////////////////////////////////////////////
// 妋擣僟僀傾儘僌
int ynDialog(const char *message)
{
char msg[512];
int dh, dw, dx, dy;
int sel=0, a=6, b=4, c=2, n, tw;
int i, x, len, ret;
strcpy(msg, message);
for(i=0,n=1; msg[i]!=0; i++){
if(msg[i]=='\n'){
msg[i]=0;
n++;
}
}
for(i=len=tw=0; i<n; i++){
ret = printXY(&msg[len], 0, 0, 0, FALSE);
if(ret>tw) tw=ret;
len=strlen(&msg[len])+1;
}
if(tw<96) tw=96;
dh = 16*(n+1)+2*2+a+b+c;
dw = 2*2+a*2+tw;
dx = (512-dw)/2;
dy = (432-dh)/2;
printf("tw=%d\ndh=%d\ndw=%d\ndx=%d\ndy=%d\n", tw,dh,dw,dx,dy);
while(1){
waitPadReady(0, 0);
if(readpad()){
if(new_pad & PAD_LEFT){
sel=0;
}else if(new_pad & PAD_RIGHT){
sel=1;
}else if(new_pad & PAD_CROSS){
ret=-1;
break;
}else if(new_pad & PAD_CIRCLE){
if(sel==0) ret=1;
else ret=-1;
break;
}
}
itoSprite(setting->color[0], 0, (SCREEN_MARGIN+FONT_HEIGHT+4)/2,
SCREEN_WIDTH, (SCREEN_MARGIN+FONT_HEIGHT+4+FONT_HEIGHT)/2, 0);
itoSprite(setting->color[0], dx-2, (dy-2)/2, dx+dw+2, (dy+dh+4)/2, 0);
drawFrame(dx, dy/2, dx+dw, (dy+dh)/2, setting->color[1]);
for(i=len=0; i<n; i++){
printXY(&msg[len], dx+2+a,(dy+a+2+i*16)/2, setting->color[3],TRUE);
len=strlen(&msg[len])+1;
}
x=(tw-96)/2;
printXY(" OK CANCEL", dx+a+x, (dy+a+b+2+n*16)/2, setting->color[3],TRUE);
if(sel==0)
drawChar(127, dx+a+x,(dy+a+b+2+n*16)/2, setting->color[3]);
else
drawChar(127,dx+a+x+40,(dy+a+b+2+n*16)/2,setting->color[3]);
drawScr();
}
x=(tw-96)/2;
drawChar(' ', dx+a+x,(dy+a+b+2+n*16)/2, setting->color[3]);
drawChar(' ',dx+a+x+40,(dy+a+b+2+n*16)/2,setting->color[3]);
return ret;
}
////////////////////////////////////////////////////////////////////////
// 僋僀僢僋僜乕僩
int cmpFile(FILEINFO *a, FILEINFO *b)
{
unsigned char *p, ca, cb;
int i, n, ret, aElf=FALSE, bElf=FALSE, t=title;
if(a->attr==b->attr){
if(a->attr & FIO_S_IFREG){
p = strrchr(a->name, '.');
if(p!=NULL && !stricmp(p+1, "ELF")) aElf=TRUE;
p = strrchr(b->name, '.');
if(p!=NULL && !stricmp(p+1, "ELF")) bElf=TRUE;
if(aElf && !bElf) return -1;
else if(!aElf && bElf) return 1;
t=FALSE;
}
if(t){
if(a->title[0]!=0 && b->title[0]==0) return -1;
else if(a->title[0]==0 && b->title[0]!=0) return 1;
else if(a->title[0]==0 && b->title[0]==0) t=FALSE;
}
if(t) n=strlen(a->title);
else n=strlen(a->name);
for(i=0; i<=n; i++){
if(t){
ca=a->title[i]; cb=b->title[i];
}else{
ca=a->name[i]; cb=b->name[i];
if(ca>='a' && ca<='z') ca-=0x20;
if(cb>='a' && cb<='z') cb-=0x20;
}
ret = ca-cb;
if(ret!=0) return ret;
}
return 0;
}
if(a->attr & FIO_S_IFDIR) return -1;
else return 1;
}
void sort(FILEINFO *a, int left, int right) {
FILEINFO tmp, pivot;
int i, p;
if (left < right) {
pivot = a[left];
p = left;
for (i=left+1; i<=right; i++) {
if (cmpFile(&a[i],&pivot)<0){
p=p+1;
tmp=a[p];
a[p]=a[i];
a[i]=tmp;
}
}
a[left] = a[p];
a[p] = pivot;
sort(a, left, p-1);
sort(a, p+1, right);
}
}
////////////////////////////////////////////////////////////////////////
// 儊儌儕乕僇乕僪撉傒崬傒
int readMC(const char *path, FILEINFO *info, int max)
{
static mcTable mcDir[MAX_ENTRY] __attribute__((aligned(64)));
char dir[MAX_PATH];
int i, j, ret;
mcSync(0,NULL,NULL);
strcpy(dir, &path[4]); strcat(dir, "*");
mcGetDir(path[2]-'0', 0, dir, 0, MAX_ENTRY-2, mcDir);
mcSync(0, NULL, &ret);
for(i=j=0; i<ret; i++)
{
if(mcDir[i].attrFile & MC_ATTR_SUBDIR &&
(!strcmp(mcDir[i].name,".") || !strcmp(mcDir[i].name,"..")))
continue;
strcpy(info[j].name, mcDir[i].name);
if(mcDir[i].attrFile & MC_ATTR_SUBDIR)
info[j].attr = FIO_S_IFDIR;
else
info[j].attr = FIO_S_IFREG;
j++;
}
return j;
}
////////////////////////////////////////////////////////////////////////
// CD撉傒崬傒
int readCD(const char *path, FILEINFO *info, int max)
{
static struct TocEntry TocEntryList[MAX_ENTRY];
char dir[MAX_PATH];
int i, j, n;
loadCdModules();
strcpy(dir, &path[5]);
CDVD_FlushCache();
n = CDVD_GetDir(dir, NULL, CDVD_GET_FILES_AND_DIRS, TocEntryList, MAX_ENTRY, dir);
for(i=j=0; i<n; i++)
{
if(TocEntryList[i].fileProperties & 0x02 &&
(!strcmp(TocEntryList[i].filename,".") ||
!strcmp(TocEntryList[i].filename,"..")))
continue;
strcpy(info[j].name, TocEntryList[i].filename);
if(TocEntryList[i].fileProperties & 0x02)
info[j].attr = FIO_S_IFDIR;
else
info[j].attr = FIO_S_IFREG;
j++;
}
return j;
}
////////////////////////////////////////////////////////////////////////
// 僷乕僥傿僔儑儞儕僗僩愝掕
void setPartyList(void)
{
iox_dirent_t dirEnt;
int hddFd;
nparties=0;
if((hddFd=fileXioDopen("hdd0:")) < 0)
return;
while(fileXioDread(hddFd, &dirEnt) > 0)
{
if(nparties >= MAX_PARTITIONS)
break;
if((dirEnt.stat.attr & ATTR_SUB_PARTITION)
|| (dirEnt.stat.mode == FS_TYPE_EMPTY))
continue;
if(!strncmp(dirEnt.name, "PP.HDL.", 7))
continue;
if(!strncmp(dirEnt.name, "__", 2) && strcmp(dirEnt.name, "__boot"))
continue;
strcpy(parties[nparties++], dirEnt.name);
}
fileXioDclose(hddFd);
}
////////////////////////////////////////////////////////////////////////
// HDD撉傒崬傒
int readHDD(const char *path, FILEINFO *info, int max)
{
iox_dirent_t dirbuf;
char party[MAX_PATH], dir[MAX_PATH];
int i=0, fd, ret;
if(nparties==0){
loadHddModules();
setPartyList();
}
if(!strcmp(path, "hdd0:/")){
for(i=0; i<nparties; i++){
strcpy(info[i].name, parties[i]);
info[i].attr = FIO_S_IFDIR;
}
return nparties;
}
getHddParty(path,NULL,party,dir);
ret = mountParty(party);
if(ret<0) return 0;
dir[3] = ret+'0';
if((fd=fileXioDopen(dir)) < 0) return 0;
while(fileXioDread(fd, &dirbuf)){
if(dirbuf.stat.mode & FIO_S_IFDIR &&
(!strcmp(dirbuf.name,".") || !strcmp(dirbuf.name,"..")))
continue;
info[i].attr = dirbuf.stat.mode;
strcpy(info[i].name, dirbuf.name);
i++;
if(i==max) break;
}
fileXioDclose(fd);
return i;
}
////////////////////////////////////////////////////////////////////////
// USB儅僗僗僩儗乕僕撉傒崬傒
int readMASS(const char *path, FILEINFO *info, int max)
{
fat_dir_record record;
int ret, n=0;
loadUsbModules();
ret = usb_mass_getFirstDirentry((char*)path+5, &record);
while(ret > 0){
if(record.attr & 0x10 &&
(!strcmp(record.name,".") || !strcmp(record.name,".."))){
ret = usb_mass_getNextDirentry(&record);
continue;
}
strcpy(info[n].name, record.name);
if(record.attr & 0x10)
info[n].attr = FIO_S_IFDIR;
else
info[n].attr = FIO_S_IFREG;
n++;
ret = usb_mass_getNextDirentry(&record);
}
return n;
}
////////////////////////////////////////////////////////////////////////
// 僼傽僀儖儕僗僩庢摼
int getDir(const char *path, FILEINFO *info)
{
int max=MAX_ENTRY-2;
int n;
if(!strncmp(path, "mc", 2)) n=readMC(path, info, max);
else if(!strncmp(path, "hdd", 3)) n=readHDD(path, info, max);
else if(!strncmp(path, "mass", 4)) n=readMASS(path, info, max);
else if(!strncmp(path, "cdfs", 4)) n=readCD(path, info, max);
else return 0;
return n;
}
///////////////////////////////////////////////////////////////////////////
// 僙乕僽僨乕僞僞僀僩儖偺庢摼
int getGameTitle(const char *path, const FILEINFO *file, char *out)
{
iox_dirent_t dirEnt;
char party[MAX_NAME], dir[MAX_PATH];
int fd=-1, dirfd=-1, size, hddin=FALSE, ret;
if(file->attr & FIO_S_IFREG) return -1;
if(path[0]==0 || !strcmp(path,"hdd0:/")) return -1;
if(!strncmp(path, "hdd", 3)){
ret = getHddParty(path, file, party, dir);
if(mountParty(party)<0) return -1;
dir[3]=ret+'0';
hddin=TRUE;
}else
sprintf(dir, "%s%s/", path, file->name);
ret = -1;
if(hddin){
if((dirfd=fileXioDopen(dir)) < 0) goto error;
while(fileXioDread(dirfd, &dirEnt)){
if(dirEnt.stat.mode & FIO_S_IFREG &&
!strcmp(dirEnt.name,"icon.sys")){
strcat(dir, "icon.sys");
if((fd=fileXioOpen(dir, O_RDONLY, fileMode)) < 0)
goto error;
if((size=fileXioLseek(fd,0,SEEK_END)) <= 0x100)
goto error;
fileXioLseek(fd,0xC0,SEEK_SET);
fileXioRead(fd, out, 16*4);
out[16*4] = 0;
fileXioClose(fd); fd=-1;
ret=0;
break;
}
}
fileXioDclose(dirfd); dirfd=-1;
}else{
strcat(dir, "icon.sys");
if((fd=fioOpen(dir, O_RDONLY)) < 0) goto error;
if((size=fioLseek(fd,0,SEEK_END)) <= 0x100) goto error;
fioLseek(fd,0xC0,SEEK_SET);
fioRead(fd, out, 16*4);
out[16*4] = 0;
fioClose(fd); fd=-1;
ret=0;
}
error:
if(fd>=0){
if(hddin) fileXioClose(fd);
else fioClose(fd);
}
if(dirfd>=0) fileXioDclose(dirfd);
return ret;
}
////////////////////////////////////////////////////////////////////////
// 儊僯儏乕
int menu(const char *path, const char *file)
{
uint64 color;
char enable[NUM_MENU], tmp[64];
int x, y, i, sel;
// 儊僯儏乕崁栚桳岠丒柍岠愝掕
memset(enable, TRUE, NUM_MENU);
if(!strcmp(path,"hdd0:/") || path[0]==0){
enable[COPY] = FALSE;
enable[CUT] = FALSE;
enable[PASTE] = FALSE;
enable[DELETE] = FALSE;
enable[RENAME] = FALSE;
enable[NEWDIR] = FALSE;
enable[GETSIZE] = FALSE;
}
if(!strncmp(path,"cdfs",4)){
enable[CUT] = FALSE;
enable[PASTE] = FALSE;
enable[DELETE] = FALSE;
enable[RENAME] = FALSE;
enable[NEWDIR] = FALSE;
}
if(!strncmp(path, "mass", 4)){
//enable[CUT] = FALSE;
//enable[PASTE] = FALSE;
//enable[DELETE] = FALSE;
enable[RENAME] = FALSE;
//enable[NEWDIR] = FALSE;
}
if(!strncmp(path, "mc", 2))
enable[RENAME] = FALSE;
if(nmarks==0){
if(!strcmp(file, "..")){
enable[COPY] = FALSE;
enable[CUT] = FALSE;
enable[DELETE] = FALSE;
enable[RENAME] = FALSE;
enable[GETSIZE] = FALSE;
}
}else
enable[RENAME] = FALSE;
if(nclipFiles==0)
enable[PASTE] = FALSE;
// 弶婜慖戰崁愝掕
for(sel=0; sel<NUM_MENU; sel++)
if(enable[sel]==TRUE) break;
while(1){
waitPadReady(0, 0);
if(readpad()){
if(new_pad & PAD_UP && sel<NUM_MENU){
do{
sel--;
if(sel<0) sel=NUM_MENU-1;
}while(!enable[sel]);
}else if(new_pad & PAD_DOWN && sel<NUM_MENU){
do{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -