summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2006-01-08 20:09:05 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2006-01-08 20:09:05 +0000
commit97950c2033084df19cc1f9f7fc6d7a7c324361da (patch)
tree733c038e845044bd899ed288c9b74fe21fac6d00 /riscos
parentd70a66e6f633f4f95768112ed6bff3924916e20d (diff)
downloadnetsurf-97950c2033084df19cc1f9f7fc6d7a7c324361da.tar.gz
netsurf-97950c2033084df19cc1f9f7fc6d7a7c324361da.tar.bz2
[project @ 2006-01-08 20:09:05 by rjw]
View source on local files now shows the actual file. Use the DataOpen protocol rather than changing the filetype. svn path=/import/netsurf/; revision=2018
Diffstat (limited to 'riscos')
-rw-r--r--riscos/gui.c122
1 files changed, 78 insertions, 44 deletions
diff --git a/riscos/gui.c b/riscos/gui.c
index 163fa68df..33d60ab35 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -20,6 +20,7 @@
#include <time.h>
#include <features.h>
#include <unixlib/local.h>
+#include "curl/curl.h"
#include "oslib/font.h"
#include "oslib/help.h"
#include "oslib/hourglass.h"
@@ -54,6 +55,7 @@
#include "netsurf/riscos/gui.h"
#include "netsurf/riscos/help.h"
#include "netsurf/riscos/menus.h"
+#include "netsurf/riscos/message.h"
#include "netsurf/riscos/options.h"
#ifdef WITH_PLUGIN
#include "netsurf/riscos/plugin.h"
@@ -242,6 +244,7 @@ static void ro_msg_dataopen(wimp_message *block);
static void ro_msg_prequit(wimp_message *message);
static void ro_msg_save_desktop(wimp_message *message);
static char *ro_path_to_url(const char *path);
+static void ro_gui_view_source_bounce(wimp_event_no event, wimp_message *message);
/**
@@ -1187,9 +1190,12 @@ void ro_gui_keypress(wimp_key *key)
/**
* Handle the three User_Message events.
*/
-
void ro_gui_user_message(wimp_event_no event, wimp_message *message)
{
+ /* attempt automatic routing */
+ if (ro_message_handle_message(event, message))
+ return;
+
switch (message->action) {
case message_HELP_REQUEST:
ro_gui_interactive_help_request(message);
@@ -1956,60 +1962,88 @@ void ro_gui_open_help_page(const char *page)
void ro_gui_view_source(struct content *content)
{
os_error *error;
- char *temp_name, *full_name;
+ char *temp_name, *r;
+ wimp_full_message_data_xfer message;
if (!content || !content->source_data) {
warn_user("MiscError", "No document source");
return;
}
-
- /* We cannot release the requested filename until after it has finished
- being used. As we can't easily find out when this is, we simply don't
- bother releasing it and simply allow it to be re-used next time NetSurf
- is started. The memory overhead from doing this is under 1 byte per
- filename. */
- temp_name = ro_filename_request();
- if (!temp_name) {
- warn_user("NoMemory", 0);
- return;
- }
- full_name = malloc(strlen(temp_name) + strlen(CACHE_FILENAME_PREFIX) + 12);
- if (!full_name) {
- warn_user("NoMemory", 0);
- return;
+
+ /* try to load local files directly. */
+ if ((content->url) && (!strncmp(content->url, "file:/", 6))) {
+ if (strncmp(content->url, "file:///", 8) == 0)
+ temp_name = curl_unescape(content->url + 7,
+ strlen(content->url) - 7);
+ else
+ temp_name = curl_unescape(content->url + 5,
+ strlen(content->url) - 5);
+ if (!temp_name) {
+ warn_user("NoMemory", 0);
+ return;
+ }
+ r = __riscosify(temp_name, 0, __RISCOSIFY_NO_SUFFIX,
+ message.file_name, 212, 0);
+ curl_free(temp_name);
+ if (r == 0) {
+ LOG(("__riscosify failed"));
+ return;
+ }
+ } else {
+ /* We cannot release the requested filename until after it has finished
+ being used. As we can't easily find out when this is, we simply don't
+ bother releasing it and simply allow it to be re-used next time NetSurf
+ is started. The memory overhead from doing this is under 1 byte per
+ filename. */
+ temp_name = ro_filename_request();
+ if (!temp_name) {
+ warn_user("NoMemory", 0);
+ return;
+ }
+ snprintf(message.file_name, 212, "%s.%s",
+ CACHE_FILENAME_PREFIX, temp_name);
+ message.file_name[211] = '\0';
+ error = xosfile_save_stamped(message.file_name,
+ ro_content_filetype(content),
+ content->source_data,
+ content->source_data + content->source_size);
+ if (error) {
+ LOG(("xosfile_save_stamped failed: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("MiscError", error->errmess);
+ return;
+ }
}
- sprintf(full_name, "Filer_Run %s.%s", CACHE_FILENAME_PREFIX, temp_name);
- error = xosfile_save_stamped(full_name + 10, 0xfff,
- content->source_data,
- content->source_data + content->source_size);
- if (error) {
- LOG(("xosfile_save_stamped failed: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("MiscError", error->errmess);
- free(full_name);
- return;
- }
+ /* begin the DataOpen protocol */
+ message.your_ref = 0;
+ message.size = 44 + ((strlen(message.file_name) + 4) & (~3u));
+ message.action = message_DATA_OPEN;
+ message.w = 0;
+ message.i = 0;
+ message.pos.x = 0;
+ message.pos.y = 0;
+ message.est_size = 0;
+ message.file_type = 0xfff;
+ ro_message_send_message(wimp_USER_MESSAGE_RECORDED, (wimp_message*)&message, 0,
+ ro_gui_view_source_bounce);
+}
- error = xos_cli(full_name);
- if (error) {
- LOG(("xos_cli: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("MiscError", error->errmess);
- free(full_name);
- return;
- }
- error = xosfile_set_type(full_name + 10, ro_content_filetype(content));
+void ro_gui_view_source_bounce(wimp_event_no event, wimp_message *message) {
+ char *filename;
+ os_error *error;
+ char command[256];
+
+ /* run the file as text */
+ filename = ((wimp_full_message_data_xfer *)message)->file_name;
+ sprintf(command, "@RunType_FFF %s", filename);
+ error = xwimp_start_task(command, 0);
if (error) {
- LOG(("xosfile_set_type failed: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("MiscError", error->errmess);
- free(full_name);
- return;
+ LOG(("xwimp_start_task failed: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
}
-
- free(full_name);
}