void default_cdrom_disc_destroy( sector_source_t source ) { assert( IS_SECTOR_SOURCE_TYPE(source,DISC_SECTOR_SOURCE) ); cdrom_disc_t disc = (cdrom_disc_t)source; int i; for( i=0; i<disc->track_count; i++ ) { sector_source_unref( disc->track[i].source ); } sector_source_unref( disc->base_source ); g_free( (char *)disc->name ); default_sector_source_destroy( source ); }
/** * Construct a sector source from a given IsoImage. */ sector_source_t iso_sector_source_new( IsoImage *image, sector_mode_t mode, cdrom_lba_t start_sector, const char *bootstrap, ERROR *err ) { assert( mode == SECTOR_MODE1 || mode == SECTOR_MODE2_FORM1 ); IsoWriteOpts *opts; struct burn_source *burn; int status = iso_write_opts_new(&opts, 0); if( status != 1 ) { iso_error_convert(status, err); return NULL; } iso_write_opts_set_appendable(opts,0); iso_write_opts_set_ms_block(opts, start_sector); status = iso_image_create_burn_source(image, opts, &burn); iso_write_opts_free(opts); if( status != 1 ) { iso_error_convert(status, err); return NULL; } off_t size = burn->get_size(burn); sector_source_t source = tmpfile_sector_source_new(mode); if( source == NULL ) { burn->free_data(burn); free(burn); return NULL; } unsigned char buf[2048]; cdrom_count_t expect = size/2048; int fd = file_sector_source_get_fd(source); source->size = expect; lseek( fd, 0, SEEK_SET ); write( fd, bootstrap, 32768 ); for( cdrom_count_t count = 0; count < expect; count++ ) { if( burn->read == NULL ) { status = burn->read_xt(burn, buf, 2048); } else { status = burn->read(burn, buf, 2048); } if( status == 0 ) { /* EOF */ break; } else if( status != 2048 ) { /* Error */ sector_source_unref(source); source = NULL; break; } /* Discard first 16 sectors, replaced with the bootstrap */ if( count >= (32768/2048) ) write( fd, buf, 2048 ); } burn->free_data(burn); free(burn); return source; }
void cdrom_disc_clear_toc( cdrom_disc_t disc ) { disc->disc_type = CDROM_DISC_NONE; disc->leadout = 0; disc->track_count = 0; disc->session_count = 0; for( unsigned i=0; i< CDROM_MAX_TRACKS; i++ ) { if( disc->track[i].source != NULL ) { sector_source_unref( disc->track[i].source ); disc->track[i].source = NULL; } } }
/** * Construct a disc around an IsoImage track (convenience function) */ cdrom_disc_t cdrom_disc_new_from_iso_image( cdrom_disc_type_t type, IsoImage *iso, cdrom_lba_t lba, const char *bootstrap, ERROR *err ) { sector_mode_t mode = (type == CDROM_DISC_NONXA ? SECTOR_MODE1 : SECTOR_MODE2_FORM1 ); sector_source_t source = iso_sector_source_new( iso, mode, lba, bootstrap, err ); if( source != NULL ) { cdrom_disc_t disc = cdrom_disc_new_from_track(type, source, lba, err); if( disc == NULL ) { sector_source_unref( source ); } else { return disc; } } return NULL; }
static void isofs_release(IsoDataSource *src) { sector_source_unref((sector_source_t)src->data); }