/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-

   caja-file.h: Caja file model.

   Copyright (C) 1999, 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., 51 Franklin St, Fifth Floor,
   Boston, MA 02110-1301, USA.

   Author: Darin Adler <darin@bentspoon.com>
*/

#ifndef CAJA_FILE_H
#define CAJA_FILE_H

#include <gtk/gtk.h>
#include <gio/gio.h>
#include <libcaja-private/caja-file-attributes.h>
#include <libcaja-private/caja-icon-info.h>

/* CajaFile is an object used to represent a single element of a
 * CajaDirectory. It's lightweight and relies on CajaDirectory
 * to do most of the work.
 */

/* CajaFile is defined both here and in caja-directory.h. */
#ifndef CAJA_FILE_DEFINED
#define CAJA_FILE_DEFINED
typedef struct CajaFile CajaFile;
#endif

#define CAJA_TYPE_FILE caja_file_get_type()
#define CAJA_FILE(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST ((obj), CAJA_TYPE_FILE, CajaFile))
#define CAJA_FILE_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST ((klass), CAJA_TYPE_FILE, CajaFileClass))
#define CAJA_IS_FILE(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CAJA_TYPE_FILE))
#define CAJA_IS_FILE_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE ((klass), CAJA_TYPE_FILE))
#define CAJA_FILE_GET_CLASS(obj) \
  (G_TYPE_INSTANCE_GET_CLASS ((obj), CAJA_TYPE_FILE, CajaFileClass))

typedef enum
{
    CAJA_FILE_SORT_NONE,
    CAJA_FILE_SORT_BY_DISPLAY_NAME,
    CAJA_FILE_SORT_BY_DIRECTORY,
    CAJA_FILE_SORT_BY_SIZE,
    CAJA_FILE_SORT_BY_TYPE,
    CAJA_FILE_SORT_BY_MTIME,
    CAJA_FILE_SORT_BY_ATIME,
    CAJA_FILE_SORT_BY_EMBLEMS,
    CAJA_FILE_SORT_BY_TRASHED_TIME
} CajaFileSortType;

typedef enum
{
    CAJA_REQUEST_NOT_STARTED,
    CAJA_REQUEST_IN_PROGRESS,
    CAJA_REQUEST_DONE
} CajaRequestStatus;

typedef enum
{
    CAJA_FILE_ICON_FLAGS_NONE = 0,
    CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS = (1<<0),
    CAJA_FILE_ICON_FLAGS_IGNORE_VISITING = (1<<1),
    CAJA_FILE_ICON_FLAGS_EMBEDDING_TEXT = (1<<2),
    CAJA_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT = (1<<3),
    CAJA_FILE_ICON_FLAGS_FOR_OPEN_FOLDER = (1<<4),
    /* whether the thumbnail size must match the display icon size */
    CAJA_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE = (1<<5),
    /* uses the icon of the mount if present */
    CAJA_FILE_ICON_FLAGS_USE_MOUNT_ICON = (1<<6),
    /* render the mount icon as an emblem over the regular one */
    CAJA_FILE_ICON_FLAGS_USE_MOUNT_ICON_AS_EMBLEM = (1<<7)
} CajaFileIconFlags;

/* Emblems sometimes displayed for CajaFiles. Do not localize. */
#define CAJA_FILE_EMBLEM_NAME_SYMBOLIC_LINK "symbolic-link"
#define CAJA_FILE_EMBLEM_NAME_CANT_READ "noread"
#define CAJA_FILE_EMBLEM_NAME_CANT_WRITE "nowrite"
#define CAJA_FILE_EMBLEM_NAME_TRASH "trash"
#define CAJA_FILE_EMBLEM_NAME_NOTE "note"
#define CAJA_FILE_EMBLEM_NAME_DESKTOP "desktop"
#define CAJA_FILE_EMBLEM_NAME_SHARED "shared"

typedef void (*CajaFileCallback)          (CajaFile  *file,
        gpointer       callback_data);
typedef void (*CajaFileListCallback)      (GList         *file_list,
        gpointer       callback_data);
typedef void (*CajaFileOperationCallback) (CajaFile  *file,
        GFile         *result_location,
        GError        *error,
        gpointer       callback_data);
