summaryrefslogtreecommitdiff
path: root/riscos/theme_install.c
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2005-03-09 00:20:45 +0000
committerJames Bursa <james@netsurf-browser.org>2005-03-09 00:20:45 +0000
commit6aea3ff270d6bf3f5955f37da6f47edb1c8134a6 (patch)
treea490066dd8feb0783627aae077bd7a36a0114534 /riscos/theme_install.c
parentf0d15c1656ef0b02cf1bf2b7d295b776a787309d (diff)
downloadnetsurf-6aea3ff270d6bf3f5955f37da6f47edb1c8134a6.tar.gz
netsurf-6aea3ff270d6bf3f5955f37da6f47edb1c8134a6.tar.bz2
[project @ 2005-03-09 00:20:45 by bursa]
Fix installed themes sitting in memory cache. Break out some code into functions. svn path=/import/netsurf/; revision=1531
Diffstat (limited to 'riscos/theme_install.c')
-rw-r--r--riscos/theme_install.c308
1 files changed, 179 insertions, 129 deletions
diff --git a/riscos/theme_install.c b/riscos/theme_install.c
index 384581b27..f37778a53 100644
--- a/riscos/theme_install.c
+++ b/riscos/theme_install.c
@@ -18,6 +18,7 @@
#include "netsurf/riscos/options.h"
#include "netsurf/riscos/theme.h"
#include "netsurf/riscos/wimp.h"
+#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/url.h"
#include "netsurf/utils/utils.h"
@@ -28,18 +29,25 @@ static struct content *theme_install_content = NULL;
static struct theme_descriptor theme_install_descriptor;
wimp_w dialog_theme_install;
+
static void theme_install_close(void);
-void theme_install_callback(content_msg msg, struct content *c,
+static void theme_install_callback(content_msg msg, struct content *c,
void *p1, void *p2, union content_msg_data data);
+static bool theme_install_read(char *source_data, unsigned long source_size);
+static void theme_install_install(bool apply);
+
#ifndef NCOS
#define THEME_LEAFNAME "WWW.NetSurf.Themes"
-#define THEME_PATHNAME "<Choices$Write>"
+#define THEME_PATH_W "<Choices$Write>."
+#define THEME_PATH_R "Choices:"
#else
#define THEME_LEAFNAME "NetSurf.Choices.Themes"
-#define THEME_PATHNAME "<User$Path>.Choices"
+#define THEME_PATH_W "<User$Path>.Choices."
+#define THEME_PATH_R THEME_PATH_W
#endif
+
/**
* Handle a CONTENT_THEME that has started loading.
*/
@@ -55,6 +63,9 @@ void theme_install_start(struct content *c)
return;
}
+ /* stop theme sitting in memory cache */
+ c->fresh = false;
+
if (!content_add_user(c, theme_install_callback, 0, 0)) {
warn_user("NoMemory", 0);
return;
@@ -77,160 +88,199 @@ void theme_install_start(struct content *c)
void theme_install_callback(content_msg msg, struct content *c,
void *p1, void *p2, union content_msg_data data)
{
- char txt_buffer[256];
- bool error = false;
+ char buffer[256];
int author_indent = 0;
switch (msg) {
- case CONTENT_MSG_READY:
+ case CONTENT_MSG_READY:
+ break;
+
+ case CONTENT_MSG_DONE:
+ theme_install_content = c;
+ if (!theme_install_read(c->source_data, c->source_size)) {
+ warn_user("ThemeInvalid", 0);
+ theme_install_close();
break;
+ }
- case CONTENT_MSG_DONE:
- theme_install_content = c;
- if ((c->source_size < sizeof(struct theme_file_header)) ||
- (!ro_gui_theme_read_file_header(&theme_install_descriptor,
- (struct theme_file_header *)c->source_data)))
- error = true;
- else if (c->source_size - sizeof(struct theme_file_header) !=
- theme_install_descriptor.compressed_size)
- error = true;
-
- if (error) {
- warn_user("ThemeInvalid", 0);
- theme_install_close();
- break;
- }
+ /* remove '© ' from the start of the data */
+ if (theme_install_descriptor.author[0] == '©')
+ author_indent++;
+ while (theme_install_descriptor.author[author_indent] == ' ')
+ author_indent++;
+ snprintf(buffer, sizeof buffer, messages_get("ThemeInstall"),
+ theme_install_descriptor.name,
+ &theme_install_descriptor.author[author_indent]);
+ buffer[sizeof buffer - 1] = '\0';
+ ro_gui_set_icon_string(dialog_theme_install,
+ ICON_THEME_INSTALL_MESSAGE,
+ buffer);
+ ro_gui_set_icon_shaded_state(dialog_theme_install,
+ ICON_THEME_INSTALL_INSTALL, false);
+ break;
- /* remove '© ' from the start of the data */
- if (theme_install_descriptor.author[0] == '©')
- author_indent++;
- while (theme_install_descriptor.author[author_indent] == ' ')
- author_indent++;
- snprintf(txt_buffer, 256, messages_get("ThemeInstall"),
- theme_install_descriptor.name,
- &theme_install_descriptor.author[author_indent]);
- txt_buffer[255] = '\0';
- ro_gui_set_icon_string(dialog_theme_install,
- ICON_THEME_INSTALL_MESSAGE,
- txt_buffer);
- ro_gui_set_icon_shaded_state(dialog_theme_install,
- ICON_THEME_INSTALL_INSTALL, false);
- break;
+ case CONTENT_MSG_ERROR:
+ theme_install_close();
+ warn_user(data.error, 0);
+ break;
- case CONTENT_MSG_ERROR:
- theme_install_close();
- warn_user(data.error, 0);
- break;
+ case CONTENT_MSG_STATUS:
+ break;
- case CONTENT_MSG_STATUS:
- break;
+ case CONTENT_MSG_LOADING:
+ case CONTENT_MSG_REDIRECT:
+ case CONTENT_MSG_REFORMAT:
+ case CONTENT_MSG_REDRAW:
+ case CONTENT_MSG_NEWPTR:
+ case CONTENT_MSG_AUTH:
+ default:
+ assert(0);
+ break;
+ }
+}
- case CONTENT_MSG_LOADING:
- case CONTENT_MSG_REDIRECT:
- case CONTENT_MSG_REFORMAT:
- case CONTENT_MSG_REDRAW:
- case CONTENT_MSG_NEWPTR:
- case CONTENT_MSG_AUTH:
- default:
- assert(0);
+
+/**
+ * Fill in theme_install_descriptor from received theme data.
+ *
+ * \param source_data received data
+ * \param source_size size of data
+ * \return true if data is a correct theme, false on error
+ *
+ * If the data is a correct theme, theme_install_descriptor is filled in.
+ */
+
+bool theme_install_read(char *source_data, unsigned long source_size)
+{
+ if (source_size < sizeof(struct theme_file_header))
+ return false;
+ if (!ro_gui_theme_read_file_header(&theme_install_descriptor,
+ (struct theme_file_header *) source_data))
+ return false;
+ if (source_size - sizeof(struct theme_file_header) !=
+ theme_install_descriptor.compressed_size)
+ return false;
+ return true;
+}
+
+
+/**
+ * Handle clicks in the theme install window.
+ */
+
+void ro_gui_theme_install_click(wimp_pointer *pointer)
+{
+ switch (pointer->i) {
+ case ICON_THEME_INSTALL_INSTALL:
+ theme_install_install(pointer->buttons == wimp_CLICK_SELECT);
+ theme_install_close();
+ break;
+ case ICON_THEME_INSTALL_CANCEL:
+ if (pointer->buttons == wimp_CLICK_ADJUST)
break;
+ theme_install_close();
+ break;
}
}
/**
- * Handle clicks in the theme install window
+ * Install the downloaded theme.
+ *
+ * \param apply make the theme the current theme
*/
-void ro_gui_theme_install_click(wimp_pointer *pointer) {
- os_error *error;
- fileswitch_object_type obj_type;
+
+void theme_install_install(bool apply)
+{
char theme_save[256];
char theme_leaf[256];
char *theme_file;
int theme_number = 1;
bool theme_found;
struct theme_descriptor *theme_install;
+ fileswitch_object_type obj_type;
+ os_error *error;
- switch (pointer->i) {
- case ICON_THEME_INSTALL_INSTALL:
- if (theme_install_content) {
- if (url_nice(theme_install_descriptor.name, &theme_file) != URL_FUNC_OK) {
- warn_user("ThemeInstallErr", 0);
- theme_install_close();
- return;
- }
- theme_found = false;
- while (!theme_found) {
- if (theme_number == 1)
- snprintf(theme_leaf, 256,
- "%s.%s", THEME_LEAFNAME, theme_file);
- else
- snprintf(theme_leaf, 256,
- "%s.%s%i", THEME_LEAFNAME, theme_file,
- theme_number);
- theme_leaf[255] = '\0';
- theme_number++;
- snprintf(theme_save, 256,
- "%s.%s", THEME_PATHNAME, theme_leaf);
- theme_save[255] = '\0';
- error = xosfile_read_stamped(theme_save,
- &obj_type, 0, 0, 0, 0, 0);
- if (error) {
- warn_user("ThemeInstallErr", 0);
- theme_install_close();
- free(theme_file);
- return;
- }
- theme_found = (obj_type == osfile_NOT_FOUND);
- }
- free(theme_file);
- error = xosfile_save_stamped(theme_save, 0xffd,
- theme_install_content->source_data,
- theme_install_content->source_data +
- theme_install_content->source_size);
- if (error) {
- warn_user("ThemeInstallErr", 0);
- theme_install_close();
- return;
- }
- /* apply theme only on Select clicks */
- if (pointer->buttons == wimp_CLICK_SELECT) {
- ro_gui_theme_get_available();
-#ifndef NCOS
- snprintf(theme_save, 256, "Choices:%s", theme_leaf);
-#else
- snprintf(theme_save, 256, "%s.%s", THEME_PATHNAME, theme_leaf);
-#endif
- theme_save[255] = '\0';
- theme_install = ro_gui_theme_find(theme_save);
- if ((!theme_install) ||
- (!ro_gui_theme_apply(theme_install))) {
- warn_user("ThemeApplyErr", 0);
- } else {
- theme_file = strdup(theme_save);
- if (!theme_file) {
- warn_user("NoMemory", 0);
- } else {
- free(option_theme);
- option_theme = theme_file;
- }
- }
- }
- theme_install_close();
- }
- break;
- case ICON_THEME_INSTALL_CANCEL:
- if (pointer->buttons == wimp_CLICK_ADJUST)
- break;
+ assert(theme_install_content);
+
+ if (url_nice(theme_install_descriptor.name, &theme_file) !=
+ URL_FUNC_OK) {
+ warn_user("ThemeInstallErr", 0);
+ theme_install_close();
+ return;
+ }
+
+ theme_found = false;
+ while (!theme_found) {
+ if (theme_number == 1)
+ snprintf(theme_leaf, sizeof theme_leaf, "%s.%s",
+ THEME_LEAFNAME, theme_file);
+ else
+ snprintf(theme_leaf, sizeof theme_leaf, "%s.%s%i",
+ THEME_LEAFNAME, theme_file,
+ theme_number);
+ theme_leaf[sizeof theme_leaf - 1] = '\0';
+ theme_number++;
+ snprintf(theme_save, sizeof theme_save, "%s%s",
+ THEME_PATH_W, theme_leaf);
+ theme_save[sizeof theme_save - 1] = '\0';
+ error = xosfile_read_stamped_no_path(theme_save,
+ &obj_type, 0, 0, 0, 0, 0);
+ if (error) {
+ LOG(("xosfile_read_stamped_no_path: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("ThemeInstallErr", 0);
theme_install_close();
- break;
+ free(theme_file);
+ return;
+ }
+ theme_found = (obj_type == osfile_NOT_FOUND);
+ }
+ free(theme_file);
+
+ error = xosfile_save_stamped(theme_save, 0xffd,
+ theme_install_content->source_data,
+ theme_install_content->source_data +
+ theme_install_content->source_size);
+ if (error) {
+ LOG(("xosfile_save_stamped: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("ThemeInstallErr", 0);
+ theme_install_close();
+ return;
+ }
+
+ if (apply) {
+ ro_gui_theme_get_available();
+ snprintf(theme_save, sizeof theme_save, "%s%s",
+ THEME_PATH_R, theme_leaf);
+ theme_save[sizeof theme_save - 1] = '\0';
+ theme_install = ro_gui_theme_find(theme_save);
+ if (!theme_install || !ro_gui_theme_apply(theme_install)) {
+ warn_user("ThemeApplyErr", 0);
+ } else {
+ theme_file = strdup(theme_save);
+ if (!theme_file) {
+ warn_user("NoMemory", 0);
+ } else {
+ free(option_theme);
+ option_theme = theme_file;
+ }
+ }
}
}
-static void theme_install_close(void) {
- theme_install_active = false;
+
+/**
+ * Close the theme installer and free resources.
+ */
+
+void theme_install_close(void)
+{
+ theme_install_active = false;
if (theme_install_content)
- content_close(theme_install_content);
+ content_remove_user(theme_install_content,
+ theme_install_callback, 0, 0);
theme_install_content = NULL;
ro_gui_dialog_close(dialog_theme_install);
}