brasero r1380 - in trunk: . src



Author: philippr
Date: Wed Oct 15 14:08:18 2008
New Revision: 1380
URL: http://svn.gnome.org/viewvc/brasero?rev=1380&view=rev

Log:
	Changed the way drives and media are probed since when HAL failed to 
	probe a medium it remained unknown to brasero. Now brasero can blank
	those media for example.

	* src/Makefile.am:
	* src/brasero-data-disc.c
	(brasero_disc_disc_session_import_response_cb),
	(brasero_data_disc_import_button_new),
	(brasero_data_disc_session_available_cb),
	(brasero_data_disc_session_loaded_cb):
	* src/brasero-marshal.list:
	* src/brasero-tool-dialog.c (brasero_tool_dialog_drive_changed_cb):
	* src/burn-basics.c (brasero_burn_library_shutdown):
	* src/burn-drive.c (brasero_drive_lock), (brasero_drive_unlock),
	(brasero_drive_get_display_name), (brasero_drive_finalize),
	(brasero_drive_check_medium_inside),
	(brasero_drive_medium_inside_property_changed_cb),
	(brasero_drive_init_real), (brasero_drive_set_property):
	* src/burn-drive.h:
	* src/burn-hal-watch.c (brasero_hal_watch_get_ctx),
	(brasero_hal_watch_property_changed_cb),
	(brasero_hal_watch_device_added_cb),
	(brasero_hal_watch_device_removed_cb), (brasero_hal_watch_init),
	(brasero_hal_watch_finalize), (brasero_hal_watch_class_init),
	(brasero_hal_watch_get_default), (brasero_hal_watch_destroy):
	* src/burn-hal-watch.h:
	* src/burn-medium-monitor.c (brasero_medium_monitor_get_media),
	(brasero_medium_monitor_medium_added_cb),
	(brasero_medium_monitor_medium_removed_cb),
	(brasero_medium_monitor_inserted_cb),
	(brasero_medium_monitor_removed_cb), (brasero_medium_monitor_init),
	(brasero_medium_monitor_finalize):
	* src/burn-medium.c (brasero_medium_finalize),
	(brasero_medium_set_property), (brasero_medium_get_property),
	(brasero_medium_class_init):
	* src/burn-medium.h:


Added:
   trunk/src/burn-hal-watch.c
   trunk/src/burn-hal-watch.h
Modified:
   trunk/ChangeLog
   trunk/src/Makefile.am
   trunk/src/brasero-data-disc.c
   trunk/src/brasero-marshal.list
   trunk/src/brasero-tool-dialog.c
   trunk/src/burn-basics.c
   trunk/src/burn-drive.c
   trunk/src/burn-drive.h
   trunk/src/burn-medium-monitor.c
   trunk/src/burn-medium.c
   trunk/src/burn-medium.h

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Wed Oct 15 14:08:18 2008
@@ -276,7 +276,9 @@
 	brasero-src-image.h           \
 	brasero-src-image.c           \
 	burn-media.c           \
-	burn-media.h
+	burn-media.h           \
+	burn-hal-watch.c           \
+	burn-hal-watch.h
 
 if BUILD_INOTIFY
 brasero_SOURCES += brasero-file-monitor.c brasero-file-monitor.h

Modified: trunk/src/brasero-data-disc.c
==============================================================================
--- trunk/src/brasero-data-disc.c	(original)
+++ trunk/src/brasero-data-disc.c	Wed Oct 15 14:08:18 2008
@@ -194,8 +194,9 @@
 			 G_IMPLEMENT_INTERFACE (BRASERO_TYPE_DISC,
 					        brasero_data_disc_iface_disc_init));
 
-#define BRASERO_DATA_DISC_MEDIUM	"brasero-data-disc-medium"
-#define BRASERO_DATA_DISC_MERGE_ID	"brasero-data-disc-merge-id"
+#define BRASERO_DATA_DISC_MEDIUM		"brasero-data-disc-medium"
+#define BRASERO_DATA_DISC_MERGE_ID		"brasero-data-disc-merge-id"
+#define BRASERO_MEDIUM_GET_UDI(medium)		(brasero_drive_get_udi (brasero_medium_get_drive (medium)))
 
 BraseroMedium *
 brasero_data_disc_get_loaded_medium (BraseroDataDisc *self)
@@ -1181,7 +1182,7 @@
 	medium = g_object_get_data (G_OBJECT (button), BRASERO_DATA_DISC_MEDIUM);
 	res = brasero_data_disc_import_session (self, medium, TRUE);
 
-	action_name = g_strdup_printf ("Import_%s", brasero_medium_get_udi (medium));
+	action_name = g_strdup_printf ("Import_%s", BRASERO_MEDIUM_GET_UDI (medium));
 	action = gtk_action_group_get_action (priv->import_group, action_name);
 	g_free (action_name);
 
@@ -1209,7 +1210,7 @@
 	if (!priv->manager)
 		return;
 