typedef int (*CajaWidthMeasureCallback)   (const char    *string,
        void	     *context);
typedef char * (*CajaTruncateCallback)    (const char    *string,
        int	      width,
        void	     *context);


#define CAJA_FILE_ATTRIBUTES_FOR_ICON (CAJA_FILE_ATTRIBUTE_INFO | CAJA_FILE_ATTRIBUTE_LINK_INFO | CAJA_FILE_ATTRIBUTE_THUMBNAIL)

typedef void CajaFileListHandle;

/* GObject requirements. */
GType                   caja_file_get_type                          (void);

/* Getting at a single file. */
CajaFile *          caja_file_get                               (GFile                          *location);
CajaFile *          caja_file_get_by_uri                        (const char                     *uri);

/* Get a file only if the caja version already exists */
CajaFile *          caja_file_get_existing                      (GFile                          *location);
CajaFile *          caja_file_get_existing_by_uri               (const char                     *uri);

/* Covers for g_object_ref and g_object_unref that provide two conveniences:
 * 1) Using these is type safe.
 * 2) You are allowed to call these with NULL,
 */
CajaFile *          caja_file_ref                               (CajaFile                   *file);
void                    caja_file_unref                             (CajaFile                   *file);

/* Monitor the file. */
void                    caja_file_monitor_add                       (CajaFile                   *file,
        gconstpointer                   client,
        CajaFileAttributes          attributes);
void                    caja_file_monitor_remove                    (CajaFile                   *file,
        gconstpointer                   client);

/* Waiting for data that's read asynchronously.
 * This interface currently works only for metadata, but could be expanded
 * to other attributes as well.
 */
void                    caja_file_call_when_ready                   (CajaFile                   *file,
        CajaFileAttributes          attributes,
        CajaFileCallback            callback,
        gpointer                        callback_data);
void                    caja_file_cancel_call_when_ready            (CajaFile                   *file,
        CajaFileCallback            callback,
        gpointer                        callback_data);
gboolean                caja_file_check_if_ready                    (CajaFile                   *file,
        CajaFileAttributes          attributes);
void                    caja_file_invalidate_attributes             (CajaFile                   *file,
        CajaFileAttributes          attributes);
void                    caja_file_invalidate_all_attributes         (CajaFile                   *file);

/* Basic attributes for file objects. */
gboolean                caja_file_contains_text                     (CajaFile                   *file);
gboolean                caja_file_is_binary                         (CajaFile                   *file);
char *                  caja_file_get_display_name                  (CajaFile                   *file);
char *                  caja_file_get_edit_name                     (CajaFile                   *file);
char *                  caja_file_get_name                          (CajaFile                   *file);
GFile *                 caja_file_get_location                      (CajaFile                   *file);
char *			 caja_file_get_description			 (CajaFile			 *file);
char *                  caja_file_get_uri                           (CajaFile                   *file);
char *                  caja_file_get_uri_scheme                    (CajaFile                   *file);
CajaFile *          caja_file_get_parent                        (CajaFile                   *file);
GFile *                 caja_file_get_parent_location               (CajaFile                   *file);
char *                  caja_file_get_parent_uri                    (CajaFile                   *file);
char *                  caja_file_get_parent_uri_for_display        (CajaFile                   *file);
gboolean                caja_file_can_get_size                      (CajaFile                   *file);
goffset                 caja_file_get_size                          (CajaFile                   *file);
time_t                  caja_file_get_mtime                         (CajaFile                   *file);
GFileType               caja_file_get_file_type                     (CajaFile                   *file);
char *                  caja_file_get_mime_type                     (CajaFile                   *file);
gboolean                caja_file_is_mime_type                      (CajaFile                   *file,
        const char                     *mime_type);
gboolean                caja_file_is_launchable                     (CajaFile                   *file);
gboolean                caja_file_is_symbolic_link                  (CajaFile                   *file);
gboolean                caja_file_is_mountpoint                     (CajaFile                   *file);
GMount *                caja_file_get_mount                         (CajaFile                   *file);
char *                  caja_file_get_volume_free_space             (CajaFile                   *file);
char *                  caja_file_get_volume_name                   (CajaFile                   *file);
char *                  caja_file_get_symbolic_link_target_path     (CajaFile                   *file);
char *                  caja_file_get_symbolic_link_target_uri      (CajaFile                   *file);
gboolean                caja_file_is_broken_symbolic_link           (CajaFile                   *file);
gboolean                caja_file_is_caja_link                  (CajaFile                   *file);
gboolean                caja_file_is_executable                     (CajaFile                   *file);
gboolean                caja_file_is_directory                      (CajaFile                   *file);
gboolean                caja_file_is_user_special_directory         (CajaFile                   *file,
        GUserDirectory                 special_directory);
