From cc66b5b3a4b7c777b498554c9879d470a1fa1a09 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Wed, 22 Apr 2009 17:36:04 +0000 Subject: [PATCH] New API call isoburn_toc_track_get_emul() --- libisoburn/burn_wrap.c | 41 +++++++++++++++++++++++++++++-------- libisoburn/isoburn.c | 3 +++ libisoburn/isoburn.h | 2 ++ libisoburn/libisoburn.h | 21 +++++++++++++++++-- xorriso/xorriso_timestamp.h | 2 +- 5 files changed, 58 insertions(+), 11 deletions(-) diff --git a/libisoburn/burn_wrap.c b/libisoburn/burn_wrap.c index 637b00c6..f3b73af7 100644 --- a/libisoburn/burn_wrap.c +++ b/libisoburn/burn_wrap.c @@ -1054,13 +1054,14 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba, int isoburn_make_toc_entry(struct isoburn *o, int *session_count, int lba, - int track_blocks, int flag) + int track_blocks, char *volid, int flag) { int ret; struct isoburn_toc_entry *item; ret= isoburn_toc_entry_new(&item, o->toc, 0); if(ret<=0) { +no_memory:; isoburn_msgs_submit(o, 0x00060000, "Not enough memory for emulated TOC entry object", 0, "FATAL", 0); @@ -1073,6 +1074,11 @@ int isoburn_make_toc_entry(struct isoburn *o, int *session_count, int lba, item->track_no= *session_count; item->start_lba= lba; item->track_blocks= track_blocks; + if(volid != NULL) { + item->volid= strdup(volid); + if(item->volid == NULL) + goto no_memory; + } return(1); } @@ -1087,7 +1093,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag) int scan_start= 0, scan_count= 0, probe_minus_16= 0, growisofs_nwa; int with_enclosure= 0; struct isoburn *o; - char msg[160], size_text[80], *sev; + char msg[160], size_text[80], *sev, volid[33], *volid_pt= NULL; time_t start_time, last_pacifier, now; /* is the media emulated multi-session ? */ @@ -1120,7 +1126,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag) session_count, size_text, (double) (now - start_time)); isoburn_msgs_submit(o, 0x00060000, msg, 0, "UPDATE", 0); } - read_flag= 0; + read_flag= 1; if(flag&2) read_flag|= (1<<15)|((session_count>0)<<14); else { @@ -1138,8 +1144,11 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag) probe_minus_16= 0; } - ret= isoburn_read_iso_head(d, lba, &track_blocks, NULL, read_flag); - if(ret<=0) { + ret= isoburn_read_iso_head(d, lba, &track_blocks, volid, read_flag); + if(ret > 0) { + volid_pt= volid; + } else { + volid_pt= NULL; if(session_count>0) { if(flag&2) { if(ret==0) { @@ -1157,7 +1166,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag) isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0); if(with_enclosure) { - ret= isoburn_make_toc_entry(o, &session_count, 0, image_size, 0); + ret= isoburn_make_toc_entry(o, &session_count, 0, image_size, NULL,0); if(ret<=0) goto failure; } @@ -1169,7 +1178,8 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag) if(ret==2) /* ISO header was found in first half block */ lba-= 16; - ret= isoburn_make_toc_entry(o, &session_count, lba, track_blocks, 0); + ret= isoburn_make_toc_entry(o, &session_count, lba, track_blocks, volid_pt, + 0); if(ret<=0) goto failure; lba+= track_blocks; @@ -1202,7 +1212,7 @@ failure:; isoburn_toc_entry_destroy(&(o->toc), 1); if(with_enclosure && o->emulation_mode == 1) { session_count= 0; - ret= isoburn_make_toc_entry(o, &session_count, 0, image_size, 0); + ret= isoburn_make_toc_entry(o, &session_count, 0, image_size, NULL, 0); } return(ret); } @@ -1475,6 +1485,21 @@ void isoburn_toc_track_get_entry(struct isoburn_toc_track *t, } +int isoburn_toc_track_get_emul(struct isoburn_toc_track *t, int *start_lba, + int *image_blocks, char volid[33], int flag) +{ + if(t->toc_entry == NULL) + return(0); + if(t->toc_entry->volid == NULL) + return(0); + *start_lba= t->toc_entry->start_lba; + *image_blocks= t->toc_entry->track_blocks; + strncpy(volid, t->toc_entry->volid, 32); + volid[32]= 0; + return(1); +} + + void isoburn_toc_disc_free(struct isoburn_toc_disc *d) { if(d->disc!=NULL) diff --git a/libisoburn/isoburn.c b/libisoburn/isoburn.c index c16a62fb..70bcd769 100644 --- a/libisoburn/isoburn.c +++ b/libisoburn/isoburn.c @@ -68,6 +68,7 @@ int isoburn_toc_entry_new(struct isoburn_toc_entry **objpt, o->track_no= 0; o->start_lba= -1; o->track_blocks= 0; + o->volid= NULL; o->next= NULL; if(boss!=NULL) { for(s= boss; s->next!=NULL; s= s->next); @@ -85,6 +86,8 @@ int isoburn_toc_entry_destroy(struct isoburn_toc_entry **o, int flag) return(0); if(flag&1) isoburn_toc_entry_destroy(&((*o)->next), flag); + if((*o)->volid != NULL) + free((*o)->volid); free((char *) (*o)); *o= NULL; return(1); diff --git a/libisoburn/isoburn.h b/libisoburn/isoburn.h index ab26d91c..7bee3bba 100644 --- a/libisoburn/isoburn.h +++ b/libisoburn/isoburn.h @@ -22,6 +22,8 @@ struct isoburn_toc_entry { int start_lba; int track_blocks; + char *volid; /* For caching a volume id from emulated toc on overwriteables */ + struct isoburn_toc_entry *next; }; diff --git a/libisoburn/libisoburn.h b/libisoburn/libisoburn.h index 42adfb5d..497406a0 100644 --- a/libisoburn/libisoburn.h +++ b/libisoburn/libisoburn.h @@ -582,7 +582,7 @@ struct isoburn_toc_track **isoburn_toc_session_get_tracks( /** Obtain a copy of the entry which describes a particular track. Wrapper for: burn_track_get_entry() @since 0.1.6 - @param s The track handle + @param t The track handle @param entry A pointer to memory provided by the caller. It will be filled with info according to struct burn_toc_entry as defined in libburn.h @@ -591,6 +591,23 @@ void isoburn_toc_track_get_entry(struct isoburn_toc_track *t, struct burn_toc_entry *entry); +/** Obtain eventual ISO image parameters of an emulated track. This info was + gained with much effort and thus gets cached in the track object. + If this call returns 1 then one can save a call of isoburn_read_iso_head() + with return mode 1 which could cause an expensive read operation. + @since 0.4.0 + @param t The track handle + @param start_lba Returns the start address of the ISO session + @param image_blocks Returns the number of 2048 bytes blocks + @param volid Caller provided memory for the volume id + @param flag unused yet, submit 0 + @return 0= not an emulated ISO session , 1= reply is valid +*/ +int isoburn_toc_track_get_emul(struct isoburn_toc_track *t, int *start_lba, + int *image_blocks, char volid[33], int flag); + + + /** Release the memory associated with a master handle of media. The handle is invalid afterwards and may not be used any more. Wrapper for: burn_disc_free() @@ -617,7 +634,7 @@ void isoburn_toc_disc_free(struct isoburn_toc_disc *disc); do not read head from media but use first 64 kB from info bit14= check both half buffers (not only second) return 2 if found in first block - bit15= return-1 on read error + bit15= return -1 on read error @return >0 seems to be a valid ISO image, 0 format not recognized, <0 error */ int isoburn_read_iso_head(struct burn_drive *d, int lba, diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 2c32da95..3581cef1 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2009.04.21.184214" +#define Xorriso_timestamP "2009.04.22.173603"