From d5bcedd3de7c64791a9b7af1d10edfa60c724526 Mon Sep 17 00:00:00 2001 From: James Bursa Date: Wed, 3 Mar 2004 00:19:47 +0000 Subject: [project @ 2004-03-03 00:19:47 by bursa] Handle DataLoads to iconbar, canonicalise path when loading files. svn path=/import/netsurf/; revision=579 --- riscos/gui.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 8 deletions(-) (limited to 'riscos') diff --git a/riscos/gui.c b/riscos/gui.c index a325aebf2..b0838a81d 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -19,6 +19,7 @@ #include "oslib/os.h" #include "oslib/osbyte.h" #include "oslib/osfile.h" +#include "oslib/osfscontrol.h" #include "oslib/plugin.h" #include "oslib/wimp.h" #include "oslib/uri.h" @@ -793,8 +794,41 @@ void ro_msg_datasave(wimp_message* block) xfree(click_boxes); } -void ro_msg_dataload(wimp_message* block) + +/** + * Handle Message_DataLoad (file dragged in). + */ + +void ro_msg_dataload(wimp_message *message) { + char *url; + + if (message->data.data_xfer.w != wimp_ICON_BAR) + return; + + if (message->data.data_xfer.file_type != 0xfaf && + message->data.data_xfer.file_type != 0x695 && + message->data.data_xfer.file_type != 0xaff && + message->data.data_xfer.file_type != 0xb60 && + message->data.data_xfer.file_type != 0xc85 && + message->data.data_xfer.file_type != 0xff9 && + message->data.data_xfer.file_type != 0xfff) + return; + + /* send DataLoadAck */ + message->action = message_DATA_LOAD_ACK; + message->your_ref = message->my_ref; + wimp_send_message(wimp_USER_MESSAGE, message, message->sender); + + /* create a new window with the file */ + url = ro_path_to_url(message->data.data_xfer.file_name); + if (url) { + browser_window_create(url); + free(url); + } + + +#if 0 gui_window* gui; struct browser_window* bw; wimp_message_data_xfer* data; @@ -841,7 +875,7 @@ void ro_msg_dataload(wimp_message* block) } xfree(click_boxes); - +#endif } @@ -885,21 +919,60 @@ void ro_msg_dataopen(wimp_message *message) /* create a new window with the file */ url = ro_path_to_url(message->data.data_xfer.file_name); - browser_window_create(url); - free(url); + if (url) { + browser_window_create(url); + free(url); + } } /** * Convert a RISC OS pathname to a file: URL. + * + * \param path RISC OS pathname + * \return URL, allocated on heap, or 0 on failure */ char *ro_path_to_url(const char *path) { - unsigned int len = 20 + strlen(path); - char *url = xcalloc(len, 1); - strcpy(url, "file://"); - __unixify(path, __RISCOSIFY_NO_REVERSE_SUFFIX, url + 7, len - 7, 0); + int spare; + char *buffer = 0; + char *url = 0; + os_error *error; + + error = xosfscontrol_canonicalise_path(path, 0, 0, 0, 0, &spare); + if (error) { + LOG(("xosfscontrol_canonicalise_path failed: 0x%x: %s", + error->errnum, error->errmess)); + warn_user(error->errmess); + return 0; + } + + buffer = malloc(1 - spare); + url = malloc(1 - spare + 10); + if (!buffer || !url) { + LOG(("malloc failed")); + warn_user("NoMemory"); + free(buffer); + free(url); + return 0; + } + + error = xosfscontrol_canonicalise_path(path, buffer, 0, 0, 1 - spare, + 0); + if (error) { + LOG(("xosfscontrol_canonicalise_path failed: 0x%x: %s", + error->errnum, error->errmess)); + warn_user(error->errmess); + free(buffer); + free(url); + return 0; + } + + strcpy(url, "file:"); + __unixify(buffer, __RISCOSIFY_NO_REVERSE_SUFFIX, url + 5, + 1 - spare + 5, 0); + free(buffer); return url; } -- cgit v1.2.3