diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2004-05-05 00:02:13 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2004-05-05 00:02:13 +0000 |
commit | 0f8e3e06e4bf946a932e77c0c27dd044cb1d9f4e (patch) | |
tree | 5f22ad8b0784912c403e302d719e84948cf7edac /riscos/save.c | |
parent | 88a5db22f965dae60f3bf8ba37de12bd93353b04 (diff) | |
download | netsurf-0f8e3e06e4bf946a932e77c0c27dd044cb1d9f4e.tar.gz netsurf-0f8e3e06e4bf946a932e77c0c27dd044cb1d9f4e.tar.bz2 |
[project @ 2004-05-05 00:02:13 by jmb]
Implement saving of Links as URI, URL and Text
Implement saving of page objects in their original format
Implement export of page images as Sprite
Fix NULL pointer causing ofla when extracting page charset from libxml
svn path=/import/netsurf/; revision=826
Diffstat (limited to 'riscos/save.c')
-rw-r--r-- | riscos/save.c | 140 |
1 files changed, 116 insertions, 24 deletions
diff --git a/riscos/save.c b/riscos/save.c index e36d85b85..79c79adfb 100644 --- a/riscos/save.c +++ b/riscos/save.c @@ -29,7 +29,12 @@ gui_save_type gui_current_save_type; -void ro_gui_save_complete(struct content *c, char *path); +extern struct content *save_content; +extern char *save_link; + +static void ro_gui_save_complete(struct content *c, char *path); +static void ro_gui_save_object_native(struct content *c, char *path); +static void ro_gui_save_link(int format, char *path); /** @@ -133,7 +138,7 @@ void ro_gui_save_drag_end(wimp_dragged *drag) void ro_gui_save_datasave_ack(wimp_message *message) { char *path = message->data.data_xfer.file_name; - struct content *c = current_gui->data.browser.bw->current_content; + struct content *c = save_content; os_error *error; ro_gui_set_icon_string(dialog_saveas, ICON_SAVE_PATH, path); @@ -171,8 +176,48 @@ void ro_gui_save_datasave_ack(wimp_message *message) save_as_text(c, path); xosfile_set_type(path, 0xfff); break; + + case GUI_SAVE_OBJECT_ORIG: + if (!c) + return; + error = xosfile_save_stamped(path, + ro_content_filetype(c), + c->source_data, + c->source_data + c->source_size); + if (error) { + LOG(("xosfile_save_stamped: 0x%x: %s", + error->errnum, error->errmess)); + warn_user(error->errmess); + } + break; + + case GUI_SAVE_OBJECT_NATIVE: + if (!c) + return; + ro_gui_save_object_native(c, path); + break; + + case GUI_SAVE_LINK_URI: + if (!save_link) + return; + ro_gui_save_link(1, path); + break; + + case GUI_SAVE_LINK_URL: + if (!save_link) + return; + ro_gui_save_link(2, path); + break; + + case GUI_SAVE_LINK_TEXT: + if (!save_link) + return; + ro_gui_save_link(3, path); + break; } + if (save_link) xfree(save_link); + save_content = NULL; wimp_create_menu(wimp_CLOSE_MENU, 0, 0); } @@ -230,29 +275,9 @@ void ro_gui_save_complete(struct content *c, char *path) warn_user("Failed to acquire dirname"); return; } -/* snprintf(spritename, sizeof spritename, "%s", appname+1); - area = malloc(SPRITE_SIZE); - if (!area) { - LOG(("malloc failed")); - warn_user("No memory for sprite"); - return; - } - area->size = SPRITE_SIZE; - area->sprite_count = 0; - area->first = 16; - area->used = 16; - error = xosspriteop_create_sprite(osspriteop_NAME, area, - spritename, false, - WIDTH / 2, HEIGHT / 2, os_MODE8BPP90X90); - if (error) { - LOG(("Failed to create sprite")); - warn_user("Failed to create iconsprite"); - free(area); - return; - } -*/ + area = thumbnail_initialise(34, 34, os_MODE8BPP90X90); - if (!area) { + if (!area) { LOG(("Iconsprite initialisation failed.")); return; } @@ -297,3 +322,70 @@ void ro_gui_save_complete(struct content *c, char *path) save_complete(c, path); } + +void ro_gui_save_object_native(struct content *c, char *path) +{ + os_error *error; + osspriteop_area *temp; + + switch (c->type) { + case CONTENT_JPEG: + error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.jpeg.sprite_area, path); + break; + case CONTENT_PNG: + error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.png.sprite_area, path); + break; + case CONTENT_GIF: + /* create sprite area */ + temp = calloc(c->data.gif.gif->frame_image->size+16, + sizeof(char)); + temp->size = c->data.gif.gif->frame_image->size+16; + temp->sprite_count = 1; + temp->first = 16; + temp->used = c->data.gif.gif->frame_image->size+16; + memcpy((char*)temp+16, + (char*)c->data.gif.gif->frame_image, + c->data.gif.gif->frame_image->size); + /* ensure extra words for name are null */ + memset((char*)temp+24, 0, 8); + error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, temp, path); + free(temp); + break; + default: + break; + } +} + +void ro_gui_save_link(int format, char *path) +{ + FILE *fp = fopen(path, "w"); + + if (!fp) return; + + switch (format) { + case 1: /* URI */ + fprintf(fp, "%s\t%s\n", "URI", "100"); + fprintf(fp, "\t# NetSurf %s\n\n", netsurf_version); + fprintf(fp, "\t%s\n", save_link); + fprintf(fp, "\t*\n"); + break; + case 2: /* URL */ + case 3: /* Text */ + fprintf(fp, "%s\n", save_link); + break; + } + + fclose(fp); + + switch (format) { + case 1: /* URI */ + xosfile_set_type(path, 0xf91); + break; + case 2: /* URL */ + xosfile_set_type(path, 0xb28); + break; + case 3: /* Text */ + xosfile_set_type(path, 0xfff); + break; + } +} |