コード例 #1
0
ファイル: hotlist.c プロジェクト: pcwalton/NetSurf
/**
 * 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);
	}
}
コード例 #2
0
ファイル: tree.c プロジェクト: MarkieMark/netsurf-git-svn
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);
	}
}
コード例 #3
0
ファイル: tree_url_node.c プロジェクト: pcwalton/NetSurf
/**
 * 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);
}
コード例 #4
0
ファイル: tree_url_node.c プロジェクト: pcwalton/NetSurf
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;
}
コード例 #5
0
ファイル: hotlist.c プロジェクト: pcwalton/NetSurf
/* 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;
}