void tree_update_URL_node(struct node *node, const char *url, const struct url_data *data) { struct node_element *element; char buffer[256]; assert(node); element = tree_find_element(node, TREE_ELEMENT_URL); if (!element) return; if (data) { /* node is linked, update */ assert(!node->editable); if (!data->title) urldb_set_url_title(url, url); if (!data->title) return; node->data.text = data->title; } else { /* node is not linked, find data */ assert(node->editable); data = urldb_get_url_data(element->text); if (!data) return; } /* not implemented yet if (element) { sprintf(buffer, "small_%.3x", ro_content_filetype_from_type(data->type)); if (ro_gui_wimp_sprite_exists(buffer)) tree_set_node_sprite(node, buffer, buffer); else tree_set_node_sprite(node, "small_xxx", "small_xxx"); } */ element = tree_find_element(node, TREE_ELEMENT_LAST_VISIT); if (element) { snprintf(buffer, 256, (char *)messages_get("TreeLast"), (data->last_visit > 0) ? ctime((time_t *)&data->last_visit) : (char *)messages_get("TreeUnknown")); if (data->last_visit > 0) buffer[strlen(buffer) - 1] = '\0'; free((void *)element->text); element->text = (char *)strdup(buffer); } element = tree_find_element(node, TREE_ELEMENT_VISITS); if (element) { snprintf(buffer, 256, (char *)messages_get("TreeVisits"), data->visits); free((void *)element->text); element->text = (char *)strdup(buffer); } }
/** * 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); }
/** * Updates the node details for a URL node. * * \param node the node to update */ void tree_update_URL_node(struct tree *tree, struct node *node, const char *url, const struct url_data *data) { struct node_element *element; struct bitmap *bitmap = NULL; struct icon_entry *entry; char *text_cp; assert(node != NULL); element = tree_node_find_element(node, TREE_ELEMENT_URL, NULL); if (element == NULL) return; if (data != NULL) { if (data->title == NULL) urldb_set_url_title(url, url); if (data->title == NULL) return; element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL); text_cp = strdup(data->title); if (text_cp == NULL) { LOG(("malloc failed")); warn_user("NoMemory", 0); return; } tree_update_node_element(tree, element, text_cp, NULL); } else { data = urldb_get_url_data(url); if (data == NULL) return; } entry = icon_table; do { if (entry->type == data->type) { if (entry->icon != NULL) tree_set_node_icon(tree, node, entry->icon); break; } ++entry; } while (entry->type != CONTENT_HTML); /* update last visit text */ element = tree_node_find_element(node, TREE_ELEMENT_LAST_VISIT, element); tree_update_element_text(tree, element, messages_get_buff("TreeLast", (data->last_visit > 0) ? ctime((time_t *)&data->last_visit) : messages_get("TreeUnknown"))); /* update number of visits text */ element = tree_node_find_element(node, TREE_ELEMENT_VISITS, element); tree_update_element_text(tree, element, messages_get_buff("TreeVisits", data->visits)); /* update thumbnail */ element = tree_node_find_element(node, TREE_ELEMENT_THUMBNAIL, element); if (element != NULL) { bitmap = urldb_get_thumbnail(url); if (bitmap != NULL) { tree_update_node_element(tree, element, NULL, bitmap); } } }