diff options
Diffstat (limited to 'frontends/amiga/download.c')
-rw-r--r-- | frontends/amiga/download.c | 87 |
1 files changed, 77 insertions, 10 deletions
diff --git a/frontends/amiga/download.c b/frontends/amiga/download.c index 47485e0da..41ff6a689 100644 --- a/frontends/amiga/download.c +++ b/frontends/amiga/download.c @@ -68,6 +68,18 @@ #include "amiga/theme.h" #include "amiga/utf8.h" +#ifndef APPNOTIFY_DisplayTime +#define APPNOTIFY_DisplayTime ( TAG_USER + 13 ) +#endif + +#ifndef APPNOTIFY_Percentage +#define APPNOTIFY_Percentage ( TAG_USER + 14 ) +#endif + +#ifndef APPNOTIFY_StopBackMsg +#define APPNOTIFY_StopBackMsg ( TAG_USER + 17 ) +#endif + struct gui_download_window { struct ami_generic_window w; struct Window *win; @@ -75,6 +87,7 @@ struct gui_download_window { BPTR fh; uint32 size; uint32 downloaded; + uint32 progress; struct dlnode *dln; struct browser_window *bw; struct download_context *ctx; @@ -84,7 +97,8 @@ struct gui_download_window { }; enum { - AMINS_DLOAD_OK = 0, + AMINS_DLOAD_PROGRESS = 0, + AMINS_DLOAD_OK, AMINS_DLOAD_ERROR, AMINS_DLOAD_ABORT, }; @@ -157,7 +171,19 @@ static struct gui_download_window *gui_download_window_create(download_context * return NULL; } - dw->objects[OID_MAIN] = WindowObj, + if((nsoption_bool(download_notify_progress) == true)) { + char bkm[1030]; + snprintf(bkm, 1030, "STOP %p", dw); + + Notify(ami_gui_get_app_id(), APPNOTIFY_Title, messages_get("amiDownloading"), + APPNOTIFY_PubScreenName, "FRONT", + APPNOTIFY_Text, dw->fname, + APPNOTIFY_DisplayTime, TRUE, + APPNOTIFY_Percentage, 0, + APPNOTIFY_StopBackMsg, bkm, + TAG_DONE); + } else { + dw->objects[OID_MAIN] = WindowObj, WA_ScreenTitle, ami_gui_get_screen_title(), WA_Title, dw->url, WA_Activate, TRUE, @@ -195,8 +221,11 @@ static struct gui_download_window *gui_download_window_create(download_context * EndGroup, EndWindow; - dw->win = (struct Window *)RA_OpenWindow(dw->objects[OID_MAIN]); + dw->win = (struct Window *)RA_OpenWindow(dw->objects[OID_MAIN]); + } + dw->ctx = ctx; + dw->result = AMINS_DLOAD_PROGRESS; ami_gui_win_list_add(dw, AMINS_DLWINDOW, &ami_download_table); @@ -219,21 +248,35 @@ static nserror gui_download_window_data(struct gui_download_window *dw, va[1] = (APTR)dw->size; va[2] = 0; - if(dw->size) - { - RefreshSetGadgetAttrs((struct Gadget *)dw->objects[GID_STATUS], dw->win, NULL, + if(dw->size) { + if((nsoption_bool(download_notify_progress) == true) && + (((dw->downloaded * 100) / dw->size) > dw->progress)) { + dw->progress = (uint32)((dw->downloaded * 100) / dw->size); + Notify(ami_gui_get_app_id(), + APPNOTIFY_Percentage, dw->progress, + TAG_DONE); + } else { + RefreshSetGadgetAttrs((struct Gadget *)dw->objects[GID_STATUS], dw->win, NULL, FUELGAUGE_Level, dw->downloaded, GA_Text, messages_get("amiDownload"), FUELGAUGE_VarArgs, va, TAG_DONE); + } } else { - RefreshSetGadgetAttrs((struct Gadget *)dw->objects[GID_STATUS], dw->win, NULL, + if((nsoption_bool(download_notify_progress) == true)) { + /* unknown size, not entirely sure how to deal with this atm... */ + Notify(ami_gui_get_app_id(), + APPNOTIFY_Percentage, 100, + TAG_DONE); + } else { + RefreshSetGadgetAttrs((struct Gadget *)dw->objects[GID_STATUS], dw->win, NULL, FUELGAUGE_Level, dw->downloaded, GA_Text, messages_get("amiDownloadU"), FUELGAUGE_VarArgs, va, TAG_DONE); + } } return NSERROR_OK; @@ -248,11 +291,23 @@ static void gui_download_window_done(struct gui_download_window *dw) if(!dw) return; bw = dw->bw; + if(dw->result == AMINS_DLOAD_PROGRESS) + dw->result = AMINS_DLOAD_OK; + + if((nsoption_bool(download_notify_progress) == true)) { + Notify(ami_gui_get_app_id(), + APPNOTIFY_Update, TRUE, + TAG_DONE); + } + if((nsoption_bool(download_notify)) && (dw->result == AMINS_DLOAD_OK)) { + char bkm[1030]; + snprintf(bkm, 1030, "OPEN %s", dw->fname); + Notify(ami_gui_get_app_id(), APPNOTIFY_Title, messages_get("amiDownloadComplete"), APPNOTIFY_PubScreenName, "FRONT", - APPNOTIFY_BackMsg, dw->fname, + APPNOTIFY_BackMsg, bkm, APPNOTIFY_CloseOnDC, TRUE, APPNOTIFY_Text, dw->fname, TAG_DONE); @@ -275,7 +330,10 @@ static void gui_download_window_done(struct gui_download_window *dw) downloads_in_progress--; - DisposeObject(dw->objects[OID_MAIN]); + if(dw->objects[OID_MAIN] != NULL) { + DisposeObject(dw->objects[OID_MAIN]); + } + ami_gui_win_list_remove(dw); if(queuedl) { nsurl *url; @@ -305,7 +363,7 @@ static void gui_download_window_error(struct gui_download_window *dw, static void ami_download_window_abort(void *w) { - struct gui_download_window *dw = (struct gui_download_window *)dw; + struct gui_download_window *dw = (struct gui_download_window *)w; download_context_abort(dw->ctx); dw->result = AMINS_DLOAD_ABORT; gui_download_window_done(dw); @@ -318,6 +376,8 @@ static BOOL ami_download_window_event(void *w) ULONG result; uint16 code; + if(dw == NULL) return FALSE; /* We may not have a real window */ + while((result = RA_HandleInput(dw->objects[OID_MAIN], &code)) != WMHI_LASTMSG) { switch(result & WMHI_CLASSMASK) // class @@ -449,6 +509,13 @@ BOOL ami_download_check_overwrite(const char *file, struct Window *win, ULONG si else return FALSE; } +void ami_download_parse_backmsg(const char *backmsg) +{ + if((backmsg[0] == 'O') && (backmsg[1] == 'P') && (backmsg[2] == 'E') && (backmsg[3] == 'N')) { + OpenWorkbenchObjectA((backmsg + 5), NULL); + } +} + static struct gui_download_table download_table = { .create = gui_download_window_create, .data = gui_download_window_data, |