/* GIO - GLib Input, Output and Streaming Library
 *
 * Copyright (C) 2006-2007 Red Hat, Inc.
 *
 * This library 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 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 *
 * Author: Alexander Larsson <alexl@redhat.com>
 */

#ifndef __G_UNIX_MOUNTS_H__
#define __G_UNIX_MOUNTS_H__

#include <gio/gio.h>

G_BEGIN_DECLS

/**
 * GUnixMountEntry:
 *
 * Defines a Unix mount entry (e.g. <filename>/media/cdrom</filename>).
 * This corresponds roughly to a mtab entry.
 **/
typedef struct _GUnixMountEntry GUnixMountEntry;

/**
 * GUnixMountPoint:
 *
 * Defines a Unix mount point (e.g. <filename>/dev</filename>).
 * This corresponds roughly to a fstab entry.
 **/
typedef struct _GUnixMountPoint GUnixMountPoint;

/**
 * GUnixMountMonitor:
 *
 * Watches #GUnixMounts for changes.
 **/
typedef struct _GUnixMountMonitor      GUnixMountMonitor;
typedef struct _GUnixMountMonitorClass GUnixMountMonitorClass;

#define G_TYPE_UNIX_MOUNT_MONITOR        (g_unix_mount_monitor_get_type ())
#define G_UNIX_MOUNT_MONITOR(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_MOUNT_MONITOR, GUnixMountMonitor))
#define G_UNIX_MOUNT_MONITOR_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_MOUNT_MONITOR, GUnixMountMonitorClass))
#define G_IS_UNIX_MOUNT_MONITOR(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_MOUNT_MONITOR))
#define G_IS_UNIX_MOUNT_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_MOUNT_MONITOR))
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUnixMountMonitor, g_object_unref)

GLIB_AVAILABLE_IN_ALL
void           g_unix_mount_free                    (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
void           g_unix_mount_point_free              (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
gint           g_unix_mount_compare                 (GUnixMountEntry    *mount1,
						     GUnixMountEntry    *mount2);
GLIB_AVAILABLE_IN_ALL
const char *   g_unix_mount_get_mount_path          (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
const char *   g_unix_mount_get_device_path         (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
const char *   g_unix_mount_get_fs_type             (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_is_readonly             (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_is_system_internal      (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_guess_can_eject         (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_guess_should_display    (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
char *         g_unix_mount_guess_name              (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
GIcon *        g_unix_mount_guess_icon              (GUnixMountEntry    *mount_entry);
GLIB_AVAILABLE_IN_ALL
GIcon *        g_unix_mount_guess_symbolic_icon     (GUnixMountEntry    *mount_entry);


GLIB_AVAILABLE_IN_ALL
gint           g_unix_mount_point_compare           (GUnixMountPoint    *mount1,
						     GUnixMountPoint    *mount2);
GLIB_AVAILABLE_IN_ALL
const char *   g_unix_mount_point_get_mount_path    (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
const char *   g_unix_mount_point_get_device_path   (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
const char *   g_unix_mount_point_get_fs_type       (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_2_32
const char *   g_unix_mount_point_get_options       (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_point_is_readonly       (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_point_is_user_mountable (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_point_is_loopback       (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_point_guess_can_eject   (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
char *         g_unix_mount_point_guess_name        (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
GIcon *        g_unix_mount_point_guess_icon        (GUnixMountPoint    *mount_point);
GLIB_AVAILABLE_IN_ALL
GIcon *        g_unix_mount_point_guess_symbolic_icon (GUnixMountPoint    *mount_point);


GLIB_AVAILABLE_IN_ALL
GList *        g_unix_mount_points_get              (guint64            *time_read);
GLIB_AVAILABLE_IN_ALL
GList *        g_unix_mounts_get                    (guint64            *time_read);
GLIB_AVAILABLE_IN_ALL
GUnixMountEntry *g_unix_mount_at                    (const char         *mount_path,
						     guint64            *time_read);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mounts_changed_since          (guint64             time);
GLIB_AVAILABLE_IN_ALL
gboolean       g_unix_mount_points_changed_since    (guint64             time);

GLIB_AVAILABLE_IN_ALL
GType              g_unix_mount_monitor_get_type       (void) G_GNUC_CONST;
GLIB_AVAILABLE_IN_2_44
GUnixMountMonitor *g_unix_mount_monitor_get            (void);
GLIB_DEPRECATED_IN_2_44_FOR(g_unix_mount_monitor_get)
GUnixMountMonitor *g_unix_mount_monitor_new            (void);
GLIB_DEPRECATED_IN_2_44
void               g_unix_mount_monitor_set_rate_limit (GUnixMountMonitor *mount_monitor,
                                                        int                limit_msec);

GLIB_AVAILABLE_IN_ALL
gboolean g_unix_is_mount_path_system_internal (const char *mount_path);

G_END_DECLS

#endif /* __G_UNIX_MOUNTS_H__ */
