thunar-usagebars/thunarx/thunarx-file-info.c
4aiman e969f94310 thunar 4.20.2 upstream
Tree of tag thunar-4.20.2 (commit 11a519f) from https://gitlab.xfce.org/xfce/thunar.
Upstream history is not included here to keep the repository small.
2026-11-03 22:42:48 +03:00

448 lines
13 KiB
C

/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
* Copyright (c) 2009 Jannis Pohlmann <jannis@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "thunarx/thunarx-file-info.h"
#include "thunarx/thunarx-private.h"
#include <libxfce4util/libxfce4util.h>
/* Signal identifiers */
enum
{
CHANGED,
RENAMED,
LAST_SIGNAL,
};
static guint file_info_signals[LAST_SIGNAL];
/**
* SECTION: thunarx-file-info
* @short_description: Abstraction of a file handled within the file manager
* @title: ThunarxFileInfo
* @include: thunarx/thunarx.h
*
* The <interface>ThunarxFileInfo</interface> interface provides extensions with
* a way to access information about a file handled within the file manager.
*/
GType
thunarx_file_info_get_type (void)
{
static gsize type__static = 0;
GType type;
if (g_once_init_enter (&type__static))
{
type = g_type_register_static_simple (G_TYPE_INTERFACE,
I_ ("ThunarxFileInfo"),
sizeof (ThunarxFileInfoIface),
NULL,
0,
NULL,
0);
g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
/**
* ThunarxFileInfo::changed:
* @file_info : a #ThunarxFileInfo.
*
* Emitted whenever the system notices a change to @file_info.
*
* Thunar plugins should use this signal to stay informed about
* changes to a @file_info for which they currently display
* information (i.e. in a #ThunarxPropertyPage), and update
* it's user interface whenever a change is noticed on @file_info.
**/
file_info_signals[CHANGED] =
g_signal_new (I_ ("changed"),
type,
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ThunarxFileInfoIface, changed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
/**
* ThunarxFileInfo::renamed:
* @file_info : a #ThunarxFileInfo
*
* Emitted when the @file_info is renamed to another
* name.
*
* For example, within Thunar, #ThunarFolder uses this
* signal to reregister it's VFS directory monitor, after
* the corresponding file was renamed.
**/
file_info_signals[RENAMED] =
g_signal_new (I_ ("renamed"),
type,
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ThunarxFileInfoIface, renamed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
g_once_init_leave (&type__static, type);
}
return type__static;
}
/**
* thunarx_file_info_get_name:
* @file_info : a #ThunarxFileInfo.
*
* Returns the real name of the file represented
* by @file_info in the local file system encoding.
* You can use g_filename_display_name() or similar
* functions to generate an UTF-8 version of the
* name, which is suitable for use in the user
* interface.
*
* The caller is responsible to free the returned
* string using g_free() when no longer needed.
*
* Return value: the real name of the file represented
* by @file_info.
**/
gchar *
thunarx_file_info_get_name (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), NULL);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->get_name) (file_info);
}
/**
* thunarx_file_info_get_uri:
* @file_info : a #ThunarxFileInfo.
*
* Returns the escaped, fully qualified URI
* of the file object represented by @file_info.
* You may use g_filename_from_uri() and similar
* functions to work with the returned URI.
*
* The caller is responsible to free the returned
* string using g_free() when no longer needed.
*
* Return value: the fully qualified URI of @file_info.
**/
gchar *
thunarx_file_info_get_uri (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), NULL);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->get_uri) (file_info);
}
/**
* thunarx_file_info_get_parent_uri:
* @file_info : a #ThunarxFileInfo.
*
* Returns the URI to the parent file of
* @file_info or %NULL if @file_info has
* no parent. Note that the parent URI
* may be of a different type than the
* URI of @file_info. For example, the
* parent of "file:///" is "computer:///".
*
* The caller is responsible to free the
* returned string using g_free() when no
* longer needed.
*
* Return value: the parent URI for @file_info
* or %NULL.
**/
gchar *
thunarx_file_info_get_parent_uri (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), NULL);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->get_parent_uri) (file_info);
}
/**
* thunarx_file_info_get_uri_scheme:
* @file_info : a #ThunarxFileInfo.
*
* Returns the URI scheme of the file represented
* by @file_info. E.g. if @file_info refers to the
* file "file:///usr/home", the return value will
* be "file".
*
* The caller is responsible to free the returned
* string using g_free() when no longer needed.
*
* Return value: the URI scheme for @file_info.
**/
gchar *
thunarx_file_info_get_uri_scheme (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), NULL);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->get_uri_scheme) (file_info);
}
/**
* thunarx_file_info_get_mime_type:
* @file_info : a #ThunarxFileInfo.
*
* Returns the MIME-type of the file represented by
* @file_info or %NULL if no MIME-type is known for
* @file_info.
*
* The caller is responsible to free the returned
* string using g_free() when no longer needed.
*
* Return value: the MIME-type for @file_info or
* %NULL.
**/
gchar *
thunarx_file_info_get_mime_type (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), NULL);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->get_mime_type) (file_info);
}
/**
* thunarx_file_info_has_mime_type:
* @file_info : a #ThunarxFileInfo.
* @mime_type : a MIME-type (e.g. "text/plain").
*
* Checks whether @file_info is of the given @mime_type
* or whether the MIME-type of @file_info is a subclass
* of @mime_type.
*
* This is the preferred way for most extensions to check
* whether they support a given file or not, and you should
* consider using this method rather than
* thunarx_file_info_get_mime_type(). A simple example would
* be a menu extension that performs a certain action on
* text files. In this case you want to check whether a given
* #ThunarxFileInfo refers to any kind of text file, not only
* to "text/plain" (e.g. this also includes "text/xml" and
* "application/x-desktop").
*
* But you should be aware that this method may take some
* time to test whether @mime_type is valid for @file_info,
* so don't call it too often.
*
* Return value: %TRUE if @mime_type is valid for @file_info,
* else %FALSE.
**/
gboolean
thunarx_file_info_has_mime_type (ThunarxFileInfo *file_info,
const gchar *mime_type)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), FALSE);
g_return_val_if_fail (mime_type != NULL, FALSE);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->has_mime_type) (file_info, mime_type);
}
/**
* thunarx_file_info_is_directory:
* @file_info : a #ThunarxFileInfo.
*
* Checks whether @file_info refers to a directory.
*
* Return value: %TRUE if @file_info is a directory.
**/
gboolean
thunarx_file_info_is_directory (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), FALSE);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->is_directory) (file_info);
}
/**
* thunarx_file_info_get_file_info:
* @file_info : a #ThunarxFileInfo.
*
* Returns the #GFileInfo associated with @file_info,
* which includes additional information about the @file_info
* as queried from GIO earlier. The caller is responsible to free the
* returned #GFileInfo object using g_object_unref() when
* no longer needed.
*
* Returns: (transfer full): the #GFileInfo object associated with @file_info,
* which MUST be freed using g_object_unref().
**/
GFileInfo *
thunarx_file_info_get_file_info (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), NULL);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->get_file_info) (file_info);
}
/**
* thunarx_file_info_get_filesystem_info:
* @file_info : a #ThunarxFileInfo.
*
* Returns the #GFileInfo which includes additional information about
* the filesystem @file_info resides on. The caller is responsible to
* free the returned #GFileInfo object using g_object_unref() when
* no longer needed.
*
* Returns: (transfer full): the #GFileInfo containing information about the
* filesystem of @file_info or %NULL if no filesystem information is
* available. It MUST be released using g_object_unref().
**/
GFileInfo *
thunarx_file_info_get_filesystem_info (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), NULL);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->get_filesystem_info) (file_info);
}
/**
* thunarx_file_info_get_location:
* @file_info : a #ThunarxFileInfo.
*
* Returns the #GFile @file_info points to. The #GFile is a more
* powerful tool than just the URI or the path. The caller
* is responsible to release the returned #GFile using g_object_unref()
* when no longer needed.
*
* Returns: (transfer full): the #GFile to which @file_info points. It MUST be
* released using g_object_unref().
**/
GFile *
thunarx_file_info_get_location (ThunarxFileInfo *file_info)
{
g_return_val_if_fail (THUNARX_IS_FILE_INFO (file_info), NULL);
return (*THUNARX_FILE_INFO_GET_IFACE (file_info)->get_location) (file_info);
}
/**
* thunarx_file_info_changed:
* @file_info : a #ThunarxFileInfo.
*
* Emits the ::changed signal on @file_info. This method should not
* be invoked by Thunar plugins, instead the file manager itself
* will use this method to emit ::changed whenever it notices a
* change on @file_info.
**/
void
thunarx_file_info_changed (ThunarxFileInfo *file_info)
{
g_return_if_fail (THUNARX_IS_FILE_INFO (file_info));
g_signal_emit (G_OBJECT (file_info), file_info_signals[CHANGED], 0);
}
/**
* thunarx_file_info_renamed:
* @file_info : a #ThunarxFileInfo.
*
* Emits the ::renamed signal on @file_info. This method should
* not be invoked by Thunar plugins, instead the file manager
* will emit this signal whenever the user renamed the @file_info.
*
* The plugins should instead connect to the ::renamed signal
* and update it's internal state and it's user interface
* after the file manager renamed a file.
**/
void
thunarx_file_info_renamed (ThunarxFileInfo *file_info)
{
g_return_if_fail (THUNARX_IS_FILE_INFO (file_info));
g_signal_emit (G_OBJECT (file_info), file_info_signals[RENAMED], 0);
}
GType
thunarx_file_info_list_get_type (void)
{
static GType type = G_TYPE_INVALID;
if (G_UNLIKELY (type == G_TYPE_INVALID))
{
type = g_boxed_type_register_static (I_ ("ThunarxFileInfoList"),
(GBoxedCopyFunc) thunarx_file_info_list_copy,
(GBoxedFreeFunc) thunarx_file_info_list_free);
}
return type;
}
/**
* thunarx_file_info_list_copy:
* @file_infos: (element-type ThunarxFileInfo): a #GList of #ThunarxFileInfo<!---->s.
*
* Does a deep copy of @file_infos and returns the
* new list.
*
* Returns: (transfer full) (element-type ThunarxFileInfo): a copy of @file_infos.
**/
GList *
thunarx_file_info_list_copy (GList *file_infos)
{
return g_list_copy_deep (file_infos, (GCopyFunc) (void (*) (void)) g_object_ref, NULL);
}
/**
* thunarx_file_info_list_free:
* @file_infos: (element-type ThunarxFileInfo): a #GList of #ThunarxFileInfo<!---->s.
*
* Frees the resources allocated for the @file_infos
* list and decreases the reference count on the
* #ThunarxFileInfo<!---->s contained within.
**/
void
thunarx_file_info_list_free (GList *file_infos)
{
g_list_free_full (file_infos, g_object_unref);
}