summaryrefslogtreecommitdiff
path: root/frontends/amiga/download.c
diff options
context:
space:
mode:
Diffstat (limited to 'frontends/amiga/download.c')
-rw-r--r--frontends/amiga/download.c87
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,