From 5c57a30047b4c9330110e5de9f5f406571f9baf1 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Fri, 3 May 2013 21:17:11 +0100 Subject: cleanup title string ownership madness in the tree_create_folder_node() API --- desktop/cookies.c | 35 ++++++++++++----------------------- desktop/history_global_core.c | 23 +++++++---------------- desktop/hotlist.c | 40 +++++++++++++++++----------------------- desktop/tree.c | 38 ++++++++++++-------------------------- desktop/tree.h | 13 +++++++++++++ desktop/tree_url_node.c | 1 + 6 files changed, 62 insertions(+), 88 deletions(-) (limited to 'desktop') diff --git a/desktop/cookies.c b/desktop/cookies.c index 581e1cc5b..539be3e2f 100644 --- a/desktop/cookies.c +++ b/desktop/cookies.c @@ -329,44 +329,33 @@ static void cookies_schedule_callback(const void *scheduled_data) const struct cookie_data *data = scheduled_data; struct node *node = NULL; struct node *cookie_node = NULL; - char *domain_cp; assert(data != NULL); node = cookies_find(cookies_tree_root, data->domain); if (node == NULL) { - domain_cp = strdup(data->domain); - if (domain_cp == NULL) { - LOG(("malloc failed")); - warn_user("NoMemory", 0); - return; - } - /* ownership of domain_cp passed to tree, if node creation - * does not fail */ node = tree_create_folder_node(cookies_tree, - cookies_tree_root, domain_cp, + cookies_tree_root, + data->domain, false, false, false); if (node != NULL) { - tree_set_node_user_callback(node, cookies_node_callback, + tree_set_node_user_callback(node, + cookies_node_callback, NULL); tree_set_node_icon(cookies_tree, node, folder_icon); - - } else { - free(domain_cp); } } - if (node == NULL) - return; - - cookie_node = cookies_find(node, data->name); - if (cookie_node == NULL) - cookies_create_cookie_node(node, data); - else - cookies_update_cookie_node(cookie_node, data); + if (node != NULL) { + cookie_node = cookies_find(node, data->name); + if (cookie_node == NULL) { + cookies_create_cookie_node(node, data); + } else { + cookies_update_cookie_node(cookie_node, data); + } - return; + } } /** diff --git a/desktop/history_global_core.c b/desktop/history_global_core.c index 3222dc7b8..2a941e05d 100644 --- a/desktop/history_global_core.c +++ b/desktop/history_global_core.c @@ -175,33 +175,24 @@ static bool history_global_initialise_node(const char *title, time_t base, int days_back) { struct tm *full_time; - char *buffer; struct node *node; base += days_back * 60 * 60 * 24; if (title == NULL) { full_time = localtime(&base); - buffer = strdup(messages_get(weekday_msg_name[full_time->tm_wday])); - } else { - buffer = strdup(title); + title = messages_get(weekday_msg_name[full_time->tm_wday]); } - if (buffer == NULL) { - LOG(("malloc failed")); - warn_user("NoMemory", 0); - return false; - } - - node = tree_create_folder_node(NULL, NULL, buffer, - false, true, true); + node = tree_create_folder_node(NULL, NULL, title, false, true, true); if (node == NULL) { - LOG(("malloc failed")); - warn_user("NoMemory", 0); - free(buffer); + warn_user(messages_get_errorcode(NSERROR_NOMEM), 0); return false; } - if (folder_icon != NULL) + + if (folder_icon != NULL) { tree_set_node_icon(global_history_tree, node, folder_icon); + } + tree_set_node_user_callback(node, history_global_node_callback, NULL); global_history_base_node[global_history_base_node_count] = node; diff --git a/desktop/hotlist.c b/desktop/hotlist.c index e2386fc8e..20cc8ea26 100644 --- a/desktop/hotlist.c +++ b/desktop/hotlist.c @@ -121,7 +121,6 @@ bool hotlist_initialise(struct tree *tree, const char *hotlist_path, { struct node *node; const struct url_data *url_data; - char *name; int hlst_loop; /* Either load or create a hotlist */ @@ -143,18 +142,15 @@ bool hotlist_initialise(struct tree *tree, const char *hotlist_path, return true; } - /* failed to load hotlist file, use default list */ - name = strdup("NetSurf"); - if (name == NULL) { - LOG(("malloc failed")); - warn_user("NoMemory", 0); - return false; - } - node = tree_create_folder_node(hotlist_tree, hotlist_tree_root, - name, true, false, false); + node = tree_create_folder_node(hotlist_tree, + hotlist_tree_root, + messages_get("NetSurf"), + true, + false, + false); if (node == NULL) { - free(name); + warn_user(messages_get_errorcode(NSERROR_NOMEM), 0); return false; } @@ -373,14 +369,7 @@ void hotlist_collapse_addresses(void) void hotlist_add_folder(bool selected) { struct node *node, *parent = NULL; - struct node_element *element; - char *title = strdup("Untitled"); - if (title == NULL) { - LOG(("malloc failed")); - warn_user("NoMemory", 0); - return; - } creating_node = true; if (selected == true) { @@ -394,16 +383,21 @@ void hotlist_add_folder(bool selected) parent = tree_get_default_folder_node(hotlist_tree); } - node = tree_create_folder_node(hotlist_tree, parent, title, - true, false, false); + node = tree_create_folder_node(hotlist_tree, + parent, + messages_get("Untitled"), + true, + false, + false); if (node == NULL) { - free(title); + warn_user(messages_get_errorcode(NSERROR_NOMEM), 0); return; } + tree_set_node_user_callback(node, hotlist_node_callback, NULL); tree_set_node_icon(hotlist_tree, node, folder_icon); - element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL); - tree_start_edit(hotlist_tree, element); + tree_start_edit(hotlist_tree, + tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL)); } /** diff --git a/desktop/tree.c b/desktop/tree.c index af64be83b..e72ef6001 100644 --- a/desktop/tree.c +++ b/desktop/tree.c @@ -233,26 +233,19 @@ struct tree *tree_create(unsigned int flags, const struct treeview_table *callbacks, void *client_data) { struct tree *tree; - char *title; tree = calloc(sizeof(struct tree), 1); if (tree == NULL) { LOG(("calloc failed")); - warn_user("NoMemory", 0); + warn_user(messages_get_errorcode(NSERROR_NOMEM), 0); return NULL; } - title = strdup("Root"); - if (title == NULL) { - LOG(("malloc failed")); - warn_user("NoMemory", 0); - free(tree); - return NULL; - } - tree->root = tree_create_folder_node(NULL, NULL, title, + tree->root = tree_create_folder_node(NULL, + NULL, + messages_get("Root"), false, false, false); if (tree->root == NULL) { - free(title); free(tree); return NULL; } @@ -553,18 +546,7 @@ static void tree_recalculate_node_sizes(struct tree *tree, struct node *node, } -/** - * Creates a folder node with the specified title, and optionally links it into - * the tree. - * - * \param tree the owner tree of 'parent', may be NULL - * \param parent the parent node, or NULL not to link - * \param title the node title (not copied, used directly) - * \param editable if true, the node title will be editable - * \param retain_in_memory if true, the node will stay in memory after deletion - * \param deleted if true, the node is created with the deleted flag - * \return the newly created node. - */ +/* exported interface documented in desktop/tree.h */ struct node *tree_create_folder_node(struct tree *tree, struct node *parent, const char *title, bool editable, bool retain_in_memory, bool deleted) @@ -575,16 +557,20 @@ struct node *tree_create_folder_node(struct tree *tree, struct node *parent, node = calloc(sizeof(struct node), 1); if (node == NULL) { - LOG(("calloc failed")); - warn_user("NoMemory", 0); return NULL; } + + node->data.text = strdup(title); + if (node->data.text == NULL) { + free(node); + return NULL; + } + node->folder = true; node->retain_in_memory = retain_in_memory; node->deleted = deleted; node->data.parent = node; node->data.type = NODE_ELEMENT_TEXT; - node->data.text = title; node->data.flag = TREE_ELEMENT_TITLE; node->data.editable = editable; node->sort = NULL; diff --git a/desktop/tree.h b/desktop/tree.h index 8ac505783..b88108776 100644 --- a/desktop/tree.h +++ b/desktop/tree.h @@ -137,6 +137,19 @@ void tree_setup_colours(void); struct tree *tree_create(unsigned int flags, const struct treeview_table *callbacks, void *client_data); + +/** + * Creates a folder node with the specified title, and optionally links it into + * the tree. + * + * \param tree the owner tree of 'parent', may be NULL + * \param parent the parent node, or NULL not to link + * \param title the node title + * \param editable if true, the node title will be editable + * \param retain_in_memory if true, the node will stay in memory after deletion + * \param deleted if true, the node is created with the deleted flag + * \return the newly created node or NULL on error. + */ struct node *tree_create_folder_node(struct tree *tree, struct node *parent, const char *title, bool editable, bool retain_in_memory, bool deleted); diff --git a/desktop/tree_url_node.c b/desktop/tree_url_node.c index 76bc8a47c..7646048bb 100644 --- a/desktop/tree_url_node.c +++ b/desktop/tree_url_node.c @@ -683,6 +683,7 @@ static bool tree_url_load_directory_cb(dom_node *node, void *ctx) dir = tree_create_folder_node(tctx->tree, tctx->directory, title, true, false, false); + free(title); if (dir == NULL) { dom_string_unref(name); return false; -- cgit v1.2.3