brasero r1380 - in trunk: . src
- From: philippr svn gnome org
- To: svn-commits-list gnome org
- Subject: brasero r1380 - in trunk: . src
- Date: Wed, 15 Oct 2008 14:08:18 +0000 (UTC)
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]