/** * Adds the currently viewed page to the hotlist at the given co-ordinates * \param url url of the page * \param x X cooridinate with respect to tree origin * \param y Y cooridinate with respect to tree origin */ void hotlist_add_page_xy(const char *url, int x, int y) { const struct url_data *data; struct node *link, *node; bool before; data = urldb_get_url_data(url); if (data == NULL) { urldb_add_url(url); urldb_set_url_persistence(url, true); data = urldb_get_url_data(url); } if (data != NULL) { link = tree_get_link_details(hotlist_tree, x, y, &before); node = tree_create_URL_node(NULL, NULL, url, NULL, hotlist_node_callback, NULL); tree_link_node(hotlist_tree, link, node, before); } }
void ami_new_bookmark(struct treeview_window *twin) { const struct url_data *data; struct Node *lbnode; struct node *treenode; char *url,*title; GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); if(lbnode) { GetListBrowserNodeAttrs(lbnode, LBNA_UserData,(ULONG *)&treenode, TAG_DONE); } else { treenode = twin->tree->root; } url = (char *)strdup("http://www.netsurf-browser.org"); data = urldb_get_url_data(url); if (!data) { urldb_add_url(url); urldb_set_url_persistence(url,true); data = urldb_get_url_data(url); } if (data) { title = data->title; tree_create_URL_node(treenode,url,data,title); ami_recreate_listbrowser(twin); } }
/** * Parse an entry represented as a li. * * \param li xmlNode for parsed li * \param directory directory to add this entry to */ static void tree_url_load_entry(xmlNode *li, struct tree *tree, struct node *directory, tree_node_user_callback callback, void *callback_data) { char *url1 = NULL; char *title = NULL; struct node *entry; xmlNode *xmlnode; const struct url_data *data; nsurl *url; nserror error; for (xmlnode = li->children; xmlnode; xmlnode = xmlnode->next) { /* The li must contain an "a" element */ if (xmlnode->type == XML_ELEMENT_NODE && strcmp((const char *)xmlnode->name, "a") == 0) { url1 = (char *)xmlGetProp(xmlnode, (const xmlChar *) "href"); title = (char *)xmlNodeGetContent(xmlnode); } } if ((url1 == NULL) || (title == NULL)) { warn_user("TreeLoadError", "(Missing <a> in <li> or " "memory exhausted.)"); return; } /* We're loading external input. * This may be garbage, so attempt to normalise via nsurl */ error = nsurl_create(url1, &url); if (error != NSERROR_OK) { LOG(("Failed normalising '%s'", url1)); warn_user("NoMemory", NULL); xmlFree(url1); xmlFree(title); return; } /* No longer need this */ xmlFree(url1); data = urldb_get_url_data(nsurl_access(url)); if (data == NULL) { /* No entry in database, so add one */ urldb_add_url(nsurl_access(url)); /* now attempt to get url data */ data = urldb_get_url_data(nsurl_access(url)); } if (data == NULL) { xmlFree(title); nsurl_unref(url); return; } /* Make this URL persistent */ urldb_set_url_persistence(nsurl_access(url), true); /* Force the title in the hotlist */ urldb_set_url_title(nsurl_access(url), title); entry = tree_create_URL_node(tree, directory, nsurl_access(url), title, callback, callback_data); if (entry == NULL) { /** \todo why isn't this fatal? */ warn_user("NoMemory", 0); } else { tree_update_URL_node(tree, entry, nsurl_access(url), data); } xmlFree(title); nsurl_unref(url); }
node_callback_resp tree_url_node_callback(void *user_data, struct node_msg_data *msg_data) { struct tree *tree; struct node_element *element; nsurl *nsurl; nserror error; const char *text; char *norm_text; const struct url_data *data; /** @todo memory leaks on non-shared folder deletion. */ switch (msg_data->msg) { case NODE_DELETE_ELEMENT_TXT: switch (msg_data->flag) { /* only history is using non-editable url * elements so only history deletion will run * this code */ case TREE_ELEMENT_URL: /* reset URL characteristics */ urldb_reset_url_visit_data( msg_data->data.text); return NODE_CALLBACK_HANDLED; case TREE_ELEMENT_TITLE: return NODE_CALLBACK_HANDLED; } break; case NODE_DELETE_ELEMENT_IMG: if (msg_data->flag == TREE_ELEMENT_THUMBNAIL || msg_data->flag == TREE_ELEMENT_TITLE) return NODE_CALLBACK_HANDLED; break; case NODE_LAUNCH: element = tree_node_find_element(msg_data->node, TREE_ELEMENT_URL, NULL); if (element != NULL) { text = tree_node_element_get_text(element); if (msg_data->flag == TREE_ELEMENT_LAUNCH_IN_TABS) { msg_data->data.bw = browser_window_create(text, msg_data->data.bw, 0, true, true); } else { browser_window_create(text, NULL, 0, true, false); } return NODE_CALLBACK_HANDLED; } break; case NODE_ELEMENT_EDIT_FINISHING: text = msg_data->data.text; if (msg_data->flag == TREE_ELEMENT_URL) { size_t len; error = nsurl_create(text, &nsurl); if (error != NSERROR_OK) { warn_user("NoMemory", 0); return NODE_CALLBACK_REJECT; } error = nsurl_get(nsurl, NSURL_WITH_FRAGMENT, &norm_text, &len); nsurl_unref(nsurl); if (error != NSERROR_OK) { warn_user("NoMemory", 0); return NODE_CALLBACK_REJECT; } msg_data->data.text = norm_text; data = urldb_get_url_data(norm_text); if (data == NULL) { urldb_add_url(norm_text); urldb_set_url_persistence(norm_text, true); data = urldb_get_url_data(norm_text); if (data == NULL) return NODE_CALLBACK_REJECT; } tree = user_data; tree_update_URL_node(tree, msg_data->node, norm_text, NULL); } else if (msg_data->flag == TREE_ELEMENT_TITLE) { while (isspace(*text)) text++; norm_text = strdup(text); if (norm_text == NULL) { LOG(("malloc failed")); warn_user("NoMemory", 0); return NODE_CALLBACK_REJECT; } /* don't allow zero length entry text, return false */ if (norm_text[0] == '\0') { warn_user("NoNameError", 0); msg_data->data.text = NULL; return NODE_CALLBACK_CONTINUE; } msg_data->data.text = norm_text; } return NODE_CALLBACK_HANDLED; default: break; } return NODE_CALLBACK_NOT_HANDLED; }
/* exported interface documented in hotlist.h */ bool hotlist_initialise(struct tree *tree, const char *hotlist_path, const char* folder_icon_name) { struct node *node; const struct url_data *url_data; char *name; int hlst_loop; /* Either load or create a hotlist */ creating_node = false; folder_icon = tree_load_icon(folder_icon_name); tree_url_node_init(folder_icon_name); if (tree == NULL) return false; hotlist_tree = tree; hotlist_tree_root = tree_get_root(hotlist_tree); if (tree_urlfile_load(hotlist_path, hotlist_tree, hotlist_node_callback, NULL)) { 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); if (node == NULL) { free(name); return false; } tree_set_node_user_callback(node, hotlist_node_callback, NULL); tree_set_node_icon(hotlist_tree, node, folder_icon); for (hlst_loop = 0; hlst_loop != HOTLIST_ENTRIES_COUNT; hlst_loop++) { url_data = urldb_get_url_data(hotlist_default_entries[hlst_loop].url); if (url_data == NULL) { urldb_add_url(hotlist_default_entries[hlst_loop].url); urldb_set_url_persistence( hotlist_default_entries[hlst_loop].url, true); url_data = urldb_get_url_data( hotlist_default_entries[hlst_loop].url); } if (url_data != NULL) { tree_create_URL_node(hotlist_tree, node, hotlist_default_entries[hlst_loop].url, messages_get(hotlist_default_entries[hlst_loop].msg_key), hotlist_node_callback, NULL); tree_update_URL_node(hotlist_tree, node, hotlist_default_entries[hlst_loop].url, url_data); } } return true; }