Example #1
0
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;
}
Example #2
0
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;
}