-	action_name = g_strdup_printf ("Import_%s", brasero_medium_get_udi (medium));
+	action_name = g_strdup_printf ("Import_%s", BRASERO_MEDIUM_GET_UDI (medium));
 
 	tooltip = brasero_medium_get_tooltip (medium);
 	/* Translators: %s is a string describing the type of medium and the 
@@ -1338,7 +1339,7 @@
 		GtkAction *action;
 		gchar *action_name;
 
-		action_name = g_strdup_printf ("Import_%s", brasero_medium_get_udi (medium));
+		action_name = g_strdup_printf ("Import_%s", BRASERO_MEDIUM_GET_UDI (medium));
 		action = gtk_action_group_get_action (priv->import_group, action_name);
 		g_free (action_name);
 
@@ -1365,7 +1366,7 @@
 
 	priv = BRASERO_DATA_DISC_PRIVATE (self);
 
-	action_name = g_strdup_printf ("Import_%s", brasero_medium_get_udi (medium));
+	action_name = g_strdup_printf ("Import_%s", BRASERO_MEDIUM_GET_UDI (medium));
 	action = gtk_action_group_get_action (priv->import_group, action_name);
 	g_free (action_name);
 

Modified: trunk/src/brasero-marshal.list
==============================================================================
--- trunk/src/brasero-marshal.list	(original)
+++ trunk/src/brasero-marshal.list	Wed Oct 15 14:08:18 2008
@@ -10,6 +10,7 @@
 VOID:INT,STRING
 VOID:POINTER,STRING
 VOID:DOUBLE,DOUBLE,LONG
+VOID:STRING,STRING
 INT:OBJECT,INT,INT
 BOOLEAN:STRING
 VOID:OBJECT,BOOLEAN

Modified: trunk/src/brasero-tool-dialog.c
==============================================================================
--- trunk/src/brasero-tool-dialog.c	(original)
+++ trunk/src/brasero-tool-dialog.c	Wed Oct 15 14:08:18 2008
@@ -366,7 +366,8 @@
 	if (klass->drive_changed)
 		klass->drive_changed (self, medium);
 
-	g_object_unref (medium);
+	if (medium)
+		g_object_unref (medium);
 }
 
 static gboolean

Modified: trunk/src/burn-basics.c
==============================================================================
--- trunk/src/burn-basics.c	(original)
+++ trunk/src/burn-basics.c	Wed Oct 15 14:08:18 2008
@@ -37,6 +37,7 @@
 #include "burn-basics.h"
 #include "burn-debug.h"
 #include "burn-caps.h"
+#include "burn-hal-watch.h"
 #include "burn-plugin-manager.h"
 #include "burn-medium-monitor.h"
 #include "burn-plugin-private.h"
@@ -120,4 +121,7 @@
 		g_object_unref (medium_manager);
 		medium_manager = NULL;
 	}
+
+	/* close HAL connection */
+	brasero_hal_watch_destroy ();
 }

Modified: trunk/src/burn-drive.c
==============================================================================
--- trunk/src/burn-drive.c	(original)
+++ trunk/src/burn-drive.c	Wed Oct 15 14:08:18 2008
@@ -36,8 +36,10 @@
 
 #include "burn-basics.h"
 #include "burn-medium.h"
+#include "burn-volume-obj.h"
 #include "burn-drive.h"
 #include "burn-debug.h"
+#include "burn-hal-watch.h"
 
 #include "scsi-mmc1.h"
 
@@ -61,6 +63,8 @@
 	gint bus;
 	gint target;
 	gint lun;
+
+	gulong hal_sig;
 };
 
 #define BRASERO_DRIVE_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_DRIVE, BraseroDrivePrivate))
@@ -80,8 +84,6 @@
 
 G_DEFINE_TYPE (BraseroDrive, brasero_drive, G_TYPE_OBJECT);
 
-static LibHalContext *hal_context = NULL;
-
 gboolean
 brasero_drive_get_bus_target_lun (BraseroDrive *self,
 				  guint *bus,
@@ -132,45 +134,6 @@
 	return (priv->path == NULL);
 }
 
