[Utopia] gnome-vfs+hal debian packages



Hi,
  
  A few days ago i made some debian packages of gnome-vfs patched to work with
  hal. It's been working nicely for me and some others, so it's time to share :)

  Packages for i386, powerpc and sparc are available using the following source 
  lines:
    deb     ftp://luon.net/debian/ experimental main
    deb-src ftp://luon.net/debian/ experimental main

  Please also use the hal packages that are available there, as they fix a
  problem with detecting mounted drives/volumes.

  The patch i used is attached. It's a modification of J5's patch, which was a
  modification of my fixes to davidz latest hal vfs patch  :). This version
  shows the drive when it is removable, hotpluggable or has it's mountpoint in   /mnt or /media instead of hiding it when it's mounted on common unix 
  mountpoint.

  Sjoerd
-- 
The two most common things in the Universe are hydrogen and stupidity.
		-- Harlan Ellison
diff -Naur gnome-vfs2-2.6.1.1.vanilla/configure.in gnome-vfs2-2.6.1.1+hal/configure.in
--- gnome-vfs2-2.6.1.1.vanilla/configure.in	2004-04-20 11:48:15.000000000 +0200
+++ gnome-vfs2-2.6.1.1+hal/configure.in	2004-06-30 22:58:05.000000000 +0200
@@ -606,8 +606,33 @@
   fi
 fi
 
-PKG_CHECK_MODULES(LIBGNOMEVFS, glib-2.0 >= $GLIB_REQUIRED gmodule-2.0 >= $GLIB_REQUIRED gthread-2.0 >= $GLIB_REQUIRED gconf-2.0 >= $GCONF_REQUIRED bonobo-activation-2.0 >= $BONOBO_ACTIVATION_REQUIRED libbonobo-2.0 >= $BONOBO_REQUIRED ORBit-2.0 >= $ORBIT_REQUIRED libxml-2.0 >= $XML_REQUIRED gnome-mime-data-2.0)
-LIBGNOMEVFS_CFLAGS="$LIBGNOMEVFS_CFLAGS $OPENSSL_CFLAGS $LIBGNUTLS_CFLAGS"
+
+
+dnl ****************************
+dnl HAL stuff
+dnl ****************************
+
+AC_ARG_ENABLE(hal,
+AC_HELP_STRING([--enable-hal],[use hal, if available]),
+[case "${enableval}" in
+yes) ENABLE_HAL=yes ;;
+no)  ENABLE_HAL=no ;;
+*) AC_MSG_ERROR(bad value ${enableval} for --enable-hal) ;;
+esac],
+[ENABLE_HAL=yes]) dnl Default value
+
+if test "x$ENABLE_HAL" = "xyes"; then
+	PKG_CHECK_MODULES(HAL, hal >= 0.2.90,
+		[ USE_HAL="hal >= 0.2.90, dbus-1 >= 0.21, dbus-glib-1 >= 0.21"; HAL_CFLAGS="-DUSE_HAL"],
+		[ USE_HAL=""; HAL_CFLAGS="-UUSE_HAL" ])
+else
+	HAL_CFLAGS="-UUSE_HAL"
+	USE_HAL=""
+fi
+AC_SUBST(HAL_CFLAGS)
+
+PKG_CHECK_MODULES(LIBGNOMEVFS, glib-2.0 >= $GLIB_REQUIRED gmodule-2.0 >= $GLIB_REQUIRED gthread-2.0 >= $GLIB_REQUIRED gconf-2.0 >= $GCONF_REQUIRED bonobo-activation-2.0 >= $BONOBO_ACTIVATION_REQUIRED libbonobo-2.0 >= $BONOBO_REQUIRED ORBit-2.0 >= $ORBIT_REQUIRED libxml-2.0 >= $XML_REQUIRED gnome-mime-data-2.0 $USE_HAL)
+LIBGNOMEVFS_CFLAGS="$LIBGNOMEVFS_CFLAGS $OPENSSL_CFLAGS $LIBGNUTLS_CFLAGS $HAL_CFLAGS"
 LIBGNOMEVFS_LIBS="$LIBGNOMEVFS_LIBS $OPENSSL_LIBS $LIBGNUTLS_LIBS"
 AC_SUBST(LIBGNOMEVFS_CFLAGS)
 AC_SUBST(LIBGNOMEVFS_LIBS)
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/Makefile.am gnome-vfs2-2.6.1.1+hal/libgnomevfs/Makefile.am
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/Makefile.am	2004-03-01 10:43:30.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/Makefile.am	2004-06-30 22:58:05.000000000 +0200
@@ -137,6 +137,7 @@
 	gnome-vfs-daemon-method.h		\
 	gnome-vfs-filesystem-type.h		\
 	gnome-vfs-handle-private.h		\
+	gnome-vfs-hal-mounts.h			\
 	gnome-vfs-i18n.h			\
 	gnome-vfs-iso9660.h			\
 	gnome-vfs-job-queue.h			\
@@ -238,6 +239,7 @@
 	gnome-vfs-filesystem-type.c		\
 	gnome-vfs-find-directory.c		\
 	gnome-vfs-handle.c			\
+	gnome-vfs-hal-mounts.c			\
 	gnome-vfs-i18n.c			\
 	gnome-vfs-inet-connection.c		\
 	gnome-vfs-init.c			\
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-drive.c gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-drive.c
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-drive.c	2003-11-26 13:18:38.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-drive.c	2004-06-30 22:58:05.000000000 +0200
@@ -171,6 +171,9 @@
 	g_free (priv->activation_uri);
 	g_free (priv->display_name);
 	g_free (priv->icon);
