summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2006-07-16 00:21:15 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2006-07-16 00:21:15 +0000
commit00d74fdd2d75cc29b651ffd3bac6f19f75b4bc22 (patch)
treea8848bd19667ffc173beb01afdbfa56347154531
parentcb04a8c7792dee47bf66a36f474c6bcf20dba82d (diff)
downloadnetsurf-00d74fdd2d75cc29b651ffd3bac6f19f75b4bc22.tar.gz
netsurf-00d74fdd2d75cc29b651ffd3bac6f19f75b4bc22.tar.bz2
Allow the viewing of the entire SSL certificate chain.
svn path=/trunk/netsurf/; revision=2755
-rwxr-xr-x!NetSurf/Resources/de/Templates,fecbin18470 -> 18687 bytes
-rw-r--r--!NetSurf/Resources/en/Templates,fecbin18399 -> 18616 bytes
-rw-r--r--!NetSurf/Resources/fr/Templates,fecbin18582 -> 18799 bytes
-rw-r--r--!NetSurf/Resources/nl/Templates,fecbin18485 -> 18702 bytes
-rw-r--r--desktop/tree.c40
-rw-r--r--riscos/cookies.c13
-rw-r--r--riscos/dialog.c8
-rw-r--r--riscos/global_history.c13
-rw-r--r--riscos/global_history.h1
-rw-r--r--riscos/gui.h2
-rw-r--r--riscos/help.c38
-rw-r--r--riscos/hotlist.c12
-rw-r--r--riscos/sslcert.c381
-rw-r--r--riscos/treeview.c25
-rw-r--r--riscos/treeview.h1
-rw-r--r--riscos/wimp.c1
-rw-r--r--riscos/wimp.h1
17 files changed, 368 insertions, 168 deletions
diff --git a/!NetSurf/Resources/de/Templates,fec b/!NetSurf/Resources/de/Templates,fec
index dbe683261..821894164 100755
--- a/!NetSurf/Resources/de/Templates,fec
+++ b/!NetSurf/Resources/de/Templates,fec
Binary files differ
diff --git a/!NetSurf/Resources/en/Templates,fec b/!NetSurf/Resources/en/Templates,fec
index b8e9daa3b..51a7b44ac 100644
--- a/!NetSurf/Resources/en/Templates,fec
+++ b/!NetSurf/Resources/en/Templates,fec
Binary files differ
diff --git a/!NetSurf/Resources/fr/Templates,fec b/!NetSurf/Resources/fr/Templates,fec
index 6552d1e6a..63c5f46ac 100644
--- a/!NetSurf/Resources/fr/Templates,fec
+++ b/!NetSurf/Resources/fr/Templates,fec
Binary files differ
diff --git a/!NetSurf/Resources/nl/Templates,fec b/!NetSurf/Resources/nl/Templates,fec
index 2ffc8c02f..128de698c 100644
--- a/!NetSurf/Resources/nl/Templates,fec
+++ b/!NetSurf/Resources/nl/Templates,fec
Binary files differ
diff --git a/desktop/tree.c b/desktop/tree.c
index 529036e22..7643f310c 100644
--- a/desktop/tree.c
+++ b/desktop/tree.c
@@ -25,6 +25,7 @@ static void tree_draw_node(struct tree *tree, struct node *node, int clip_x,
int clip_y, int clip_width, int clip_height);
static struct node_element *tree_create_node_element(struct node *parent,
node_element_data data);
+static void tree_delete_node_internal(struct tree *tree, struct node *node, bool siblings);
static int tree_get_node_width(struct node *node);
static int tree_get_node_height(struct node *node);
static void tree_handle_selection_area_node(struct tree *tree,
@@ -34,7 +35,6 @@ static void tree_selected_to_processing(struct node *node);
void tree_clear_processing(struct node *node);
struct node *tree_move_processing_node(struct node *node, struct node *link,
bool before, bool first);
-struct node *tree_create_leaf_node(struct node *parent, const char *title);
struct node *tree_create_leaf_node_shared(struct node *parent, const char *title);
static int tree_initialising = 0;
@@ -884,6 +884,24 @@ void tree_delete_selected_nodes(struct tree *tree, struct node *node) {
* \param siblings whether to delete all siblings
*/
void tree_delete_node(struct tree *tree, struct node *node, bool siblings) {
+
+ tree_delete_node_internal(tree, node, siblings);
+
+ if (tree->root)
+ tree_recalculate_node_positions(tree, tree->root);
+ tree_redraw_area(tree, 0, 0, 16384, 16384); /* \todo correct area */
+ tree_recalculate_size(tree);
+}
+
+
+/**
+ * Deletes a node from the tree.
+ *
+ * \param tree the tree to delete from
+ * \param node the node to delete
+ * \param siblings whether to delete all siblings
+ */
+void tree_delete_node_internal(struct tree *tree, struct node *node, bool siblings) {
struct node *next;
struct node *parent;
struct node_element *e, *f;
@@ -892,10 +910,12 @@ void tree_delete_node(struct tree *tree, struct node *node, bool siblings) {
if (tree->temp_selection == node)
tree->temp_selection = NULL;
+ if (tree->root == node)
+ tree->root = NULL;
next = node->next;
if (node->child)
- tree_delete_node(tree, node->child, true);
+ tree_delete_node_internal(tree, node->child, true);
node->child = NULL;
parent = node->parent;
tree_delink_node(node);
@@ -935,14 +955,9 @@ void tree_delete_node(struct tree *tree, struct node *node, bool siblings) {
node->deleted = true;
}
if (siblings && next)
- tree_delete_node(tree, next, true);
-
- tree_recalculate_node_positions(tree, tree->root);
- tree_redraw_area(tree, 0, 0, 16384, 16384); /* \todo correct area */
- tree_recalculate_size(tree);
+ tree_delete_node_internal(tree, next, true);
}
-
/**
* Creates a folder node with the specified title, and links it into the tree.
*
@@ -1240,8 +1255,13 @@ void tree_recalculate_size(struct tree *tree) {
return;
width = tree->width;
height = tree->height;
- tree->width = tree_get_node_width(tree->root);
- tree->height = tree_get_node_height(tree->root);
+ if (tree->root) {
+ tree->width = tree_get_node_width(tree->root);
+ tree->height = tree_get_node_height(tree->root);
+ } else {
+ tree->width = 0;
+ tree->height = 0;
+ }
if ((width != tree->width) || (height != tree->height))
tree_resized(tree);
}
diff --git a/riscos/cookies.c b/riscos/cookies.c
index b1cf8873f..2830e1ec8 100644
--- a/riscos/cookies.c
+++ b/riscos/cookies.c
@@ -110,19 +110,6 @@ bool ro_gui_cookies_click(wimp_pointer *pointer)
/**
- * Attempts to process an interactive help message request
- *
- * \param x the x co-ordinate to give help for
- * \param y the x co-ordinate to give help for
- * \return the message code index
- */
-int ro_gui_cookies_help(int x, int y)
-{
- return -1;
-}
-
-
-/**
* Perform cookie addition
*
* \param data Cookie data for a domain
diff --git a/riscos/dialog.c b/riscos/dialog.c
index 706ee5701..fdd71ba77 100644
--- a/riscos/dialog.c
+++ b/riscos/dialog.c
@@ -42,7 +42,7 @@
/* The maximum number of persistent dialogues
*/
-#define MAX_PERSISTENT 16
+#define MAX_PERSISTENT 64
wimp_w dialog_info, dialog_saveas,
@@ -355,11 +355,17 @@ void ro_gui_dialog_close(wimp_w close)
for (i = 0; i < MAX_PERSISTENT; i++) {
if (persistent_dialog[i].dialog == close) {
/* We are => invalidate record */
+ persistent_dialog[i].parent = NULL;
persistent_dialog[i].dialog = NULL;
break;
}
}
+ /* Close any child windows */
+ for (i = 0; i < MAX_PERSISTENT; i++)
+ if (persistent_dialog[i].parent == close)
+ ro_gui_dialog_close(persistent_dialog[i].dialog);
+
/* Give the caret back to the parent window. This code relies on
the fact that only tree windows and browser windows open
persistent dialogues, as the caret gets placed to no icon.
diff --git a/riscos/global_history.c b/riscos/global_history.c
index c5916aa10..355b70cf5 100644
--- a/riscos/global_history.c
+++ b/riscos/global_history.c
@@ -236,19 +236,6 @@ bool ro_gui_global_history_click(wimp_pointer *pointer)
/**
- * Attempts to process an interactive help message request
- *
- * \param x the x co-ordinate to give help for
- * \param y the x co-ordinate to give help for
- * \return the message code index
- */
-int ro_gui_global_history_help(int x, int y)
-{
- return -1;
-}
-
-
-/**
* Adds to the global history
*
* \param url The URL to add
diff --git a/riscos/global_history.h b/riscos/global_history.h
index 5aab7b2b4..e3a187412 100644
--- a/riscos/global_history.h
+++ b/riscos/global_history.h
@@ -15,7 +15,6 @@
#define GLOBAL_HISTORY_RECENT_URLS 16
void ro_gui_global_history_initialise(void);
-int ro_gui_global_history_help(int x, int y);
void ro_gui_global_history_save(void);
diff --git a/riscos/gui.h b/riscos/gui.h
index 17fb86903..ca8f90b6b 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -129,6 +129,7 @@ void ro_gui_401login_init(void);
/* in sslcert.c */
#ifdef WITH_SSL
void ro_gui_cert_init(void);
+void ro_gui_cert_open(struct tree *tree, struct node *node);
#endif
/* in window.c */
@@ -176,7 +177,6 @@ void ro_gui_hotlist_save(void);
void ro_gui_hotlist_prepare_folder_dialog(struct node *node);
void ro_gui_hotlist_prepare_entry_dialog(struct node *node);
bool ro_gui_hotlist_dialog_apply(wimp_w w);
-int ro_gui_hotlist_help(int x, int y);
/* in filetype.c */
int ro_content_filetype(struct content *content);
diff --git a/riscos/help.c b/riscos/help.c
index f189ce48a..a7e185055 100644
--- a/riscos/help.c
+++ b/riscos/help.c
@@ -17,12 +17,11 @@
#include "oslib/taskmanager.h"
#include "oslib/wimp.h"
#include "netsurf/desktop/tree.h"
-#include "netsurf/riscos/cookies.h"
-#include "netsurf/riscos/global_history.h"
#include "netsurf/riscos/gui.h"
#include "netsurf/riscos/help.h"
#include "netsurf/riscos/menus.h"
#include "netsurf/riscos/theme.h"
+#include "netsurf/riscos/treeview.h"
#include "netsurf/riscos/wimp.h"
#include "netsurf/riscos/wimp_event.h"
#include "netsurf/utils/messages.h"
@@ -46,7 +45,7 @@
HelpBrowserMenu Browser window menu
HelpHotlistMenu Hotlist window menu
HelpGHistoryMenu Global history window menu
- HelpCookiesMenu Cookie window menu
+ HelpCookiesMenu Cookie window menu
The prefixes are followed by either the icon number (eg 'HelpToolbar7'),
or a series of numbers representing the menu structure (eg
@@ -88,6 +87,7 @@ void ro_gui_interactive_help_request(wimp_message *message) {
wimp_menu *test_menu;
os_error *error;
const char *auto_text;
+ int i;
/* only accept help requests */
if ((!message) || (message->action != message_HELP_REQUEST))
@@ -105,24 +105,24 @@ void ro_gui_interactive_help_request(wimp_message *message) {
/* do the basic window checks */
auto_text = ro_gui_wimp_event_get_help_prefix(window);
if (auto_text)
- sprintf(message_token, "%s%i", auto_text, (int)icon);
+ sprintf(message_token, "%s%i", auto_text, (int)icon);
else if (window == wimp_ICON_BAR)
sprintf(message_token, "HelpIconbar");
- else if ((hotlist_tree) && (window == (wimp_w)hotlist_tree->handle))
- sprintf(message_token, "HelpHotlist%i",
- ro_gui_hotlist_help(message_data->pos.x,
- message_data->pos.y));
- else if ((global_history_tree) &&
- (window == (wimp_w)global_history_tree->handle))
- sprintf(message_token, "HelpGHistory%i",
- ro_gui_global_history_help(message_data->pos.x,
- message_data->pos.y));
- else if ((cookies_tree) &&
- (window == (wimp_w)cookies_tree->handle))
- sprintf(message_token, "HelpGHistory%i",
- ro_gui_cookies_help(message_data->pos.x,
- message_data->pos.y));
- else if ((g = ro_gui_window_lookup(window)) != NULL)
+ else if ((hotlist_tree) && (window == (wimp_w)hotlist_tree->handle)) {
+ i = ro_gui_tree_help(message_data->pos.x, message_data->pos.y);
+ sprintf(message_token,
+ (i >= 0) ? "HelpTree%i" :"HelpHotlist%i", i);
+ } else if ((global_history_tree) &&
+ (window == (wimp_w)global_history_tree->handle)) {
+ i = ro_gui_tree_help(message_data->pos.x, message_data->pos.y);
+ sprintf(message_token,
+ (i >= 0) ? "HelpTree%i" :"HelpGHistory%i", i);
+ } else if ((cookies_tree) &&
+ (window == (wimp_w)cookies_tree->handle)) {
+ i = ro_gui_tree_help(message_data->pos.x, message_data->pos.y);
+ sprintf(message_token,
+ (i >= 0) ? "HelpTree%i" :"HelpCookies%i", i);
+ } else if ((g = ro_gui_window_lookup(window)) != NULL)
sprintf(message_token, "HelpBrowser%i", (int)icon);
/* if we've managed to find something so far then we broadcast it */
diff --git a/riscos/hotlist.c b/riscos/hotlist.c
index e809e53bc..4ce2f72ea 100644
--- a/riscos/hotlist.c
+++ b/riscos/hotlist.c
@@ -355,15 +355,3 @@ bool ro_gui_hotlist_dialog_apply(wimp_w w) {
}
return true;
}
-
-
-/**
- * Attempts to process an interactive help message request
- *
- * \param x the x co-ordinate to give help for
- * \param y the x co-ordinate to give help for
- * \return the message code index
- */
-int ro_gui_hotlist_help(int x, int y) {
- return -1;
-}
diff --git a/riscos/sslcert.c b/riscos/sslcert.c
index de83e5e20..9bf9bf1d6 100644
--- a/riscos/sslcert.c
+++ b/riscos/sslcert.c
@@ -23,34 +23,47 @@
#include "netsurf/content/urldb.h"
#include "netsurf/desktop/browser.h"
#include "netsurf/desktop/gui.h"
+#include "netsurf/desktop/tree.h"
#include "netsurf/riscos/dialog.h"
#include "netsurf/riscos/textarea.h"
+#include "netsurf/riscos/treeview.h"
#include "netsurf/riscos/wimp_event.h"
+#include "netsurf/riscos/wimp.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/utils.h"
-#define ICON_CERT_VERSION 1
-#define ICON_CERT_VALID_FROM 2
-#define ICON_CERT_TYPE 3
-#define ICON_CERT_VALID_TO 4
-#define ICON_CERT_SERIAL 5
-#define ICON_CERT_ISSUER 6
-#define ICON_CERT_SUBJECT 7
-#define ICON_CERT_REJECT 8
-#define ICON_CERT_ACCEPT 9
+#define ICON_SSL_PANE 1
+#define ICON_SSL_REJECT 3
+#define ICON_SSL_ACCEPT 4
+#define ICON_CERT_VERSION 3
+#define ICON_CERT_VALID_FROM 5
+#define ICON_CERT_TYPE 7
+#define ICON_CERT_VALID_TO 9
+#define ICON_CERT_SERIAL 11
+#define ICON_CERT_ISSUER 13
+#define ICON_CERT_SUBJECT 15
+
+static wimp_window *dialog_tree_template;
static wimp_window *dialog_cert_template;
+static wimp_window *dialog_display_template;
+struct session_data {
+ struct session_cert *certs;
+ unsigned long num;
+ struct browser_window *bw;
+ char *url;
+ struct tree *tree;
+};
struct session_cert {
char version[16], valid_from[32], valid_to[32], type[8], serial[32];
- char *url;
+ char *issuer_t;
+ char *subject_t;
uintptr_t issuer;
uintptr_t subject;
- struct browser_window *bw;
};
-static void ro_gui_cert_open(struct browser_window *bw, const char *url,
- const struct ssl_cert_info *certdata);
+static bool ro_gui_cert_click(wimp_pointer *pointer);
static void ro_gui_cert_close(wimp_w w);
static bool ro_gui_cert_apply(wimp_w w);
@@ -60,7 +73,16 @@ static bool ro_gui_cert_apply(wimp_w w);
void ro_gui_cert_init(void)
{
+ dialog_tree_template = ro_gui_dialog_load_template("tree");
dialog_cert_template = ro_gui_dialog_load_template("sslcert");
+ dialog_display_template = ro_gui_dialog_load_template("ssldisplay");
+
+ dialog_tree_template->flags &= ~(wimp_WINDOW_MOVEABLE |
+ wimp_WINDOW_BACK_ICON |
+ wimp_WINDOW_CLOSE_ICON |
+ wimp_WINDOW_TITLE_ICON |
+ wimp_WINDOW_SIZE_ICON |
+ wimp_WINDOW_TOGGLE_ICON);
}
/**
@@ -70,57 +92,232 @@ void ro_gui_cert_init(void)
void gui_cert_verify(struct browser_window *bw, struct content *c,
const struct ssl_cert_info *certs, unsigned long num)
{
- assert(bw && c && certs);
-
- /** \todo Display entire certificate chain */
- ro_gui_cert_open(bw, c->url, certs);
-}
-
-void ro_gui_cert_open(struct browser_window *bw, const char *url,
- const struct ssl_cert_info *certdata)
-{
- struct session_cert *session;
wimp_w w;
+ wimp_w ssl_w;
+ const struct ssl_cert_info *from;
+ struct session_cert *to;
+ struct session_data *data;
+ struct tree *tree;
+ struct node *node;
+ wimp_window_state state;
+ wimp_icon_state istate;
os_error *error;
+ long i;
+
+ assert(bw && c && certs);
- session = malloc(sizeof(struct session_cert));
- if (!session) {
+ /* copy the certificate information */
+ data = calloc(1, sizeof(struct session_data));
+ if (!data) {
+ warn_user("NoMemory", 0);
+ return;
+ }
+ data->url = strdup(c->url);
+ if (!data->url) {
+ free(data);
warn_user("NoMemory", 0);
return;
}
+ data->bw = bw;
+ data->num = num;
+ data->certs = calloc(num, sizeof(struct session_cert));
+ if (!data->certs) {
+ free(data->url);
+ free(data);
+ warn_user("NoMemory", 0);
+ return;
+ }
+ for (i = 0; i < (long)num; i++) {
+ to = &data->certs[i];
+ from = &certs[i];
+ to->subject_t = strdup(from->subject);
+ to->issuer_t = strdup(from->issuer);
+ if ((!to->subject_t) || (!to->issuer_t)) {
+ for (; i >= 0; i--) {
+ to = &data->certs[i];
+ free(to->subject_t);
+ free(to->issuer_t);
+ }
+ free(data->certs);
+ free(data->url);
+ free(data);
+ warn_user("NoMemory", 0);
+ return;
+ }
+ snprintf(to->version, sizeof data->certs->version, "%ld",
+ from->version);
+ snprintf(to->valid_from, sizeof data->certs->valid_from, "%s",
+ from->not_before);
+ snprintf(to->type, sizeof data->certs->type, "%d",
+ from->cert_type);
+ snprintf(to->valid_to, sizeof data->certs->valid_to, "%s",
+ from->not_after);
+ snprintf(to->serial, sizeof data->certs->serial, "%ld",
+ from->serial);
+ }
- session->url = strdup(url);
- if (!session->url) {
- free(session);
+ /* create the SSL window */
+ error = xwimp_create_window(dialog_cert_template, &ssl_w);
+ if (error) {
+ free(data->certs);
+ free(data->url);
+ free(data);
+ LOG(("xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess));
+ return;
+ }
+
+ /* automated SSL window event handling */
+ ro_gui_wimp_event_set_user_data(ssl_w, data);
+ ro_gui_wimp_event_register_cancel(ssl_w, ICON_SSL_REJECT);
+ ro_gui_wimp_event_register_ok(ssl_w, ICON_SSL_ACCEPT, ro_gui_cert_apply);
+ ro_gui_dialog_open_persistent(bw->window->window, ssl_w, false);
+
+ /* create a tree window (styled as a list) */
+ error = xwimp_create_window(dialog_tree_template, &w);
+ if (error) {
+ ro_gui_cert_close(ssl_w);
+ LOG(("xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess));
+ return;
+ }
+ tree = calloc(sizeof(struct tree), 1);
+ if (!tree) {
+ ro_gui_cert_close(ssl_w);
warn_user("NoMemory", 0);
return;
}
+ tree->root = tree_create_folder_node(NULL, "Root");
+ if (!tree->root) {
+ ro_gui_cert_close(ssl_w);
+ warn_user("NoMemory", 0);
+ free(tree);
+ tree = NULL;
+ }
+ tree->root->expanded = true;
+ tree->handle = (int)w;
+ tree->movable = false;
+ tree->no_vscroll = true;
+ tree->no_furniture = true;
+ tree->single_selection = true;
+ data->tree = tree;
+
+ /* put the SSL names in the tree */
+ for (i = 0; i < (long)num; i++) {
+ node = tree_create_leaf_node(tree->root, certs[i].issuer);
+ if (node) {
+ node->data.data = TREE_ELEMENT_SSL;
+ tree_set_node_sprite(node, "small_xxx", "small_xxx");
+ }
+ }
+
+ /* automated treeview event handling */
+ ro_gui_wimp_event_set_user_data(w, tree);
+ ro_gui_wimp_event_register_keypress(w, ro_gui_tree_keypress);
+ ro_gui_wimp_event_register_redraw_window(w, ro_gui_tree_redraw);
+ ro_gui_wimp_event_register_open_window(w, ro_gui_tree_open);
+ ro_gui_wimp_event_register_close_window(w, ro_gui_wimp_event_finalise);
+ ro_gui_wimp_event_register_mouse_click(w, ro_gui_cert_click);
+
+ /* nest the tree window inside the pane window */
+ state.w = ssl_w;
+ error = xwimp_get_window_state(&state);
+ if (error) {
+ ro_gui_cert_close(ssl_w);
+ LOG(("xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess));
+ return;
+ }
+
+ istate.w = ssl_w;
+ istate.i = ICON_SSL_PANE;
+ error = xwimp_get_icon_state(&istate);
+ if (error) {
+ ro_gui_cert_close(ssl_w);
+ LOG(("xwimp_get_icon_state: 0x%x: %s",
+ error->errnum, error->errmess));
+ return;
+ }
+ state.w = w;
+ state.visible.x1 = state.visible.x0 + istate.icon.extent.x1 - 20 -
+ ro_get_vscroll_width(w);
+ state.visible.x0 += istate.icon.extent.x0 + 20;
+ state.visible.y0 = state.visible.y1 + istate.icon.extent.y0 + 20;
+ state.visible.y1 += istate.icon.extent.y1 - 32;
+ error = xwimp_open_window_nested((wimp_open *)&state, ssl_w,
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_XORIGIN_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
+ << wimp_CHILD_YORIGIN_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_LS_EDGE_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_RS_EDGE_SHIFT);
+ if (error) {
+ ro_gui_cert_close(ssl_w);
+ LOG(("xwimp_open_window_nested: 0x%x: %s",
+ error->errnum, error->errmess));
+ return;
+ }
+ tree_initialise(tree);
+}
+
+void ro_gui_cert_open(struct tree *tree, struct node *node)
+{
+ struct node *n;
+ struct session_data *data;
+ struct session_cert *session;
+ wimp_window_state state;
+ wimp_w child;
+ wimp_w parent;
+ wimp_w w;
+ unsigned long i;
+ os_error *error;
+
+ assert(tree->root);
+
+ /* firstly we need to get our node index in the list */
+ for (n = tree->root->child, i = 0; n; i++, n = n->next)
+ if (n == node)
+ break;
+ assert(n);
+
+ /* now we get the handle of our list window */
+ child = (wimp_w)tree->handle;
+ assert(child);
+
+ /* now we can get the linked parent handle */
+ state.w = child;
+ error = xwimp_get_window_state_and_nesting(&state, &parent, 0);
+ if (error) {
+ LOG(("xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return;
+ }
+ assert(parent);
+
+ /* from this we can get our session data */
+ data = (struct session_data *)ro_gui_wimp_event_get_user_data(parent);
+ assert(data);
+ assert(data->tree == tree);
+
+ /* and finally the nodes session certificate data */
+ session = &data->certs[i];
+ assert(session);
- session->bw = bw;
-
- snprintf(session->version, sizeof session->version, "%ld",
- certdata->version);
- snprintf(session->valid_from, sizeof session->valid_from, "%s",
- certdata->not_before);
- snprintf(session->type, sizeof session->type, "%d",
- certdata->cert_type);
- snprintf(session->valid_to, sizeof session->valid_to, "%s",
- certdata->not_after);
- snprintf(session->serial, sizeof session->serial, "%ld",
- certdata->serial);
-
- dialog_cert_template->icons[ICON_CERT_VERSION].data.indirected_text.text = session->version;
- dialog_cert_template->icons[ICON_CERT_VERSION].data.indirected_text.size = strlen(session->version) + 1;
- dialog_cert_template->icons[ICON_CERT_VALID_FROM].data.indirected_text.text = session->valid_from;
- dialog_cert_template->icons[ICON_CERT_VALID_FROM].data.indirected_text.size = strlen(session->valid_from) + 1;
- dialog_cert_template->icons[ICON_CERT_TYPE].data.indirected_text.text = session->type;
- dialog_cert_template->icons[ICON_CERT_TYPE].data.indirected_text.size = strlen(session->type) + 1;
- dialog_cert_template->icons[ICON_CERT_VALID_TO].data.indirected_text.text = session->valid_to;
- dialog_cert_template->icons[ICON_CERT_VALID_TO].data.indirected_text.size = strlen(session->valid_to) + 1;
- dialog_cert_template->icons[ICON_CERT_SERIAL].data.indirected_text.text = session->serial;
- dialog_cert_template->icons[ICON_CERT_SERIAL].data.indirected_text.size = strlen(session->serial) + 1;
-
- error = xwimp_create_window(dialog_cert_template, &w);
+ dialog_display_template->icons[ICON_CERT_VERSION].data.indirected_text.text = session->version;
+ dialog_display_template->icons[ICON_CERT_VERSION].data.indirected_text.size = strlen(session->version) + 1;
+ dialog_display_template->icons[ICON_CERT_VALID_FROM].data.indirected_text.text = session->valid_from;
+ dialog_display_template->icons[ICON_CERT_VALID_FROM].data.indirected_text.size = strlen(session->valid_from) + 1;
+ dialog_display_template->icons[ICON_CERT_TYPE].data.indirected_text.text = session->type;
+ dialog_display_template->icons[ICON_CERT_TYPE].data.indirected_text.size = strlen(session->type) + 1;
+ dialog_display_template->icons[ICON_CERT_VALID_TO].data.indirected_text.text = session->valid_to;
+ dialog_display_template->icons[ICON_CERT_VALID_TO].data.indirected_text.size = strlen(session->valid_to) + 1;
+ dialog_display_template->icons[ICON_CERT_SERIAL].data.indirected_text.text = session->serial;
+ dialog_display_template->icons[ICON_CERT_SERIAL].data.indirected_text.size = strlen(session->serial) + 1;
+
+ error = xwimp_create_window(dialog_display_template, &w);
if (error) {
LOG(("xwimp_create_window: 0x%x: %s",
error->errnum, error->errmess));
@@ -128,47 +325,41 @@ void ro_gui_cert_open(struct browser_window *bw, const char *url,
warn_user("MiscError", error->errmess);
return;
}
-
+ if (session->issuer)
+ textarea_destroy(session->issuer);
session->issuer = textarea_create(w, ICON_CERT_ISSUER,
TEXTAREA_MULTILINE | TEXTAREA_READONLY, NULL, 0);
if (!session->issuer) {
xwimp_delete_window(w);
- free(session);
warn_user("NoMemory", 0);
return;
}
- if (!textarea_set_text(session->issuer, certdata->issuer)) {
+ if (!textarea_set_text(session->issuer, session->issuer_t)) {
textarea_destroy(session->issuer);
xwimp_delete_window(w);
- free(session);
warn_user("NoMemory", 0);
return;
}
+ if (session->subject)
+ textarea_destroy(session->subject);
session->subject = textarea_create(w, ICON_CERT_SUBJECT,
TEXTAREA_MULTILINE | TEXTAREA_READONLY, NULL, 0);
if (!session->subject) {
textarea_destroy(session->issuer);
xwimp_delete_window(w);
- free(session);
warn_user("NoMemory", 0);
return;
}
- if (!textarea_set_text(session->subject, certdata->subject)) {
+ if (!textarea_set_text(session->subject, session->subject_t)) {
textarea_destroy(session->subject);
textarea_destroy(session->issuer);
xwimp_delete_window(w);
- free(session);
warn_user("NoMemory", 0);
return;
}
-
- ro_gui_wimp_event_register_cancel(w, ICON_CERT_REJECT);
- ro_gui_wimp_event_register_ok(w, ICON_CERT_ACCEPT, ro_gui_cert_apply);
- ro_gui_wimp_event_register_close_window(w, ro_gui_cert_close);
- ro_gui_wimp_event_set_user_data(w, session);
-
- ro_gui_dialog_open_persistent(bw->window->window, w, false);
+ ro_gui_wimp_event_register_close_window(w, ro_gui_wimp_event_finalise);
+ ro_gui_dialog_open_persistent(parent, w, false);
}
/**
@@ -176,25 +367,31 @@ void ro_gui_cert_open(struct browser_window *bw, const char *url,
*/
void ro_gui_cert_close(wimp_w w)
{
- os_error *error;
- struct session_cert *session;
-
- session = (struct session_cert *)ro_gui_wimp_event_get_user_data(w);
-
- assert(session);
-
- textarea_destroy(session->subject);
- textarea_destroy(session->issuer);
-
- free(session->url);
- free(session);
-
+ struct session_data *data;
+ unsigned long i;
+
+ data = (struct session_data *)ro_gui_wimp_event_get_user_data(w);
+ assert(data);
+
+ for (i = 0; i < data->num; i++) {
+ if (data->certs[i].subject)
+ textarea_destroy(data->certs[i].subject);
+ if (data->certs[i].issuer)
+ textarea_destroy(data->certs[i].issuer);
+ }
+ free(data->certs);
+ free(data->url);
+ free(data);
+
+ if (data->tree) {
+ tree_delete_node(data->tree, data->tree->root, false);
+ xwimp_delete_window((wimp_w)data->tree->handle);
+ free(data->tree);
+ }
+ xwimp_delete_window(w);
+
ro_gui_wimp_event_finalise(w);
-
- error = xwimp_delete_window(w);
- if (error)
- LOG(("xwimp_delete_window: 0x%x: %s",
- error->errnum, error->errmess));
+
}
/**
@@ -202,16 +399,22 @@ void ro_gui_cert_close(wimp_w w)
*/
bool ro_gui_cert_apply(wimp_w w)
{
- struct session_cert *session;
-
- session = (struct session_cert *)ro_gui_wimp_event_get_user_data(w);
+ struct session_data *session;
+ session = (struct session_data *)ro_gui_wimp_event_get_user_data(w);
assert(session);
urldb_set_cert_permissions(session->url, true);
-
browser_window_go(session->bw, session->url, 0, true);
+ return true;
+}
+bool ro_gui_cert_click(wimp_pointer *pointer)
+{
+ struct tree *tree;
+
+ tree = (struct tree *)ro_gui_wimp_event_get_user_data(pointer->w);
+ ro_gui_tree_click(pointer, tree);
return true;
}
diff --git a/riscos/treeview.c b/riscos/treeview.c
index a01c9b01c..827f01408 100644
--- a/riscos/treeview.c
+++ b/riscos/treeview.c
@@ -45,8 +45,8 @@
static bool ro_gui_tree_initialise_sprite(const char *name, int number);
-static void ro_gui_tree_launch_selected_node(struct node *node, bool all);
-static bool ro_gui_tree_launch_node(struct node *node);
+static void ro_gui_tree_launch_selected_node(struct tree *tree, struct node *node, bool all);
+static bool ro_gui_tree_launch_node(struct tree *tree, struct node *node);
static void tree_handle_node_changed_callback(void *p);
/* an array of sprite addresses for Tinct */
@@ -822,7 +822,7 @@ bool ro_gui_tree_click(wimp_pointer *pointer, struct tree *tree) {
/* double click starts launches the leaf */
if ((pointer->buttons == wimp_CLICK_SELECT) ||
(pointer->buttons == wimp_CLICK_ADJUST)) {
- if (!ro_gui_tree_launch_node(node))
+ if (!ro_gui_tree_launch_node(tree, node))
return false;
if (pointer->buttons == wimp_CLICK_ADJUST)
ro_gui_dialog_close((wimp_w)tree->handle);
@@ -1435,7 +1435,7 @@ void ro_gui_tree_launch_selected(struct tree *tree) {
assert(tree);
if (tree->root->child)
- ro_gui_tree_launch_selected_node(tree->root->child, false);
+ ro_gui_tree_launch_selected_node(tree, tree->root->child, false);
}
@@ -1444,12 +1444,12 @@ void ro_gui_tree_launch_selected(struct tree *tree) {
*
* \param node the node to launch all selected nodes for
*/
-void ro_gui_tree_launch_selected_node(struct node *node, bool all) {
+void ro_gui_tree_launch_selected_node(struct tree *tree, struct node *node, bool all) {
for (; node; node = node->next) {
if (((node->selected) || (all)) && (!node->folder))
- ro_gui_tree_launch_node(node);
+ ro_gui_tree_launch_node(tree, node);
if ((node->child) && ((node->expanded) || (node->selected) | (all)))
- ro_gui_tree_launch_selected_node(node->child,
+ ro_gui_tree_launch_selected_node(tree, node->child,
(node->selected) | (all));
}
}
@@ -1461,7 +1461,7 @@ void ro_gui_tree_launch_selected_node(struct node *node, bool all) {
* \param node the node to launch
* \return whether the node could be launched
*/
-bool ro_gui_tree_launch_node(struct node *node) {
+bool ro_gui_tree_launch_node(struct tree *tree, struct node *node) {
struct node_element *element;
assert(node);
@@ -1471,6 +1471,15 @@ bool ro_gui_tree_launch_node(struct node *node) {
browser_window_create(element->text, NULL, 0, true);
return true;
}
+ element = tree_find_element(node, TREE_ELEMENT_SSL);
+ if (element) {
+ ro_gui_cert_open(tree, node);
+ return true;
+ }
return false;
}
+
+int ro_gui_tree_help(int x, int y) {
+ return -1;
+}
diff --git a/riscos/treeview.h b/riscos/treeview.h
index 3be34c4e3..bfaeffd86 100644
--- a/riscos/treeview.h
+++ b/riscos/treeview.h
@@ -44,5 +44,6 @@ void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element,
void ro_gui_tree_scroll_visible(struct tree *tree, struct node_element *element);
void ro_gui_tree_get_tree_coordinates(struct tree *tree, int x, int y,
int *tree_x, int *tree_y);
+int ro_gui_tree_help(int x, int y);
#endif
diff --git a/riscos/wimp.c b/riscos/wimp.c
index 6ca288101..b0b2fd020 100644
--- a/riscos/wimp.c
+++ b/riscos/wimp.c
@@ -30,7 +30,6 @@
#include "netsurf/utils/utils.h"
static void ro_gui_wimp_cache_furniture_sizes(wimp_w w);
-static bool ro_gui_wimp_read_eig_factors(os_mode mode, int *xeig, int *yeig);
static wimpextend_furniture_sizes furniture_sizes;
static wimp_w furniture_window = NULL;
diff --git a/riscos/wimp.h b/riscos/wimp.h
index 0b2f70c43..f169ce8f1 100644
--- a/riscos/wimp.h
+++ b/riscos/wimp.h
@@ -23,6 +23,7 @@
int ro_get_hscroll_height(wimp_w w);
int ro_get_vscroll_width(wimp_w w);
+bool ro_gui_wimp_read_eig_factors(os_mode mode, int *xeig, int *yeig);
void ro_convert_os_units_to_pixels(os_coord *os_units, os_mode mode);
void ro_convert_pixels_to_os_units(os_coord *pixels, os_mode mode);