nkeynes@492: /** nkeynes@561: * $Id$ nkeynes@492: * nkeynes@492: * NullDC GDI image format nkeynes@492: * nkeynes@492: * Copyright (c) 2005 Nathan Keynes. nkeynes@492: * nkeynes@492: * This program is free software; you can redistribute it and/or modify nkeynes@492: * it under the terms of the GNU General Public License as published by nkeynes@492: * the Free Software Foundation; either version 2 of the License, or nkeynes@492: * (at your option) any later version. nkeynes@492: * nkeynes@492: * This program is distributed in the hope that it will be useful, nkeynes@492: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@492: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@492: * GNU General Public License for more details. nkeynes@492: */ nkeynes@492: nkeynes@492: #include nkeynes@492: #include nkeynes@492: #include nkeynes@492: #include nkeynes@492: #include nkeynes@492: #include nkeynes@492: #include nkeynes@492: #include "gdrom/gdrom.h" nkeynes@492: nkeynes@492: nkeynes@492: static gboolean gdi_image_is_valid( FILE *f ); nkeynes@492: static gdrom_disc_t gdi_image_open( const gchar *filename, FILE *f ); nkeynes@492: nkeynes@492: struct gdrom_image_class gdi_image_class = { "NullDC GD-Rom Image", "gdi", nkeynes@492: gdi_image_is_valid, gdi_image_open }; nkeynes@492: nkeynes@492: static gboolean gdi_image_is_valid( FILE *f ) nkeynes@492: { nkeynes@492: char line[512]; nkeynes@492: uint32_t track_count; nkeynes@492: nkeynes@492: fseek(f, 0, SEEK_SET); nkeynes@492: if( fgets( line, sizeof(line), f ) == NULL ) { nkeynes@492: return FALSE; nkeynes@492: } nkeynes@492: track_count = strtoul(line, NULL, 0); nkeynes@492: if( track_count == 0 || track_count > 99 ) { nkeynes@492: return FALSE; nkeynes@492: } nkeynes@492: return TRUE; nkeynes@492: } nkeynes@492: nkeynes@492: static gdrom_disc_t gdi_image_open( const gchar *filename, FILE *f ) nkeynes@492: { nkeynes@492: int i; nkeynes@492: uint32_t track_count; nkeynes@492: gdrom_disc_t disc; nkeynes@492: gdrom_image_t image; nkeynes@492: struct stat st; nkeynes@492: char line[512]; nkeynes@492: gchar *dirname; nkeynes@492: nkeynes@492: fseek(f, 0, SEEK_SET); nkeynes@492: nkeynes@492: if( fgets( line, sizeof(line), f ) == NULL ) { nkeynes@492: return FALSE; nkeynes@492: } nkeynes@492: track_count = strtoul(line, NULL, 0); nkeynes@492: if( track_count == 0 || track_count > 99 ) { nkeynes@492: return NULL; nkeynes@492: } nkeynes@492: nkeynes@492: disc = gdrom_image_new(filename, f); nkeynes@492: if( disc == NULL ) { nkeynes@492: ERROR("Unable to allocate memory!"); nkeynes@492: return NULL; nkeynes@492: } nkeynes@492: dirname = g_path_get_dirname(filename); nkeynes@492: image = (gdrom_image_t)disc; nkeynes@492: image->disc_type = IDE_DISC_GDROM; nkeynes@492: image->track_count = track_count; nkeynes@492: for( i=0; i= 45000 ) { nkeynes@492: image->track[i].session = 1; nkeynes@492: } else { nkeynes@492: image->track[i].session = 0; nkeynes@492: } nkeynes@492: image->track[i].lba = start_lba + 150; // 2-second offset nkeynes@492: image->track[i].flags = (flags & 0x0F)<<4; nkeynes@492: image->track[i].sector_size = size; nkeynes@492: if( strcasecmp( filename, "none" ) == 0 ) { nkeynes@492: image->track[i].file = NULL; nkeynes@492: image->track[i].sector_count = 0; nkeynes@492: image->track[i].mode = GDROM_MODE1; nkeynes@492: } else { nkeynes@492: gchar *pathname = g_strdup_printf( "%s%c%s", dirname, G_DIR_SEPARATOR, filename ); nkeynes@492: image->track[i].file = fopen( pathname, "ro" ); nkeynes@492: g_free(pathname); nkeynes@492: if( image->track[i].file == NULL ) { nkeynes@492: gdrom_image_destroy_no_close(disc); nkeynes@492: g_free(dirname); nkeynes@492: return NULL; nkeynes@492: } nkeynes@492: fstat( fileno(image->track[i].file), &st ); nkeynes@492: image->track[i].sector_count = st.st_size / size; nkeynes@498: if( image->track[i].flags & TRACK_DATA ) { nkeynes@498: /* Data track */ nkeynes@498: switch(size) { nkeynes@498: case 2048: image->track[i].mode = GDROM_MODE1; break; nkeynes@498: case 2336: image->track[i].mode = GDROM_GD; break; nkeynes@498: case 2352: image->track[i].mode = GDROM_RAW; break; nkeynes@498: default: nkeynes@498: gdrom_image_destroy_no_close(disc); nkeynes@498: g_free(dirname); nkeynes@498: return NULL; nkeynes@498: } nkeynes@498: } else { nkeynes@498: /* Audio track */ nkeynes@498: image->track[i].mode = GDROM_CDDA; nkeynes@498: if( size != 2352 ) { nkeynes@498: gdrom_image_destroy_no_close(disc); nkeynes@498: g_free(dirname); nkeynes@498: return NULL; nkeynes@498: } nkeynes@492: } nkeynes@492: } nkeynes@492: image->track[i].offset = offset; nkeynes@492: } nkeynes@492: g_free(dirname); nkeynes@492: return disc; nkeynes@492: }