diff options
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; + } +} |