gboolean		caja_file_is_archive			(CajaFile			*file);
gboolean                caja_file_is_in_trash                       (CajaFile                   *file);
gboolean                caja_file_is_in_desktop                     (CajaFile                   *file);
gboolean		caja_file_is_home				(CajaFile                   *file);
gboolean                caja_file_is_desktop_directory              (CajaFile                   *file);
GError *                caja_file_get_file_info_error               (CajaFile                   *file);
gboolean                caja_file_get_directory_item_count          (CajaFile                   *file,
        guint                          *count,
        gboolean                       *count_unreadable);
void                    caja_file_recompute_deep_counts             (CajaFile                   *file);
CajaRequestStatus   caja_file_get_deep_counts                   (CajaFile                   *file,
        guint                          *directory_count,
        guint                          *file_count,
        guint                          *unreadable_directory_count,
        goffset               *total_size,
        gboolean                        force);
gboolean                caja_file_should_show_thumbnail             (CajaFile                   *file);
gboolean                caja_file_should_show_directory_item_count  (CajaFile                   *file);
gboolean                caja_file_should_show_type                  (CajaFile                   *file);
GList *                 caja_file_get_keywords                      (CajaFile                   *file);
void                    caja_file_set_keywords                      (CajaFile                   *file,
        GList                          *keywords);
GList *                 caja_file_get_emblem_icons                  (CajaFile                   *file,
        char                          **exclude);
GList *                 caja_file_get_emblem_pixbufs                (CajaFile                   *file,
        int                             size,
        gboolean                        force_size,
        char                          **exclude);
char *                  caja_file_get_top_left_text                 (CajaFile                   *file);
char *                  caja_file_peek_top_left_text                (CajaFile                   *file,
        gboolean                        need_large_text,
        gboolean                       *got_top_left_text);
gboolean                caja_file_get_directory_item_mime_types     (CajaFile                   *file,
        GList                         **mime_list);

