static void query_completed_cb (EphyHistoryService *service, gboolean success, gpointer result_data, FindURLsData *user_data) { EphyCompletionModel *model = user_data->model; EphyCompletionModelPrivate *priv = model->priv; GList *p, *urls; GPtrArray *children; GSList *list = NULL; int i; /* Bookmarks */ children = ephy_node_get_children (priv->bookmarks); /* FIXME: perhaps this could be done in a service thread? There * should never be a ton of bookmarks, but seems a bit cleaner and * consistent with what we do for the history. */ for (i = 0; i < children->len; i++) { EphyNode *kid; const char *keywords, *location, *title; kid = g_ptr_array_index (children, i); location = ephy_node_get_property_string (kid, EPHY_NODE_BMK_PROP_LOCATION); title = ephy_node_get_property_string (kid, EPHY_NODE_BMK_PROP_TITLE); keywords = ephy_node_get_property_string (kid, EPHY_NODE_BMK_PROP_KEYWORDS); if (should_add_bookmark_to_model (model, user_data->search_string, title, location, keywords)) list = add_to_potential_rows (list, title, location, keywords, 0, TRUE, FALSE); } /* History */ urls = (GList*)result_data; for (p = urls; p != NULL; p = p->next) { EphyHistoryURL *url = (EphyHistoryURL*)p->data; list = add_to_potential_rows (list, url->title, url->url, NULL, url->visit_count, FALSE, TRUE); } /* Sort the rows by relevance. */ list = g_slist_sort (list, sort_by_relevance); /* Now that we have all the rows we want to insert, replace the rows * in the current model one by one, sorted by relevance. */ replace_rows_in_model (model, list); /* Notify */ if (user_data->callback) user_data->callback (service, success, result_data, user_data->user_data); g_free (user_data->search_string); g_slice_free (FindURLsData, user_data); g_list_free_full (urls, (GDestroyNotify)ephy_history_url_free); g_slist_free_full (list, (GDestroyNotify)free_potential_row); g_clear_object (&priv->cancellable); }
static void activate_cb (GtkAction *action, gpointer dummy) { GObject *object = G_OBJECT (action); EphyLink *link; EphyNode *node; GPtrArray *children; EphyEmbed *embed = NULL; const char *url; guint i; link = g_object_get_data (object, "ephy-link"); node = g_object_get_data (object, "ephy-node"); children = ephy_node_get_children (node); for (i = 0; i < children->len; ++i) { node = g_ptr_array_index (children, i); url = ephy_node_get_property_string (node, EPHY_NODE_BMK_PROP_LOCATION); embed = ephy_link_open (link, url, embed, EPHY_LINK_NEW_TAB | ephy_link_flags_from_current_event ()); } }
static gboolean ephy_node_filter_expression_evaluate (EphyNodeFilterExpression *exp, EphyNode *node) { switch (exp->type) { case EPHY_NODE_FILTER_EXPRESSION_ALWAYS_TRUE: return TRUE; case EPHY_NODE_FILTER_EXPRESSION_NODE_EQUALS: return (exp->args.node_args.a == exp->args.node_args.b); case EPHY_NODE_FILTER_EXPRESSION_EQUALS: return (exp->args.node_args.a == node); case EPHY_NODE_FILTER_EXPRESSION_HAS_PARENT: return ephy_node_has_child (exp->args.node_args.a, node); case EPHY_NODE_FILTER_EXPRESSION_HAS_CHILD: return ephy_node_has_child (node, exp->args.node_args.a); case EPHY_NODE_FILTER_EXPRESSION_NODE_PROP_EQUALS: { EphyNode *prop; prop = ephy_node_get_property_node (node, exp->args.prop_args.prop_id); return (prop == exp->args.prop_args.second_arg.node); } case EPHY_NODE_FILTER_EXPRESSION_CHILD_PROP_EQUALS: { EphyNode *prop; GPtrArray *children; int i; children = ephy_node_get_children (node); for (i = 0; i < children->len; i++) { EphyNode *child; child = g_ptr_array_index (children, i); prop = ephy_node_get_property_node (child, exp->args.prop_args.prop_id); if (prop == exp->args.prop_args.second_arg.node) { return TRUE; } } return FALSE; } case EPHY_NODE_FILTER_EXPRESSION_STRING_PROP_CONTAINS: { const char *prop; char *folded_case; gboolean ret; prop = ephy_node_get_property_string (node, exp->args.prop_args.prop_id); if (prop == NULL) return FALSE; folded_case = g_utf8_casefold (prop, -1); ret = (strstr (folded_case, exp->args.prop_args.second_arg.string) != NULL); g_free (folded_case); return ret; } case EPHY_NODE_FILTER_EXPRESSION_STRING_PROP_EQUALS: { const char *prop; char *folded_case; gboolean ret; prop = ephy_node_get_property_string (node, exp->args.prop_args.prop_id); if (prop == NULL) return FALSE; folded_case = g_utf8_casefold (prop, -1); ret = (strcmp (folded_case, exp->args.prop_args.second_arg.string) == 0); g_free (folded_case); return ret; } case EPHY_NODE_FILTER_EXPRESSION_KEY_PROP_CONTAINS: { const char *prop; prop = ephy_node_get_property_string (node, exp->args.prop_args.prop_id); if (prop == NULL) return FALSE; return (strstr (prop, exp->args.prop_args.second_arg.string) != NULL); } case EPHY_NODE_FILTER_EXPRESSION_KEY_PROP_EQUALS: { const char *prop; prop = ephy_node_get_property_string (node, exp->args.prop_args.prop_id); if (prop == NULL) return FALSE; return (strcmp (prop, exp->args.prop_args.second_arg.string) == 0); } case EPHY_NODE_FILTER_EXPRESSION_INT_PROP_EQUALS: { int prop; prop = ephy_node_get_property_int (node, exp->args.prop_args.prop_id); return (prop == exp->args.prop_args.second_arg.number); } case EPHY_NODE_FILTER_EXPRESSION_INT_PROP_BIGGER_THAN: { int prop; prop = ephy_node_get_property_int (node, exp->args.prop_args.prop_id); return (prop > exp->args.prop_args.second_arg.number); } case EPHY_NODE_FILTER_EXPRESSION_INT_PROP_LESS_THAN: { int prop; prop = ephy_node_get_property_int (node, exp->args.prop_args.prop_id); return (prop < exp->args.prop_args.second_arg.number); } default: break; } return FALSE; }