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 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)

View File

@ -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);

View File

@ -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;
};

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.
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,

View File

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