int read_safe(void* dst, uint64_t offset, int len) { int ol = len; int ret = 0; unsigned char* sector_buffer = (unsigned char*)memalign(32,32768); while (len) { ret |= DVD_LowRead64(sector_buffer, 32768, offset); uint32_t off = offset & 32767; int rl = 32768 - off; if (rl > len) rl = len; else rl = 32768; memcpy(dst, sector_buffer, rl); offset += rl; len -= rl; dst += rl; } free(sector_buffer); if(ret) return -1; if(dvd_get_error()) init_dvd(); return ol; }
int fileBrowser_DVD_readDir(fileBrowser_file* ffile, fileBrowser_file** dir){ int ret = 0; num_entries = 0; if(dvd_get_error() || !dvd_init) { //if some error ret = init_dvd(); if(ret) { //try init return ret; //fail } dvd_init = 1; } // Call the corresponding DVD function num_entries = dvd_read_directoryentries(ffile->discoffset,ffile->size); // If it was not successful, just return the error if(num_entries <= 0) return FILE_BROWSER_ERROR; // Convert the DVD "file" data to fileBrowser_files *dir = malloc( num_entries * sizeof(fileBrowser_file) ); int i; for(i=0; i<num_entries; ++i){ strcpy( (*dir)[i].name, &DVDToc.file[i].name[0] ); (*dir)[i].discoffset = (uint64_t)(((uint64_t)DVDToc.file[i].sector)*2048); (*dir)[i].offset = 0; (*dir)[i].size = DVDToc.file[i].size; (*dir)[i].attr = 0; if(DVDToc.file[i].flags == 2)//on DVD, 2 is a dir (*dir)[i].attr = FILE_BROWSER_ATTR_DIR; if((*dir)[i].name[strlen((*dir)[i].name)-1] == '/' ) (*dir)[i].name[strlen((*dir)[i].name)-1] = 0; //get rid of trailing '/' } if(strlen((*dir)[0].name) == 0) strcpy( (*dir)[0].name, ".." ); return num_entries; }
int fileBrowser_DVD_readDir(fileBrowser_file* ffile, fileBrowser_file** dir){ int num_entries = 0, ret = 0; if(dvd_get_error() || !dvd_init) { //if some error ret = init_dvd(); if(ret) { //try init return ret; //fail } dvd_init = 1; } if (!memcmp((void*)0x80000000, "D43U01", 6)) { //OoT+MQ bonus disc support. num_entries = 2; *dir = malloc( num_entries * sizeof(fileBrowser_file) ); strcpy( (*dir)[0].name, ZELDA_OOT_NAME); (*dir)[0].discoffset = 0x54FBEEF4ULL; (*dir)[0].offset = 0; (*dir)[0].size = 0x2000000; (*dir)[0].attr = 0; strcpy( (*dir)[1].name, ZELDA_MQ_NAME); (*dir)[1].discoffset = 0x52CCC5FCULL; (*dir)[1].offset = 0; (*dir)[1].size = 0x2000000; (*dir)[1].attr = 0; return num_entries; } else if (!memcmp((void*)0x80000000, "D43E01", 6)) { num_entries = 2; *dir = malloc( num_entries * sizeof(fileBrowser_file) ); strcpy( (*dir)[0].name, ZELDA_OOT_NAME); (*dir)[0].discoffset = 0x550569D8ULL; (*dir)[0].offset = 0; (*dir)[0].size = 0x2000000; (*dir)[0].attr = 0; strcpy( (*dir)[1].name, ZELDA_MQ_NAME); (*dir)[1].discoffset = 0x52FBC1E0ULL; (*dir)[1].offset = 0; (*dir)[1].size = 0x2000000; (*dir)[1].attr = 0; return num_entries; } else if (!memcmp((void*)0x80000000, "PZLP01", 6)) { //Zelda Collectors disc support. num_entries = 2; *dir = malloc( num_entries * sizeof(fileBrowser_file) ); strcpy( (*dir)[0].name, ZELDA_OOT_NAME); (*dir)[0].discoffset = 0x3B9D1FC0ULL; (*dir)[0].offset = 0; (*dir)[0].size = 0x2000000; (*dir)[0].attr = 0; strcpy( (*dir)[1].name, ZELDA_MM_NAME); (*dir)[1].discoffset = 0x0C4E1FC0ULL; (*dir)[1].offset = 0; (*dir)[1].size = 0x2000000; (*dir)[1].attr = 0; return num_entries; } // Call the corresponding DVD function num_entries = dvd_read_directoryentries(ffile->discoffset,ffile->size); // If it was not successful, just return the error if(num_entries <= 0) return FILE_BROWSER_ERROR; // Convert the DVD "file" data to fileBrowser_files *dir = malloc( num_entries * sizeof(fileBrowser_file) ); int i; for(i=0; i<num_entries; ++i){ strcpy( (*dir)[i].name, DVDToc->file[i].name ); (*dir)[i].discoffset = (uint64_t)(((uint64_t)DVDToc->file[i].sector)*2048); (*dir)[i].offset = 0; (*dir)[i].size = DVDToc->file[i].size; (*dir)[i].attr = 0; if(DVDToc->file[i].flags == 2)//on DVD, 2 is a dir (*dir)[i].attr = FILE_BROWSER_ATTR_DIR; if((*dir)[i].name[strlen((*dir)[i].name)-1] == '/' ) (*dir)[i].name[strlen((*dir)[i].name)-1] = 0; //get rid of trailing '/' } //kill the large TOC so we can have a lot more memory ingame (256k more) free(DVDToc); DVDToc = NULL; if(strlen((*dir)[0].name) == 0) strcpy( (*dir)[0].name, ".." ); return num_entries; }