mirror of
https://gitlab.gnome.org/GNOME/nautilus
synced 2024-08-25 10:45:41 +00:00
![Alexander Larsson](/assets/img/avatar_default.png)
2007-12-10 Alexander Larsson <alexl@redhat.com> * libnautilus-private/nautilus-directory-async.c: * libnautilus-private/nautilus-directory-metafile.[ch]: * libnautilus-private/nautilus-metafile.[ch]: * libnautilus-private/nautilus-directory-private.h: * libnautilus-private/nautilus-directory.c: * libnautilus-private/Makefile.am: * libnautilus-private/nautilus-directory-metafile-monitor.[ch]: Removed. * libnautilus-private/nautilus-metafile-factory.[ch]: Removed. * libnautilus-private/nautilus-metafile-server.idl: Removed. * src/nautilus-application.c: * src/nautilus-main.c: * src/nautilus-spatial-window.c: Remove the bonobo layer for metadata, as we're always in-process anyway these days. svn path=/trunk/; revision=13515
364 lines
10 KiB
C
364 lines
10 KiB
C
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
|
|
|
|
nautilus-directory-metafile.c: Nautilus directory model.
|
|
|
|
Copyright (C) 2000, 2001 Eazel, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 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
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public
|
|
License along with this program; if not, write to the
|
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Boston, MA 02111-1307, USA.
|
|
|
|
Authors: Darin Adler <darin@bentspoon.com>,
|
|
Mike Engber <engber@eazel.com>
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include "nautilus-directory-metafile.h"
|
|
|
|
#include "nautilus-directory-private.h"
|
|
#include "nautilus-file-private.h"
|
|
#include "nautilus-metafile.h"
|
|
#include <eel/eel-debug.h>
|
|
#include <eel/eel-string.h>
|
|
#include <stdio.h>
|
|
|
|
|
|
static NautilusMetafile *
|
|
get_metafile (NautilusDirectory *directory)
|
|
{
|
|
char *uri;
|
|
|
|
if (directory->details->metafile == NULL) {
|
|
uri = nautilus_directory_get_uri (directory);
|
|
directory->details->metafile = nautilus_metafile_get_for_uri (uri);
|
|
g_free (uri);
|
|
}
|
|
|
|
return directory->details->metafile;
|
|
}
|
|
|
|
gboolean
|
|
nautilus_directory_is_metadata_read (NautilusDirectory *directory)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE);
|
|
|
|
metafile = get_metafile (directory);
|
|
|
|
if (metafile == NULL) {
|
|
return TRUE;
|
|
}
|
|
|
|
return nautilus_metafile_is_read (metafile);
|
|
}
|
|
|
|
char *
|
|
nautilus_directory_get_file_metadata (NautilusDirectory *directory,
|
|
const char *file_name,
|
|
const char *key,
|
|
const char *default_metadata)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), g_strdup (default_metadata));
|
|
g_return_val_if_fail (!eel_str_is_empty (file_name), g_strdup (default_metadata));
|
|
g_return_val_if_fail (!eel_str_is_empty (key), g_strdup (default_metadata));
|
|
|
|
metafile = get_metafile (directory);
|
|
|
|
return nautilus_metafile_get (metafile, file_name, key, default_metadata);
|
|
}
|
|
|
|
GList *
|
|
nautilus_directory_get_file_metadata_list (NautilusDirectory *directory,
|
|
const char *file_name,
|
|
const char *list_key,
|
|
const char *list_subkey)
|
|
{
|
|
NautilusMetafile * metafile;
|
|
|
|
g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL);
|
|
g_return_val_if_fail (!eel_str_is_empty (file_name), NULL);
|
|
g_return_val_if_fail (!eel_str_is_empty (list_key), NULL);
|
|
g_return_val_if_fail (!eel_str_is_empty (list_subkey), NULL);
|
|
|
|
metafile = get_metafile (directory);
|
|
return nautilus_metafile_get_list (metafile, file_name, list_key, list_subkey);
|
|
}
|
|
|
|
void
|
|
nautilus_directory_set_file_metadata (NautilusDirectory *directory,
|
|
const char *file_name,
|
|
const char *key,
|
|
const char *default_metadata,
|
|
const char *metadata)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
|
|
g_return_if_fail (!eel_str_is_empty (file_name));
|
|
g_return_if_fail (!eel_str_is_empty (key));
|
|
|
|
metafile = get_metafile (directory);
|
|
nautilus_metafile_set (metafile, file_name, key, default_metadata, metadata);
|
|
}
|
|
|
|
void
|
|
nautilus_directory_set_file_metadata_list (NautilusDirectory *directory,
|
|
const char *file_name,
|
|
const char *list_key,
|
|
const char *list_subkey,
|
|
GList *list)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
|
|
g_return_if_fail (!eel_str_is_empty (file_name));
|
|
g_return_if_fail (!eel_str_is_empty (list_key));
|
|
g_return_if_fail (!eel_str_is_empty (list_subkey));
|
|
|
|
metafile = get_metafile (directory);
|
|
nautilus_metafile_set_list (metafile,
|
|
file_name,
|
|
list_key,
|
|
list_subkey,
|
|
list);
|
|
}
|
|
|
|
gboolean
|
|
nautilus_directory_get_boolean_file_metadata (NautilusDirectory *directory,
|
|
const char *file_name,
|
|
const char *key,
|
|
gboolean default_metadata)
|
|
{
|
|
char *result_as_string;
|
|
gboolean result;
|
|
|
|
result_as_string = nautilus_directory_get_file_metadata
|
|
(directory, file_name, key,
|
|
default_metadata ? "true" : "false");
|
|
g_assert (result_as_string != NULL);
|
|
|
|
if (g_ascii_strcasecmp (result_as_string, "true") == 0) {
|
|
result = TRUE;
|
|
} else if (g_ascii_strcasecmp (result_as_string, "false") == 0) {
|
|
result = FALSE;
|
|
} else {
|
|
g_error ("boolean metadata with value other than true or false");
|
|
result = default_metadata;
|
|
}
|
|
|
|
g_free (result_as_string);
|
|
return result;
|
|
}
|
|
|
|
void
|
|
nautilus_directory_set_boolean_file_metadata (NautilusDirectory *directory,
|
|
const char *file_name,
|
|
const char *key,
|
|
gboolean default_metadata,
|
|
gboolean metadata)
|
|
{
|
|
nautilus_directory_set_file_metadata
|
|
(directory, file_name, key,
|
|
default_metadata ? "true" : "false",
|
|
metadata ? "true" : "false");
|
|
}
|
|
|
|
int
|
|
nautilus_directory_get_integer_file_metadata (NautilusDirectory *directory,
|
|
const char *file_name,
|
|
const char *key,
|
|
int default_metadata)
|
|
{
|
|
char *result_as_string;
|
|
char default_as_string[32];
|
|
int result;
|
|
char c;
|
|
|
|
g_snprintf (default_as_string, sizeof (default_as_string), "%d", default_metadata);
|
|
result_as_string = nautilus_directory_get_file_metadata
|
|
(directory, file_name, key, default_as_string);
|
|
|
|
/* Normally we can't get a a NULL, but we check for it here to
|
|
* handle the oddball case of a non-existent directory.
|
|
*/
|
|
if (result_as_string == NULL) {
|
|
result = default_metadata;
|
|
} else {
|
|
if (sscanf (result_as_string, " %d %c", &result, &c) != 1) {
|
|
result = default_metadata;
|
|
}
|
|
g_free (result_as_string);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void
|
|
nautilus_directory_set_integer_file_metadata (NautilusDirectory *directory,
|
|
const char *file_name,
|
|
const char *key,
|
|
int default_metadata,
|
|
int metadata)
|
|
{
|
|
char value_as_string[32];
|
|
char default_as_string[32];
|
|
|
|
g_snprintf (value_as_string, sizeof (value_as_string), "%d", metadata);
|
|
g_snprintf (default_as_string, sizeof (default_as_string), "%d", default_metadata);
|
|
|
|
nautilus_directory_set_file_metadata
|
|
(directory, file_name, key,
|
|
default_as_string, value_as_string);
|
|
}
|
|
|
|
void
|
|
nautilus_directory_copy_file_metadata (NautilusDirectory *source_directory,
|
|
const char *source_file_name,
|
|
NautilusDirectory *destination_directory,
|
|
const char *destination_file_name)
|
|
{
|
|
char *destination_uri;
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (source_directory));
|
|
g_return_if_fail (source_file_name != NULL);
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (destination_directory));
|
|
g_return_if_fail (destination_file_name != NULL);
|
|
|
|
metafile = get_metafile (source_directory);
|
|
destination_uri = nautilus_directory_get_uri (destination_directory);
|
|
|
|
nautilus_metafile_copy (metafile, source_file_name,
|
|
destination_uri, destination_file_name);
|
|
|
|
g_free (destination_uri);
|
|
}
|
|
|
|
void
|
|
nautilus_directory_remove_file_metadata (NautilusDirectory *directory,
|
|
const char *file_name)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
|
|
g_return_if_fail (file_name != NULL);
|
|
|
|
metafile = get_metafile (directory);
|
|
nautilus_metafile_remove (metafile, file_name);
|
|
}
|
|
|
|
void
|
|
nautilus_directory_rename_file_metadata (NautilusDirectory *directory,
|
|
const char *old_file_name,
|
|
const char *new_file_name)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
|
|
g_return_if_fail (old_file_name != NULL);
|
|
g_return_if_fail (new_file_name != NULL);
|
|
|
|
metafile = get_metafile (directory);
|
|
nautilus_metafile_rename (metafile, old_file_name,new_file_name);
|
|
}
|
|
|
|
void
|
|
nautilus_directory_rename_directory_metadata (NautilusDirectory *directory,
|
|
const char *new_directory_uri)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
|
|
g_return_if_fail (new_directory_uri != NULL);
|
|
|
|
metafile = get_metafile (directory);
|
|
nautilus_metafile_rename_directory (metafile, new_directory_uri);
|
|
}
|
|
|
|
static void
|
|
metafile_changed_cb (NautilusMetafile *metafile,
|
|
GList *file_names,
|
|
NautilusDirectory *directory)
|
|
{
|
|
GList *file_list;
|
|
NautilusFile *file;
|
|
|
|
file_list = NULL;
|
|
while (file_names != NULL) {
|
|
file = nautilus_directory_find_file_by_internal_filename
|
|
(directory, file_names->data);
|
|
|
|
if (file != NULL) {
|
|
if (nautilus_file_is_self_owned (file)) {
|
|
nautilus_file_emit_changed (file);
|
|
} else {
|
|
file_list = g_list_prepend (file_list, file);
|
|
}
|
|
}
|
|
file_names = file_names->next;
|
|
}
|
|
|
|
if (file_list != NULL) {
|
|
file_list = g_list_reverse (file_list);
|
|
nautilus_directory_emit_change_signals (directory, file_list);
|
|
g_list_free (file_list);
|
|
}
|
|
}
|
|
|
|
static void
|
|
metafile_ready_cb (NautilusMetafile *metafile,
|
|
NautilusDirectory *directory)
|
|
{
|
|
emit_change_signals_for_all_files (directory);
|
|
nautilus_directory_async_state_changed (directory);
|
|
}
|
|
|
|
|
|
void
|
|
nautilus_directory_register_metadata_monitor (NautilusDirectory *directory)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
|
|
|
|
if (directory->details->metafile_monitored) {
|
|
return;
|
|
}
|
|
|
|
metafile = get_metafile (directory);
|
|
directory->details->metafile_monitored = TRUE;
|
|
|
|
g_signal_connect (metafile, "changed", (GCallback)metafile_changed_cb, directory);
|
|
g_signal_connect (metafile, "ready", (GCallback)metafile_ready_cb, directory);
|
|
|
|
nautilus_metafile_load (metafile);
|
|
}
|
|
|
|
void
|
|
nautilus_directory_unregister_metadata_monitor (NautilusDirectory *directory)
|
|
{
|
|
NautilusMetafile *metafile;
|
|
|
|
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
|
|
|
|
directory->details->metafile_monitored = FALSE;
|
|
|
|
metafile = get_metafile (directory);
|
|
g_signal_handlers_disconnect_by_func (metafile, metafile_changed_cb, directory);
|
|
g_signal_handlers_disconnect_by_func (metafile, metafile_ready_cb, directory);
|
|
}
|