summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Shaw <joeshaw@src.gnome.org>2005-10-13 21:56:02 +0000
committerJoe Shaw <joeshaw@src.gnome.org>2005-10-13 21:56:02 +0000
commit3a4ee101071d30e28bf2af8f9b9c5191a65a8302 (patch)
tree01acaf023190f868701aaa7456130f31da36957b
parente975c10b0b7a671a7d2bf39b7871ea650a6d310a (diff)
downloadnautilus-3a4ee101071d30e28bf2af8f9b9c5191a65a8302.tar.gz
Very rudimentary pass at saving/loading searches
-rw-r--r--libnautilus-private/nautilus-directory.c3
-rw-r--r--libnautilus-private/nautilus-file-utilities.c16
-rw-r--r--libnautilus-private/nautilus-file-utilities.h2
-rw-r--r--libnautilus-private/nautilus-search-directory.c133
-rw-r--r--libnautilus-private/nautilus-search-directory.h3
-rw-r--r--src/nautilus-bookmark-list.c33
6 files changed, 175 insertions, 15 deletions
diff --git a/libnautilus-private/nautilus-directory.c b/libnautilus-private/nautilus-directory.c
index 7f7848999..e6f39c455 100644
--- a/libnautilus-private/nautilus-directory.c
+++ b/libnautilus-private/nautilus-directory.c
@@ -527,6 +527,9 @@ nautilus_directory_new (const char *uri)
set_directory_uri (directory, uri);
+ if (eel_uri_is_search (uri))
+ nautilus_search_directory_load_search (NAUTILUS_SEARCH_DIRECTORY (directory));
+
return directory;
}
diff --git a/libnautilus-private/nautilus-file-utilities.c b/libnautilus-private/nautilus-file-utilities.c
index 6cb00bf79..87b867a62 100644
--- a/libnautilus-private/nautilus-file-utilities.c
+++ b/libnautilus-private/nautilus-file-utilities.c
@@ -249,6 +249,22 @@ nautilus_get_templates_directory_uri (void)
return uri;
}
+char *
+nautilus_get_searches_directory (void)
+{
+ char *user_dir;
+ char *searches_dir;
+
+ user_dir = nautilus_get_user_directory ();
+ searches_dir = g_build_filename (user_dir, "searches", NULL);
+ g_free (user_dir);
+
+ if (!g_file_test (searches_dir, G_FILE_TEST_EXISTS))
+ mkdir (searches_dir, DEFAULT_NAUTILUS_DIRECTORY_MODE);
+
+ return searches_dir;
+}
+
/* These need to be reset to NULL when desktop_is_home_dir changes */
static char *escaped_desktop_dir = NULL;
static char *escaped_desktop_dir_dirname = NULL;
diff --git a/libnautilus-private/nautilus-file-utilities.h b/libnautilus-private/nautilus-file-utilities.h
index 15b04c68c..02f9bdd18 100644
--- a/libnautilus-private/nautilus-file-utilities.h
+++ b/libnautilus-private/nautilus-file-utilities.h
@@ -49,6 +49,8 @@ char * nautilus_get_templates_directory (void);
char * nautilus_get_templates_directory_uri (void);
void nautilus_create_templates_directory (void);
+char * nautilus_get_searches_directory (void);
+
char * nautilus_compute_title_for_uri (const char *text_uri);
/* This function returns something that needs to be freed with g_free,
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index d1ac33b80..c17d1009f 100644
--- a/libnautilus-private/nautilus-search-directory.c
+++ b/libnautilus-private/nautilus-search-directory.c
@@ -730,6 +730,7 @@ nautilus_search_directory_generate_new_uri (void)
gettimeofday (&tv, NULL);
uri = g_strdup_printf (EEL_SEARCH_URI"///%ld-%ld-%d/", tv.tv_sec, tv.tv_usec, counter++);
+ printf ("generated uri: %s\n", uri);
return uri;
}
@@ -754,31 +755,139 @@ nautilus_search_directory_get_query (NautilusSearchDirectory *search)
return search->details->query;
}
-#if 0
-static void nautilus_search_directory_save_search (NautilusSearchDirectory *search);
+/* Move past the "x-nautilus-search:///" portion of the URI */
+#define SEARCH_URI_OFFSET 21
-static void
+void
nautilus_search_directory_save_search (NautilusSearchDirectory *search)
{
- char *user_dir, *search_file;
char *search_uri;
+ char *search_dir, *search_file;
char *xml;
-
+ GError *err = NULL;
- user_dir = nautilus_get_user_directory ();
- search_file = g_build_path ("/", user_dir, "searches.xml", NULL);
- g_free (user_dir);
+ if (search->details->query == NULL)
+ return;
search_uri = nautilus_directory_get_uri (NAUTILUS_DIRECTORY (search));
- xml = g_strdup_printf ("<query id=\"%s\">\n"
+ search_dir = nautilus_get_searches_directory ();
+ search_file = g_build_path ("/", search_dir, search_uri + SEARCH_URI_OFFSET, NULL);
+ g_free (search_dir);
+
+ xml = g_strdup_printf ("<query uri=\"%s\">\n"
" <text>%s</text>\n"
- "</query>",
+ "</query>\n",
search_uri,
nautilus_query_get_text (search->details->query));
g_free (search_uri);
- g_file_set_contents (search_file, xml, strlen (xml), NULL);
+ g_file_set_contents (search_file, xml, strlen (xml), &err);
+}
+
+typedef struct {
+ NautilusSearchDirectory *search;
+ gboolean in_text;
+} ParserInfo;
+
+static void
+start_element_cb (GMarkupParseContext *ctx,
+ const char *element_name,
+ const char **attribute_names,
+ const char **attribute_values,
+ gpointer user_data,
+ GError **err)
+{
+ ParserInfo *info;
+
+ info = (ParserInfo *) user_data;
+
+ if (strcmp (element_name, "text") == 0)
+ info->in_text = TRUE;
+}
+
+static void
+end_element_cb (GMarkupParseContext *ctx,
+ const char *element_name,
+ gpointer user_data,
+ GError **err)
+{
+ ParserInfo *info;
+
+ info = (ParserInfo *) user_data;
+
+ if (strcmp (element_name, "text") == 0)
+ info->in_text = FALSE;
+}
+
+static void
+text_cb (GMarkupParseContext *ctx,
+ const char *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **err)
+{
+ ParserInfo *info;
+ char *t;
+ NautilusQuery *query;
+
+ info = (ParserInfo *) user_data;
+
+ if (!info->in_text) {
+ return;
+ }
+
+ t = g_strndup (text, text_len);
+
+ query = nautilus_query_new ();
+ nautilus_query_set_text (query, t);
+ g_free (t);
+
+ nautilus_search_directory_set_query (info->search, query);
+ g_object_unref (query);
+}
+
+static void
+error_cb (GMarkupParseContext *ctx,
+ GError *err,
+ gpointer user_data)
+{
+}
+
+static GMarkupParser parser = {
+ start_element_cb,
+ end_element_cb,
+ text_cb,
+ NULL,
+ error_cb
+};
+
+void
+nautilus_search_directory_load_search (NautilusSearchDirectory *search)
+{
+ char *search_uri;
+ char *search_dir, *search_file;
+ ParserInfo info;
+ GMarkupParseContext *ctx;
+ char *xml;
+ gsize xml_len;
+
+ search_uri = nautilus_directory_get_uri (NAUTILUS_DIRECTORY (search));
+
+ search_dir = nautilus_get_searches_directory ();
+ search_file = g_build_path ("/", search_dir, search_uri + SEARCH_URI_OFFSET, NULL);
+ g_free (search_dir);
+
+ if (!g_file_test (search_file, G_FILE_TEST_EXISTS)) {
+ return;
+ }
+
+ info.search = search;
+ info.in_text = FALSE;
+
+ ctx = g_markup_parse_context_new (&parser, 0, &info, NULL);
+ g_file_get_contents (search_file, &xml, &xml_len, NULL);
+
+ g_markup_parse_context_parse (ctx, xml, xml_len, NULL);
}
-#endif
diff --git a/libnautilus-private/nautilus-search-directory.h b/libnautilus-private/nautilus-search-directory.h
index fff621db6..94db5c418 100644
--- a/libnautilus-private/nautilus-search-directory.h
+++ b/libnautilus-private/nautilus-search-directory.h
@@ -58,4 +58,7 @@ NautilusQuery *nautilus_search_directory_get_query (NautilusSearchDirectory *sea
void nautilus_search_directory_set_query (NautilusSearchDirectory *search,
NautilusQuery *query);
+void nautilus_search_directory_save_search (NautilusSearchDirectory *search);
+void nautilus_search_directory_load_search (NautilusSearchDirectory *search);
+
#endif /* NAUTILUS_SEARCH_DIRECTORY_H */
diff --git a/src/nautilus-bookmark-list.c b/src/nautilus-bookmark-list.c
index 6958a5535..4f1c88822 100644
--- a/src/nautilus-bookmark-list.c
+++ b/src/nautilus-bookmark-list.c
@@ -31,10 +31,12 @@
#include <eel/eel-glib-extensions.h>
#include <eel/eel-gtk-macros.h>
#include <eel/eel-string.h>
+#include <eel/eel-vfs-extensions.h>
#include <eel/eel-xml-extensions.h>
#include <gtk/gtksignal.h>
#include <libnautilus-private/nautilus-file-utilities.h>
#include <libnautilus-private/nautilus-icon-factory.h>
+#include <libnautilus-private/nautilus-search-directory.h>
#include <libgnome/gnome-macros.h>
#include <libgnome/gnome-util.h>
#include <libgnomevfs/gnome-vfs-types.h>
@@ -513,6 +515,21 @@ nautilus_bookmark_list_new (void)
return list;
}
+static void
+save_search_for_uri (const char *uri)
+{
+ NautilusDirectory *directory;
+ NautilusSearchDirectory *search;
+
+ directory = nautilus_directory_get (uri);
+
+ g_assert (NAUTILUS_IS_SEARCH_DIRECTORY (directory));
+
+ search = NAUTILUS_SEARCH_DIRECTORY (directory);
+
+ nautilus_search_directory_save_search (search);
+}
+
/**
* nautilus_bookmark_list_save_file:
*
@@ -543,19 +560,20 @@ nautilus_bookmark_list_save_file (NautilusBookmarkList *bookmarks)
GList *l;
for (l = bookmarks->list; l; l = l->next) {
+ char *uri;
char *bookmark_string;
bookmark = NAUTILUS_BOOKMARK (l->data);
+
+ uri = nautilus_bookmark_get_uri (bookmark);
/* make sure we save label if it has one for compatibility with GTK 2.7 and 2.8 */
if (nautilus_bookmark_get_has_custom_name (bookmark)) {
char *label, *uri;
label = nautilus_bookmark_get_name (bookmark);
- uri = nautilus_bookmark_get_uri (bookmark);
bookmark_string = g_strconcat (uri, " ", label, NULL);
- g_free (uri);
g_free (label);
} else {
- bookmark_string = nautilus_bookmark_get_uri (bookmark);
+ bookmark_string = g_strdup (uri);
}
if (fputs (bookmark_string, file) == EOF || fputs ("\n", file) == EOF) {
saved_errno = errno;
@@ -564,6 +582,15 @@ nautilus_bookmark_list_save_file (NautilusBookmarkList *bookmarks)
goto io_error;
}
g_free (bookmark_string);
+
+ /*
+ * Rather gross hack to save out searches at the same
+ * time as the bookmarks.
+ */
+ if (eel_uri_is_search (uri))
+ save_search_for_uri (uri);
+
+ g_free (uri);
}
if (fclose (file) == EOF) {