2003-08-28 23:21:27 +04:00
|
|
|
/*
|
|
|
|
* This file is part of NetSurf, http://netsurf.sourceforge.net/
|
|
|
|
* Licensed under the GNU General Public License,
|
|
|
|
* http://www.opensource.org/licenses/gpl-license
|
|
|
|
* Copyright 2003 James Bursa <bursa@users.sourceforge.net>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "oslib/mimemap.h"
|
|
|
|
#include "oslib/wimp.h"
|
|
|
|
#include "oslib/wimpspriteop.h"
|
|
|
|
#include "netsurf/desktop/gui.h"
|
|
|
|
#include "netsurf/riscos/gui.h"
|
|
|
|
#include "netsurf/utils/log.h"
|
|
|
|
#include "netsurf/utils/messages.h"
|
|
|
|
#include "netsurf/utils/utils.h"
|
|
|
|
|
|
|
|
|
|
|
|
static wimp_window *download_template;
|
|
|
|
|
|
|
|
|
|
|
|
static void ro_gui_download_leaf(const char *url, char *leaf);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load the download window template.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void ro_gui_download_init(void)
|
|
|
|
{
|
|
|
|
char name[] = "download";
|
|
|
|
int context, window_size, data_size;
|
|
|
|
char *data;
|
|
|
|
|
|
|
|
/* find required buffer sizes */
|
|
|
|
context = wimp_load_template(wimp_GET_SIZE, 0, 0, wimp_NO_FONTS,
|
|
|
|
name, 0, &window_size, &data_size);
|
|
|
|
assert(context != 0);
|
|
|
|
|
|
|
|
download_template = xcalloc((unsigned int) window_size, 1);
|
|
|
|
data = xcalloc((unsigned int) data_size, 1);
|
|
|
|
|
|
|
|
/* load */
|
|
|
|
wimp_load_template(download_template, data, data + data_size,
|
|
|
|
wimp_NO_FONTS, name, 0, 0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create and open a download progress window.
|
|
|
|
*/
|
|
|
|
|
|
|
|
gui_window *gui_create_download_window(struct content *content)
|
|
|
|
{
|
|
|
|
gui_window *g = xcalloc(1, sizeof(gui_window));
|
|
|
|
os_error *e;
|
|
|
|
|
|
|
|
assert(content->type == CONTENT_OTHER);
|
|
|
|
|
|
|
|
g->type = GUI_DOWNLOAD_WINDOW;
|
|
|
|
g->data.download.content = content;
|
|
|
|
|
|
|
|
/* convert MIME type to RISC OS file type */
|
|
|
|
e = xmimemaptranslate_mime_type_to_filetype(content->mime_type,
|
|
|
|
&(g->data.download.file_type));
|
|
|
|
if (e)
|
|
|
|
g->data.download.file_type = 0xffd;
|
|
|
|
|
|
|
|
/* fill in download window icons */
|
|
|
|
download_template->icons[ICON_DOWNLOAD_URL].data.indirected_text.text =
|
|
|
|
content->url;
|
|
|
|
download_template->icons[ICON_DOWNLOAD_URL].data.indirected_text.size =
|
|
|
|
strlen(content->url) + 1;
|
|
|
|
strncpy(g->status, content->status_message, 256);
|
|
|
|
download_template->icons[ICON_DOWNLOAD_STATUS].data.indirected_text.text =
|
|
|
|
g->status;
|
|
|
|
download_template->icons[ICON_DOWNLOAD_STATUS].data.indirected_text.size =
|
|
|
|
256;
|
|
|
|
sprintf(g->data.download.sprite_name, "Sfile_%x",
|
|
|
|
g->data.download.file_type);
|
|
|
|
e = xwimpspriteop_select_sprite(g->data.download.sprite_name + 1, 0);
|
|
|
|
if (e)
|
|
|
|
strcpy(g->data.download.sprite_name, "Sfile_xxx");
|
|
|
|
download_template->icons[ICON_DOWNLOAD_ICON].data.indirected_text.validation =
|
|
|
|
g->data.download.sprite_name;
|
|
|
|
ro_gui_download_leaf(content->url, g->data.download.path);
|
|
|
|
download_template->icons[ICON_DOWNLOAD_PATH].data.indirected_text.text =
|
|
|
|
g->data.download.path;
|
|
|
|
download_template->icons[ICON_DOWNLOAD_PATH].data.indirected_text.size =
|
|
|
|
256;
|
|
|
|
|
|
|
|
/* create and open the download window */
|
2003-11-08 02:51:13 +03:00
|
|
|
g->window = wimp_create_window(download_template);
|
|
|
|
ro_gui_dialog_open(g->window);
|
2003-08-28 23:21:27 +04:00
|
|
|
|
2003-10-06 03:30:21 +04:00
|
|
|
g->data.download.download_status = download_INCOMPLETE;
|
|
|
|
|
2003-08-28 23:21:27 +04:00
|
|
|
g->next = window_list;
|
|
|
|
window_list = g;
|
|
|
|
return g;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find a friendly RISC OS leaf name for a URL.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void ro_gui_download_leaf(const char *url, char *leaf)
|
|
|
|
{
|
|
|
|
char *slash;
|
|
|
|
size_t len;
|
2003-10-06 20:29:27 +04:00
|
|
|
int i;
|
2003-08-28 23:21:27 +04:00
|
|
|
|
|
|
|
/* take url from last / to first non-RISC OS character, eg. '.' */
|
|
|
|
slash = strrchr(url, '/');
|
|
|
|
if (!slash) {
|
|
|
|
strcpy(leaf, "download");
|
|
|
|
return;
|
|
|
|
}
|
2003-10-06 20:29:27 +04:00
|
|
|
/*len = strspn(slash + 1, "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
|
"abcdefghijklmnopqrstuvwxyz");*/ /* over-paranoid */
|
|
|
|
len = strlen(slash+1);
|
2003-08-28 23:21:27 +04:00
|
|
|
if (40 < len)
|
|
|
|
len = 40;
|
|
|
|
strncpy(leaf, slash + 1, len);
|
|
|
|
leaf[len] = 0;
|
2003-10-06 20:29:27 +04:00
|
|
|
/* swap "." for "/" */
|
|
|
|
for (i=0; i!=len; i++) {
|
|
|
|
if (leaf[i] == '.') {
|
|
|
|
leaf[i] = '/';
|
|
|
|
}
|
|
|
|
}
|
2003-08-28 23:21:27 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Refresh the status icon in the download window.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void gui_download_window_update_status(gui_window *g)
|
|
|
|
{
|
|
|
|
strncpy(g->status, g->data.download.content->status_message, 256);
|
2003-11-08 02:51:13 +03:00
|
|
|
wimp_set_icon_state(g->window,
|
2003-08-28 23:21:27 +04:00
|
|
|
ICON_DOWNLOAD_STATUS, 0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle failed downloads.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void gui_download_window_error(gui_window *g, const char *error)
|
|
|
|
{
|
|
|
|
g->data.download.content = 0;
|
|
|
|
|
|
|
|
/* place error message in status icon in red */
|
|
|
|
strncpy(g->status, error, 256);
|
2003-11-08 02:51:13 +03:00
|
|
|
wimp_set_icon_state(g->window,
|
2003-08-28 23:21:27 +04:00
|
|
|
ICON_DOWNLOAD_STATUS,
|
|
|
|
wimp_COLOUR_RED << wimp_ICON_FG_COLOUR_SHIFT,
|
|
|
|
wimp_ICON_FG_COLOUR);
|
|
|
|
|
|
|
|
/* grey out file and pathname icons */
|
2003-11-08 02:51:13 +03:00
|
|
|
wimp_set_icon_state(g->window,
|
2003-08-28 23:21:27 +04:00
|
|
|
ICON_DOWNLOAD_ICON, wimp_ICON_SHADED, 0);
|
2003-11-08 02:51:13 +03:00
|
|
|
wimp_set_icon_state(g->window,
|
2003-08-28 23:21:27 +04:00
|
|
|
ICON_DOWNLOAD_PATH, wimp_ICON_SHADED, 0);
|
2003-10-06 03:30:21 +04:00
|
|
|
|
|
|
|
g->data.download.download_status = download_ERROR;
|
2003-08-28 23:21:27 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle completed downloads.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void gui_download_window_done(gui_window *g)
|
|
|
|
{
|
|
|
|
snprintf(g->status, 256, messages_get("Downloaded"),
|
|
|
|
g->data.download.content->data.other.length);
|
2003-11-08 02:51:13 +03:00
|
|
|
wimp_set_icon_state(g->window,
|
2003-08-28 23:21:27 +04:00
|
|
|
ICON_DOWNLOAD_STATUS, 0, 0);
|
2003-10-06 03:30:21 +04:00
|
|
|
|
|
|
|
// clear shaded path and icon icons
|
2003-11-08 02:51:13 +03:00
|
|
|
wimp_set_icon_state(g->window,
|
2003-10-06 03:30:21 +04:00
|
|
|
ICON_DOWNLOAD_ICON, 0, wimp_ICON_SHADED);
|
2003-11-08 02:51:13 +03:00
|
|
|
wimp_set_icon_state(g->window,
|
2003-10-06 03:30:21 +04:00
|
|
|
ICON_DOWNLOAD_PATH, 0, wimp_ICON_SHADED);
|
|
|
|
|
|
|
|
g->data.download.download_status = download_COMPLETE;
|
2003-08-28 23:21:27 +04:00
|
|
|
}
|
|
|
|
|
2003-10-06 03:30:21 +04:00
|
|
|
void ro_download_window_click(struct gui_window *g, wimp_pointer *pointer)
|
|
|
|
{
|
|
|
|
/* Handle clicks on download windows */
|
|
|
|
|
|
|
|
switch (pointer->i)
|
|
|
|
{
|
|
|
|
case ICON_DOWNLOAD_ABORT : if (g->data.download.download_status ==
|
|
|
|
download_INCOMPLETE)
|
|
|
|
fetch_abort(g->data.download.content->fetch);
|
|
|
|
|
|
|
|
ro_download_window_close(g);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ICON_DOWNLOAD_ICON : if (g->data.download.download_status ==
|
|
|
|
download_COMPLETE)
|
|
|
|
{
|
|
|
|
current_drag.type = draginfo_DOWNLOAD_SAVE;
|
|
|
|
current_drag.data.download.gui = g;
|
|
|
|
ro_gui_drag_box_start(pointer);
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct gui_window * ro_lookup_download_window_from_w(wimp_w window)
|
|
|
|
{
|
|
|
|
gui_window* g;
|
|
|
|
for (g = window_list; g != NULL; g = g->next)
|
|
|
|
{
|
|
|
|
if (g->type == GUI_DOWNLOAD_WINDOW)
|
|
|
|
{
|
2003-11-08 02:51:13 +03:00
|
|
|
if (g->window == window)
|
2003-10-06 03:30:21 +04:00
|
|
|
{
|
|
|
|
return g;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ro_download_window_close(struct gui_window *g)
|
|
|
|
{
|
|
|
|
// free contexts etc???
|
|
|
|
|
2003-11-08 02:51:13 +03:00
|
|
|
wimp_close_window(g->window);
|
2003-10-06 03:30:21 +04:00
|
|
|
}
|