New API functions isoburn_preset_msgs_submit(), isoburn_set_msgs_submit()

This commit is contained in:
2008-06-18 16:14:44 +00:00
parent ceca17e946
commit ae5ad5a143
7 changed files with 195 additions and 77 deletions

View File

@ -47,6 +47,16 @@
/* The global list of isoburn objects. Usually there is only one. */
extern struct isoburn *isoburn_list_start; /* in isoburn.c */
/* Default values for application provided msgs_submit methods.
To be attached to newly aquired drives.
Storage location is isoburn.c
*/
extern int (*libisoburn_default_msgs_submit)
(void *handle, int error_code, char msg_text[],
int os_errno, char severity[], int flag);
extern void *libisoburn_default_msgs_submit_handle;
extern int libisoburn_default_msgs_submit_flag;
int isoburn_emulate_toc(struct burn_drive *d, int flag);
@ -217,6 +227,18 @@ int isoburn_libburn_req(int *major, int *minor, int *micro)
}
int isoburn_preset_msgs_submit(int (*msgs_submit)(void *handle, int error_code,
char msg_text[], int os_errno,
char severity[], int flag),
void *submit_handle, int submit_flag, int flag)
{
libisoburn_default_msgs_submit= msgs_submit;
libisoburn_default_msgs_submit_handle= submit_handle;
libisoburn_default_msgs_submit_flag= submit_flag;
return(1);
}
int isoburn_is_intermediate_dvd_rw(struct burn_drive *d, int flag)
{
int profile, ret= 0, format_status, num_formats;
@ -263,6 +285,9 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
if(ret<=0)
goto ex;
(*o)->drive= d;
(*o)->msgs_submit= libisoburn_default_msgs_submit;
(*o)->msgs_submit_handle= libisoburn_default_msgs_submit_handle;
(*o)->msgs_submit_flag= libisoburn_default_msgs_submit_flag;
#ifdef Hardcoded_cd_rW
/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo */
@ -361,7 +386,7 @@ int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
if(conv_ret<=0) {
sprintf(msg, "Unsuitable drive address: '%s'\n",adr);
msg[BURN_MSGS_MESSAGE_LEN-1]= 0;
burn_msgs_submit(0x00060000, msg, 0, "FAILURE", NULL);
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "FAILURE", 0);
ret= 0; goto ex;
}
@ -433,8 +458,8 @@ int isoburn_find_emulator(struct isoburn **pt,
if(ret<=0)
return(0);
if((*pt)->emulation_mode==-1) {
burn_msgs_submit(0x00060000,
"Unsuitable drive and media state", 0, "FAILURE", NULL);
isoburn_msgs_submit(*pt, 0x00060000,
"Unsuitable drive and media state", 0, "FAILURE", 0);
return(-1);
}
if((*pt)->emulation_mode==0)
@ -552,8 +577,8 @@ int isoburn_disc_get_msc1(struct burn_drive *d, int *start_lba)
if(isoburn_disc_get_status(d)!=BURN_DISC_APPENDABLE &&
isoburn_disc_get_status(d)!=BURN_DISC_FULL) {
burn_msgs_submit(0x00060000,
"Media contains no recognizable data", 0, "SORRY",NULL);
isoburn_msgs_submit(NULL, 0x00060000,
"Media contains no recognizable data", 0, "SORRY", 0);
return(0);
}
ret= isoburn_find_emulator(&o, d, 0);
@ -639,10 +664,10 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
*/
sprintf(msg,
"DVD-RW insufficiently formatted. (Intermediate State, size unknown)");
burn_msgs_submit(0x00060000, msg, 0, "FAILURE", NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0);
sprintf(msg,
"It might help to first deformat it and then format it again");
burn_msgs_submit(0x00060000, msg, 0, "HINT", NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "HINT", 0);
burn_drive_cancel(drive); /* mark run as failure */
return;
}
@ -656,7 +681,7 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
write_type= burn_write_opts_auto_write_type(opts, disc, reasons, 0);
if (write_type == BURN_WRITE_NONE) {
sprintf(msg, "Failed to find a suitable write mode:\n%s", reasons);
burn_msgs_submit(0x00060000, msg, 0, "FAILURE", NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0);
if(o!=NULL)
o->wrote_well= 0;
/* To cause a negative reply with burn_drive_wrote_well() */
@ -668,7 +693,7 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
sprintf(msg, "Write_type = %s\n",
(write_type == BURN_WRITE_SAO ? "SAO" :
(write_type == BURN_WRITE_TAO ? "TAO" : reasons)));
burn_msgs_submit(0x00060000, msg, 0, "DEBUG", NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "DEBUG", 0);
#ifdef Hardcoded_cd_rW
/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo */
@ -746,9 +771,9 @@ int isoburn_set_start_byte(struct isoburn *o, off_t value, int flag)
if(ret<=0)
goto ex;
if(!caps->start_adr) {
burn_msgs_submit(0x00060000,
"Cannot set start byte address with this type of media",
0, "FAILURE", NULL);
isoburn_msgs_submit(o, 0x00060000,
"Cannot set start byte address with this type of media",
0, "FAILURE", 0);
{ret= 0; goto ex;}
}
o->min_start_byte= value;
@ -930,9 +955,9 @@ int isoburn_read_iso_head_parse(struct burn_drive *d, unsigned char *data,
else
info[i]= 0;
} else {
burn_msgs_submit(0x00060000,
isoburn_msgs_submit(NULL, 0x00060000,
"Program error: Unknown info mode with isoburn_read_iso_head()",
0, "FATAL", NULL);
0, "FATAL", 0);
return(-1);
}
return(1);
@ -1025,7 +1050,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
sprintf(msg,
"Chain of ISO session headers broken at #%d, LBA %ds",
session_count+1, lba);
burn_msgs_submit(0x00060000, msg, 0, "WARNING", NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
}
{ret= 0; goto failure;}
}
@ -1033,9 +1058,9 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
lba-= 16;
ret= isoburn_toc_entry_new(&item, o->toc, 0);
if(ret<=0) {
burn_msgs_submit(0x00060000,
"Not enough memory for emulated TOC entry object",
0, "FATAL", NULL);
isoburn_msgs_submit(o, 0x00060000,
"Not enough memory for emulated TOC entry object",
0, "FATAL", 0);
ret= -1; goto failure;
}
if(o->toc==NULL)
@ -1045,20 +1070,13 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
item->track_no= session_count;
item->start_lba= lba;
item->track_blocks= track_blocks;
now= time(NULL);
#ifdef Not_yeT
/* >>> need asynchronous delivery of messages */;
if(now - last_pacifier > 5) {
last_pacifier= now;
sprintf(msg, "Scanning found %d ISO session headers in %.f seconds",
session_count, (double) (now - start_time));
burn_msgs_submit(0x00060000, msg, 0, "UPDATE", NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "UPDATE", 0);
}
#endif
lba+= track_blocks;
if(lba % Libisoburn_nwa_alignemenT)
lba+= Libisoburn_nwa_alignemenT - (lba % Libisoburn_nwa_alignemenT);
@ -1071,7 +1089,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
now= time(NULL);
sprintf(msg, "Scanning found %d ISO session headers in %.f seconds",
session_count, (double) (now - start_time));
burn_msgs_submit(0x00060000, msg, 0, sev, NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, sev, 0);
return(1);
failure:;
isoburn_toc_entry_destroy(&(o->toc), 1);
@ -1352,6 +1370,25 @@ int isoburn_get_track_lba(struct isoburn_toc_track *track, int *lba, int flag)
}
int isoburn_set_msgs_submit(struct burn_drive *d,
int (*msgs_submit)(void *handle, int error_code,
char msg_text[], int os_errno,
char severity[], int flag),
void *submit_handle, int submit_flag, int flag)
{
struct isoburn *o;
int ret;
ret= isoburn_find_emulator(&o, d, 0);
if(ret<0 || o==NULL)
return(-1);
o->msgs_submit= msgs_submit;
o->msgs_submit_handle= submit_handle;
o->msgs_submit_flag= submit_flag;
return(1);
}
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
int flag)
{
@ -1380,7 +1417,7 @@ not_found:;
goto unknown_mode;
sprintf(msg, "Failed to find %s %s", mode_names[adr_mode],
strlen(adr_value)<=80 ? adr_value : "-oversized-string-");
burn_msgs_submit(0x00060000, msg, 0, "FAILURE", NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0);
ret= 0; goto ex;
}
sessions= isoburn_toc_disc_get_sessions(disc, &num_sessions);
@ -1448,7 +1485,7 @@ not_found:;
} else {
unknown_mode:;
sprintf(msg, "Program error: Unknown msc1 address mode %d", adr_mode);
burn_msgs_submit(0x00060000, msg, 0, "FATAL", NULL);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FATAL", 0);
ret= 0; goto ex;
}
ret= 1;