diff options
Diffstat (limited to 'src/gtk/nautilusgtkbookmarksmanager.c')
-rw-r--r-- | src/gtk/nautilusgtkbookmarksmanager.c | 594 |
1 files changed, 0 insertions, 594 deletions
diff --git a/src/gtk/nautilusgtkbookmarksmanager.c b/src/gtk/nautilusgtkbookmarksmanager.c deleted file mode 100644 index 385d58635..000000000 --- a/src/gtk/nautilusgtkbookmarksmanager.c +++ /dev/null @@ -1,594 +0,0 @@ -/* -*- Mode: C; c-file-style: "gnu"; tab-width: 8 -*- */ -/* GTK - The GIMP Toolkit - * nautilusgtkbookmarksmanager.c: Utilities to manage and monitor ~/.gtk-bookmarks - * Copyright (C) 2003, Red Hat, Inc. - * Copyright (C) 2007-2008 Carlos Garnacho - * Copyright (C) 2011 Suse - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - * - * Authors: Federico Mena Quintero <federico@gnome.org> - */ - -#include "config.h" -#include <glib/gi18n.h> -#include <gtk/gtk.h> - -#include <string.h> - -#include <glib/gi18n-lib.h> - -#include "nautilusgtkbookmarksmanager.h" - -static void -_gtk_bookmark_free (gpointer data) -{ - GtkBookmark *bookmark = data; - - g_object_unref (bookmark->file); - g_free (bookmark->label); - g_slice_free (GtkBookmark, bookmark); -} - -static void -set_error_bookmark_doesnt_exist (GFile *file, GError **error) -{ - gchar *uri = g_file_get_uri (file); - - g_set_error (error, - GTK_FILE_CHOOSER_ERROR, - GTK_FILE_CHOOSER_ERROR_NONEXISTENT, - _("%s does not exist in the bookmarks list"), - uri); - - g_free (uri); -} - -static GFile * -get_legacy_bookmarks_file (void) -{ - GFile *file; - gchar *filename; - - filename = g_build_filename (g_get_home_dir (), ".gtk-bookmarks", NULL); - file = g_file_new_for_path (filename); - g_free (filename); - - return file; -} - -static GFile * -get_bookmarks_file (void) -{ - GFile *file; - gchar *filename; - - filename = g_build_filename (g_get_user_config_dir (), "gtk-3.0", "bookmarks", NULL); - file = g_file_new_for_path (filename); - g_free (filename); - - return file; -} - -static GSList * -read_bookmarks (GFile *file) -{ - gchar *contents; - gchar **lines, *space; - GSList *bookmarks = NULL; - gint i; - - if (!g_file_load_contents (file, NULL, &contents, - NULL, NULL, NULL)) - return NULL; - - lines = g_strsplit (contents, "\n", -1); - - for (i = 0; lines[i]; i++) - { - GtkBookmark *bookmark; - - if (!*lines[i]) - continue; - - if (!g_utf8_validate (lines[i], -1, NULL)) - continue; - - bookmark = g_slice_new0 (GtkBookmark); - - if ((space = strchr (lines[i], ' ')) != NULL) - { - space[0] = '\0'; - bookmark->label = g_strdup (space + 1); - } - - bookmark->file = g_file_new_for_uri (lines[i]); - bookmarks = g_slist_prepend (bookmarks, bookmark); - } - - bookmarks = g_slist_reverse (bookmarks); - g_strfreev (lines); - g_free (contents); - - return bookmarks; -} - -static void -save_bookmarks (GFile *bookmarks_file, - GSList *bookmarks) -{ - GError *error = NULL; - GString *contents; - GSList *l; - GFile *parent = NULL; - - contents = g_string_new (""); - - for (l = bookmarks; l; l = l->next) - { - GtkBookmark *bookmark = l->data; - gchar *uri; - - uri = g_file_get_uri (bookmark->file); - if (!uri) - continue; - - g_string_append (contents, uri); - - if (bookmark->label && g_utf8_validate (bookmark->label, -1, NULL)) - g_string_append_printf (contents, " %s", bookmark->label); - - g_string_append_c (contents, '\n'); - g_free (uri); - } - - parent = g_file_get_parent (bookmarks_file); - if (!g_file_make_directory_with_parents (parent, NULL, &error)) - { - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) - g_clear_error (&error); - else - goto out; - } - if (!g_file_replace_contents (bookmarks_file, - contents->str, - contents->len, - NULL, FALSE, 0, NULL, - NULL, &error)) - goto out; - - out: - if (error) - { - g_critical ("%s", error->message); - g_error_free (error); - } - g_clear_object (&parent); - g_string_free (contents, TRUE); -} - -static void -notify_changed (NautilusGtkBookmarksManager *manager) -{ - if (manager->changed_func) - manager->changed_func (manager->changed_func_data); -} - -static void -bookmarks_file_changed (GFileMonitor *monitor, - GFile *file, - GFile *other_file, - GFileMonitorEvent event, - gpointer data) -{ - NautilusGtkBookmarksManager *manager = data; - - switch (event) - { - case G_FILE_MONITOR_EVENT_CHANGED: - case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: - case G_FILE_MONITOR_EVENT_CREATED: - case G_FILE_MONITOR_EVENT_DELETED: - g_slist_free_full (manager->bookmarks, _gtk_bookmark_free); - manager->bookmarks = read_bookmarks (file); - - gdk_threads_enter (); - notify_changed (manager); - gdk_threads_leave (); - break; - - default: - /* ignore at the moment */ - break; - } -} - -NautilusGtkBookmarksManager * -_nautilus_gtk_bookmarks_manager_new (GtkBookmarksChangedFunc changed_func, gpointer changed_func_data) -{ - NautilusGtkBookmarksManager *manager; - GFile *bookmarks_file; - GError *error; - - manager = g_new0 (NautilusGtkBookmarksManager, 1); - - manager->changed_func = changed_func; - manager->changed_func_data = changed_func_data; - - bookmarks_file = get_bookmarks_file (); - manager->bookmarks = read_bookmarks (bookmarks_file); - if (!manager->bookmarks) - { - GFile *legacy_bookmarks_file; - - /* Read the legacy one and write it to the new one */ - legacy_bookmarks_file = get_legacy_bookmarks_file (); - manager->bookmarks = read_bookmarks (legacy_bookmarks_file); - if (manager->bookmarks) - save_bookmarks (bookmarks_file, manager->bookmarks); - - g_object_unref (legacy_bookmarks_file); - } - - error = NULL; - manager->bookmarks_monitor = g_file_monitor_file (bookmarks_file, - G_FILE_MONITOR_NONE, - NULL, &error); - if (error) - { - g_warning ("%s", error->message); - g_error_free (error); - } - else - manager->bookmarks_monitor_changed_id = g_signal_connect (manager->bookmarks_monitor, "changed", - G_CALLBACK (bookmarks_file_changed), manager); - - g_object_unref (bookmarks_file); - - return manager; -} - -void -_nautilus_gtk_bookmarks_manager_free (NautilusGtkBookmarksManager *manager) -{ - g_return_if_fail (manager != NULL); - - if (manager->bookmarks_monitor) - { - g_file_monitor_cancel (manager->bookmarks_monitor); - g_signal_handler_disconnect (manager->bookmarks_monitor, manager->bookmarks_monitor_changed_id); - manager->bookmarks_monitor_changed_id = 0; - g_object_unref (manager->bookmarks_monitor); - } - - g_slist_free_full (manager->bookmarks, _gtk_bookmark_free); - - g_free (manager); -} - -GSList * -_nautilus_gtk_bookmarks_manager_list_bookmarks (NautilusGtkBookmarksManager *manager) -{ - GSList *bookmarks, *files = NULL; - - g_return_val_if_fail (manager != NULL, NULL); - - bookmarks = manager->bookmarks; - - while (bookmarks) - { - GtkBookmark *bookmark; - - bookmark = bookmarks->data; - bookmarks = bookmarks->next; - - files = g_slist_prepend (files, g_object_ref (bookmark->file)); - } - - return g_slist_reverse (files); -} - -static GSList * -find_bookmark_link_for_file (GSList *bookmarks, GFile *file, int *position_ret) -{ - int pos; - - pos = 0; - for (; bookmarks; bookmarks = bookmarks->next) - { - GtkBookmark *bookmark = bookmarks->data; - - if (g_file_equal (file, bookmark->file)) - { - if (position_ret) - *position_ret = pos; - - return bookmarks; - } - - pos++; - } - - if (position_ret) - *position_ret = -1; - - return NULL; -} - -gboolean -_nautilus_gtk_bookmarks_manager_has_bookmark (NautilusGtkBookmarksManager *manager, - GFile *file) -{ - GSList *link; - - link = find_bookmark_link_for_file (manager->bookmarks, file, NULL); - return (link != NULL); -} - -gboolean -_nautilus_gtk_bookmarks_manager_insert_bookmark (NautilusGtkBookmarksManager *manager, - GFile *file, - gint position, - GError **error) -{ - GSList *link; - GtkBookmark *bookmark; - GFile *bookmarks_file; - - g_return_val_if_fail (manager != NULL, FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - link = find_bookmark_link_for_file (manager->bookmarks, file, NULL); - - if (link) - { - gchar *uri; - bookmark = link->data; - uri = g_file_get_uri (bookmark->file); - - g_set_error (error, - GTK_FILE_CHOOSER_ERROR, - GTK_FILE_CHOOSER_ERROR_ALREADY_EXISTS, - _("%s already exists in the bookmarks list"), - uri); - - g_free (uri); - - return FALSE; - } - - bookmark = g_slice_new0 (GtkBookmark); - bookmark->file = g_object_ref (file); - - manager->bookmarks = g_slist_insert (manager->bookmarks, bookmark, position); - - bookmarks_file = get_bookmarks_file (); - save_bookmarks (bookmarks_file, manager->bookmarks); - g_object_unref (bookmarks_file); - - notify_changed (manager); - - return TRUE; -} - -gboolean -_nautilus_gtk_bookmarks_manager_remove_bookmark (NautilusGtkBookmarksManager *manager, - GFile *file, - GError **error) -{ - GSList *link; - GFile *bookmarks_file; - - g_return_val_if_fail (manager != NULL, FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - if (!manager->bookmarks) - return FALSE; - - link = find_bookmark_link_for_file (manager->bookmarks, file, NULL); - if (link) - { - GtkBookmark *bookmark = link->data; - - manager->bookmarks = g_slist_remove_link (manager->bookmarks, link); - _gtk_bookmark_free (bookmark); - g_slist_free_1 (link); - } - else - { - set_error_bookmark_doesnt_exist (file, error); - return FALSE; - } - - bookmarks_file = get_bookmarks_file (); - save_bookmarks (bookmarks_file, manager->bookmarks); - g_object_unref (bookmarks_file); - - notify_changed (manager); - - return TRUE; -} - -gboolean -_nautilus_gtk_bookmarks_manager_reorder_bookmark (NautilusGtkBookmarksManager *manager, - GFile *file, - gint new_position, - GError **error) -{ - GSList *link; - GFile *bookmarks_file; - int old_position; - - g_return_val_if_fail (manager != NULL, FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - g_return_val_if_fail (new_position >= 0, FALSE); - - if (!manager->bookmarks) - return FALSE; - - link = find_bookmark_link_for_file (manager->bookmarks, file, &old_position); - if (new_position == old_position) - return TRUE; - - if (link) - { - GtkBookmark *bookmark = link->data; - - manager->bookmarks = g_slist_remove_link (manager->bookmarks, link); - g_slist_free_1 (link); - - if (new_position > old_position) - new_position--; - - manager->bookmarks = g_slist_insert (manager->bookmarks, bookmark, new_position); - } - else - { - set_error_bookmark_doesnt_exist (file, error); - return FALSE; - } - - bookmarks_file = get_bookmarks_file (); - save_bookmarks (bookmarks_file, manager->bookmarks); - g_object_unref (bookmarks_file); - - notify_changed (manager); - - return TRUE; -} - -gchar * -_nautilus_gtk_bookmarks_manager_get_bookmark_label (NautilusGtkBookmarksManager *manager, - GFile *file) -{ - GSList *bookmarks; - gchar *label = NULL; - - g_return_val_if_fail (manager != NULL, NULL); - g_return_val_if_fail (file != NULL, NULL); - - bookmarks = manager->bookmarks; - - while (bookmarks) - { - GtkBookmark *bookmark; - - bookmark = bookmarks->data; - bookmarks = bookmarks->next; - - if (g_file_equal (file, bookmark->file)) - { - label = g_strdup (bookmark->label); - break; - } - } - - return label; -} - -gboolean -_nautilus_gtk_bookmarks_manager_set_bookmark_label (NautilusGtkBookmarksManager *manager, - GFile *file, - const gchar *label, - GError **error) -{ - GFile *bookmarks_file; - GSList *link; - - g_return_val_if_fail (manager != NULL, FALSE); - g_return_val_if_fail (file != NULL, FALSE); - - link = find_bookmark_link_for_file (manager->bookmarks, file, NULL); - if (link) - { - GtkBookmark *bookmark = link->data; - - g_free (bookmark->label); - bookmark->label = g_strdup (label); - } - else - { - set_error_bookmark_doesnt_exist (file, error); - return FALSE; - } - - bookmarks_file = get_bookmarks_file (); - save_bookmarks (bookmarks_file, manager->bookmarks); - g_object_unref (bookmarks_file); - - notify_changed (manager); - - return TRUE; -} - -gboolean -_nautilus_gtk_bookmarks_manager_get_xdg_type (NautilusGtkBookmarksManager *manager, - GFile *file, - GUserDirectory *directory) -{ - GSList *link; - gboolean match; - GFile *location; - const gchar *path; - GUserDirectory dir; - GtkBookmark *bookmark; - - link = find_bookmark_link_for_file (manager->bookmarks, file, NULL); - if (!link) - return FALSE; - - match = FALSE; - bookmark = link->data; - - for (dir = 0; dir < G_USER_N_DIRECTORIES; dir++) - { - path = g_get_user_special_dir (dir); - if (!path) - continue; - - location = g_file_new_for_path (path); - match = g_file_equal (location, bookmark->file); - g_object_unref (location); - - if (match) - break; - } - - if (match && directory != NULL) - *directory = dir; - - return match; -} - -gboolean -_nautilus_gtk_bookmarks_manager_get_is_builtin (NautilusGtkBookmarksManager *manager, - GFile *file) -{ - GUserDirectory xdg_type; - - /* if this is not an XDG dir, it's never builtin */ - if (!_nautilus_gtk_bookmarks_manager_get_xdg_type (manager, file, &xdg_type)) - return FALSE; - - /* exclude XDG locations we don't display by default */ - return _nautilus_gtk_bookmarks_manager_get_is_xdg_dir_builtin (xdg_type); -} - -gboolean -_nautilus_gtk_bookmarks_manager_get_is_xdg_dir_builtin (GUserDirectory xdg_type) -{ - return (xdg_type != G_USER_DIRECTORY_DESKTOP) && - (xdg_type != G_USER_DIRECTORY_TEMPLATES) && - (xdg_type != G_USER_DIRECTORY_PUBLIC_SHARE); -} |