Ejemplo n.º 1
0
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 );
}
Ejemplo n.º 2
0
/**
 * 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;
}
Ejemplo n.º 3
0
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;
        }
    }
}
Ejemplo n.º 4
0
/**
 * 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;
}
Ejemplo n.º 5
0
static void isofs_release(IsoDataSource *src)
{
    sector_source_unref((sector_source_t)src->data);
}