New API call isoburn_toc_track_get_emul()
This commit is contained in:
parent
4f41e7aa41
commit
cc66b5b3a4
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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()
|
||||||
@ -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
|
do not read head from media but use first 64 kB from info
|
||||||
bit14= check both half buffers (not only second)
|
bit14= check both half buffers (not only second)
|
||||||
return 2 if found in first block
|
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
|
@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,
|
int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2009.04.21.184214"
|
#define Xorriso_timestamP "2009.04.22.173603"
|
||||||
|
Loading…
Reference in New Issue
Block a user