-static LibHalContext *
-brasero_drive_get_hal_context (void)
-{
-	DBusError error;
-	DBusConnection *dbus_connection;
-
-	if (hal_context)
-		return hal_context;
-
-	hal_context = libhal_ctx_new ();
-	if (hal_context == NULL) {
-		g_warning ("Cannot initialize hal library.");
-		goto error;
-	}
-
-	dbus_error_init (&error);
-	dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
-	if (dbus_error_is_set (&error)) {
-		g_warning ("Cannot connect to DBus %s.", error.message);
-		dbus_error_free (&error);
-		goto error;
-	}
-
-	libhal_ctx_set_dbus_connection (hal_context, dbus_connection);
-	if (libhal_ctx_init (hal_context, &error) == FALSE) {
-		g_warning ("Failed to initialize hal : %s", error.message);
-		dbus_error_free (&error);
-		goto error;
-	}
-
-	return hal_context;
-
-error:
-	libhal_ctx_shutdown (hal_context, NULL);
-	libhal_ctx_free (hal_context);
-	hal_context = NULL;
-	return NULL;
-}
-
 gboolean
 brasero_drive_is_door_open (BraseroDrive *self)
 {
@@ -202,6 +165,7 @@
 		    gchar **reason_for_failure)
 {
 	BraseroDrivePrivate *priv;
+	BraseroHALWatch *watch;
 	LibHalContext *ctx;
 	DBusError error;
 	gboolean result;
@@ -212,7 +176,8 @@
 	if (!priv->udi)
 		return FALSE;
 
-	ctx = brasero_drive_get_hal_context ();
+	watch = brasero_hal_watch_get_default ();
+	ctx = brasero_hal_watch_get_ctx (watch);
 
 	dbus_error_init (&error);
 	result = libhal_device_lock (ctx,
@@ -237,6 +202,7 @@
 brasero_drive_unlock (BraseroDrive *self)
 {
 	BraseroDrivePrivate *priv;
+	BraseroHALWatch *watch;
 	LibHalContext *ctx;
 	DBusError error;
 	gboolean result;
@@ -246,7 +212,8 @@
 	if (!priv->udi)
 		return FALSE;
 
-	ctx = brasero_drive_get_hal_context ();
+	watch = brasero_hal_watch_get_default ();
+	ctx = brasero_hal_watch_get_ctx (watch);
 
 	dbus_error_init (&error);
 	result = libhal_device_unlock (ctx,
@@ -263,6 +230,7 @@
 brasero_drive_get_display_name (BraseroDrive *self)
 {
 	BraseroDrivePrivate *priv;
+	BraseroHALWatch *watch;
 	LibHalContext *ctx;
 
 	priv = BRASERO_DRIVE_PRIVATE (self);
@@ -273,7 +241,8 @@
 	if (!priv->udi)
 		return g_strdup (_("Image File"));;
 
-	ctx = brasero_drive_get_hal_context ();
+	watch = brasero_hal_watch_get_default ();
+	ctx = brasero_hal_watch_get_ctx (watch);
 	return libhal_device_get_property_string (ctx,
 						  priv->udi,
 	  					  DEVICE_MODEL,
@@ -322,35 +291,6 @@
 	return priv->medium;
 }
 
-void
-brasero_drive_set_medium (BraseroDrive *self,
-			  BraseroMedium *medium)
-{
-	BraseroDrivePrivate *priv;
-
-	priv = BRASERO_DRIVE_PRIVATE (self);
-
-	if (priv->medium) {
-		g_signal_emit (self,
-			       drive_signals [MEDIUM_REMOVED],
-			       0,
-			       priv->medium);
-
-		g_object_unref (priv->medium);
-		priv->medium = NULL;
-	}
-
-	priv->medium = medium;
-
-	if (medium) {
-		g_object_ref (medium);
-		g_signal_emit (self,
-			       drive_signals [MEDIUM_INSERTED],
-			       0,
-			       medium);
-	}
-}
-
 BraseroDriveCaps
 brasero_drive_get_caps (BraseroDrive *self)
 {
@@ -396,29 +336,122 @@
 		priv->block_path = NULL;
 	}
 
+	if (priv->medium) {
+		g_object_unref (priv->medium);
+		priv->medium = NULL;
+	}
+
+	if (priv->hal_sig) {
+		BraseroHALWatch *watch;
+		LibHalContext *ctx;
+		DBusError error;
+
+		watch = brasero_hal_watch_get_default ();
+		ctx = brasero_hal_watch_get_ctx (watch);
+
+		dbus_error_init (&error);
+		libhal_device_remove_property_watch (ctx, priv->udi, &error);
+
+		g_signal_handler_disconnect (watch, priv->hal_sig);
+		priv->hal_sig = 0;
+	}
+
 	if (priv->udi) {
 		g_free (priv->udi);
 		priv->udi = NULL;
 	}
 
-	if (priv->medium) {
-		g_object_unref (priv->medium);
+	G_OBJECT_CLASS (brasero_drive_parent_class)->finalize (object);
+}
+
+static void
+brasero_drive_check_medium_inside (BraseroDrive *self)
+{
+	BraseroDrivePrivate *priv;
+	BraseroHALWatch *watch;
+	gboolean has_medium;
+	LibHalContext *ctx;
+	DBusError error;
+
+	priv = BRASERO_DRIVE_PRIVATE (self);
+
+	watch = brasero_hal_watch_get_default ();
+	ctx = brasero_hal_watch_get_ctx (watch);
+
+	BRASERO_BURN_LOG ("Contents changed");
+
+	dbus_error_init (&error);
+	has_medium = libhal_device_get_property_bool (ctx,
+						      priv->udi,
+						      "storage.removable.media_available",
+						      &error);
+	if (dbus_error_is_set (&error)) {
+		g_warning ("Hal connection problem :  %s\n",
+			   error.message);
+		dbus_error_free (&error);
+		return;
+	}
+
+	if (has_medium) {
+		BRASERO_BURN_LOG ("New medium inserted");
+
+		priv->medium = g_object_new (BRASERO_TYPE_VOLUME,
+					     "drive", self,
+					     NULL);
+		if (priv->medium)
+			g_signal_emit (self,
+				       drive_signals [MEDIUM_INSERTED],
+				       0,
+				       priv->medium);
+	}
+	else if (priv->medium) {
+		BraseroMedium *medium;
+
+		BRASERO_BURN_LOG ("Medium removed");
+
+		medium = priv->medium;
 		priv->medium = NULL;
+
+		g_signal_emit (self,
+			       drive_signals [MEDIUM_REMOVED],
+			       0,
+			       medium);
+		g_object_unref (medium);
 	}
+}
 
-	G_OBJECT_CLASS (brasero_drive_parent_class)->finalize (object);
+static void
+brasero_drive_medium_inside_property_changed_cb (BraseroHALWatch *watch,
+						 const char *udi,
+						 const char *key,
+						 BraseroDrive *drive)
+{
+	BraseroDrivePrivate *priv;
+
+	priv = BRASERO_DRIVE_PRIVATE (drive);
+
+	if (key && strcmp (key, "storage.removable.media_available"))
+		return;
+
+	if (udi && strcmp (udi, priv->udi))
+		return;
+
+	brasero_drive_check_medium_inside (drive);
 }
 
 static void
 brasero_drive_init_real (BraseroDrive *drive)
 {
 	BraseroDrivePrivate *priv;
+	BraseroHALWatch *watch;
 	LibHalContext *ctx;
+	DBusError error;
 	char *parent;
 
 	priv = BRASERO_DRIVE_PRIVATE (drive);
 
-	ctx = brasero_drive_get_hal_context ();
+	watch = brasero_hal_watch_get_default ();
+	ctx = brasero_hal_watch_get_ctx (watch);
 
 	priv->path = libhal_device_get_property_string (ctx, priv->udi, BLOCK_DEVICE, NULL);
 	if (priv->path [0] == '\0') {
@@ -476,6 +509,21 @@
 
 	BRASERO_BURN_LOG ("Drive %s has bus,target,lun = %i %i %i", priv->path, priv->bus, priv->target, priv->lun);
 	libhal_free_string (parent);
+
+	/* Now check for the medium */
+	brasero_drive_check_medium_inside (drive);
+
+	dbus_error_init (&error);
+	libhal_device_add_property_watch (ctx, priv->udi, &error);
+	if (dbus_error_is_set (&error)) {
+		g_warning ("Hal is not running : %s\n", error.message);
+		dbus_error_free (&error);
+	}
+
+	priv->hal_sig = g_signal_connect (watch,
+					  "property-changed",
+					  G_CALLBACK (brasero_drive_medium_inside_property_changed_cb),
+					  drive);
 }
 
 static void
@@ -494,8 +542,14 @@
 	{
 	case PROP_UDI:
 		priv->udi = g_strdup (g_value_get_string (value));
-		if (priv->udi)
+		if (!priv->udi) {
+			priv->medium = g_object_new (BRASERO_TYPE_VOLUME,
+						     "drive", object,
+						     NULL);
+		}
+		else
 			brasero_drive_init_real (BRASERO_DRIVE (object));
+			
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -560,10 +614,10 @@
 	g_object_class_install_property (object_class,
 	                                 PROP_UDI,
 	                                 g_param_spec_string("udi",
-	                                                      "udi",
-	                                                      "HAL udi",
-	                                                      NULL,
-	                                                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+	                                                     "udi",
+	                                                     "HAL udi",
+	                                                     NULL,
+	                                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 }
 
 BraseroDrive *

Modified: trunk/src/burn-drive.h
==============================================================================
--- trunk/src/burn-drive.h	(original)
+++ trunk/src/burn-drive.h	Wed Oct 15 14:08:18 2008
@@ -68,10 +68,6 @@
 BraseroDrive *
 brasero_drive_new (const gchar *udi);
 
-void
-brasero_drive_set_medium (BraseroDrive *drive,
-			  BraseroMedium *medium);
-
 BraseroMedium *
 brasero_drive_get_medium (BraseroDrive *drive);
 

Added: trunk/src/burn-hal-watch.c
==============================================================================
--- (empty file)
+++ trunk/src/burn-hal-watch.c	Wed Oct 15 14:08:18 2008
@@ -0,0 +1,243 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Rouquier Philippe 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero 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 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include <libhal.h>
+
+#include "burn-debug.h"
+#include "burn-hal-watch.h"
+#include "brasero-marshal.h"
+
+typedef struct _BraseroHALWatchPrivate BraseroHALWatchPrivate;
+struct _BraseroHALWatchPrivate
+{
+	LibHalContext * ctx;
+};
+
+#define BRASERO_HAL_WATCH_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_HAL_WATCH, BraseroHALWatchPrivate))
+
+enum
+{
+	PROPERTY_CHANGED,
+	DEVICE_ADDED,
+	DEVICE_REMOVED,
+	LAST_SIGNAL
+};
+
+
+static guint hal_watch_signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (BraseroHALWatch, brasero_hal_watch, G_TYPE_OBJECT);
+
+LibHalContext *
+brasero_hal_watch_get_ctx (BraseroHALWatch *self)
+{
+	BraseroHALWatchPrivate *priv;
+
+	priv = BRASERO_HAL_WATCH_PRIVATE (self);
+	if (!priv->ctx)
+		BRASERO_BURN_LOG ("HAL context is NULL");
+
+	return priv->ctx;
+}
+
+static void
+brasero_hal_watch_property_changed_cb (LibHalContext *ctx,
+				       const char *udi,
+				       const char *key,
+				       dbus_bool_t is_removed,
+				       dbus_bool_t is_added)
+{
+	BraseroHALWatch *self;
+
+	self = libhal_ctx_get_user_data (ctx);
+	g_signal_emit (self,
+		       hal_watch_signals [PROPERTY_CHANGED],
+		       0,
+		       udi,
+		       key);
+}
+
+static void
+brasero_hal_watch_device_added_cb (LibHalContext *ctx,
+				   const char *udi)
+{
+	BraseroHALWatch *self;
+
+	self = libhal_ctx_get_user_data (ctx);
+	g_signal_emit (self,
+		       hal_watch_signals [DEVICE_ADDED],
+		       0,
+		       udi);
+}
+
+static void
+brasero_hal_watch_device_removed_cb (LibHalContext *ctx,
+				     const char *udi)
+{
+	BraseroHALWatch *self;
+
+	self = libhal_ctx_get_user_data (ctx);
+	g_signal_emit (self,
+		       hal_watch_signals [DEVICE_REMOVED],
+		       0,
+		       udi);
+}
+
+static void
+brasero_hal_watch_init (BraseroHALWatch *object)
+{
+	DBusError error;
+	BraseroHALWatchPrivate *priv;
+	DBusConnection *dbus_connection;
+
+	priv = BRASERO_HAL_WATCH_PRIVATE (object);
+
+	/* initialize the connection with hal */
+	priv->ctx = libhal_ctx_new ();
+	if (priv->ctx == NULL) {
+		g_warning ("Cannot initialize hal library\n");
+		goto error;
+	}
+
+	dbus_error_init (&error);
+	dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+	if (dbus_error_is_set (&error)) {
+		g_warning ("Cannot connect to DBus %s\n", error.message);
+		dbus_error_free (&error);
+		goto error;
+	}
+
+	dbus_connection_setup_with_g_main (dbus_connection, NULL);
+	libhal_ctx_set_dbus_connection (priv->ctx, dbus_connection);
+
+	libhal_ctx_set_user_data (priv->ctx, object);
+	libhal_ctx_set_cache (priv->ctx, FALSE);
+
+	/* monitor devices addition and removal */
+	libhal_ctx_set_device_added (priv->ctx, brasero_hal_watch_device_added_cb);
+	libhal_ctx_set_device_removed (priv->ctx, brasero_hal_watch_device_removed_cb);
+	libhal_ctx_set_device_property_modified (priv->ctx, brasero_hal_watch_property_changed_cb);
+
+	if (libhal_ctx_init (priv->ctx, &error))
+		return;
+
+	g_warning ("Failed to initialize hal : %s\n", error.message);
+	dbus_error_free (&error);
+
+error:
+
+	libhal_ctx_shutdown (priv->ctx, NULL);
+	libhal_ctx_free (priv->ctx);
+	priv->ctx = NULL;
+
+	dbus_connection_unref (dbus_connection);
+}
+
+static void
+brasero_hal_watch_finalize (GObject *object)
+{
+	BraseroHALWatchPrivate *priv;
+
+	priv = BRASERO_HAL_WATCH_PRIVATE (object);
+
+	if (priv->ctx) {
+		DBusConnection *connection;
+
+		connection = libhal_ctx_get_dbus_connection (priv->ctx);
+		dbus_connection_unref (connection);
+
+		libhal_ctx_shutdown (priv->ctx, NULL);
+		libhal_ctx_free (priv->ctx);
+		priv->ctx = NULL;
+	}
+
+	G_OBJECT_CLASS (brasero_hal_watch_parent_class)->finalize (object);
+}
+
+static void
+brasero_hal_watch_class_init (BraseroHALWatchClass *klass)
+{
+	GObjectClass* object_class = G_OBJECT_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (BraseroHALWatchPrivate));
+
+	object_class->finalize = brasero_hal_watch_finalize;
+
+	hal_watch_signals[PROPERTY_CHANGED] =
+		g_signal_new ("property_changed",
+		              G_OBJECT_CLASS_TYPE (klass),
+		              G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+		              0,
+		              NULL, NULL,
+		              brasero_marshal_VOID__STRING_STRING,
+		              G_TYPE_NONE, 2,
+		              G_TYPE_STRING,
+			      G_TYPE_STRING);
+	hal_watch_signals[DEVICE_ADDED] =
+		g_signal_new ("device_added",
+		              G_OBJECT_CLASS_TYPE (klass),
+		              G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+		              0,
+		              NULL, NULL,
+		              g_cclosure_marshal_VOID__STRING,
+		              G_TYPE_NONE, 1,
+		              G_TYPE_STRING);
+	hal_watch_signals[DEVICE_REMOVED] =
+		g_signal_new ("device_removed",
+		              G_OBJECT_CLASS_TYPE (klass),
+		              G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+		              0,
+		              NULL, NULL,
+		              g_cclosure_marshal_VOID__STRING,
+		              G_TYPE_NONE, 1,
+		              G_TYPE_STRING);
+}
+
+static BraseroHALWatch *singleton = NULL;
+
+BraseroHALWatch *
+brasero_hal_watch_get_default (void)
+{
+	if (singleton)
+		return singleton;
+
+	singleton = g_object_new (BRASERO_TYPE_HAL_WATCH, NULL);
+	return singleton;
+}
+
+void
+brasero_hal_watch_destroy (void)
+{
+	if (singleton) {
+		g_object_unref (singleton);
+		singleton = NULL;
+	}
+}
+

Added: trunk/src/burn-hal-watch.h
==============================================================================
--- (empty file)
+++ trunk/src/burn-hal-watch.h	Wed Oct 15 14:08:18 2008
@@ -0,0 +1,62 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Rouquier Philippe 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero 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 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _BRASERO_HAL_WATCH_H_
+#define _BRASERO_HAL_WATCH_H_
+
+#include <glib-object.h>
+
+#include <libhal.h>
+
+G_BEGIN_DECLS
+
+#define BRASERO_TYPE_HAL_WATCH             (brasero_hal_watch_get_type ())
+#define BRASERO_HAL_WATCH(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BRASERO_TYPE_HAL_WATCH, BraseroHALWatch))
+#define BRASERO_HAL_WATCH_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BRASERO_TYPE_HAL_WATCH, BraseroHALWatchClass))
+#define BRASERO_IS_HAL_WATCH(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BRASERO_TYPE_HAL_WATCH))
+#define BRASERO_IS_HAL_WATCH_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BRASERO_TYPE_HAL_WATCH))
+#define BRASERO_HAL_WATCH_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BRASERO_TYPE_HAL_WATCH, BraseroHALWatchClass))
+
+typedef struct _BraseroHALWatchClass BraseroHALWatchClass;
+typedef struct _BraseroHALWatch BraseroHALWatch;
+
+struct _BraseroHALWatchClass
+{
+	GObjectClass parent_class;
+};
+
+struct _BraseroHALWatch
+{
+	GObject parent_instance;
+};
+
+GType brasero_hal_watch_get_type (void) G_GNUC_CONST;
+
+BraseroHALWatch *
+brasero_hal_watch_get_default (void);
+
+void
+brasero_hal_watch_destroy (void);
+
+LibHalContext *
+brasero_hal_watch_get_ctx (BraseroHALWatch *watch);
+
+G_END_DECLS
+
+#endif /* _BRASERO_HAL_WATCH_H_ */

Modified: trunk/src/burn-medium-monitor.c
==============================================================================
--- trunk/src/burn-medium-monitor.c	(original)
+++ trunk/src/burn-medium-monitor.c	Wed Oct 15 14:08:18 2008
@@ -37,10 +37,10 @@
 
 #include <libhal.h>
 
+#include "burn-debug.h"
 #include "burn-drive.h"
-
 #include "burn-medium.h"
-#include "burn-volume-obj.h"
+#include "burn-hal-watch.h"
 #include "burn-medium-monitor.h"
 
 #if defined(HAVE_STRUCT_USCSI_CMD)
@@ -52,10 +52,7 @@
 typedef struct _BraseroMediumMonitorPrivate BraseroMediumMonitorPrivate;
 struct _BraseroMediumMonitorPrivate
 {
-	GSList *media;
 	GSList *drives;
-
-	LibHalContext *ctx;
 	GVolumeMonitor *gmonitor;
 };
 
@@ -107,12 +104,14 @@
 
 	priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
 
-	for (iter = priv->media; iter; iter = iter->next) {
+	for (iter = priv->drives; iter; iter = iter->next) {
 		BraseroMedium *medium;
 		BraseroDrive *drive;
 
-		medium = iter->data;
-		drive = brasero_medium_get_drive (medium);
+		drive = iter->data;
+		medium = brasero_drive_get_medium (drive);
+		if (!medium)
+			continue;
 
 		if ((type & BRASERO_MEDIA_TYPE_ANY_IN_BURNER)
 		&&  (brasero_drive_can_write (drive))) {
@@ -157,125 +156,87 @@
 }
 
 static void
-brasero_medium_monitor_drive_inserted (LibHalContext *ctx,
-				       const gchar *udi)
+brasero_medium_monitor_medium_added_cb (BraseroDrive *drive,
+					BraseroMedium *medium,
+					BraseroMediumMonitor *self)
 {
-	BraseroMediumMonitorPrivate *priv;
-	BraseroMediumMonitor *self;
-	BraseroDrive *drive = NULL;
-
-	self = libhal_ctx_get_user_data (ctx);
-	priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
+	g_signal_emit (self,
+		       medium_monitor_signals [MEDIUM_INSERTED],
+		       0,
+		       medium);
+}
 
-	drive = brasero_drive_new (udi);
-	priv->drives = g_slist_prepend (priv->drives, drive);
+static void
+brasero_medium_monitor_medium_removed_cb (BraseroDrive *drive,
+					  BraseroMedium *medium,
+					  BraseroMediumMonitor *self)
+{
+	g_signal_emit (self,
+		       medium_monitor_signals [MEDIUM_REMOVED],
+		       0,
+		       medium);
 }
 
 static void
-brasero_medium_monitor_medium_inserted (LibHalContext *ctx,
-					const gchar *udi)
+brasero_medium_monitor_inserted_cb (BraseroHALWatch *watch,
+				    const char *udi,
+				    BraseroMediumMonitor *self)
 {
 	BraseroMediumMonitorPrivate *priv;
-	BraseroMediumMonitor *self;
 	BraseroDrive *drive = NULL;
-	BraseroMedium *medium;
-	gchar *drive_path;
-	GSList *iter;
+	LibHalContext *ctx;
 
-	drive_path = libhal_device_get_property_string (ctx,
-							udi,
-							BLOCK_DEVICE,
-							NULL);
-	if (!drive_path)
+	ctx = brasero_hal_watch_get_ctx (watch);
+	if (!libhal_device_query_capability (ctx, udi, "storage.cdrom", NULL))
 		return;
 
-	self = libhal_ctx_get_user_data (ctx);
-	priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
-
-	/* Search the drive */
-	for (iter = priv->drives; iter; iter = iter->next) {
-		BraseroDrive *tmp;
+	BRASERO_BURN_LOG ("New drive inserted");
 
-		tmp = iter->data;
-		if (!brasero_drive_get_device (tmp))
-			continue;
-
-		if (!strcmp (brasero_drive_get_device (tmp), drive_path)) {
-			drive = tmp;
-			break;
-		}
-	}
-	g_free (drive_path);
-
-	if (!drive)
-		return;
-
-	/* Create medium */
-	medium = BRASERO_MEDIUM (brasero_volume_new (drive, udi));
-	priv->media = g_slist_prepend (priv->media, medium);
-	brasero_drive_set_medium (drive, medium);
+	priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
 
-	g_signal_emit (self,
-		       medium_monitor_signals [MEDIUM_INSERTED],
-		       0,
-		       medium);
-}
+	drive = brasero_drive_new (udi);
+	priv->drives = g_slist_prepend (priv->drives, drive);
 
-static void
-brasero_medium_monitor_inserted_cb (LibHalContext *ctx,
-				    const char *udi)
-{
-	if (libhal_device_property_exists (ctx, udi, "volume.is_disc", NULL)
-	&&  libhal_device_get_property_bool (ctx, udi, "volume.is_disc", NULL))
-		brasero_medium_monitor_medium_inserted (ctx, udi);
-	else if (libhal_device_property_exists (ctx, udi, "storage.cdrom", NULL)
-	     &&  libhal_device_get_property_bool (ctx, udi, "storage.cdrom", NULL))
-		brasero_medium_monitor_drive_inserted (ctx, udi);
+	/* check if a medium is inserted */
+	if (brasero_drive_get_medium (drive))
+		g_signal_emit (self,
+			       medium_monitor_signals [MEDIUM_INSERTED],
+			       0,
+			       brasero_drive_get_medium (drive));
+
+	/* connect to signals */
+	g_signal_connect (drive,
+			  "medium-added",
+			  G_CALLBACK (brasero_medium_monitor_medium_added_cb),
+			  self);
+	g_signal_connect (drive,
+			  "medium-removed",
+			  G_CALLBACK (brasero_medium_monitor_medium_removed_cb),
+			  self);
 }
 
 static void
-brasero_medium_monitor_removed_cb (LibHalContext *ctx,
-				   const char *udi)
+brasero_medium_monitor_removed_cb (BraseroHALWatch *watch,
+				   const char *udi,
+				   BraseroMediumMonitor *self)
 {
 	BraseroMediumMonitorPrivate *priv;
-	BraseroMediumMonitor *self;
+	LibHalContext *ctx;
 	GSList *iter;
+	GSList *next;
 
-	self = libhal_ctx_get_user_data (ctx);
+	ctx = brasero_hal_watch_get_ctx (watch);
 	priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
 
-	for (iter = priv->media; iter; iter = iter->next) {
-		const gchar *device_udi;
-		BraseroMedium *medium;
-
-		medium = iter->data;
-		device_udi = brasero_medium_get_udi (medium);
-		if (!device_udi)
-			continue;
-
-		if (!strcmp (device_udi, udi)) {
-			BraseroDrive *drive;
-
-			drive = brasero_medium_get_drive (medium);
-			if (drive)
-				brasero_drive_set_medium (drive, NULL);
-
-			priv->media = g_slist_remove (priv->media, medium);
-			g_signal_emit (self,
-				       medium_monitor_signals [MEDIUM_REMOVED],
-				       0,
-				       medium);
+	BRASERO_BURN_LOG ("Drive removed");
 
-			g_object_unref (medium);
-			break;
-		}
-	}
-
-	for (iter = priv->drives; iter; iter = iter->next) {
+	for (iter = priv->drives; iter; iter = next) {
 		const gchar *device_udi;
 		BraseroDrive *drive;
 
 		drive = iter->data;
+		next = iter->next;
+
 		device_udi = brasero_drive_get_udi (drive);
 		if (!device_udi)
 			continue;
@@ -284,51 +245,27 @@
 			BraseroMedium *medium;
 
 			medium = brasero_drive_get_medium (drive);
-			brasero_drive_set_medium (drive, NULL);
-
-			if (medium) {
-				priv->media = g_slist_remove (priv->media, medium);
+			if (medium)
 				g_signal_emit (self,
 					       medium_monitor_signals [MEDIUM_REMOVED],
 					       0,
 					       medium);
-				g_object_unref (medium);
-				return;
-			}
 
 			priv->drives = g_slist_remove (priv->drives, drive);
 			g_object_unref (drive);
-			break;
 		}
 	}
 }
 
 static void
-brasero_medium_monitor_add_file (BraseroMediumMonitor *self)
-{
-	BraseroMediumMonitorPrivate *priv;
-	BraseroMedium *medium;
-	BraseroDrive *drive;
-
-	priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
-
-	drive = brasero_drive_new (NULL);
-	priv->drives = g_slist_prepend (priv->drives, drive);
-	
-	medium = g_object_new (BRASERO_TYPE_VOLUME,
-			       "drive", drive,
-			       NULL);
-	priv->media = g_slist_prepend (priv->media, medium);
-	brasero_drive_set_medium (drive, medium);
-}
-
-static void
 brasero_medium_monitor_init (BraseroMediumMonitor *object)
 {
 	DBusError error;
 	int nb_devices, i;
+	LibHalContext *ctx;
+	BraseroDrive *drive;
 	char **devices = NULL;
-	DBusConnection *dbus_connection;
+	BraseroHALWatch *watch;
 	BraseroMediumMonitorPrivate *priv;
 
 	priv = BRASERO_MEDIUM_MONITOR_PRIVATE (object);
@@ -338,96 +275,48 @@
 	 * connect to HAL before us. */
 	priv->gmonitor = g_volume_monitor_get ();
 
-	/* initialize the connection with hal */
-	priv->ctx = libhal_ctx_new ();
-	if (priv->ctx == NULL) {
-		g_warning ("Cannot initialize hal library\n");
-		goto error;
-	}
-
-	dbus_error_init (&error);
-	dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
-	if (dbus_error_is_set (&error)) {
-		g_warning ("Cannot connect to DBus %s\n", error.message);
-		dbus_error_free (&error);
-		goto error;
-	}
-
-	dbus_connection_setup_with_g_main (dbus_connection, NULL);
-	libhal_ctx_set_dbus_connection (priv->ctx, dbus_connection);
+	watch = brasero_hal_watch_get_default ();
+	ctx = brasero_hal_watch_get_ctx (watch);
 
-	libhal_ctx_set_user_data (priv->ctx, object);
-	libhal_ctx_set_cache (priv->ctx, FALSE);
-
-	/* monitor devices addition and removal */
-	libhal_ctx_set_device_added (priv->ctx, brasero_medium_monitor_inserted_cb);
-	libhal_ctx_set_device_removed (priv->ctx, brasero_medium_monitor_removed_cb);
-
-	if (libhal_ctx_init (priv->ctx, &error) == FALSE) {
-		g_warning ("Failed to initialize hal : %s\n", error.message);
-		dbus_error_free (&error);
-		goto error;
-	}
+	g_signal_connect (watch,
+			  "device-added",
+			  G_CALLBACK (brasero_medium_monitor_inserted_cb),
+			  object);
+	g_signal_connect (watch,
+			  "device-removed",
+			  G_CALLBACK (brasero_medium_monitor_removed_cb),
+			  object);
 
 	/* Now we get the list and cache it */
-	devices = libhal_find_device_by_capability (priv->ctx,
+	dbus_error_init (&error);
+	devices = libhal_find_device_by_capability (ctx,
 						    "storage.cdrom", &nb_devices,
 						    &error);
 	if (dbus_error_is_set (&error)) {
 		g_warning ("Hal is not running : %s\n", error.message);
 		dbus_error_free (&error);
-		goto error;
+		return;
 	}
 
 	for (i = 0; i < nb_devices; i++) {
-		int j;
-		int nb_volumes;
-		BraseroDrive *drive;
-		char **volumes = NULL;
-
 		/* create the drive */
 		drive = brasero_drive_new (devices [i]);
 		priv->drives = g_slist_prepend (priv->drives, drive);
 
-		/* Now search for a possible medium inside */
-		volumes = libhal_manager_find_device_string_match (priv->ctx,
-								   "info.parent",
-								   devices [i],
-								   &nb_volumes,
-								   &error);
-		if (dbus_error_is_set (&error)) {
-			g_warning ("Hal connection problem :  %s\n",
-				   error.message);
-			dbus_error_free (&error);
-
-			if (volumes)
-				libhal_free_string_array (volumes);
-			goto error;
-		}
-
-		for (j = 0; j < nb_volumes; j++) {
-			BraseroMedium *medium;
-
-			medium = BRASERO_MEDIUM (brasero_volume_new (drive, volumes [j]));
-			priv->media = g_slist_prepend (priv->media, medium);
-			brasero_drive_set_medium (drive, medium);
-		}
-
-		libhal_free_string_array (volumes);
+		g_signal_connect (drive,
+				  "medium-added",
+				  G_CALLBACK (brasero_medium_monitor_medium_added_cb),
+				  object);
+		g_signal_connect (drive,
+				  "medium-removed",
+				  G_CALLBACK (brasero_medium_monitor_medium_removed_cb),
+				  object);
 	}
 	libhal_free_string_array (devices);
 
-	brasero_medium_monitor_add_file (object);
-
-	return;
-
-      error:
-	libhal_ctx_shutdown (priv->ctx, NULL);
-	libhal_ctx_free (priv->ctx);
-	priv->ctx = NULL;
-
-	if (devices)
-		libhal_free_string_array (devices);
+	/* add fake/file drive */
+	drive = brasero_drive_new (NULL);
+	priv->drives = g_slist_prepend (priv->drives, drive);
 
 	return;
 }
@@ -439,29 +328,12 @@
 
 	priv = BRASERO_MEDIUM_MONITOR_PRIVATE (object);
 
-	if (priv->media) {
-		g_slist_foreach (priv->media, (GFunc) g_object_unref, NULL);
-		g_slist_free (priv->media);
-		priv->media = NULL;
-	}
-
 	if (priv->drives) {
 		g_slist_foreach (priv->drives, (GFunc) g_object_unref, NULL);
 		g_slist_free (priv->drives);
 		priv->drives = NULL;
 	}
 
-	if (priv->ctx) {
-		DBusConnection *connection;
-
-		connection = libhal_ctx_get_dbus_connection (priv->ctx);
-		dbus_connection_unref (connection);
-
-		libhal_ctx_shutdown (priv->ctx, NULL);
-		libhal_ctx_free (priv->ctx);
-		priv->ctx = NULL;
-	}
-
 	if (priv->gmonitor) {
 		g_object_unref (priv->gmonitor);
 		priv->gmonitor = NULL;

Modified: trunk/src/burn-medium.c
==============================================================================
--- trunk/src/burn-medium.c	(original)
+++ trunk/src/burn-medium.c	Wed Oct 15 14:08:18 2008
@@ -95,8 +95,6 @@
 	const gchar *type;
 	const gchar *icon;
 
-	gchar *udi;
-
 	gchar *id;
 
 	gint max_rd;
@@ -137,7 +135,6 @@
 {
 	PROP_0,
 	PROP_DRIVE,
-	PROP_UDI
 };
 
 static GObjectClass* parent_class = NULL;
@@ -3012,11 +3009,6 @@
 
 	priv = BRASERO_MEDIUM_PRIVATE (object);
 
-	if (priv->udi) {
-		g_free (priv->udi);
-		priv->udi = NULL;
-	}
-
 	if (priv->retry_id) {
 		g_source_remove (priv->retry_id);
 		priv->retry_id = 0;
@@ -3058,9 +3050,6 @@
 
 	switch (prop_id)
 	{
-	case PROP_UDI:
-		priv->udi = g_strdup (g_value_get_string (value));
-		break;
 	case PROP_DRIVE:
 		/* we don't ref the drive here as it would create a circular
 		 * dependency where the drive would hold a reference on the 
@@ -3094,9 +3083,6 @@
 	case PROP_DRIVE:
 		g_value_set_object (value, priv->drive);
 		break;
-	case PROP_UDI:
-		g_value_set_string (value, g_strdup (priv->udi));
-		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -3122,13 +3108,6 @@
 	                                                      "drive in which medium is inserted",
 	                                                      BRASERO_TYPE_DRIVE,
 	                                                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-	g_object_class_install_property (object_class,
-	                                 PROP_UDI,
-	                                 g_param_spec_string ("udi",
-	                                                      "udi",
-	                                                      "HAL udi",
-	                                                      NULL,
-	                                                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 }
 
 gboolean
@@ -3221,15 +3200,6 @@
 }
 
 const gchar *
-brasero_medium_get_udi (BraseroMedium *self)
-{
-	BraseroMediumPrivate *priv;
-
-	priv = BRASERO_MEDIUM_PRIVATE (self);
-	return priv->udi;
-}
-
-const gchar *
 brasero_medium_get_id (BraseroMedium *self)
 {
 	BraseroMediumPrivate *priv;

Modified: trunk/src/burn-medium.h
==============================================================================
--- trunk/src/burn-medium.h	(original)
+++ trunk/src/burn-medium.h	Wed Oct 15 14:08:18 2008
@@ -72,10 +72,6 @@
 
 GType brasero_medium_get_type (void) G_GNUC_CONST;
 
-const gchar *
-brasero_medium_get_udi (BraseroMedium *medium);
-
-
 typedef enum {
 	BRASERO_MEDIUM_TRACK_NONE		= 0,
 	BRASERO_MEDIUM_TRACK_DATA		= 1,



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