New API call isoburn_toc_track_get_emul()

This commit is contained in:
Thomas Schmitt 2009-04-22 17:36:04 +00:00
parent 4f41e7aa41
commit cc66b5b3a4
5 changed files with 58 additions and 11 deletions

View File

@ -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 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; int ret;
struct isoburn_toc_entry *item; struct isoburn_toc_entry *item;
ret= isoburn_toc_entry_new(&item, o->toc, 0); ret= isoburn_toc_entry_new(&item, o->toc, 0);
if(ret<=0) { if(ret<=0) {
no_memory:;
isoburn_msgs_submit(o, 0x00060000, isoburn_msgs_submit(o, 0x00060000,
"Not enough memory for emulated TOC entry object", "Not enough memory for emulated TOC entry object",
0, "FATAL", 0); 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->track_no= *session_count;
item->start_lba= lba; item->start_lba= lba;
item->track_blocks= track_blocks; item->track_blocks= track_blocks;
if(volid != NULL) {
item->volid= strdup(volid);
if(item->volid == NULL)
goto no_memory;
}
return(1); 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 scan_start= 0, scan_count= 0, probe_minus_16= 0, growisofs_nwa;
int with_enclosure= 0; int with_enclosure= 0;
struct isoburn *o; 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; time_t start_time, last_pacifier, now;
/* is the media emulated multi-session ? */ /* 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)); session_count, size_text, (double) (now - start_time));
isoburn_msgs_submit(o, 0x00060000, msg, 0, "UPDATE", 0); isoburn_msgs_submit(o, 0x00060000, msg, 0, "UPDATE", 0);
} }
read_flag= 0; read_flag= 1;
if(flag&2) if(flag&2)
read_flag|= (1<<15)|((session_count>0)<<14); read_flag|= (1<<15)|((session_count>0)<<14);
else { else {
@ -1138,8 +1144,11 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
probe_minus_16= 0; probe_minus_16= 0;
} }
ret= isoburn_read_iso_head(d, lba, &track_blocks, NULL, read_flag); ret= isoburn_read_iso_head(d, lba, &track_blocks, volid, read_flag);
if(ret<=0) { if(ret > 0) {
volid_pt= volid;
} else {
volid_pt= NULL;
if(session_count>0) { if(session_count>0) {
if(flag&2) { if(flag&2) {
if(ret==0) { 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); isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
if(with_enclosure) { 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) if(ret<=0)
goto failure; 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 */ if(ret==2) /* ISO header was found in first half block */
lba-= 16; 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) if(ret<=0)
goto failure; goto failure;
lba+= track_blocks; lba+= track_blocks;
@ -1202,7 +1212,7 @@ failure:;
isoburn_toc_entry_destroy(&(o->toc), 1); isoburn_toc_entry_destroy(&(o->toc), 1);
if(with_enclosure && o->emulation_mode == 1) { if(with_enclosure && o->emulation_mode == 1) {
session_count= 0; 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); 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) void isoburn_toc_disc_free(struct isoburn_toc_disc *d)
{ {
if(d->disc!=NULL) if(d->disc!=NULL)

View File

@ -68,6 +68,7 @@ int isoburn_toc_entry_new(struct isoburn_toc_entry **objpt,
o->track_no= 0; o->track_no= 0;
o->start_lba= -1; o->start_lba= -1;
o->track_blocks= 0; o->track_blocks= 0;
o->volid= NULL;
o->next= NULL; o->next= NULL;
if(boss!=NULL) { if(boss!=NULL) {
for(s= boss; s->next!=NULL; s= s->next); 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); return(0);
if(flag&1) if(flag&1)
isoburn_toc_entry_destroy(&((*o)->next), flag); isoburn_toc_entry_destroy(&((*o)->next), flag);
if((*o)->volid != NULL)
free((*o)->volid);
free((char *) (*o)); free((char *) (*o));
*o= NULL; *o= NULL;
return(1); return(1);

View File

@ -22,6 +22,8 @@ struct isoburn_toc_entry {
int start_lba; int start_lba;
int track_blocks; int track_blocks;
char *volid; /* For caching a volume id from emulated toc on overwriteables */
struct isoburn_toc_entry *next; struct isoburn_toc_entry *next;
}; };

View File

@ -582,7 +582,7 @@ struct isoburn_toc_track **isoburn_toc_session_get_tracks(
/** Obtain a copy of the entry which describes a particular track. /** Obtain a copy of the entry which describes a particular track.
Wrapper for: burn_track_get_entry() Wrapper for: burn_track_get_entry()
@since 0.1.6 @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 @param entry A pointer to memory provided by the caller. It will be filled
with info according to struct burn_toc_entry as defined with info according to struct burn_toc_entry as defined
in libburn.h in libburn.h
@ -591,6 +591,23 @@ void isoburn_toc_track_get_entry(struct isoburn_toc_track *t,
struct burn_toc_entry *entry); 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. /** Release the memory associated with a master handle of media.
The handle is invalid afterwards and may not be used any more. The handle is invalid afterwards and may not be used any more.
Wrapper for: burn_disc_free() Wrapper for: burn_disc_free()

View File

@ -1 +1 @@
#define Xorriso_timestamP "2009.04.21.184214" #define Xorriso_timestamP "2009.04.22.173603"