diff --git a/ecdb/trunk/README b/ecdb/trunk/README index f9cd6d6..c5646da 100644 --- a/ecdb/trunk/README +++ b/ecdb/trunk/README @@ -1,3 +1,19 @@ CD Burner INFO++; + +Crashes: +burn_disc_free, 184 --> no bt for now + +libiso_msgs_submit, 333 (libisofs problem?) +Backtrace +------------ +#0 libiso_msgs_submit (m=0x0, origin=1048576, error_code=2, + severity=268435456, priority=0, + msg_text=0xb74c3b8c "Starting image writing...", os_errno=0, flag=0) + at libisofs/libiso_msgs.c:329 +#1 0xb7f08ba0 in iso_msg_debug (imgid=1048576, + fmt=0xb7f19697 "Starting image writing...") at libisofs/messages.c:96 +#2 0xb7f0de93 in write_function (arg=0x8079b80) at libisofs/ecma119.c:766 +#3 0xb7864125 in start_thread () from /lib/libpthread.so.0 +#4 0xb774ca0e in clone () from /lib/libc.so.6 diff --git a/ecdb/trunk/src/ecdb.c b/ecdb/trunk/src/ecdb.c index 2b489aa..2a564a9 100644 --- a/ecdb/trunk/src/ecdb.c +++ b/ecdb/trunk/src/ecdb.c @@ -1,8 +1,12 @@ #include "ecdb.h" +/* Global Variables */ +int ECDB_DRIVE_ACTION_FINISHED = 0; +int ECDB_DRIVE_ACTION_BEGUN = 0; +int ECDB_DRIVE_ACTION_UPDATE = 0; + Ecdb_Main *em; int ecdb_setup(); -void ecdb_shutdown(); int main(int argc, char **argv) @@ -10,6 +14,18 @@ main(int argc, char **argv) Ecdb_Project *proj; int i; + if (!ecore_init()) + { + printf("Cannot initialize Ecore!\n"); + return 1; + } + + if (!ecore_file_init()) + { + printf("Cannot initialize Ecore_File!\n"); + return 1; + } + if (!ecdb_setup()) { printf("Setup failed\n"); @@ -27,17 +43,27 @@ main(int argc, char **argv) ecore_list_append(proj->files, strdup(argv[i])); i++; } - proj->simulate = FALSE; + proj->simulate = TRUE; proj->publisher_id = proj->data_preparer_id = proj->system_id = proj->application_id = proj->copywrite_id = proj->abstract_id = proj->biblio_id = "ecdb"; ecdb_aquire_drive(proj, 0); - ecdb_burn_project(proj); - sleep(7000); + + if (ecdb_burn_project(proj)) + { + printf("Burn was unsuccessful\n"); + burn_finish(); + ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, NULL, NULL, NULL); + return 1; + } + + ecore_main_loop_begin(); /* End testing */ burn_finish(); - ecdb_shutdown(); + ecore_shutdown(); + ecore_file_shutdown(); + printf("Program Done\n"); return 0; }; @@ -49,6 +75,13 @@ ecdb_setup(void) em->drives = NULL; em->projects = ecore_list_new(); + ECDB_DRIVE_ACTION_FINISHED = ecore_event_type_new(); + ECDB_DRIVE_ACTION_BEGUN = ecore_event_type_new(); + ECDB_DRIVE_ACTION_UPDATE = ecore_event_type_new(); + + ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, ecdb_shutdown, + NULL); + if (!ecdb_aquire_drive_info()) { printf("Aquiring drives failed!\n"); diff --git a/ecdb/trunk/src/ecdb.h b/ecdb/trunk/src/ecdb.h index 9099b9f..c2a8456 100644 --- a/ecdb/trunk/src/ecdb.h +++ b/ecdb/trunk/src/ecdb.h @@ -117,8 +117,14 @@ struct _Ecdb_Project_Info /* The drive reference */ Ecdb_Drive_Info *drive; BurnProgress progress; + BurnDriveStatus stat; }; +/* Callbacks */ +extern int ECDB_DRIVE_ACTION_FINISHED; +extern int ECDB_DRIVE_ACTION_BEGUN; +extern int ECDB_DRIVE_ACTION_UPDATE; + #include "ecdb_drives.h" #include "ecdb_image.h" #include "ecdb_burn.h" diff --git a/ecdb/trunk/src/ecdb_burn.c b/ecdb/trunk/src/ecdb_burn.c index 77130a8..bed94d6 100644 --- a/ecdb/trunk/src/ecdb_burn.c +++ b/ecdb/trunk/src/ecdb_burn.c @@ -11,6 +11,8 @@ struct Burn_Data }; void *_progress_update(void *d); +int _progress_gui_update(void *d); +int ecdb_burn_finished(void *data, int type, void *event); /* Event handlers */ int @@ -65,11 +67,12 @@ ecdb_burn_project(Ecdb_Project *proj) burn_write_opts_set_perform_opc(opts, proj->opc); burn_write_opts_set_multi(opts, proj->multi); if (proj->simulate) - printf("simulating!\n"); + printf("Simulating Burn!\n"); burn_write_opts_set_simulate(opts, proj->simulate); burn_drive_set_speed(proj->drive->tangible->drive, 0, proj->speed); burn_write_opts_set_underrun_proof(opts, proj->underrun_proof); + printf("Searching for burn mode\n"); if (burn_write_opts_auto_write_type(opts, data->disc, reasons, 0) == BURN_WRITE_NONE) { @@ -78,22 +81,29 @@ ecdb_burn_project(Ecdb_Project *proj) return 1; } - /* Not sure where to put this for now */ burn_disc_write(opts, data->disc); burn_write_opts_free(opts); + printf("Disc now burning\n"); pthread_create(&progress_update, NULL, _progress_update, data); pthread_detach(progress_update); + ecore_timer_add(0.5, _progress_gui_update, data); + ecore_event_handler_add(ECDB_DRIVE_ACTION_FINISHED, ecdb_burn_finished, + data); return 0; } +/* Hopefully at some point EFL will become thread-safe, or ecore_timer will + * work with burn_drive_get_status without segfaulting. At that point we can + * do away with this. + */ + void * _progress_update(void *d) { Burn_Data *data; BurnProgress p; - BurnDriveStatus stat; struct burn_drive *drive; data = d; @@ -105,54 +115,83 @@ _progress_update(void *d) } drive = data->proj->drive->tangible[0].drive; - + printf("Progress update active\n"); while (TRUE) { - stat = burn_drive_get_status(drive, &p); - if (stat == BURN_DRIVE_SPAWNING) + data->proj->stat = burn_drive_get_status(drive, &p); + if (data->proj->stat == BURN_DRIVE_SPAWNING) { sleep(3); continue; } - else if (stat == BURN_DRIVE_IDLE) + else if (data->proj->stat == BURN_DRIVE_IDLE) { - BurnTrack *track; - BurnSource *source; - - ecore_list_first_goto(data->sources); - ecore_list_first_goto(data->tracks); - - while ((source = ecore_list_remove(data->sources))) - { - burn_source_free(source); - track = ecore_list_remove(data->tracks); - burn_track_free(track); - } - - ecore_list_destroy(data->sources); - ecore_list_destroy(data->tracks); - burn_session_free(data->session); - burn_disc_free(data->disc); - burn_drive_release(drive, 0); - burn_drive_info_free(data->proj->drive->tangible); - - /* Don't keep in here */ - printf("fail\n"); - ecore_list_destroy(data->proj->files); - FREE(data->proj); - - /* End testing */ - printf("here\n"); - FREE(data); - pthread_exit(NULL); break; } - //printf("Total sectors: %d, on sector: %d\n", p.sectors, - // p.sector); data->proj->progress = p; sleep(5); } } +int +_progress_gui_update(void *data) +{ + Burn_Data *d; + + d = data; + + if (d->proj->stat == BURN_DRIVE_IDLE) + { + ecore_event_add(ECDB_DRIVE_ACTION_FINISHED, NULL, NULL, data); + printf("Burn finished\n"); + return ECORE_CALLBACK_CANCEL; + } + else + ecore_event_add(ECDB_DRIVE_ACTION_UPDATE, NULL, NULL, data); + + return ECORE_CALLBACK_RENEW; +} + + +int +ecdb_burn_finished(void *data, int type, void *event) +{ + Burn_Data *proj; + BurnTrack *track; + BurnSource *source; + + proj = data; + + ecore_list_first_goto(proj->sources); + ecore_list_first_goto(proj->tracks); + + printf("Freeing source and tracks\n"); + while ((source = ecore_list_remove(proj->sources))) + { + burn_source_free(source); + track = ecore_list_remove(proj->tracks); + burn_track_free(track); + } + ecore_list_destroy(proj->sources); + ecore_list_destroy(proj->tracks); + + printf("Freeing session and disc\n"); + burn_session_free(proj->session); + + /* Crashes on this line... */ + burn_disc_free(proj->disc); + + printf("Releasing drive\n"); + burn_drive_release(proj->proj->drive->tangible[0].drive, 1); + burn_drive_info_free(proj->proj->drive->tangible); + printf("Ze brun hath finish\n"); + + /* To be removed from here at some point */ + ecore_list_destroy(proj->proj->files); + FREE(proj->proj); + FREE(proj); + ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, NULL, NULL, NULL); + return 0; +} diff --git a/ecdb/trunk/src/ecdb_misc.c b/ecdb/trunk/src/ecdb_misc.c index a40b4ee..fab6bcc 100644 --- a/ecdb/trunk/src/ecdb_misc.c +++ b/ecdb/trunk/src/ecdb_misc.c @@ -17,14 +17,16 @@ ecdb_project_new(void) return proj; } -void -ecdb_shutdown(void) +int +ecdb_shutdown(void *data, int type, void *event) { if (em->projects) ecore_list_destroy(em->projects); if (em->drives) ecore_list_destroy(em->drives); free(em); + ecore_main_loop_quit(); + return 0; } void diff --git a/ecdb/trunk/src/ecdb_misc.h b/ecdb/trunk/src/ecdb_misc.h index c40e879..c1aedc8 100644 --- a/ecdb/trunk/src/ecdb_misc.h +++ b/ecdb/trunk/src/ecdb_misc.h @@ -2,7 +2,7 @@ #define ECDB_MISC_H Ecdb_Project *ecdb_project_new(void); -void ecdb_shutdown(void); +int ecdb_shutdown(void *data, int type, void *event); void ecdb_burn_init(void); void ecdb_image_init(void);