+#ifdef USE_HAL
+	g_free (priv->hal_udi);
+#endif
 	g_free (priv);
 	drive->priv = NULL;
 	
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-hal-mounts.c gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-hal-mounts.c
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-hal-mounts.c	1970-01-01 01:00:00.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-hal-mounts.c	2004-07-01 00:54:24.000000000 +0200
@@ -0,0 +1,1176 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* gnome-vfs-hal-mounts.c - read and monitor volumes using freedesktop HAL
+
+   Copyright (C) 2004 David Zeuthen
+
+   The Gnome 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.
+
+   The Gnome 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 the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: David Zeuthen <david fubar dk>
+*/
+
+#ifdef USE_HAL
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fstab.h>
+#include <sys/sysmacros.h>
+#include <libgnomevfs/gnome-vfs-utils.h>
+#include <libgnomevfs/gnome-vfs-i18n.h>
+
+#include "gnome-vfs-hal-mounts.h"
+#include "gnome-vfs-volume-monitor-daemon.h"
+#include "gnome-vfs-volume-monitor-private.h"
+
+/** Use HAL to retrieve information about drives and volumes.
+ *
+ *  TODO, in no particular order
+ *
+ *  - Fixup rest of gnome-vfs such that '/' is allowed in the name of
+ *    drives and volumes
+ *
+ *  - More fancy icons for media; e.g. Compact Flash, Smart Media, Memory
+ *    Stick, SD/MMC, optical media (CD-ROM, CD-R, CD-RW, DVDROM, DVD-R,
+ *    DVD+R, DVD+RW, DVD-RW, DVD-RAM), gnome-dev-removable and 
+ *    gnome-dev-harddisk icons with USB, IDE, SCSI, Firewire logos on;
+ *    perhaps through emblems in Nautilus?
+ *
+ *  - Find a way to expose the HAL UDI of a drive and a volume such that
+ *    e.g. Nautilus can extract more properties on the device, e.g. eject
+ *    on blank media doesn't work very well. Also nice to put a music
+ *    player emblem on a volume icon if the removable storage is from a
+ *    portable music player (e.g. capabilities merged from .fdi files
+ *    for e.g. an iPod).
+ *
+ *  - Bug XYZ
+ *
+ *  - Lots of other stuff :-)
+ *
+ */
+
+
+/** If this is defined then only mounted volumes are shown which gives
+ *  a Mac OS X like experience. Otherwise unmounted volumes are shown
+ *  as a drive icon. Obviously, this requires an automounter like
+ *  gnome-volume-manager.
+ */
+/*#define HAL_ONLY_SHOW_MOUNTED_VOLUMES*/
+
+
+typedef struct {
+	char *udi;
+
+	int device_major;
+	int device_minor;
+	char *device_file;
+
+	char *bus;                /* ide, scsi, usb, firewire, ... */
+	char *vendor;             /* may be NULL, is never "" */
+	char *model;              /* may be NULL, is never "" */
+	gboolean is_hotpluggable;
+	gboolean is_removable;
+	gboolean no_partitions;
+	char *type;               /* disk, cdrom, compact_flash, memory_stick
+				   * smart_media, sd_mmc, ... */
+} GnomeVFSHalDrive;
+
+typedef struct {
+	char *udi;
+
+	int device_major;
+	int device_minor;
+	char *device_file;
+	char *volume_label; /* may be NULL, is never "" */
+	gboolean is_mounted;
+	char *mount_point;  /* NULL iff !is_mounted */
+	char *fstype;       /* NULL iff !is_mounted or unknown */
+
+	gboolean is_disc;
+	char *disc_type;    /* NULL iff !is_disc */
+	gboolean disc_has_audio;
+	gboolean disc_has_data;
+	gboolean disc_is_appendable;
+	gboolean disc_is_blank;
+	gboolean disc_is_rewritable;
+} GnomeVFSHalVolume;
+
+static void
+_hal_free_drive (GnomeVFSHalDrive *drive)
+{
+	if (drive == NULL )
+		return;
+
+	free (drive->udi);
+	hal_free_string (drive->device_file);
+	hal_free_string (drive->bus);
+	hal_free_string (drive->vendor);
+	hal_free_string (drive->model);
+	hal_free_string (drive->type);
+}
+
+
+static void
+_hal_free_vol (GnomeVFSHalVolume *vol)
+{
+	if (vol == NULL )
+		return;
+
+	free (vol->udi);
+	hal_free_string (vol->device_file);
+	hal_free_string (vol->volume_label);
+	hal_free_string (vol->fstype);
+	hal_free_string (vol->mount_point);
+	hal_free_string (vol->disc_type);
+}
+
+
+/** Given a UDI for a HAL device of capability 'storage', this
+ *  function retrieves all the relevant properties into a convenient
+ *  structure.  Returns NULL if UDI is invalid or device is not of
+ *  capability 'storage'.
+ *
+ *  Free with _hal_free_drive().
+ */
+static GnomeVFSHalDrive *
+_hal_get_drive (const char *udi, LibHalContext *hal_ctx)
+{
+	GnomeVFSHalDrive *drive;
+
+	drive = g_new0 (GnomeVFSHalDrive, 1);
+	if (drive == NULL)
+		goto error;
+
+	drive->udi = strdup (udi);
+	if (drive->udi == NULL)
+		goto error;
+
+	drive->device_file = hal_device_get_property_string (
+		hal_ctx, udi, "block.device");
+	if (drive->device_file == NULL)
+		goto error;
+
+	drive->bus = hal_device_get_property_string (
+		hal_ctx, udi, "storage.bus");
+	if (drive->bus == NULL)
+		goto error;
+
+	drive->vendor = hal_device_get_property_string (
+		hal_ctx, udi, "storage.vendor");
+	if (drive->vendor == NULL)
+		goto error;
+
+	drive->model = hal_device_get_property_string (
+		hal_ctx, udi, "storage.model");
+	if (drive->model == NULL)
+		goto error;
+
+	drive->type = hal_device_get_property_string (
+		hal_ctx, udi, "storage.drive_type");
+	if (drive->type == NULL)
+		goto error;
+	
+	drive->is_hotpluggable = hal_device_get_property_bool (
+		hal_ctx, udi, "storage.hotpluggable");
+
+	drive->is_removable = hal_device_get_property_bool (
+		hal_ctx, udi, "storage.removable");
+
+	drive->no_partitions = hal_device_get_property_bool (
+		hal_ctx, udi, "block.no_partitions");
+
+	return drive;
+error:
+	_hal_free_drive (drive);
+	return NULL;
+}
+
+/** Given a UDI for a HAL device of capability 'volume', this function
+ *  retrieves all the relevant properties into a convenient structure.
+ *  Returns NULL if UDI is invalid or device is not of capability
+ *  'volume'.
+ *
+ *  Free with _hal_free_vol().
+ */
+static GnomeVFSHalVolume *
+_hal_get_vol (const char *udi, LibHalContext *hal_ctx)
+{
+	GnomeVFSHalVolume *vol;
+
+	vol = g_new0 (GnomeVFSHalVolume, 1);
+	if (vol == NULL)
+		goto error;
+
+	/* only care about capability volume */
+	if (!hal_device_query_capability (
+		    hal_ctx,
+		    udi, "volume"))
+		goto error;
+
+	vol->udi = strdup (udi);
+	if (vol->udi == NULL)
+		goto error;
+
+	vol->device_major = hal_device_get_property_int (
+		hal_ctx, udi, "block.major");
+
+	vol->device_minor = hal_device_get_property_int (
+		hal_ctx, udi, "block.minor");
+
+	vol->device_file = hal_device_get_property_string (
+		hal_ctx,
+		udi, "block.device");
+	if (vol->device_file == NULL)
+		goto error;
+
+	if (hal_device_property_exists (
+		    hal_ctx,
+		    udi, "volume.label")) {
+		vol->volume_label = hal_device_get_property_string (
+			hal_ctx,
+			udi, "volume.label");
+		if (strlen (vol->volume_label) == 0) {
+			hal_free_string (vol->volume_label);
+			vol->volume_label = NULL;
+		}
+	}
+
+
+	vol->is_mounted = hal_device_get_property_bool (
+		hal_ctx,
+		udi, "volume.is_mounted");
+			    
+	if (vol->is_mounted) {
+		vol->mount_point = hal_device_get_property_string (
+			hal_ctx,
+			udi, "volume.mount_point");
+		if (vol->mount_point == NULL || strlen (vol->mount_point) == 0)
+			goto error;
+		
+	}
+
+	vol->fstype = hal_device_get_property_string (
+		hal_ctx,
+		udi, "volume.fstype");
+	if (vol->fstype == NULL)
+		goto error;
+	if (strlen(vol->fstype) == 0) {
+		hal_free_string (vol->fstype);
+		vol->fstype = NULL;
+	}
+
+	/* optical disc properties */
+	if (hal_device_get_property_bool (hal_ctx,
+					  udi, "volume.is_disc")) {
+		vol->is_disc = TRUE;
+
+		vol->disc_type = hal_device_get_property_string (
+			hal_ctx,
+			udi, "volume.disc.type");
+		if (vol->disc_type == NULL || strlen (vol->disc_type) == 0)
+			goto error;
+
+		vol->disc_has_audio = hal_device_get_property_bool (
+			hal_ctx,
+			udi, "volume.disc.has_audio");
+		vol->disc_has_data = hal_device_get_property_bool (
+			hal_ctx,
+			udi, "volume.disc.has_data");
+		vol->disc_is_appendable = hal_device_get_property_bool (
+			hal_ctx,
+			udi, "volume.disc.is_appendable");
+		vol->disc_is_blank = hal_device_get_property_bool (
+			hal_ctx,
+			udi, "volume.disc.is_blank");
+		vol->disc_is_rewritable = hal_device_get_property_bool (
+			hal_ctx,
+			udi, "volume.disc.is_rewritable");
+	}
+
+
+
+	return vol;
+
+error:
+	_hal_free_vol (vol);
+	return NULL;
+}
+
+/** Get the GnomeVFSHalDrive from a GnomeVFSHalVolume. Returns NULL on error.
+ *
+ *  Free with _hal_free_drive().
+ */
+static GnomeVFSHalDrive *
+_hal_get_drive_from_vol (GnomeVFSHalVolume *vol, LibHalContext *hal_ctx)
+{
+	const char *storage_udi;
+
+	storage_udi = hal_device_get_property_string (
+		hal_ctx, vol->udi, "block.storage_device");	
+	if (storage_udi == NULL)
+		goto error;
+
+	return _hal_get_drive (storage_udi, hal_ctx);
+error:
+	return NULL;
+}
+
+
+
+/***********************************************************************/
+
+/** Fixup the name given to GnomeVFS, it may not contain '/'-characters.
+ *  Substitute these with '-'.
+ */
+static void
+fixup_name (char *name)
+{
+	int i;
+
+	for (i=0; name[i]!='\0'; i++) {
+		if (name[i] == '/')
+			name[i] = '-';
+	}
+}
+
+/***********************************************************************/
+
+static char *_hal_get_vol_name (GnomeVFSHalVolume *vol, 
+				GnomeVFSHalDrive *drive, 
+				LibHalContext *hal_ctx);
+static char *_hal_get_vol_icon (GnomeVFSHalVolume *vol, 
+				GnomeVFSHalDrive *drive, 
+				LibHalContext *hal_ctx);
+static int _hal_get_vol_type (GnomeVFSHalVolume *vol, 
+			      GnomeVFSHalDrive *drive, 
+			      LibHalContext *hal_ctx);
+
+
+
+/* vol may be NULL */
+static char *
+_hal_get_drive_name (GnomeVFSHalVolume *vol, GnomeVFSHalDrive *drive, 
+		     LibHalContext *hal_ctx)
+{
+	char *name;
+
+
+#ifdef HAL_ONLY_SHOW_MOUNTED_VOLUMES
+	/* this is safe, as drives and volumes are 1:1 */
+	if (vol != NULL)
+		return _hal_get_vol_name (vol, drive, hal_ctx);
+#else
+	/* Bork, storage.removable is a bit broken on HAL (I fear only
+	 * .fdi files will fix it), so it's not sane to rely on this..
+	 * Which is bad, because without computer:/// looks ugly, e.g.
+	 * "<drive_name> : <volume_name>" even for storage that is
+	 * not removable. Bork.
+	 */
+
+        /*
+	if (vol != NULL && !drive->is_removable)
+		return _hal_get_vol_name (vol, drive, hal_ctx);
+	*/
+#endif
+
+	if (strcmp (drive->type, "cdrom") == 0) {
+		gboolean cdr;
+		gboolean cdrw;
+		gboolean dvd;
+		gboolean dvdplusr;
+		gboolean dvdplusrw;
+		gboolean dvdr;
+		gboolean dvdram;
+		char *first;
+		char *second;
+
+		/* use the capabilities of the cdrom device */
+
+		cdr = hal_device_get_property_bool (
+			hal_ctx, drive->udi, "storage.cdrom.cdr");
+		cdrw = hal_device_get_property_bool (
+			hal_ctx, drive->udi, "storage.cdrom.cdrw");
+		dvd = hal_device_get_property_bool (
+			hal_ctx, drive->udi, "storage.cdrom.dvd");
+		dvdplusr = hal_device_get_property_bool (
+			hal_ctx, drive->udi, "storage.cdrom.dvdplusr");
+		dvdplusrw = hal_device_get_property_bool (
+			hal_ctx, drive->udi, "storage.cdrom.dvdplusrw");
+		dvdr = hal_device_get_property_bool (
+			hal_ctx, drive->udi, "storage.cdrom.dvdr");
+		dvdram = hal_device_get_property_bool (
+			hal_ctx, drive->udi, "storage.cdrom.dvdram");
+
+		first = "CD-ROM";
+		if( cdr )
+			first = "CD-R";
+		if( cdrw )
+			first = "CD-RW";
+
+		/* Hmm, '/' is not an allowed character, so use '\' instead */
+		second = "";
+		if( dvd )
+			second = "\\DVD-ROM";
+		if( dvdplusr )
+			second = "\\DVD+R";
+		if( dvdplusrw )
+			second = "\\DVD+RW";
+		if( dvdr )
+			second = "\\DVD-R";
+		if( dvdram )
+			second = "\\DVD-RAM";
+		if( dvdplusr && dvdr )
+			second = "\\DVD±R";
+		if( dvdplusr && dvdplusrw && dvdr )
+			second = "\\DVD±RW";
+
+		name = g_strdup_printf ("%s%s", first, second);
+	} else {
+		name = g_strdup (drive->model);
+	}
+
+	fixup_name (name);
+
+	return name;
+}
+
+/* vol may be NULL */
+static char *
+_hal_get_drive_icon (GnomeVFSHalVolume *vol, GnomeVFSHalDrive *drive, 
+		     LibHalContext *hal_ctx)
+{
+	return g_strdup ("gnome-dev-removable");
+}
+
+/* vol may be NULL */
+static int
+_hal_get_drive_type (GnomeVFSHalVolume *vol, GnomeVFSHalDrive *drive, 
+		     LibHalContext *hal_ctx)
+{
+	int type = GNOME_VFS_DEVICE_TYPE_HARDDRIVE;
+
+	if (strcmp (drive->type, "cdrom") == 0)
+		type = GNOME_VFS_DEVICE_TYPE_CDROM;
+	else if (strcmp (drive->type, "compact_flash") == 0 ||
+		 strcmp (drive->type, "memory_stick") == 0 ||
+		 strcmp (drive->type, "smart_media") == 0 ||
+		 strcmp (drive->type, "sd_mmc") == 0)
+		type = GNOME_VFS_DEVICE_TYPE_MEMORY_STICK;
+
+	return type;
+}
+
+
+
+/***********************************************************************/
+
+static char *
+_hal_get_vol_name (GnomeVFSHalVolume *vol, GnomeVFSHalDrive *drive, 
+		   LibHalContext *hal_ctx)
+{
+	char *name = NULL;
+
+	if (vol->volume_label != NULL ) {
+
+		/* Using the label is the best thing */
+		name = g_strdup (vol->volume_label);
+
+	} else if (strcmp (drive->type, "cdrom") == 0) {
+
+		/* If it's a optical disc, use the disc type */
+		if (strcmp (vol->disc_type, "cd_rom") == 0) {
+			name = _("CD Disc");
+		} else if (strcmp (vol->disc_type, "cd_r") == 0) {
+			if (vol->disc_is_blank)
+				name = g_strdup (_("Blank CD-R Disc"));
+			else
+				name = _("CD-R Disc");
+		} else if (strcmp (vol->disc_type, "cd_rw") == 0) {
+			if (vol->disc_is_blank)
+				name = g_strdup (_("Blank CD-RW Disc"));
+			else
+				name = g_strdup (_("CD-RW Disc"));
+		} else if (strcmp (vol->disc_type, "dvd_rom") == 0) {
+					name = g_strdup (_("DVD-ROM Disc"));
+		} else if (strcmp (vol->disc_type, "dvd_r") == 0) {
+			if (vol->disc_is_blank)
+				name = g_strdup (_("Blank DVD-R Disc"));
+			else
+				name = g_strdup (_("DVD-R Disc"));
+		} else if (strcmp (vol->disc_type, "dvd_ram") == 0) {
+			if (vol->disc_is_blank)
+				name = g_strdup (_("Blank DVD-RAM Disc"));
+			else
+				name = g_strdup (_("DVD-RAM Disc"));
+		} else if ((strcmp (vol->disc_type, "dvd_rw_restricted_overwrite") == 0) || (strcmp (vol->disc_type, "dvd_rw") == 0)) {
+			if (vol->disc_is_blank)
+				name = g_strdup (_("Blank DVD-RW Disc"));
+			else
+				name = g_strdup (_("DVD-RW Disc"));
+		} else if (strcmp (vol->disc_type, "dvd_plus_rw") == 0) {
+			if (vol->disc_is_blank)
+				name = g_strdup (_("Blank DVD+RW Disc"));
+			else
+				name = g_strdup (_("DVD+RW Disc"));
+		} else if (strcmp (vol->disc_type, "dvdplusr") == 0) {
+			if (vol->disc_is_blank)
+				name = g_strdup (_("Blank DVD+R Disc"));
+			else
+				name = g_strdup (_("DVD+R Disc"));
+		} else {
+			name = g_strdup (_("Optical Disc"));
+		}
+
+	} else if (strcmp (drive->type, "compact_flash") == 0) {
+		name = g_strdup (_("Compact Flash Media"));
+	} else if (strcmp (drive->type, "memory_stick") == 0) {
+		name = g_strdup (_("Memory Stick Media"));
+	} else if (strcmp (drive->type, "smart_media") == 0) {
+		name = g_strdup (_("Smart Media Media"));
+	} else if (strcmp (drive->type, "sd_mmc") == 0) {
+		name = g_strdup (_("SD/MMC Media"));
+	} else if (strcmp (drive->type, "disk") == 0) {
+
+		/* Look at the filesystem type, if applicable */
+		if (vol->fstype != NULL) {
+
+			    if (strcmp (vol->fstype, "hfs") == 0) {
+				    name = g_strdup (_("Mac OS disk"));
+			    } else if (strcmp (vol->fstype, "hfsplus") == 0) {
+				    name = g_strdup (_("Mac OS X disk"));
+			    } /*else if (strcmp (vol->fstype, "vfat") == 0 ||
+				strcmp (vol->fstype, "fat") == 0 ||
+				strcmp (vol->fstype, "msdos") == 0 ||
+				strcmp (vol->fstype, "msdosfs") == 0 ) {
+				name = g_strdup (_("PC Interchange Disk"));
+				}*/ 
+			    else if (strcmp (vol->fstype, "ntfs") == 0) {
+				    name = g_strdup (_("Windows Disk"));
+			    } else if (strcmp (vol->fstype, "ext2") == 0 ||
+				       strcmp (vol->fstype, "ext3") == 0 ||
+				       strcmp (vol->fstype, "jfs") == 0 ||
+				       strcmp (vol->fstype, "xfs") == 0 ||
+				       strcmp (vol->fstype, "reiser") == 0) {
+				    name = g_strdup (_("Linux Disk"));
+			    }
+		}
+	}
+
+	/* fallback; use the same name as the drive */
+	if (name == NULL)
+		name = _hal_get_drive_name (NULL, drive, hal_ctx);
+
+	fixup_name (name);
+
+	return name;
+}
+
+static char *
+_hal_get_vol_icon (GnomeVFSHalVolume *vol, GnomeVFSHalDrive *drive, 
+		   LibHalContext *hal_ctx)
+{
+	char *icon;
+
+	if (strcmp (drive->type, "cdrom") == 0) {
+		icon = g_strdup ("gnome-dev-cdrom");
+	} else if (strcmp (drive->type, "compact_flash") == 0 ||
+		   strcmp (drive->type, "memory_stick") == 0 ||
+		   strcmp (drive->type, "smart_media") == 0 ||
+		   strcmp (drive->type, "sd_mmc") == 0) {
+		icon = g_strdup ("gnome-dev-jazdisk");
+	} else {
+		icon = g_strdup ("gnome-dev-harddisk");
+	}
+	
+	return icon;
+}
+
+static int
+_hal_get_vol_type (GnomeVFSHalVolume *vol, GnomeVFSHalDrive *drive, 
+		   LibHalContext *hal_ctx)
+{
+	return _hal_get_drive_type (NULL, drive, hal_ctx);
+}
+
+/***********************************************************************/
+
+/** This function is used to skip certain volumes/drives we don't
+ *  want to expose in GnomeVFS.
+ *
+ */
+static gboolean
+_hal_check_for_skip (GnomeVFSHalDrive *hal_drive, 
+		     GnomeVFSHalVolume *hal_vol,  /* may be NULL */
+		     char *mount_point)
+{
+	/* Skip volumes where HAL couldn't figure out the filesystem type */
+	if (hal_vol != NULL) {
+		/* but allow blank discs */
+		if (!(hal_vol->is_disc && hal_vol->disc_is_blank)) {
+			if (hal_vol->fstype == NULL)
+				return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+/** This function is checks if we want to have the drive/volume user_visible
+ */
+static gboolean
+_hal_check_for_show(GnomeVFSHalDrive *hal_drive, char *mount_point) {
+  /* return true if the drive is removable or the volume is mounted in /media
+   * or /mnt */
+  if (hal_drive->is_removable || hal_drive->is_hotpluggable) {
+    return TRUE;
+  }
+  if (!strncmp(mount_point, "/mnt", 4) || !strncmp(mount_point, "/media", 6)) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/***********************************************************************/
+
+
+/** Add a drive where the media is not partition based.
+ *
+ *  It's safe to call this function multiple times for the same HAL 
+ *  UDI (Unique Device Identifier).
+ */
+static void 
+_hal_add_drive_no_partitions (
+	GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon,
+	const char *udi)
+{
+	GnomeVFSHalDrive *hal_drive = NULL;
+	LibHalContext *hal_ctx = volume_monitor_daemon->hal_ctx;
+	GnomeVFSDrive *drive;
+	GnomeVFSVolumeMonitor *volume_monitor = 
+		GNOME_VFS_VOLUME_MONITOR (volume_monitor_daemon);
+	char *name = NULL;
+	char *icon = NULL;
+	GnomeVFSDeviceType device_type = GNOME_VFS_DEVICE_TYPE_HARDDRIVE;
+	struct fstab *fst;
+	char *mount_point = NULL;
+
+#ifdef HAL_ONLY_SHOW_MOUNTED_VOLUMES
+	return;
+#endif
+
+	/*
+	 * We create the GnomeVFSDrive for such beasts since we can
+	 * actually do it in advance due to the fact that we already
+	 * know the device file and the mount point.
+	 */
+	
+	hal_drive = _hal_get_drive (udi, hal_ctx);
+	if (hal_drive == NULL)
+		goto out;
+
+	/* get mount point from /etc/fstab */
+	if (setfsent () == 1) {
+		fst = getfsspec (hal_drive->device_file);
+		if (fst != NULL )
+			mount_point = strdup (fst->fs_file);
+		endfsent ();
+	}
+	if (mount_point == NULL || mount_point[0] != '/')
+		goto out;
+
+	/* See if we should skip this */
+	if (_hal_check_for_skip (hal_drive, NULL, mount_point))
+		goto out;
+	
+	/* see if drive was already added */
+	drive = _gnome_vfs_volume_monitor_find_drive_by_hal_udi (
+		volume_monitor, udi);
+	if (drive == NULL ) {
+
+		/* nope, make one */
+		
+		name = _hal_get_drive_name (NULL, hal_drive, hal_ctx);
+		icon = _hal_get_drive_icon (NULL, hal_drive, hal_ctx);
+		device_type = _hal_get_drive_type (NULL, hal_drive, hal_ctx);
+		
+		drive = g_object_new (GNOME_VFS_TYPE_DRIVE, NULL);
+		drive->priv->device_path = g_strdup (hal_drive->device_file);
+		
+		drive->priv->activation_uri = gnome_vfs_get_uri_from_local_path (mount_point);
+		drive->priv->is_connected = TRUE;
+		drive->priv->device_type = device_type;
+		drive->priv->icon = g_strdup (icon);
+		drive->priv->display_name = _gnome_vfs_volume_monitor_uniquify_drive_name (volume_monitor, name);
+		drive->priv->is_user_visible = _hal_check_for_show(hal_drive, mount_point);
+		drive->priv->volume = NULL;
+		drive->priv->hal_udi = g_strdup (udi);
+		
+		_gnome_vfs_volume_monitor_connected (volume_monitor, drive);
+		gnome_vfs_drive_unref (drive);
+	}
+	
+out:
+	_hal_free_drive (hal_drive);
+	g_free (name);
+	g_free (icon);
+	free (mount_point);
+}
+
+
+/** Add a hal-volume, that is, a HalDevice of capability 'volume'. 
+ *
+ *  It's safe to call this function multiple times for the same HAL 
+ *  UDI (Unique Device Identifier).
+ */
+static void 
+_hal_add_volume (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon,
+		 const char *udi)
+{
+	GnomeVFSHalVolume *hal_vol = NULL;
+	GnomeVFSHalDrive *hal_drive = NULL;
+	LibHalContext *hal_ctx = volume_monitor_daemon->hal_ctx;
+
+	GnomeVFSDrive *drive;
+	GnomeVFSVolume *vol;
+	GnomeVFSVolumeMonitor *volume_monitor = 
+		GNOME_VFS_VOLUME_MONITOR (volume_monitor_daemon);
+	char *name = NULL;
+	char *icon = NULL;
+	GnomeVFSDeviceType device_type = GNOME_VFS_DEVICE_TYPE_HARDDRIVE;
+  gboolean desktop_visible = FALSE;
+	struct fstab *fst;
+	char *mount_point = NULL;
+	gboolean is_blank_disc = FALSE;
+
+	/* Only care about capability volume */
+	if (!hal_device_query_capability (
+		    volume_monitor_daemon->hal_ctx,
+		    udi, "volume"))
+	{
+
+		/* And capability block where block.no_partition==TRUE and
+		 * block.is_volume==FALSE
+		 */
+		if (hal_device_query_capability (
+			    hal_ctx, udi, "block") &&
+		    (hal_device_get_property_bool (
+			    hal_ctx, udi, "block.no_partitions")==TRUE) &&
+		    (hal_device_get_property_bool (
+			    hal_ctx, udi, "block.is_volume")==FALSE)) {
+			/* This represent top-level block devices with
+			 * media not using partitions.. Such as floppy
+			 * drives or optical drives..
+			 */
+
+			_hal_add_drive_no_partitions (
+				volume_monitor_daemon, udi);
+			goto out;
+
+		} else {
+			/* Nothing we can use... */
+			goto out;
+		}
+	}
+
+
+	/* get HAL drive and volume objects */
+	hal_vol = _hal_get_vol (udi, hal_ctx);
+	if (hal_vol == NULL)
+		goto out;
+	hal_drive = _hal_get_drive_from_vol (hal_vol, hal_ctx);
+	if (hal_drive == NULL)
+		goto out;
+
+	/* See if we should have an icon on the desktop */
+	if (hal_drive->is_hotpluggable || hal_vol->is_disc)
+		desktop_visible = TRUE;
+
+	/* If we are mounted, use the mount point that HAL knows */
+	if (hal_vol->is_mounted) {
+		mount_point = strdup (hal_vol->mount_point);
+	} else {
+		/* Otherwise... Yuck.. 
+		 *
+		 * gnome-vfs expects a mount point for a not yet
+		 * mounted volume which is kind of gross as it may be
+		 * mounted anywhere by e.g. root in the
+		 * future. Surely, this is not needed at all,
+		 * gnome-vfs should just be able to do a 'mount
+		 * /dev/sda1' or something.
+		 *
+		 * Now, HAL *could* monitor the /etc/fstab file and
+		 * maintain volume.mount_point property while
+		 * volume.is_mounted is FALSE, but this is unclean and
+		 * we really want the volume.mount_point to be empty
+		 * if, and only if, volume.is_mounted is FALSE.
+		 *
+		 * So, we just need to read the /etc/fstab here to
+		 * find the mount point (which is probably created by
+		 * a callout anyway). Oh well, piece of cake anyway..
+		 */
+		if (setfsent () == 1) {
+			fst = getfsspec (hal_vol->device_file);
+			if (fst != NULL )
+				mount_point = strdup (fst->fs_file);
+			endfsent ();
+		}
+	}
+
+	/* And we do need a mount point, and now we tried so hard to find
+	 * one.. bail out if we haven't got any.. 
+	 *
+	 * Further, getfspec above may return 'swap', so only accept a mount
+	 * point that starts with /. Hmmm..
+	 */
+	if (mount_point == NULL || mount_point[0]!='/')
+		goto out;
+
+	/* see if we're a blank disc instead of being mounted */
+	is_blank_disc = hal_vol->is_disc && hal_vol->disc_is_blank;
+
+	/* See if we should skip this */
+	if (_hal_check_for_skip (hal_drive, hal_vol, mount_point))
+		goto out;
+
+#ifdef HAL_ONLY_SHOW_MOUNTED_VOLUMES
+	/* we should also show blank discs */
+	if (!hal_vol->is_mounted && !is_blank_disc)
+		goto out;
+#endif
+
+	/* see if it was already added */
+	drive = _gnome_vfs_volume_monitor_find_drive_by_hal_udi (
+		volume_monitor, 
+#ifdef HAL_ONLY_SHOW_MOUNTED_VOLUMES
+			udi);
+#else
+			hal_drive->no_partitions ? hal_drive->udi : udi);
+#endif
+	if (drive == NULL ) {
+
+		/* nope, make one */
+
+		name = _hal_get_drive_name (hal_vol, hal_drive, hal_ctx);
+		icon = _hal_get_drive_icon (hal_vol, hal_drive, hal_ctx);
+		device_type = _hal_get_drive_type (hal_vol, hal_drive, hal_ctx);
+
+		drive = g_object_new (GNOME_VFS_TYPE_DRIVE, NULL);
+		drive->priv->device_path = g_strdup (hal_vol->device_file);
+
+		drive->priv->activation_uri = gnome_vfs_get_uri_from_local_path (mount_point);
+		drive->priv->is_connected = TRUE;
+		drive->priv->device_type = device_type;
+		drive->priv->icon = g_strdup (icon);
+		drive->priv->display_name = _gnome_vfs_volume_monitor_uniquify_drive_name (volume_monitor, name);
+    drive->priv->is_user_visible = _hal_check_for_show(hal_drive, mount_point);
+		drive->priv->volume = NULL;
+
+		drive->priv->hal_udi = g_strdup (
+#ifdef HAL_ONLY_SHOW_MOUNTED_VOLUMES
+			udi);
+#else
+			hal_drive->no_partitions ? hal_drive->udi : udi);
+#endif
+		
+		_gnome_vfs_volume_monitor_connected (volume_monitor, drive);
+		gnome_vfs_drive_unref (drive);
+	} 
+
+	g_free (name); name = NULL;
+	g_free (icon); icon = NULL;
+
+	/* drive is now a reference to GnomeVFSDrive */
+
+	/* Only create a GnomeVFSVolume object if the volume is mounted 
+	 * or a blank disc */
+	if (hal_vol->is_mounted || is_blank_disc) {
+		/* see if hal_vol was already added */
+		vol = _gnome_vfs_volume_monitor_find_volume_by_hal_udi (
+			volume_monitor, udi);
+		if (vol == NULL ) {
+
+			name = _hal_get_vol_name (hal_vol, hal_drive, hal_ctx);
+			icon = _hal_get_vol_icon (hal_vol, hal_drive, hal_ctx);
+			device_type = _hal_get_vol_type (hal_vol, hal_drive, hal_ctx);
+
+			vol = g_object_new (GNOME_VFS_TYPE_VOLUME, NULL);
+			vol->priv->volume_type = GNOME_VFS_VOLUME_TYPE_MOUNTPOINT;
+			
+			if (is_blank_disc) {
+				vol->priv->device_path = g_strdup (hal_vol->device_file);
+				vol->priv->activation_uri = g_strdup ("burn:///");
+				vol->priv->unix_device = makedev (hal_vol->device_major, 
+								  hal_vol->device_minor);
+				vol->priv->filesystem_type = g_strdup (hal_vol->fstype);
+
+			} else {
+				vol->priv->device_path = g_strdup (hal_vol->device_file);
+				vol->priv->activation_uri = gnome_vfs_get_uri_from_local_path (mount_point);
+				vol->priv->unix_device = makedev (hal_vol->device_major, 
+								  hal_vol->device_minor);
+				vol->priv->filesystem_type = g_strdup (hal_vol->fstype);
+			}
+
+			vol->priv->is_read_only = FALSE;
+			vol->priv->is_mounted = TRUE;
+			
+			vol->priv->device_type = device_type;
+			
+			vol->priv->display_name = _gnome_vfs_volume_monitor_uniquify_volume_name (volume_monitor, name);
+			vol->priv->icon = g_strdup(icon);
+			vol->priv->is_user_visible = desktop_visible;
+			vol->priv->hal_udi = g_strdup (udi);
+			
+			vol->priv->drive = drive;
+			_gnome_vfs_drive_set_mounted_volume (drive, vol);
+			
+			_gnome_vfs_volume_monitor_mounted (volume_monitor, vol);			gnome_vfs_volume_unref (vol);
+
+		}
+	}
+
+out:
+	_hal_free_vol (hal_vol);
+	_hal_free_drive (hal_drive);
+	g_free (name);
+	g_free (icon);
+	free (mount_point);
+}
+
+
+/** Remove a hal-volume, that is, a HalDevice of capability 'volume'. 
+ *
+ *  It's safe to call this function even though the hal-volume doesn't
+ *  correspond to any (GnomeVFSDrive, GnomeVFSVolume) pair.
+ */
+static void 
+_hal_remove_volume (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon,
+		    const char *udi)
+{
+	GnomeVFSDrive *drive;
+	GnomeVFSVolume *vol;
+	GnomeVFSVolumeMonitor *volume_monitor;
+
+	volume_monitor = GNOME_VFS_VOLUME_MONITOR (volume_monitor_daemon);
+
+	drive = _gnome_vfs_volume_monitor_find_drive_by_hal_udi (
+		volume_monitor, udi);
+	if (drive != NULL ) {
+		_gnome_vfs_volume_monitor_disconnected (volume_monitor, drive);
+	}
+
+	vol = _gnome_vfs_volume_monitor_find_volume_by_hal_udi (
+		volume_monitor, udi);
+	if (vol != NULL ) {
+		_gnome_vfs_volume_monitor_unmounted (volume_monitor, vol);
+	}
+}
+
+
+/** Call when a HAL volume is unmounted.
+ *
+ *  It's safe to call this function even though the hal-volume doesn't
+ *  correspond to GnomeVFSVolume object.
+ */
+static void 
+_hal_volume_unmounted (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon,
+		       const char *udi)
+{
+	GnomeVFSVolume *vol;
+	GnomeVFSVolumeMonitor *volume_monitor;
+
+	volume_monitor = GNOME_VFS_VOLUME_MONITOR (volume_monitor_daemon);
+
+	vol = _gnome_vfs_volume_monitor_find_volume_by_hal_udi (
+		volume_monitor, udi);
+
+	if (vol != NULL ) {
+		_gnome_vfs_volume_monitor_unmounted (volume_monitor, vol);
+	}
+
+#ifdef HAL_ONLY_SHOW_MOUNTED_VOLUMES
+	{
+		GnomeVFSDrive *drive;
+		drive = _gnome_vfs_volume_monitor_find_drive_by_hal_udi (
+			volume_monitor, udi);
+		if (drive != NULL ) {
+			_gnome_vfs_volume_monitor_disconnected (volume_monitor, drive);
+		}
+	}
+#endif
+
+}
+
+
+void 
+_gnome_vfs_monitor_hal_get_volume_list (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon)
+{
+	int i;
+	int num_hal_volumes;
+	char **hal_volumes;
+	GnomeVFSVolumeMonitor *volume_monitor;
+
+
+	volume_monitor = GNOME_VFS_VOLUME_MONITOR (volume_monitor_daemon);
+
+	hal_volumes = hal_find_device_by_capability (
+		volume_monitor_daemon->hal_ctx,
+		"volume",
+		&num_hal_volumes);
+	for (i=0; i<num_hal_volumes; i++) {
+		char *udi;
+
+		udi = hal_volumes [i];
+
+		_hal_add_volume (volume_monitor_daemon, udi);
+	}
+	hal_free_string_array (hal_volumes);
+
+	hal_volumes = hal_find_device_by_capability (
+		volume_monitor_daemon->hal_ctx,
+		"block",
+		&num_hal_volumes);
+	for (i=0; i<num_hal_volumes; i++) {
+		char *udi;
+
+		udi = hal_volumes [i];
+
+		_hal_add_volume (volume_monitor_daemon, udi);
+	}
+	hal_free_string_array (hal_volumes);
+}
+
+static void
+_hal_mainloop_integration (LibHalContext *ctx, 
+			   DBusConnection * dbus_connection)
+{
+        dbus_connection_setup_with_g_main (dbus_connection, NULL);
+}
+
+static void 
+_hal_device_added (LibHalContext *ctx, 
+		   const char *udi)
+{
+	GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon;
+	volume_monitor_daemon = (GnomeVFSVolumeMonitorDaemon *)
+		hal_ctx_get_user_data (ctx);
+	_hal_add_volume (volume_monitor_daemon, udi);
+}
+
+static void 
+_hal_device_removed (LibHalContext *ctx, 
+		   const char *udi)
+{
+	GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon;
+	volume_monitor_daemon = (GnomeVFSVolumeMonitorDaemon *)
+		hal_ctx_get_user_data (ctx);
+	_hal_remove_volume (volume_monitor_daemon, udi);
+}
+
+static void 
+_hal_device_new_capability (LibHalContext *ctx, 
+			    const char *udi, 
+			    const char *capability)
+{
+	GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon;
+	volume_monitor_daemon = (GnomeVFSVolumeMonitorDaemon *)
+		hal_ctx_get_user_data (ctx);
+	_hal_add_volume (volume_monitor_daemon, udi);
+}
+
+static void 
+_hal_device_lost_capability (LibHalContext *ctx, 
+			     const char *udi,
+			     const char *capability)
+{
+}
+
+static void 
+_hal_device_property_modified (LibHalContext *ctx, 
+			       const char *udi,
+			       const char *key,
+			       dbus_bool_t is_removed,
+			       dbus_bool_t is_added)
+{
+	GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon;
+	volume_monitor_daemon = (GnomeVFSVolumeMonitorDaemon *)
+		hal_ctx_get_user_data (ctx);
+
+	if (!is_removed && strcmp (key, "volume.is_mounted") == 0) {
+		dbus_bool_t is_mounted;
+
+		is_mounted = hal_device_get_property_bool(
+			ctx, udi, "volume.is_mounted");
+
+		if( is_mounted )
+			_hal_add_volume (volume_monitor_daemon, udi);
+		else
+			_hal_volume_unmounted (volume_monitor_daemon, udi);
+	}
+}
+
+static void 
+_hal_device_condition (LibHalContext *ctx, 
+		       const char *udi,
+		       const char *condition_name,
+		       DBusMessage *message)
+{
+	GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon;
+	volume_monitor_daemon = (GnomeVFSVolumeMonitorDaemon *)
+		hal_ctx_get_user_data (ctx);
+
+	if (strcmp (condition_name, "BlockForcedUnmountPartition") == 0) {
+		_hal_remove_volume (volume_monitor_daemon, udi);
+	}
+}
+
+static LibHalFunctions
+hal_functions = { _hal_mainloop_integration,
+		  _hal_device_added,
+		  _hal_device_removed,
+		  _hal_device_new_capability,
+		  _hal_device_lost_capability,
+		  _hal_device_property_modified,
+		  _hal_device_condition };
+
+void
+_gnome_vfs_monitor_hal_mounts_init (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon)
+{
+	/* initialise the connection to the hal daemon */
+	if ((volume_monitor_daemon->hal_ctx = 
+	     hal_initialize (&hal_functions, FALSE)) == NULL) {
+		g_warning ("hal_initialize failed\n");
+		/* XXX how should this be handled? */
+		exit (1);
+	}
+
+	hal_ctx_set_user_data (volume_monitor_daemon->hal_ctx,
+			       volume_monitor_daemon);
+
+	hal_device_property_watch_all (volume_monitor_daemon->hal_ctx);
+}
+
+void
+_gnome_vfs_monitor_hal_mounts_shutdown (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon)
+{
+	if (hal_shutdown (volume_monitor_daemon->hal_ctx) != 0) {
+		g_warning ("hal_shutdown failed\n");
+	}
+}
+
+#endif /* USE_HAL */
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-hal-mounts.h gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-hal-mounts.h
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-hal-mounts.h	1970-01-01 01:00:00.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-hal-mounts.h	2004-06-30 22:58:05.000000000 +0200
@@ -0,0 +1,45 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* gnome-vfs-hal-mounts.h - read and monitor volumes using freedesktop HAL
+
+   Copyright (C) 2004 David Zeuthen
+
+   The Gnome 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.
+
+   The Gnome 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 the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: David Zeuthen <david fubar dk>
+*/
+
+#ifndef GNOME_VFS_HAL_MOUNTS_H
+#define GNOME_VFS_HAL_MOUNTS_H
+
+#include <glib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <hal/libhal.h>
+#include <dbus/dbus-glib.h>
+
+#include "gnome-vfs-volume-monitor-daemon.h"
+
+void _gnome_vfs_monitor_hal_mounts_init (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon);
+
+void _gnome_vfs_monitor_hal_mounts_shutdown (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon);
+
+void _gnome_vfs_monitor_hal_get_volume_list (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon);
+
+
+
+#endif /* GNOME_VFS_HAL_MOUNTS_H */
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume-monitor-daemon.c gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume-monitor-daemon.c
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume-monitor-daemon.c	2004-01-27 19:59:13.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume-monitor-daemon.c	2004-06-30 22:58:05.000000000 +0200
@@ -34,12 +34,19 @@
 #include "gnome-vfs-cdrom.h"
 #include "gnome-vfs-filesystem-type.h"
 
+#ifdef USE_HAL
+#include "gnome-vfs-hal-mounts.h"
+#endif /* USE_HAL */
+
 static void gnome_vfs_volume_monitor_daemon_class_init (GnomeVFSVolumeMonitorDaemonClass *klass);
 static void gnome_vfs_volume_monitor_daemon_init       (GnomeVFSVolumeMonitorDaemon      *volume_monitor_daemon);
 static void gnome_vfs_volume_monitor_daemon_finalize   (GObject                          *object);
 
+#ifndef USE_HAL
 static void update_fstab_drives (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon);
 static void update_mtab_volumes (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon);
+#endif /* !USE_HAL */
+
 static void update_connected_servers (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon);
 
 typedef struct {
@@ -106,6 +113,7 @@
 	o_class->finalize = gnome_vfs_volume_monitor_daemon_finalize;
 }
 
+#ifndef USE_HAL
 static void
 fstab_changed (gpointer data)
 {
@@ -123,6 +131,7 @@
 	volume_monitor = data;
 	update_mtab_volumes (volume_monitor);
 }
+#endif  /* !USE_HAL */
 
 static void
 connected_servers_changed (GConfClient* client,
@@ -140,10 +149,14 @@
 static void
 gnome_vfs_volume_monitor_daemon_init (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon)
 {
+#ifdef USE_HAL
+	_gnome_vfs_monitor_hal_mounts_init (volume_monitor_daemon);
+#else
 	_gnome_vfs_monitor_unix_mounts (fstab_changed,
 					volume_monitor_daemon,
 					mtab_changed,
 					volume_monitor_daemon);
+#endif /* USE_HAL */
 
 	volume_monitor_daemon->gconf_client = gconf_client_get_default ();
 	gconf_client_add_dir (volume_monitor_daemon->gconf_client,
@@ -160,16 +173,24 @@
 					 NULL);
 								       
 	
+#ifdef USE_HAL
+	_gnome_vfs_monitor_hal_get_volume_list (volume_monitor_daemon);
+#else
 	update_fstab_drives (volume_monitor_daemon);
 	update_mtab_volumes (volume_monitor_daemon);
+#endif /* USE_HAL */
 	update_connected_servers (volume_monitor_daemon);
 }
 
 void
 gnome_vfs_volume_monitor_daemon_force_probe (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon)
 {
+#ifdef USE_HAL
+	_gnome_vfs_monitor_hal_get_volume_list (volume_monitor_daemon);
+#else
 	update_fstab_drives (volume_monitor_daemon);
 	update_mtab_volumes (volume_monitor_daemon);
+#endif /* USE_HAL */
 	update_connected_servers (volume_monitor_daemon);
 }
 
@@ -184,6 +205,9 @@
 		
 	_gnome_vfs_stop_monitoring_unix_mounts ();
 
+#ifdef USE_HAL
+	_gnome_vfs_monitor_hal_mounts_shutdown (volume_monitor_daemon);
+#else
 	g_list_foreach (volume_monitor_daemon->last_mtab,
 			(GFunc)_gnome_vfs_unix_mount_free, NULL);
 	g_list_free (volume_monitor_daemon->last_mtab);
@@ -191,6 +215,7 @@
 	g_list_foreach (volume_monitor_daemon->last_fstab,
 			(GFunc)_gnome_vfs_unix_mount_point_free, NULL);
 	g_list_free (volume_monitor_daemon->last_fstab);	
+#endif /* USE_HAL */
 
 	gconf_client_notify_remove (volume_monitor_daemon->gconf_client,
 				    volume_monitor_daemon->connected_id);
@@ -201,6 +226,7 @@
 		(* G_OBJECT_CLASS (parent_class)->finalize) (object);
 }
 
+#ifndef USE_HAL
 static GnomeVFSDeviceType
 get_device_type_from_device_and_mount (const char *device_path, const char *mount_path)
 {
@@ -376,6 +402,8 @@
 
 	return g_strdup (icon_name);
 }
+#endif /* !USE_HAL */
+
 
 static void
 diff_sorted_lists (GList *list1, GList *list2, GCompareFunc compare,
@@ -412,6 +440,7 @@
 
 /************************* fstab drives ***********************************/
 
+#ifndef USE_HAL
 static void
 fixup_mountpoint (GnomeVFSUnixMountPoint *mount)
 {
@@ -862,6 +891,8 @@
 	
 }
 
+#endif /* !USE_HAL */
+
 /************************* connected server ***********************************/
 
 static void
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume-monitor-daemon.h gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume-monitor-daemon.h
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume-monitor-daemon.h	2004-01-27 19:59:13.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume-monitor-daemon.h	2004-06-30 22:58:05.000000000 +0200
@@ -29,6 +29,10 @@
 #include <gconf/gconf-client.h>
 #include "gnome-vfs-volume-monitor.h"
 
+#ifdef USE_HAL
+#include <hal/libhal.h>
+#endif /* USE_HAL */
+
 G_BEGIN_DECLS
 
 #define GNOME_VFS_TYPE_VOLUME_MONITOR_DAEMON        (gnome_vfs_volume_monitor_daemon_get_type ())
@@ -43,8 +47,12 @@
 struct _GnomeVFSVolumeMonitorDaemon {
 	GnomeVFSVolumeMonitor parent;
 
+#ifdef USE_HAL
+	LibHalContext *hal_ctx;
+#else
 	GList *last_fstab;
 	GList *last_mtab;
+#endif /* USE_HAL */
 	GList *last_connected_servers;
 	
 	GConfClient *gconf_client;
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume-monitor-private.h gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume-monitor-private.h
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume-monitor-private.h	2004-01-22 16:35:01.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume-monitor-private.h	2004-06-30 22:58:05.000000000 +0200
@@ -62,6 +62,10 @@
 
 	/* Only for connected servers */
 	char *gconf_id;
+
+#ifdef USE_HAL
+	char *hal_udi;
+#endif /* USE_HAL */
 };
 
 
@@ -79,6 +83,10 @@
 	
 	gboolean is_user_visible;
 	gboolean is_connected;
+
+#ifdef USE_HAL
+	char *hal_udi;
+#endif /* USE_HAL */
 };
 
 void _gnome_vfs_volume_set_drive                (GnomeVFSVolume        *volume,
@@ -124,6 +132,14 @@
 GnomeVFSVolume *_gnome_vfs_volume_monitor_find_connected_server_by_gconf_id  (GnomeVFSVolumeMonitor *volume_monitor,
 									      const char            *id);
 
+#ifdef USE_HAL
+GnomeVFSVolume *_gnome_vfs_volume_monitor_find_volume_by_hal_udi (GnomeVFSVolumeMonitor *volume_monitor,
+								  const char *hal_udi);
+GnomeVFSDrive *_gnome_vfs_volume_monitor_find_drive_by_hal_udi (GnomeVFSVolumeMonitor *volume_monitor,
+								const char           *hal_udi);
+
+#endif /* USE_HAL */
+
 
 char *_gnome_vfs_volume_monitor_uniquify_volume_name (GnomeVFSVolumeMonitor *volume_monitor,
 						      const char            *name);
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume-monitor.c gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume-monitor.c
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume-monitor.c	2003-11-26 13:18:38.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume-monitor.c	2004-07-01 00:48:38.000000000 +0200
@@ -253,6 +253,56 @@
 }
 
 
+
+#ifdef USE_HAL
+GnomeVFSVolume *
+_gnome_vfs_volume_monitor_find_volume_by_hal_udi (GnomeVFSVolumeMonitor *volume_monitor,
+						  const char *hal_udi)
+{
+	GList *l;
+	GnomeVFSVolume *vol, *ret;
+
+	/* Doesn't need locks, only called internally on main thread and doesn't write */
+	
+	ret = NULL;
+	for (l = volume_monitor->priv->mtab_volumes; l != NULL; l = l->next) {
+		vol = l->data;
+		if (vol->priv != NULL && vol->priv->hal_udi != NULL && 
+		    vol->priv->activation_uri != NULL && /* Hmm */
+		    strcmp (vol->priv->hal_udi, hal_udi) == 0) {
+			ret = vol;
+			break;
+		}
+	}
+	
+	return ret;
+}
+
+GnomeVFSDrive *
+_gnome_vfs_volume_monitor_find_drive_by_hal_udi (GnomeVFSVolumeMonitor *volume_monitor,
+						 const char           *hal_udi)
+{
+	GList *l;
+	GnomeVFSDrive *drive, *ret;
+
+	/* Doesn't need locks, only called internally on main thread and doesn't write */
+	
+	ret = NULL;
+	for (l = volume_monitor->priv->fstab_drives; l != NULL; l = l->next) {
+		drive = l->data;
+		if (drive->priv != NULL && drive->priv->hal_udi != NULL &&
+		    drive->priv->activation_uri != NULL && /* Hmm */
+		    strcmp (drive->priv->hal_udi, hal_udi) == 0) {
+			ret = drive;
+			break;
+		}
+	}
+
+	return ret;
+}
+#endif /* USE_HAL */
+
+
 GnomeVFSVolume *
 _gnome_vfs_volume_monitor_find_mtab_volume_by_activation_uri (GnomeVFSVolumeMonitor *volume_monitor,
 							      const char *activation_uri)
diff -Naur gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume.c gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume.c
--- gnome-vfs2-2.6.1.1.vanilla/libgnomevfs/gnome-vfs-volume.c	2003-11-26 13:18:38.000000000 +0100
+++ gnome-vfs2-2.6.1.1+hal/libgnomevfs/gnome-vfs-volume.c	2004-06-30 22:58:05.000000000 +0200
@@ -136,6 +136,9 @@
 	g_free (priv->display_name);
 	g_free (priv->icon);
 	g_free (priv->gconf_id);
+#ifdef USE_HAL
+	g_free (priv->hal_udi);
+#endif
 	g_free (priv);
 	volume->priv = NULL;
 	

Attachment: signature.asc
Description: Digital signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]