163
brasero_medium_monitor_drive_inserted (LibHalContext *ctx,
159
brasero_medium_monitor_medium_added_cb (BraseroDrive *drive,
160
BraseroMedium *medium,
161
BraseroMediumMonitor *self)
164
medium_monitor_signals [MEDIUM_INSERTED],
170
brasero_medium_monitor_medium_removed_cb (BraseroDrive *drive,
171
BraseroMedium *medium,
172
BraseroMediumMonitor *self)
175
medium_monitor_signals [MEDIUM_REMOVED],
181
brasero_medium_monitor_inserted_cb (BraseroHALWatch *watch,
183
BraseroMediumMonitor *self)
166
185
BraseroMediumMonitorPrivate *priv;
167
BraseroMediumMonitor *self;
168
186
BraseroDrive *drive = NULL;
170
self = libhal_ctx_get_user_data (ctx);
189
ctx = brasero_hal_watch_get_ctx (watch);
190
if (!libhal_device_query_capability (ctx, udi, "storage.cdrom", NULL))
193
BRASERO_BURN_LOG ("New drive inserted");
171
195
priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
173
197
drive = brasero_drive_new (udi);
174
198
priv->drives = g_slist_prepend (priv->drives, drive);
178
brasero_medium_monitor_medium_inserted (LibHalContext *ctx,
181
BraseroMediumMonitorPrivate *priv;
182
BraseroMediumMonitor *self;
183
BraseroDrive *drive = NULL;
184
BraseroMedium *medium;
188
drive_path = libhal_device_get_property_string (ctx,
195
self = libhal_ctx_get_user_data (ctx);
196
priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
198
/* Search the drive */
199
for (iter = priv->drives; iter; iter = iter->next) {
203
if (!brasero_drive_get_device (tmp))
206
if (!strcmp (brasero_drive_get_device (tmp), drive_path)) {
217
medium = BRASERO_MEDIUM (brasero_volume_new (drive, udi));
218
priv->media = g_slist_prepend (priv->media, medium);
219
brasero_drive_set_medium (drive, medium);
222
medium_monitor_signals [MEDIUM_INSERTED],
228
brasero_medium_monitor_inserted_cb (LibHalContext *ctx,
231
if (libhal_device_property_exists (ctx, udi, "volume.is_disc", NULL)
232
&& libhal_device_get_property_bool (ctx, udi, "volume.is_disc", NULL))
233
brasero_medium_monitor_medium_inserted (ctx, udi);
234
else if (libhal_device_property_exists (ctx, udi, "storage.cdrom", NULL)
235
&& libhal_device_get_property_bool (ctx, udi, "storage.cdrom", NULL))
236
brasero_medium_monitor_drive_inserted (ctx, udi);
240
brasero_medium_monitor_removed_cb (LibHalContext *ctx,
243
BraseroMediumMonitorPrivate *priv;
244
BraseroMediumMonitor *self;
247
self = libhal_ctx_get_user_data (ctx);
248
priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
250
for (iter = priv->media; iter; iter = iter->next) {
251
const gchar *device_udi;
252
BraseroMedium *medium;
255
device_udi = brasero_medium_get_udi (medium);
259
if (!strcmp (device_udi, udi)) {
262
drive = brasero_medium_get_drive (medium);
264
brasero_drive_set_medium (drive, NULL);
266
priv->media = g_slist_remove (priv->media, medium);
268
medium_monitor_signals [MEDIUM_REMOVED],
272
g_object_unref (medium);
277
for (iter = priv->drives; iter; iter = iter->next) {
200
/* check if a medium is inserted */
201
if (brasero_drive_get_medium (drive))
203
medium_monitor_signals [MEDIUM_INSERTED],
205
brasero_drive_get_medium (drive));
207
/* connect to signals */
208
g_signal_connect (drive,
210
G_CALLBACK (brasero_medium_monitor_medium_added_cb),
212
g_signal_connect (drive,
214
G_CALLBACK (brasero_medium_monitor_medium_removed_cb),
219
brasero_medium_monitor_removed_cb (BraseroHALWatch *watch,
221
BraseroMediumMonitor *self)
223
BraseroMediumMonitorPrivate *priv;
228
ctx = brasero_hal_watch_get_ctx (watch);
229
priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
231
BRASERO_BURN_LOG ("Drive removed");
233
for (iter = priv->drives; iter; iter = next) {
278
234
const gchar *device_udi;
279
235
BraseroDrive *drive;
281
237
drive = iter->data;
282
240
device_udi = brasero_drive_get_udi (drive);
287
245
BraseroMedium *medium;
289
247
medium = brasero_drive_get_medium (drive);
290
brasero_drive_set_medium (drive, NULL);
293
priv->media = g_slist_remove (priv->media, medium);
294
249
g_signal_emit (self,
295
250
medium_monitor_signals [MEDIUM_REMOVED],
298
g_object_unref (medium);
302
254
priv->drives = g_slist_remove (priv->drives, drive);
303
255
g_object_unref (drive);
310
brasero_medium_monitor_add_file (BraseroMediumMonitor *self)
312
BraseroMediumMonitorPrivate *priv;
313
BraseroMedium *medium;
316
priv = BRASERO_MEDIUM_MONITOR_PRIVATE (self);
318
drive = brasero_drive_new (NULL);
319
priv->drives = g_slist_prepend (priv->drives, drive);
321
medium = g_object_new (BRASERO_TYPE_VOLUME,
324
priv->media = g_slist_prepend (priv->media, medium);
325
brasero_drive_set_medium (drive, medium);
329
261
brasero_medium_monitor_init (BraseroMediumMonitor *object)
332
264
int nb_devices, i;
333
267
char **devices = NULL;
334
DBusConnection *dbus_connection;
268
BraseroHALWatch *watch;
335
269
BraseroMediumMonitorPrivate *priv;
337
271
priv = BRASERO_MEDIUM_MONITOR_PRIVATE (object);
341
275
* connect to HAL before us. */
342
276
priv->gmonitor = g_volume_monitor_get ();
344
/* initialize the connection with hal */
345
priv->ctx = libhal_ctx_new ();
346
if (priv->ctx == NULL) {
347
g_warning ("Cannot initialize hal library\n");
278
watch = brasero_hal_watch_get_default ();
279
ctx = brasero_hal_watch_get_ctx (watch);
281
g_signal_connect (watch,
283
G_CALLBACK (brasero_medium_monitor_inserted_cb),
285
g_signal_connect (watch,
287
G_CALLBACK (brasero_medium_monitor_removed_cb),
290
/* Now we get the list and cache it */
351
291
dbus_error_init (&error);
352
dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
353
if (dbus_error_is_set (&error)) {
354
g_warning ("Cannot connect to DBus %s\n", error.message);
355
dbus_error_free (&error);
359
dbus_connection_setup_with_g_main (dbus_connection, NULL);
360
libhal_ctx_set_dbus_connection (priv->ctx, dbus_connection);
362
libhal_ctx_set_user_data (priv->ctx, object);
363
libhal_ctx_set_cache (priv->ctx, FALSE);
365
/* monitor devices addition and removal */
366
libhal_ctx_set_device_added (priv->ctx, brasero_medium_monitor_inserted_cb);
367
libhal_ctx_set_device_removed (priv->ctx, brasero_medium_monitor_removed_cb);
369
if (libhal_ctx_init (priv->ctx, &error) == FALSE) {
370
g_warning ("Failed to initialize hal : %s\n", error.message);
371
dbus_error_free (&error);
375
/* Now we get the list and cache it */
376
devices = libhal_find_device_by_capability (priv->ctx,
292
BRASERO_BURN_LOG ("Polling for drives");
293
devices = libhal_find_device_by_capability (ctx,
377
294
"storage.cdrom", &nb_devices,
379
296
if (dbus_error_is_set (&error)) {
380
g_warning ("Hal is not running : %s\n", error.message);
297
BRASERO_BURN_LOG ("Hal is not running : %s\n", error.message);
381
298
dbus_error_free (&error);
302
BRASERO_BURN_LOG ("Found %d drives", nb_devices);
385
303
for (i = 0; i < nb_devices; i++) {
389
char **volumes = NULL;
391
304
/* create the drive */
305
BRASERO_BURN_LOG ("Probing %s", devices [i]);
392
306
drive = brasero_drive_new (devices [i]);
393
307
priv->drives = g_slist_prepend (priv->drives, drive);
395
/* Now search for a possible medium inside */
396
volumes = libhal_manager_find_device_string_match (priv->ctx,
401
if (dbus_error_is_set (&error)) {
402
g_warning ("Hal connection problem : %s\n",
404
dbus_error_free (&error);
407
libhal_free_string_array (volumes);
411
for (j = 0; j < nb_volumes; j++) {
412
BraseroMedium *medium;
414
medium = BRASERO_MEDIUM (brasero_volume_new (drive, volumes [j]));
415
priv->media = g_slist_prepend (priv->media, medium);
416
brasero_drive_set_medium (drive, medium);
419
libhal_free_string_array (volumes);
309
g_signal_connect (drive,
311
G_CALLBACK (brasero_medium_monitor_medium_added_cb),
313
g_signal_connect (drive,
315
G_CALLBACK (brasero_medium_monitor_medium_removed_cb),
421
318
libhal_free_string_array (devices);
423
brasero_medium_monitor_add_file (object);
428
libhal_ctx_shutdown (priv->ctx, NULL);
429
libhal_ctx_free (priv->ctx);
433
libhal_free_string_array (devices);
320
/* add fake/file drive */
321
drive = brasero_drive_new (NULL);
322
priv->drives = g_slist_prepend (priv->drives, drive);