diff --git a/ecdb/trunk/src/ecdb_burn.c b/ecdb/trunk/src/ecdb_burn.c index a6befb8..184d218 100644 --- a/ecdb/trunk/src/ecdb_burn.c +++ b/ecdb/trunk/src/ecdb_burn.c @@ -13,7 +13,8 @@ struct Burn_Data int ecdb_burn_finished(void *data, int type, void *event); int ecdb_burn_project_init(Ecdb_Burn_Project *proj); int ecdb_erase_project_init(Ecdb_Erase_Project *proj); -static void ecdb_burn_progress_handler(void *data, void *buffer, int nbyte); +static void ecdb_burn_progress_handler(void *data, void *buffer, + unsigned int nbyte); Ecdb_Burn_Project * ecdb_burn_project_new(void) @@ -155,9 +156,10 @@ ecdb_burn_project(Ecdb_Burn_Project *proj) void * ecdb_drive_progress_update(void *data) { - Ecdb_Project *proj; + const Ecdb_Project *proj; BurnProgress p; struct burn_drive *drive; + BurnDriveStatus stat; proj = data; @@ -173,27 +175,25 @@ ecdb_drive_progress_update(void *data) printf("Progress update active\n"); while (TRUE) { - proj->stat = burn_drive_get_status(drive, &p); - if (proj->stat == BURN_DRIVE_SPAWNING) + stat = burn_drive_get_status(drive, &p); + ecore_pipe_write(proj->pipe, &p, sizeof(&p)); + if (stat == BURN_DRIVE_SPAWNING) { sleep(1); continue; } - else if (proj->stat == BURN_DRIVE_IDLE) + else if (stat == BURN_DRIVE_IDLE) { ecore_pipe_del(proj->pipe); /* Call the finished event handler here */ pthread_exit(NULL); break; } - - ecore_pipe_write(proj->pipe, &p, sizeof(&p)); - sleep(1); } } static void -ecdb_burn_progress_handler(void *data, void *buffer, int nbyte) +ecdb_burn_progress_handler(void *data, void *buffer, unsigned int nbyte) { BurnProgress *p = buffer; diff --git a/ecdb/trunk/src/ecdb_common.h b/ecdb/trunk/src/ecdb_common.h index a386a68..5e3b924 100644 --- a/ecdb/trunk/src/ecdb_common.h +++ b/ecdb/trunk/src/ecdb_common.h @@ -55,7 +55,6 @@ struct _Ecdb_Project_Info { /* The drive reference */ Ecdb_Drive_Info *drive; - BurnDriveStatus stat; Ecore_Event_Handler *ev_handler; Ecore_Pipe *pipe; unsigned int type; diff --git a/ecdb/trunk/src/ecdb_erase.c b/ecdb/trunk/src/ecdb_erase.c index deeff13..0d22710 100644 --- a/ecdb/trunk/src/ecdb_erase.c +++ b/ecdb/trunk/src/ecdb_erase.c @@ -1,7 +1,9 @@ #include "ecdb.h" int ecdb_erase_project_init(Ecdb_Erase_Project *proj); -static void ecdb_erase_progress_handler(void *data, void *buffer, int nbyte); +static void ecdb_erase_progress_handler(void *data, void *buffer, + unsigned int nbyte); +int ecdb_erase_finished(void *data, int type, void *event); Ecdb_Erase_Project * ecdb_erase_project_new(void) @@ -76,6 +78,9 @@ ecdb_erase_disc(Ecdb_Erase_Project *proj) pthread_create(&progress_update, NULL, ecdb_drive_progress_update, proj); pthread_detach(progress_update); + ECDB_PROJECT(proj)->ev_handler = ecore_event_handler_add + (ECDB_DRIVE_ACTION_FINISHED, + ecdb_erase_finished, proj); return TRUE; } else @@ -86,14 +91,38 @@ ecdb_erase_disc(Ecdb_Erase_Project *proj) } static void -ecdb_erase_progress_handler(void *data, void *buffer, int nbyte) +ecdb_erase_progress_handler(void *data, void *buffer, unsigned int nbyte) { BurnProgress *p = buffer; Evas_Object *swallow; char buf[1024]; + // Is this correct? + if (p->sector >= p->sectors) + { + ecore_event_add(ECDB_DRIVE_ACTION_FINISHED, NULL, NULL, NULL); + return; + } + swallow = evas_object_name_find(ecore_evas_get(em->main_win_ee), "erase_page"); snprintf(buf, sizeof(buf), "%d/%d", p->sector, p->sectors); edje_object_part_text_set(swallow, "progress_text", buf); } + +int +ecdb_erase_finished(void *data, int type, void *event) +{ + Ecdb_Erase_Project *proj; + + proj = data; + + burn_drive_release(ECDB_PROJECT(proj)->drive->tangible[0].drive, 0); + burn_drive_info_free(ECDB_PROJECT(proj)->drive->tangible); + ecore_event_handler_del(ECDB_PROJECT(proj)->ev_handler); + ecdb_erase_project_destroy(proj); + ecdb_gui_erase_cleanup(); + + return TRUE; +} + diff --git a/ecdb/trunk/src/ecdb_gui.c b/ecdb/trunk/src/ecdb_gui.c index 06a2bb7..7be504e 100644 --- a/ecdb/trunk/src/ecdb_gui.c +++ b/ecdb/trunk/src/ecdb_gui.c @@ -373,8 +373,8 @@ ecdb_cb_erase_page_buttons_clicked(void *data, Evas_Object *o, { printf("Couldn't grab drive!\n"); ecdb_erase_project_destroy(proj); - snprintf(buf, sizeof(buf), "Couldn't grab drive!"); - edje_object_part_text_set(swallow, "progress_text", buf); + edje_object_part_text_set(swallow, "progress_text", + "Couldn't grab the drive!"); return; } @@ -397,15 +397,6 @@ ecdb_cb_erase_page_buttons_clicked(void *data, Evas_Object *o, const char *ids[] = {"ecdb/erase/return", "ecdb/erase/begin", "ecdb/erase/speed"}; ecdb_gui_controls_disable(ids, 3); - - - /* 2) Start erase - * 3) Grab a drive - * 4) Start burn - * 5) Set up progress callback - */ - - } else if (!strcmp(source, "ecdb/erase/speed")) { @@ -674,3 +665,17 @@ ecdb_gui_controls_enable(const char **ids, int n) } } +void +ecdb_gui_erase_cleanup(void) +{ + Evas_Object *swallow; + const char *ids[] = {"ecdb/erase/return", "ecdb/erase/begin", + "ecdb/erase/speed"}; + + swallow = evas_object_name_find(ecore_evas_get(em->main_win_ee), + "erase_page"); + edje_object_part_text_set(swallow, "progress_text", "Erase Complete!"); + ecdb_gui_controls_enable(ids, 3); + edje_object_signal_emit(swallow, "ecdb,erase,done", "ecdb"); +} + diff --git a/ecdb/trunk/src/ecdb_gui.h b/ecdb/trunk/src/ecdb_gui.h index 10dee00..ea05667 100644 --- a/ecdb/trunk/src/ecdb_gui.h +++ b/ecdb/trunk/src/ecdb_gui.h @@ -3,5 +3,6 @@ int ecdb_create_main_gui(void); void ecdb_set_main_theme(const char *theme_name); +void ecdb_gui_erase_cleanup(void); #endif