diff options
author | Joe Shaw <joeshaw@src.gnome.org> | 2005-10-13 21:56:02 +0000 |
---|---|---|
committer | Joe Shaw <joeshaw@src.gnome.org> | 2005-10-13 21:56:02 +0000 |
commit | 3a4ee101071d30e28bf2af8f9b9c5191a65a8302 (patch) | |
tree | 01acaf023190f868701aaa7456130f31da36957b | |
parent | e975c10b0b7a671a7d2bf39b7871ea650a6d310a (diff) | |
download | nautilus-3a4ee101071d30e28bf2af8f9b9c5191a65a8302.tar.gz |
Very rudimentary pass at saving/loading searches
-rw-r--r-- | libnautilus-private/nautilus-directory.c | 3 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-utilities.c | 16 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-utilities.h | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-search-directory.c | 133 | ||||
-rw-r--r-- | libnautilus-private/nautilus-search-directory.h | 3 | ||||
-rw-r--r-- | src/nautilus-bookmark-list.c | 33 |
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) { |