summaryrefslogtreecommitdiff
path: root/src/nautilus-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-file.c')
-rw-r--r--src/nautilus-file.c552
1 files changed, 363 insertions, 189 deletions
diff --git a/src/nautilus-file.c b/src/nautilus-file.c
index bbbb20df5..496cbefaf 100644
--- a/src/nautilus-file.c
+++ b/src/nautilus-file.c
@@ -54,9 +54,8 @@
#include <glib.h>
#include <gnome-autoar/gnome-autoar.h>
#include <gdesktop-enums.h>
-#include <libnautilus-extension/nautilus-file-info.h>
-#include <libnautilus-extension/nautilus-extension-private.h>
#include <libxml/parser.h>
+#include <libnautilus-extension/nautilus-extension-private.h>
#include <pwd.h>
#include <stdlib.h>
#include <sys/time.h>
@@ -162,7 +161,7 @@ static GQuark attribute_name_q,
attribute_free_space_q,
attribute_favorite_q;
-static void nautilus_file_info_iface_init (NautilusFileInfoIface *iface);
+static void nautilus_file_info_iface_init (NautilusFileInfoInterface *iface);
static char *nautilus_file_get_owner_as_string (NautilusFile *file,
gboolean include_real_name);
static char *nautilus_file_get_type_as_string (NautilusFile *file);
@@ -711,7 +710,7 @@ nautilus_file_new_from_info (NautilusDirectory *directory,
return file;
}
-static NautilusFile *
+static NautilusFileInfo *
nautilus_file_get_internal (GFile *location,
gboolean create)
{
@@ -782,45 +781,39 @@ nautilus_file_get_internal (GFile *location,
g_free (basename);
nautilus_directory_unref (directory);
- return file;
+ return NAUTILUS_FILE_INFO (file);
}
NautilusFile *
nautilus_file_get (GFile *location)
{
- return nautilus_file_get_internal (location, TRUE);
+ return NAUTILUS_FILE (nautilus_file_get_internal (location, TRUE));
}
NautilusFile *
nautilus_file_get_existing (GFile *location)
{
- return nautilus_file_get_internal (location, FALSE);
+ return NAUTILUS_FILE (nautilus_file_get_internal (location, FALSE));
}
NautilusFile *
nautilus_file_get_existing_by_uri (const char *uri)
{
- GFile *location;
- NautilusFile *file;
+ g_autoptr (GFile) location = NULL;
location = g_file_new_for_uri (uri);
- file = nautilus_file_get_internal (location, FALSE);
- g_object_unref (location);
- return file;
+ return nautilus_file_get_existing (location);
}
NautilusFile *
nautilus_file_get_by_uri (const char *uri)
{
- GFile *location;
- NautilusFile *file;
+ g_autoptr (GFile) location = NULL;
location = g_file_new_for_uri (uri);
- file = nautilus_file_get_internal (location, TRUE);
- g_object_unref (location);
- return file;
+ return nautilus_file_get (location);
}
gboolean
@@ -1017,41 +1010,29 @@ nautilus_file_get_parent_uri_for_display (NautilusFile *file)
char *
nautilus_file_get_parent_uri (NautilusFile *file)
{
- g_assert (NAUTILUS_IS_FILE (file));
-
- if (nautilus_file_is_self_owned (file))
- {
- /* Callers expect an empty string, not a NULL. */
- return g_strdup ("");
- }
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
- return nautilus_directory_get_uri (file->details->directory);
+ return nautilus_file_info_get_parent_uri (NAUTILUS_FILE_INFO (file));
}
GFile *
nautilus_file_get_parent_location (NautilusFile *file)
{
- g_assert (NAUTILUS_IS_FILE (file));
-
- if (nautilus_file_is_self_owned (file))
- {
- return NULL;
- }
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
- return nautilus_directory_get_location (file->details->directory);
+ return nautilus_file_info_get_parent_location (NAUTILUS_FILE_INFO (file));
}
NautilusFile *
nautilus_file_get_parent (NautilusFile *file)
{
- g_assert (NAUTILUS_IS_FILE (file));
+ NautilusFileInfo *file_info;
- if (nautilus_file_is_self_owned (file))
- {
- return NULL;
- }
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+ file_info = NAUTILUS_FILE_INFO (file);
- return nautilus_directory_get_corresponding_file (file->details->directory);
+ return NAUTILUS_FILE (nautilus_file_info_get_parent_info (file_info));
}
/**
@@ -1091,7 +1072,7 @@ nautilus_file_can_write (NautilusFile *file)
{
g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
- return file->details->can_write;
+ return nautilus_file_info_can_write (NAUTILUS_FILE_INFO (file));
}
/**
@@ -1744,57 +1725,26 @@ nautilus_file_can_trash (NautilusFile *file)
GFile *
nautilus_file_get_location (NautilusFile *file)
{
- g_autoptr (GFile) location = NULL;
-
g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
- location = nautilus_directory_get_location (file->details->directory);
-
- if (nautilus_file_is_self_owned (file))
- {
- return g_object_ref (location);
- }
-
- return g_file_get_child (location, eel_ref_str_peek (file->details->name));
+ return nautilus_file_info_get_location (NAUTILUS_FILE_INFO (file));
}
/* Return the actual uri associated with the passed-in file. */
char *
nautilus_file_get_uri (NautilusFile *file)
{
- char *uri;
- GFile *loc;
-
g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
- loc = nautilus_file_get_location (file);
- uri = g_file_get_uri (loc);
- g_object_unref (loc);
-
- return uri;
+ return nautilus_file_info_get_uri (NAUTILUS_FILE_INFO (file));
}
char *
nautilus_file_get_uri_scheme (NautilusFile *file)
{
- g_autoptr (GFile) location = NULL;
- char *scheme;
-
g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
- if (file->details->directory == NULL)
- {
- return NULL;
- }
-
- location = nautilus_directory_get_location (file->details->directory);
- if (location == NULL)
- {
- return NULL;
- }
- scheme = g_file_get_uri_scheme (location);
-
- return scheme;
+ return nautilus_file_info_get_uri_scheme (NAUTILUS_FILE_INFO (file));
}
@@ -4603,7 +4553,9 @@ nautilus_file_get_edit_name (NautilusFile *file)
char *
nautilus_file_get_name (NautilusFile *file)
{
- return g_strdup (eel_ref_str_peek (file->details->name));
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+ return nautilus_file_info_get_name (NAUTILUS_FILE_INFO (file));
}
/**
@@ -4671,12 +4623,7 @@ nautilus_file_get_activation_uri (NautilusFile *file)
{
g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
- if (file->details->activation_uri != NULL)
- {
- return g_strdup (file->details->activation_uri);
- }
-
- return nautilus_file_get_uri (file);
+ return nautilus_file_info_get_uri (NAUTILUS_FILE_INFO (file));
}
GFile *
@@ -7507,7 +7454,9 @@ char *
nautilus_file_get_string_attribute (NautilusFile *file,
const char *attribute_name)
{
- return nautilus_file_get_string_attribute_q (file, g_quark_from_string (attribute_name));
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+ return nautilus_file_info_get_string_attribute (NAUTILUS_FILE_INFO (file), attribute_name);
}
@@ -7819,12 +7768,9 @@ nautilus_file_get_detailed_type_as_string (NautilusFile *file)
GFileType
nautilus_file_get_file_type (NautilusFile *file)
{
- if (file == NULL)
- {
- return G_FILE_TYPE_UNKNOWN;
- }
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), G_FILE_TYPE_UNKNOWN);
- return file->details->type;
+ return nautilus_file_info_get_file_type (NAUTILUS_FILE_INFO (file));;
}
/**
@@ -7839,15 +7785,9 @@ nautilus_file_get_file_type (NautilusFile *file)
char *
nautilus_file_get_mime_type (NautilusFile *file)
{
- if (file != NULL)
- {
- g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
- if (file->details->mime_type != NULL)
- {
- return g_strdup (eel_ref_str_peek (file->details->mime_type));
- }
- }
- return g_strdup ("application/octet-stream");
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+ return nautilus_file_info_get_mime_type (NAUTILUS_FILE_INFO (file));
}
/**
@@ -7869,12 +7809,7 @@ nautilus_file_is_mime_type (NautilusFile *file,
g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
g_return_val_if_fail (mime_type != NULL, FALSE);
- if (file->details->mime_type == NULL)
- {
- return FALSE;
- }
- return g_content_type_is_a (eel_ref_str_peek (file->details->mime_type),
- mime_type);
+ return nautilus_file_info_is_mime_type (NAUTILUS_FILE_INFO (file), mime_type);
}
char *
@@ -7930,11 +7865,9 @@ nautilus_file_is_symbolic_link (NautilusFile *file)
GMount *
nautilus_file_get_mount (NautilusFile *file)
{
- if (file->details->mount)
- {
- return g_object_ref (file->details->mount);
- }
- return NULL;
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+ return nautilus_file_info_get_mount (NAUTILUS_FILE_INFO (file));
}
static void
@@ -8204,7 +8137,9 @@ nautilus_file_is_regular_file (NautilusFile *file)
gboolean
nautilus_file_is_directory (NautilusFile *file)
{
- return nautilus_file_get_file_type (file) == G_FILE_TYPE_DIRECTORY;
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
+
+ return nautilus_file_info_is_directory (NAUTILUS_FILE_INFO (file));
}
/**
@@ -8614,7 +8549,7 @@ nautilus_file_is_gone (NautilusFile *file)
{
g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
- return file->details->is_gone;
+ return nautilus_file_info_is_gone (NAUTILUS_FILE_INFO (file));
}
/**
@@ -9521,66 +9456,6 @@ nautilus_file_class_init (NautilusFileClass *class)
NULL);
}
-static void
-nautilus_file_add_emblem (NautilusFile *file,
- const char *emblem_name)
-{
- if (file->details->pending_info_providers)
- {
- file->details->pending_extension_emblems = g_list_prepend (file->details->pending_extension_emblems,
- g_strdup (emblem_name));
- }
- else
- {
- file->details->extension_emblems = g_list_prepend (file->details->extension_emblems,
- g_strdup (emblem_name));
- }
-
- nautilus_file_changed (file);
-}
-
-static void
-nautilus_file_add_string_attribute (NautilusFile *file,
- const char *attribute_name,
- const char *value)
-{
- if (file->details->pending_info_providers)
- {
- /* Lazily create hashtable */
- if (!file->details->pending_extension_attributes)
- {
- file->details->pending_extension_attributes =
- g_hash_table_new_full (g_direct_hash, g_direct_equal,
- NULL,
- (GDestroyNotify) g_free);
- }
- g_hash_table_insert (file->details->pending_extension_attributes,
- GINT_TO_POINTER (g_quark_from_string (attribute_name)),
- g_strdup (value));
- }
- else
- {
- if (!file->details->extension_attributes)
- {
- file->details->extension_attributes =
- g_hash_table_new_full (g_direct_hash, g_direct_equal,
- NULL,
- (GDestroyNotify) g_free);
- }
- g_hash_table_insert (file->details->extension_attributes,
- GINT_TO_POINTER (g_quark_from_string (attribute_name)),
- g_strdup (value));
- }
-
- nautilus_file_changed (file);
-}
-
-static void
-nautilus_file_invalidate_extension_info (NautilusFile *file)
-{
- nautilus_file_invalidate_attributes (file, NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO);
-}
-
void
nautilus_file_info_providers_done (NautilusFile *file)
{
@@ -9710,28 +9585,327 @@ nautilus_drag_can_accept_info (NautilusFile *drop_target_item,
}
}
+static gboolean
+is_gone (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ return file->details->is_gone;
+}
+
+static char *
+get_name (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ return g_strdup (eel_ref_str_peek (file->details->name));
+}
+
+static char *
+get_uri (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+ g_autoptr (GFile) location = NULL;
+
+ file = NAUTILUS_FILE (file_info);
+ location = nautilus_file_get_location (file);
+
+ return g_file_get_uri (location);
+}
+
+static char *
+get_parent_uri (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (nautilus_file_is_self_owned (file))
+ {
+ /* Callers expect an empty string, not a NULL. */
+ return g_strdup ("");
+ }
+
+ return nautilus_directory_get_uri (file->details->directory);
+}
+
+static char *
+get_uri_scheme (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+ g_autoptr (GFile) location = NULL;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (file->details->directory == NULL)
+ {
+ return NULL;
+ }
+
+ location = nautilus_directory_get_location (file->details->directory);
+ if (location == NULL)
+ {
+ return NULL;
+ }
+
+ return g_file_get_uri_scheme (location);
+}
+
+static char *
+get_mime_type (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (file->details->mime_type != NULL)
+ {
+ return g_strdup (eel_ref_str_peek (file->details->mime_type));
+ }
+
+ return g_strdup ("application/octet-stream");
+}
+
+static gboolean
+is_mime_type (NautilusFileInfo *file_info,
+ const char *mime_type)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (file->details->mime_type == NULL)
+ {
+ return FALSE;
+ }
+
+ return g_content_type_is_a (eel_ref_str_peek (file->details->mime_type), mime_type);
+}
+
+static gboolean
+is_directory (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ return nautilus_file_get_file_type (file) == G_FILE_TYPE_DIRECTORY;
+}
+
+static void
+add_emblem (NautilusFileInfo *file_info,
+ const char *emblem_name)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (file->details->pending_info_providers)
+ {
+ file->details->pending_extension_emblems = g_list_prepend (file->details->pending_extension_emblems,
+ g_strdup (emblem_name));
+ }
+ else
+ {
+ file->details->extension_emblems = g_list_prepend (file->details->extension_emblems,
+ g_strdup (emblem_name));
+ }
+
+ nautilus_file_changed (file);
+}
+
+static char *
+get_string_attribute (NautilusFileInfo *file_info,
+ const char *attribute_name)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ return nautilus_file_get_string_attribute_q (file, g_quark_from_string (attribute_name));
+}
+
+static void
+add_string_attribute (NautilusFileInfo *file_info,
+ const char *attribute_name,
+ const char *value)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (file->details->pending_info_providers != NULL)
+ {
+ /* Lazily create hashtable */
+ if (file->details->pending_extension_attributes == NULL)
+ {
+ file->details->pending_extension_attributes =
+ g_hash_table_new_full (g_direct_hash, g_direct_equal,
+ NULL,
+ (GDestroyNotify) g_free);
+ }
+ g_hash_table_insert (file->details->pending_extension_attributes,
+ GINT_TO_POINTER (g_quark_from_string (attribute_name)),
+ g_strdup (value));
+ }
+ else
+ {
+ if (file->details->extension_attributes == NULL)
+ {
+ file->details->extension_attributes =
+ g_hash_table_new_full (g_direct_hash, g_direct_equal,
+ NULL,
+ (GDestroyNotify) g_free);
+ }
+ g_hash_table_insert (file->details->extension_attributes,
+ GINT_TO_POINTER (g_quark_from_string (attribute_name)),
+ g_strdup (value));
+ }
+
+ nautilus_file_changed (file);
+}
+
+static void
+invalidate_extension_info (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ nautilus_file_invalidate_attributes (file, NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO);
+}
+
+static char *
+get_activation_uri (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (file->details->activation_uri != NULL)
+ {
+ return g_strdup (file->details->activation_uri);
+ }
+
+ return nautilus_file_get_uri (file);
+}
+
+static GFileType
+get_file_type (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ return file->details->type;
+}
+
+static GFile *
+get_location (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+ g_autoptr (GFile) location = NULL;
+
+ file = NAUTILUS_FILE (file_info);
+ location = nautilus_directory_get_location (file->details->directory);
+
+ if (nautilus_file_is_self_owned (file))
+ {
+ return g_object_ref (location);
+ }
+
+ return g_file_get_child (location, eel_ref_str_peek (file->details->name));
+}
+
+static GFile *
+get_parent_location (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (nautilus_file_is_self_owned (file))
+ {
+ return NULL;
+ }
+
+ return nautilus_directory_get_location (file->details->directory);
+}
+
+static NautilusFileInfo *
+get_parent_info (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+ NautilusFile *parent_file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (nautilus_file_is_self_owned (file))
+ {
+ return NULL;
+ }
+
+ parent_file = nautilus_directory_get_corresponding_file (file->details->directory);
+
+ return NAUTILUS_FILE_INFO (parent_file);
+}
+
+static GMount *
+get_mount (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ if (file->details->mount)
+ {
+ return g_object_ref (file->details->mount);
+ }
+
+ return NULL;
+}
+
+static gboolean
+can_write (NautilusFileInfo *file_info)
+{
+ NautilusFile *file;
+
+ file = NAUTILUS_FILE (file_info);
+
+ return file->details->can_write;
+}
+
static void
-nautilus_file_info_iface_init (NautilusFileInfoIface *iface)
-{
- iface->is_gone = nautilus_file_is_gone;
- iface->get_name = nautilus_file_get_name;
- iface->get_file_type = nautilus_file_get_file_type;
- iface->get_location = nautilus_file_get_location;
- iface->get_uri = nautilus_file_get_uri;
- iface->get_parent_location = nautilus_file_get_parent_location;
- iface->get_parent_uri = nautilus_file_get_parent_uri;
- iface->get_parent_info = nautilus_file_get_parent;
- iface->get_mount = nautilus_file_get_mount;
- iface->get_uri_scheme = nautilus_file_get_uri_scheme;
- iface->get_activation_uri = nautilus_file_get_activation_uri;
- iface->get_mime_type = nautilus_file_get_mime_type;
- iface->is_mime_type = nautilus_file_is_mime_type;
- iface->is_directory = nautilus_file_is_directory;
- iface->can_write = nautilus_file_can_write;
- iface->add_emblem = nautilus_file_add_emblem;
- iface->get_string_attribute = nautilus_file_get_string_attribute;
- iface->add_string_attribute = nautilus_file_add_string_attribute;
- iface->invalidate_extension_info = nautilus_file_invalidate_extension_info;
+nautilus_file_info_iface_init (NautilusFileInfoInterface *iface)
+{
+ iface->is_gone = is_gone;
+
+ iface->get_name = get_name;
+ iface->get_uri = get_uri;
+ iface->get_parent_uri = get_parent_uri;
+ iface->get_uri_scheme = get_uri_scheme;
+
+ iface->get_mime_type = get_mime_type;
+ iface->is_mime_type = is_mime_type;
+ iface->is_directory = is_directory;
+
+ iface->add_emblem = add_emblem;
+ iface->get_string_attribute = get_string_attribute;
+ iface->add_string_attribute = add_string_attribute;
+ iface->invalidate_extension_info = invalidate_extension_info;
+
+ iface->get_activation_uri = get_activation_uri;
+
+ iface->get_file_type = get_file_type;
+ iface->get_location = get_location;
+ iface->get_parent_location = get_parent_location;
+ iface->get_parent_info = get_parent_info;
+ iface->get_mount = get_mount;
+ iface->can_write = can_write;
}
#if !defined (NAUTILUS_OMIT_SELF_CHECK)