void                    caja_file_set_attributes                    (CajaFile                   *file,
        GFileInfo                      *attributes,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
GFilesystemPreviewType  caja_file_get_filesystem_use_preview        (CajaFile *file);

char *                  caja_file_get_filesystem_id                 (CajaFile                   *file);

CajaFile *          caja_file_get_trash_original_file           (CajaFile                   *file);

/* Permissions. */
gboolean                caja_file_can_get_permissions               (CajaFile                   *file);
gboolean                caja_file_can_set_permissions               (CajaFile                   *file);
guint                   caja_file_get_permissions                   (CajaFile                   *file);
gboolean                caja_file_can_get_owner                     (CajaFile                   *file);
gboolean                caja_file_can_set_owner                     (CajaFile                   *file);
gboolean                caja_file_can_get_group                     (CajaFile                   *file);
gboolean                caja_file_can_set_group                     (CajaFile                   *file);
char *                  caja_file_get_owner_name                    (CajaFile                   *file);
char *                  caja_file_get_group_name                    (CajaFile                   *file);
GList *                 caja_get_user_names                         (void);
GList *                 caja_get_all_group_names                    (void);
GList *                 caja_file_get_settable_group_names          (CajaFile                   *file);
gboolean                caja_file_can_get_selinux_context           (CajaFile                   *file);
char *                  caja_file_get_selinux_context               (CajaFile                   *file);

/* "Capabilities". */
gboolean                caja_file_can_read                          (CajaFile                   *file);
gboolean                caja_file_can_write                         (CajaFile                   *file);
gboolean                caja_file_can_execute                       (CajaFile                   *file);
gboolean                caja_file_can_rename                        (CajaFile                   *file);
gboolean                caja_file_can_delete                        (CajaFile                   *file);
gboolean                caja_file_can_trash                         (CajaFile                   *file);

gboolean                caja_file_can_mount                         (CajaFile                   *file);
gboolean                caja_file_can_unmount                       (CajaFile                   *file);
gboolean                caja_file_can_eject                         (CajaFile                   *file);
gboolean                caja_file_can_start                         (CajaFile                   *file);
gboolean                caja_file_can_start_degraded                (CajaFile                   *file);
gboolean                caja_file_can_stop                          (CajaFile                   *file);
GDriveStartStopType     caja_file_get_start_stop_type               (CajaFile                   *file);
gboolean                caja_file_can_poll_for_media                (CajaFile                   *file);
gboolean                caja_file_is_media_check_automatic          (CajaFile                   *file);

void                    caja_file_mount                             (CajaFile                   *file,
        GMountOperation                *mount_op,
        GCancellable                   *cancellable,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
void                    caja_file_unmount                           (CajaFile                   *file,
        GMountOperation                *mount_op,
        GCancellable                   *cancellable,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
void                    caja_file_eject                             (CajaFile                   *file,
        GMountOperation                *mount_op,
        GCancellable                   *cancellable,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);

void                    caja_file_start                             (CajaFile                   *file,
        GMountOperation                *start_op,
        GCancellable                   *cancellable,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
void                    caja_file_stop                              (CajaFile                   *file,
        GMountOperation                *mount_op,
        GCancellable                   *cancellable,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
void                    caja_file_poll_for_media                    (CajaFile                   *file);

/* Basic operations for file objects. */
void                    caja_file_set_owner                         (CajaFile                   *file,
        const char                     *user_name_or_id,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
void                    caja_file_set_group                         (CajaFile                   *file,
        const char                     *group_name_or_id,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
void                    caja_file_set_permissions                   (CajaFile                   *file,
        guint32                         permissions,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
void                    caja_file_rename                            (CajaFile                   *file,
        const char                     *new_name,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);
void                    caja_file_cancel                            (CajaFile                   *file,
        CajaFileOperationCallback   callback,
        gpointer                        callback_data);

/* Return true if this file has already been deleted.
 * This object will be unref'd after sending the files_removed signal,
 * but it could hang around longer if someone ref'd it.
 */
gboolean                caja_file_is_gone                           (CajaFile                   *file);

/* Return true if this file is not confirmed to have ever really
 * existed. This is true when the CajaFile object has been created, but no I/O
 * has yet confirmed the existence of a file by that name.
 */
gboolean                caja_file_is_not_yet_confirmed              (CajaFile                   *file);

/* Simple getting and setting top-level metadata. */
char *                  caja_file_get_metadata                      (CajaFile                   *file,
        const char                     *key,
        const char                     *default_metadata);
GList *                 caja_file_get_metadata_list                 (CajaFile                   *file,
        const char                     *key);
void                    caja_file_set_metadata                      (CajaFile                   *file,
        const char                     *key,
        const char                     *default_metadata,
        const char                     *metadata);
void                    caja_file_set_metadata_list                 (CajaFile                   *file,
        const char                     *key,
        GList                          *list);

/* Covers for common data types. */
gboolean                caja_file_get_boolean_metadata              (CajaFile                   *file,
        const char                     *key,
        gboolean                        default_metadata);
void                    caja_file_set_boolean_metadata              (CajaFile                   *file,
        const char                     *key,
        gboolean                        default_metadata,
        gboolean                        metadata);
int                     caja_file_get_integer_metadata              (CajaFile                   *file,
        const char                     *key,
        int                             default_metadata);
void                    caja_file_set_integer_metadata              (CajaFile                   *file,
        const char                     *key,
        int                             default_metadata,
        int                             metadata);

#define UNDEFINED_TIME ((time_t) (-1))

time_t                  caja_file_get_time_metadata                 (CajaFile                  *file,
        const char                    *key);
void                    caja_file_set_time_metadata                 (CajaFile                  *file,
        const char                    *key,
        time_t                         time);


/* Attributes for file objects as user-displayable strings. */
char *                  caja_file_get_string_attribute              (CajaFile                   *file,
        const char                     *attribute_name);
char *                  caja_file_get_string_attribute_q            (CajaFile                   *file,
        GQuark                          attribute_q);
char *                  caja_file_get_string_attribute_with_default (CajaFile                   *file,
        const char                     *attribute_name);
char *                  caja_file_get_string_attribute_with_default_q (CajaFile                  *file,
        GQuark                          attribute_q);
char *			caja_file_fit_modified_date_as_string	(CajaFile 			*file,
        int				 width,
        CajaWidthMeasureCallback    measure_callback,
        CajaTruncateCallback	 truncate_callback,
        void				*measure_truncate_context);

/* Matching with another URI. */
gboolean                caja_file_matches_uri                       (CajaFile                   *file,
        const char                     *uri);

/* Is the file local? */
gboolean                caja_file_is_local                          (CajaFile                   *file);

/* Comparing two file objects for sorting */
CajaFileSortType    caja_file_get_default_sort_type             (CajaFile                   *file,
        gboolean                       *reversed);
const gchar *           caja_file_get_default_sort_attribute        (CajaFile                   *file,
        gboolean                       *reversed);

int                     caja_file_compare_for_sort                  (CajaFile                   *file_1,
        CajaFile                   *file_2,
        CajaFileSortType            sort_type,
        gboolean			 directories_first,
        gboolean		  	 reversed);
int                     caja_file_compare_for_sort_by_attribute     (CajaFile                   *file_1,
        CajaFile                   *file_2,
        const char                     *attribute,
        gboolean                        directories_first,
        gboolean                        reversed);
int                     caja_file_compare_for_sort_by_attribute_q   (CajaFile                   *file_1,
        CajaFile                   *file_2,
        GQuark                          attribute,
        gboolean                        directories_first,
        gboolean                        reversed);
gboolean                caja_file_is_date_sort_attribute_q          (GQuark                          attribute);

int                     caja_file_compare_display_name              (CajaFile                   *file_1,
        const char                     *pattern);
int                     caja_file_compare_location                  (CajaFile                    *file_1,
        CajaFile                    *file_2);

/* filtering functions for use by various directory views */
gboolean                caja_file_is_hidden_file                    (CajaFile                   *file);
gboolean                caja_file_should_show                       (CajaFile                   *file,
        gboolean                        show_hidden,
        gboolean                        show_foreign);
GList                  *caja_file_list_filter_hidden                (GList                          *files,
        gboolean                        show_hidden);


/* Get the URI that's used when activating the file.
 * Getting this can require reading the contents of the file.
 */
gboolean                caja_file_is_launcher                       (CajaFile                   *file);
gboolean                caja_file_is_foreign_link                   (CajaFile                   *file);
gboolean                caja_file_is_trusted_link                   (CajaFile                   *file);
gboolean                caja_file_has_activation_uri                (CajaFile                   *file);
char *                  caja_file_get_activation_uri                (CajaFile                   *file);
GFile *                 caja_file_get_activation_location           (CajaFile                   *file);

char *                  caja_file_get_drop_target_uri               (CajaFile                   *file);

/* Get custom icon (if specified by metadata or link contents) */
char *                  caja_file_get_custom_icon                   (CajaFile                   *file);


GIcon *                 caja_file_get_gicon                         (CajaFile                   *file,
        CajaFileIconFlags           flags);
CajaIconInfo *      caja_file_get_icon                          (CajaFile                   *file,
        int                             size,
        CajaFileIconFlags           flags);
GdkPixbuf *             caja_file_get_icon_pixbuf                   (CajaFile                   *file,
        int                             size,
        gboolean                        force_size,
        CajaFileIconFlags           flags);

gboolean                caja_file_has_open_window                   (CajaFile                   *file);
void                    caja_file_set_has_open_window               (CajaFile                   *file,
        gboolean                        has_open_window);

/* Thumbnailing handling */
gboolean                caja_file_is_thumbnailing                   (CajaFile                   *file);

/* Convenience functions for dealing with a list of CajaFile objects that each have a ref.
 * These are just convenient names for functions that work on lists of GtkObject *.
 */
GList *                 caja_file_list_ref                          (GList                          *file_list);
void                    caja_file_list_unref                        (GList                          *file_list);
void                    caja_file_list_free                         (GList                          *file_list);
GList *                 caja_file_list_copy                         (GList                          *file_list);
GList *                 caja_file_list_from_uris                    (GList                          *uri_list);
GList *			caja_file_list_sort_by_display_name		(GList				*file_list);
void                    caja_file_list_call_when_ready              (GList                          *file_list,
        CajaFileAttributes          attributes,
        CajaFileListHandle        **handle,
        CajaFileListCallback        callback,
        gpointer                        callback_data);
void                    caja_file_list_cancel_call_when_ready       (CajaFileListHandle         *handle);

/* Debugging */
void                    caja_file_dump                              (CajaFile                   *file);

typedef struct CajaFileDetails CajaFileDetails;

struct CajaFile
{
    GObject parent_slot;
    CajaFileDetails *details;
};

/* This is actually a "protected" type, but it must be here so we can
 * compile the get_date function pointer declaration below.
 */
typedef enum
{
    CAJA_DATE_TYPE_MODIFIED,
    CAJA_DATE_TYPE_CHANGED,
    CAJA_DATE_TYPE_ACCESSED,
    CAJA_DATE_TYPE_PERMISSIONS_CHANGED,
    CAJA_DATE_TYPE_TRASHED
} CajaDateType;

typedef struct
{
    GObjectClass parent_slot;

    /* Subclasses can set this to something other than G_FILE_TYPE_UNKNOWN and
       it will be used as the default file type. This is useful when creating
       a "virtual" CajaFile subclass that you can't actually get real
       information about. For exaple CajaDesktopDirectoryFile. */
    GFileType default_file_type;

    /* Called when the file notices any change. */
    void                  (* changed)                (CajaFile *file);

    /* Called periodically while directory deep count is being computed. */
    void                  (* updated_deep_count_in_progress) (CajaFile *file);

    /* Virtual functions (mainly used for trash directory). */
    void                  (* monitor_add)            (CajaFile           *file,
            gconstpointer           client,
            CajaFileAttributes  attributes);
    void                  (* monitor_remove)         (CajaFile           *file,
            gconstpointer           client);
    void                  (* call_when_ready)        (CajaFile           *file,
            CajaFileAttributes  attributes,
            CajaFileCallback    callback,
            gpointer                callback_data);
    void                  (* cancel_call_when_ready) (CajaFile           *file,
            CajaFileCallback    callback,
            gpointer                callback_data);
    gboolean              (* check_if_ready)         (CajaFile           *file,
            CajaFileAttributes  attributes);
    gboolean              (* get_item_count)         (CajaFile           *file,
            guint                  *count,
            gboolean               *count_unreadable);
    CajaRequestStatus (* get_deep_counts)        (CajaFile           *file,
            guint                  *directory_count,
            guint                  *file_count,
            guint                  *unreadable_directory_count,
            goffset       *total_size);
    gboolean              (* get_date)               (CajaFile           *file,
            CajaDateType        type,
            time_t                 *date);
    char *                (* get_where_string)       (CajaFile           *file);

    void                  (* set_metadata)           (CajaFile           *file,
            const char             *key,
            const char             *value);
    void                  (* set_metadata_as_list)   (CajaFile           *file,
            const char             *key,
            char                  **value);

    void                  (* mount)                  (CajaFile                   *file,
            GMountOperation                *mount_op,
            GCancellable                   *cancellable,
            CajaFileOperationCallback   callback,
            gpointer                        callback_data);
    void                 (* unmount)                 (CajaFile                   *file,
            GMountOperation                *mount_op,
            GCancellable                   *cancellable,
            CajaFileOperationCallback   callback,
            gpointer                        callback_data);
    void                 (* eject)                   (CajaFile                   *file,
            GMountOperation                *mount_op,
            GCancellable                   *cancellable,
            CajaFileOperationCallback   callback,
            gpointer                        callback_data);

    void                  (* start)                  (CajaFile                   *file,
            GMountOperation                *start_op,
            GCancellable                   *cancellable,
            CajaFileOperationCallback   callback,
            gpointer                        callback_data);
    void                 (* stop)                    (CajaFile                   *file,
            GMountOperation                *mount_op,
            GCancellable                   *cancellable,
            CajaFileOperationCallback   callback,
            gpointer                        callback_data);

    void                 (* poll_for_media)          (CajaFile                   *file);
} CajaFileClass;

#endif /* CAJA_FILE_H */