~mfisch/brasero/update-to-3.8.0

« back to all changes in this revision

Viewing changes to src/brasero-session-cfg.c

  • Committer: Bazaar Package Importer
  • Author(s): Robert Ancell
  • Date: 2009-06-03 10:36:30 UTC
  • mfrom: (1.1.23 upstream)
  • Revision ID: james.westby@ubuntu.com-20090603103630-2r72408gk45sc0ws
Tags: 2.27.2-0ubuntu1
* New upstream release (LP: #380850)
  - Split burning backend into a new library called libbrasero-burn
  - Split some utilities into a new library called libbrasero-utils
  - Use Brasero as a single instance application using libunique
  - Data spanning
  - Memleak fixes
  - Bug Fixes
  - String fixes
  - Use autogenerated Changelog via git
  - Translation Updates
  - Fixes (LP: #360671)
* Bump GTK+ requirement and add libunique requirement

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2
 
/*
3
 
 * brasero
4
 
 * Copyright (C) Philippe Rouquier 2008 <bonfire-app@wanadoo.fr>
5
 
 * 
6
 
 * brasero is free software: you can redistribute it and/or modify it
7
 
 * under the terms of the GNU General Public License as published by the
8
 
 * Free Software Foundation, either version 3 of the License, or
9
 
 * (at your option) any later version.
10
 
 * 
11
 
 * brasero is distributed in the hope that it will be useful, but
12
 
 * WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
 
 * See the GNU General Public License for more details.
15
 
 * 
16
 
 * You should have received a copy of the GNU General Public License along
17
 
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
18
 
 */
19
 
 
20
 
#ifdef HAVE_CONFIG_H
21
 
#  include <config.h>
22
 
#endif
23
 
 
24
 
#include <string.h>
25
 
 
26
 
#include <glib.h>
27
 
#include <glib-object.h>
28
 
#include <glib/gi18n-lib.h>
29
 
 
30
 
#include <gconf/gconf-client.h>
31
 
 
32
 
#include "burn-basics.h"
33
 
#include "burn-debug.h"
34
 
#include "burn-plugin-manager.h"
35
 
#include "burn-session.h"
36
 
#include "burn-caps.h"
37
 
#include "burn-plugin-manager.h"
38
 
#include "burn-image-format.h"
39
 
 
40
 
#include "brasero-session-cfg.h"
41
 
 
42
 
typedef struct _BraseroSessionCfgPrivate BraseroSessionCfgPrivate;
43
 
struct _BraseroSessionCfgPrivate
44
 
{
45
 
        BraseroBurnCaps *caps;
46
 
 
47
 
        BraseroBurnFlag supported;
48
 
        BraseroBurnFlag compulsory;
49
 
 
50
 
        gchar *output;
51
 
 
52
 
        glong caps_sig;
53
 
 
54
 
        BraseroSessionError is_valid;
55
 
 
56
 
        guint CD_TEXT_modified:1;
57
 
        guint configuring:1;
58
 
        guint disabled:1;
59
 
};
60
 
 
61
 
#define BRASERO_SESSION_CFG_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_SESSION_CFG, BraseroSessionCfgPrivate))
62
 
 
63
 
enum
64
 
{
65
 
        IS_VALID_SIGNAL,
66
 
        LAST_SIGNAL
67
 
};
68
 
 
69
 
 
70
 
static guint session_cfg_signals [LAST_SIGNAL] = { 0 };
71
 
 
72
 
G_DEFINE_TYPE (BraseroSessionCfg, brasero_session_cfg, BRASERO_TYPE_BURN_SESSION);
73
 
 
74
 
#define BRASERO_DEST_SAVED_FLAGS                (BRASERO_DRIVE_PROPERTIES_FLAGS|BRASERO_BURN_FLAG_MULTI)
75
 
#define BRASERO_DRIVE_PROPERTIES_KEY            "/apps/brasero/drives"
76
 
 
77
 
/**
78
 
 * Get a key to save parameters through GConf
79
 
 */
80
 
 
81
 
static gchar *
82
 
brasero_session_cfg_get_gconf_key (BraseroSessionCfg *self,
83
 
                                   const gchar *property)
84
 
{
85
 
        BraseroMedium *medium;
86
 
        BraseroDrive *drive;
87
 
        gchar *display_name;
88
 
        gchar *key = NULL;
89
 
        gchar *disc_type;
90
 
 
91
 
        drive = brasero_burn_session_get_burner (BRASERO_BURN_SESSION (self));
92
 
        if (!drive)
93
 
                return NULL;
94
 
 
95
 
        medium = brasero_drive_get_medium (drive);
96
 
        if (brasero_medium_get_status (medium) == BRASERO_MEDIUM_NONE)
97
 
                return NULL;
98
 
        
99
 
        /* make sure display_name doesn't contain any forbidden characters */
100
 
        if (!brasero_drive_is_fake (drive)) {
101
 
                gchar *tmp;
102
 
 
103
 
                tmp = brasero_drive_get_display_name (drive);
104
 
                display_name = gconf_escape_key (tmp, -1);
105
 
                g_free (tmp);
106
 
        }
107
 
        else
108
 
                display_name = g_strdup ("File");
109
 
 
110
 
        display_name = display_name ? display_name : "";
111
 
 
112
 
        disc_type = gconf_escape_key (brasero_medium_get_type_string (medium), -1);
113
 
        if (!disc_type) {
114
 
                g_free (display_name);
115
 
                return NULL;
116
 
        }
117
 
 
118
 
        switch (brasero_burn_session_get_input_type (BRASERO_BURN_SESSION (self), NULL)) {
119
 
        case BRASERO_TRACK_TYPE_NONE:
120
 
                key = g_strdup_printf ("%s/%s/none_%s/%s",
121
 
                                       BRASERO_DRIVE_PROPERTIES_KEY,
122
 
                                       display_name,
123
 
                                       disc_type,
124
 
                                       property);
125
 
                break;
126
 
        case BRASERO_TRACK_TYPE_DISC:
127
 
                key = g_strdup_printf ("%s/%s/disc_%s/%s",
128
 
                                       BRASERO_DRIVE_PROPERTIES_KEY,
129
 
                                       display_name,
130
 
                                       disc_type,
131
 
                                       property);
132
 
                break;
133
 
 
134
 
        case BRASERO_TRACK_TYPE_DATA:
135
 
                key = g_strdup_printf ("%s/%s/data_%s/%s",
136
 
                                       BRASERO_DRIVE_PROPERTIES_KEY,
137
 
                                       display_name,
138
 
                                       disc_type,
139
 
                                       property);
140
 
                break;
141
 
 
142
 
        case BRASERO_TRACK_TYPE_IMAGE:
143
 
                key = g_strdup_printf ("%s/%s/image_%s/%s",
144
 
                                       BRASERO_DRIVE_PROPERTIES_KEY,
145
 
                                       display_name,
146
 
                                       disc_type,
147
 
                                       property);
148
 
                break;
149
 
 
150
 
        case BRASERO_TRACK_TYPE_AUDIO:
151
 
                key = g_strdup_printf ("%s/%s/audio_%s/%s",
152
 
                                       BRASERO_DRIVE_PROPERTIES_KEY,
153
 
                                       display_name,
154
 
                                       disc_type,
155
 
                                       property);
156
 
                break;
157
 
        default:
158
 
                break;
159
 
        }
160
 
 
161
 
        g_free (display_name);
162
 
        g_free (disc_type);
163
 
        return key;
164
 
}
165
 
 
166
 
BraseroSessionError
167
 
brasero_session_cfg_get_error (BraseroSessionCfg *self)
168
 
{
169
 
        BraseroSessionCfgPrivate *priv;
170
 
 
171
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
172
 
 
173
 
        if (priv->is_valid == BRASERO_SESSION_VALID
174
 
        &&  priv->CD_TEXT_modified)
175
 
                return BRASERO_SESSION_NO_CD_TEXT;
176
 
 
177
 
        return priv->is_valid;
178
 
}
179
 
 
180
 
void
181
 
brasero_session_cfg_disable (BraseroSessionCfg *self)
182
 
{
183
 
        BraseroSessionCfgPrivate *priv;
184
 
 
185
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
186
 
        priv->disabled = TRUE;
187
 
}
188
 
 
189
 
static void
190
 
brasero_session_cfg_save_drive_properties (BraseroSessionCfg *self)
191
 
{
192
 
        BraseroSessionCfgPrivate *priv;
193
 
        BraseroBurnFlag flags;
194
 
        GConfClient *client;
195
 
        const gchar *path;
196
 
        guint64 rate;
197
 
        gchar *key;
198
 
 
199
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
200
 
 
201
 
        client = gconf_client_get_default ();
202
 
 
203
 
        rate = brasero_burn_session_get_rate (BRASERO_BURN_SESSION (self));
204
 
        key = brasero_session_cfg_get_gconf_key (self, "speed");
205
 
        if (!key) {
206
 
                g_object_unref (client);
207
 
                return;
208
 
        }
209
 
 
210
 
        gconf_client_set_int (client, key, rate / 1000, NULL);
211
 
        g_free (key);
212
 
 
213
 
        key = brasero_session_cfg_get_gconf_key (self, "flags");
214
 
        if (!key) {
215
 
                g_object_unref (client);
216
 
                return;
217
 
        }
218
 
 
219
 
        flags = gconf_client_get_int (client, key, NULL);
220
 
        flags &= ~BRASERO_DEST_SAVED_FLAGS;
221
 
        flags |= (brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self)) & BRASERO_DEST_SAVED_FLAGS);
222
 
        gconf_client_set_int (client, key, flags, NULL);
223
 
        g_free (key);
224
 
 
225
 
        /* temporary directory */
226
 
        path = brasero_burn_session_get_tmpdir (BRASERO_BURN_SESSION (self));
227
 
        key = g_strdup_printf ("%s/tmpdir", BRASERO_DRIVE_PROPERTIES_KEY);
228
 
        gconf_client_set_string (client, key, path, NULL);
229
 
        g_free (key);
230
 
 
231
 
        g_object_unref (client);
232
 
}
233
 
 
234
 
static void
235
 
brasero_session_cfg_add_drive_properties_flags (BraseroSessionCfg *self,
236
 
                                                BraseroBurnFlag flags)
237
 
{
238
 
        BraseroMedia media;
239
 
        BraseroBurnFlag flag;
240
 
        BraseroBurnResult result;
241
 
        BraseroSessionCfgPrivate *priv;
242
 
 
243
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
244
 
 
245
 
        media = brasero_burn_session_get_dest_media (BRASERO_BURN_SESSION (self));
246
 
 
247
 
        /* add flags then wipe out flags from session to check them one by one */
248
 
        flags |= brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self));
249
 
        brasero_burn_session_remove_flag (BRASERO_BURN_SESSION (self), flags);
250
 
 
251
 
        priv->supported = BRASERO_BURN_FLAG_NONE;
252
 
        priv->compulsory = BRASERO_BURN_FLAG_NONE;
253
 
        result = brasero_burn_caps_get_flags (priv->caps,
254
 
                                              BRASERO_BURN_SESSION (self),
255
 
                                              &priv->supported,
256
 
                                              &priv->compulsory);
257
 
        if (result != BRASERO_BURN_OK) {
258
 
                brasero_burn_session_set_flags (BRASERO_BURN_SESSION (self), flags);
259
 
                return;
260
 
        }
261
 
 
262
 
        /* These are always supported and better be set. */
263
 
        brasero_burn_session_set_flags (BRASERO_BURN_SESSION (self),
264
 
                                        BRASERO_BURN_FLAG_DONT_OVERWRITE|
265
 
                                        BRASERO_BURN_FLAG_CHECK_SIZE|
266
 
                                        BRASERO_BURN_FLAG_NOGRACE);
267
 
 
268
 
        for (flag = BRASERO_BURN_FLAG_EJECT; flag < BRASERO_BURN_FLAG_LAST; flag <<= 1) {
269
 
                /* see if this flag was originally set */
270
 
                if (!(flags & flag))
271
 
                        continue;
272
 
 
273
 
                /* Don't set write modes now in this case */
274
 
                if (brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self))
275
 
                && (flag & (BRASERO_BURN_FLAG_DAO|BRASERO_BURN_FLAG_RAW)))
276
 
                        continue;
277
 
 
278
 
                if (priv->compulsory
279
 
                && (priv->compulsory & brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self))) != priv->compulsory) {
280
 
                        brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self), priv->compulsory);
281
 
 
282
 
                        priv->supported = BRASERO_BURN_FLAG_NONE;
283
 
                        priv->compulsory = BRASERO_BURN_FLAG_NONE;
284
 
                        brasero_burn_caps_get_flags (priv->caps,
285
 
                                                     BRASERO_BURN_SESSION (self),
286
 
                                                     &priv->supported,
287
 
                                                     &priv->compulsory);
288
 
                }
289
 
 
290
 
                if (priv->supported & flag) {
291
 
                        brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self), flag);
292
 
 
293
 
                        priv->supported = BRASERO_BURN_FLAG_NONE;
294
 
                        priv->compulsory = BRASERO_BURN_FLAG_NONE;
295
 
                        brasero_burn_caps_get_flags (priv->caps,
296
 
                                                     BRASERO_BURN_SESSION (self),
297
 
                                                     &priv->supported,
298
 
                                                     &priv->compulsory);
299
 
                }
300
 
        }
301
 
 
302
 
        if (BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_PLUS)
303
 
        ||  BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_RESTRICTED)
304
 
        ||  BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_PLUS_DL)) {
305
 
                /* This is a special case to favour libburn/growisofs
306
 
                 * wodim/cdrecord for these types of media. */
307
 
                if (priv->supported & BRASERO_BURN_FLAG_MULTI) {
308
 
                        brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self),
309
 
                                                       BRASERO_BURN_FLAG_MULTI);
310
 
 
311
 
                        priv->supported = BRASERO_BURN_FLAG_NONE;
312
 
                        priv->compulsory = BRASERO_BURN_FLAG_NONE;
313
 
                        brasero_burn_caps_get_flags (priv->caps,
314
 
                                                     BRASERO_BURN_SESSION (self),
315
 
                                                     &priv->supported,
316
 
                                                     &priv->compulsory);
317
 
                }
318
 
        }
319
 
 
320
 
        /* Always set this flag whenever possible */
321
 
        if (priv->supported & BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE) {
322
 
                brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self),
323
 
                                               BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE);
324
 
 
325
 
                if (priv->supported & BRASERO_BURN_FLAG_FAST_BLANK)
326
 
                        brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self),
327
 
                                                       BRASERO_BURN_FLAG_FAST_BLANK);
328
 
 
329
 
                priv->supported = BRASERO_BURN_FLAG_NONE;
330
 
                priv->compulsory = BRASERO_BURN_FLAG_NONE;
331
 
                brasero_burn_caps_get_flags (priv->caps,
332
 
                                             BRASERO_BURN_SESSION (self),
333
 
                                             &priv->supported,
334
 
                                             &priv->compulsory);
335
 
        }
336
 
 
337
 
        /* When copying with same drive don't set write mode, it'll be set later */
338
 
        if (!brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self))) {
339
 
                /* use DAO whenever it's possible */
340
 
                if (priv->supported & BRASERO_BURN_FLAG_DAO) {
341
 
                        brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self), BRASERO_BURN_FLAG_DAO);
342
 
 
343
 
                        priv->supported = BRASERO_BURN_FLAG_NONE;
344
 
                        priv->compulsory = BRASERO_BURN_FLAG_NONE;
345
 
                        brasero_burn_caps_get_flags (priv->caps,
346
 
                                                     BRASERO_BURN_SESSION (self),
347
 
                                                     &priv->supported,
348
 
                                                     &priv->compulsory);
349
 
 
350
 
                        /* NOTE: after setting DAO, some flags may become
351
 
                         * compulsory like BLANK_BEFORE for CDRW with data */
352
 
                }
353
 
        }
354
 
 
355
 
        /* Always save flags */
356
 
        brasero_session_cfg_save_drive_properties (self);
357
 
}
358
 
 
359
 
static void
360
 
brasero_session_cfg_set_drive_properties (BraseroSessionCfg *self)
361
 
{
362
 
        BraseroTrackType source = { 0, };
363
 
        BraseroSessionCfgPrivate *priv;
364
 
        BraseroBurnFlag flags;
365
 
        BraseroMedium *medium;
366
 
        BraseroDrive *drive;
367
 
        GConfClient *client;
368
 
        GConfValue *value;
369
 
        guint64 rate;
370
 
        gchar *path;
371
 
        gchar *key;
372
 
 
373
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
374
 
 
375
 
        /* The next two must work as they were checked earlier */
376
 
        brasero_burn_session_get_input_type (BRASERO_BURN_SESSION (self), &source);
377
 
        drive = brasero_burn_session_get_burner (BRASERO_BURN_SESSION (self));
378
 
 
379
 
        medium = brasero_drive_get_medium (drive);
380
 
        if (!medium || brasero_medium_get_status (medium) == BRASERO_MEDIUM_NONE)
381
 
                return;
382
 
 
383
 
        /* Update/set the rate */
384
 
        client = gconf_client_get_default ();
385
 
 
386
 
        key = brasero_session_cfg_get_gconf_key (self, "speed");
387
 
        value = gconf_client_get_without_default (client, key, NULL);
388
 
        g_free (key);
389
 
 
390
 
        if (value) {
391
 
                rate = gconf_value_get_int (value) * 1000;
392
 
                gconf_value_free (value);
393
 
        }
394
 
        else
395
 
                rate = brasero_medium_get_max_write_speed (medium);
396
 
 
397
 
        brasero_burn_session_set_rate (BRASERO_BURN_SESSION (self), rate);
398
 
 
399
 
        /* Set temporary directory
400
 
         * NOTE: BraseroBurnSession can cope with NULL path */
401
 
        key = g_strdup_printf ("%s/tmpdir", BRASERO_DRIVE_PROPERTIES_KEY);
402
 
        path = gconf_client_get_string (client, key, NULL);
403
 
        g_free (key);
404
 
 
405
 
        brasero_burn_session_set_tmpdir (BRASERO_BURN_SESSION (self), path);
406
 
        g_free (path);
407
 
 
408
 
        /* Do the same with the flags.
409
 
         * NOTE: we only save/load PROPERTIES_FLAGS */
410
 
        key = brasero_session_cfg_get_gconf_key (self, "flags");
411
 
        if (!key) {
412
 
                g_object_unref (client);
413
 
                return;
414
 
        }
415
 
 
416
 
        value = gconf_client_get_without_default (client, key, NULL);
417
 
        g_free (key);
418
 
 
419
 
        g_object_unref (client);
420
 
 
421
 
        if (brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self))) {
422
 
                /* Special case */
423
 
                if (value) {
424
 
                        flags = gconf_value_get_int (value) & BRASERO_DEST_SAVED_FLAGS;
425
 
                        gconf_value_free (value);
426
 
                }
427
 
                else
428
 
                        flags = BRASERO_BURN_FLAG_EJECT|
429
 
                                BRASERO_BURN_FLAG_BURNPROOF;
430
 
 
431
 
                flags |= BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE|
432
 
                         BRASERO_BURN_FLAG_FAST_BLANK;
433
 
        }
434
 
        else if (!value) {
435
 
                /* Set sound defaults. */
436
 
                flags = BRASERO_BURN_FLAG_EJECT|
437
 
                        BRASERO_BURN_FLAG_BURNPROOF;
438
 
 
439
 
                if (source.type == BRASERO_TRACK_TYPE_DATA
440
 
                ||  source.type == BRASERO_TRACK_TYPE_DISC
441
 
                ||  source.type == BRASERO_TRACK_TYPE_IMAGE)
442
 
                        flags |= BRASERO_BURN_FLAG_NO_TMP_FILES;
443
 
        }
444
 
        else {
445
 
                /* set the saved flags */
446
 
                flags = gconf_value_get_int (value) & BRASERO_DEST_SAVED_FLAGS;
447
 
                gconf_value_free (value);
448
 
        }
449
 
 
450
 
        brasero_session_cfg_add_drive_properties_flags (self, flags);
451
 
}
452
 
 
453
 
static void
454
 
brasero_session_cfg_check_drive_settings (BraseroSessionCfg *self)
455
 
{
456
 
        BraseroSessionCfgPrivate *priv;
457
 
        BraseroBurnFlag flags;
458
 
 
459
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
460
 
 
461
 
        /* Try to properly update the flags for the current drive */
462
 
        flags = brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self));
463
 
        if (brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self))) {
464
 
                flags |= BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE|
465
 
                         BRASERO_BURN_FLAG_FAST_BLANK;
466
 
        }
467
 
 
468
 
        /* check each flag before re-adding it */
469
 
        brasero_session_cfg_add_drive_properties_flags (self, flags);
470
 
}
471
 
 
472
 
static BraseroSessionError
473
 
brasero_session_cfg_check_size (BraseroSessionCfg *self)
474
 
{
475
 
        BraseroSessionCfgPrivate *priv;
476
 
        BraseroBurnFlag flags;
477
 
        BraseroMedium *medium;
478
 
        BraseroDrive *burner;
479
 
        GValue *value = NULL;
480
 
        /* in sectors */
481
 
        gint64 session_size;
482
 
        gint64 max_sectors;
483
 
        gint64 disc_size;
484
 
        GSList *iter;
485
 
 
486
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
487
 
 
488
 
        burner = brasero_burn_session_get_burner (BRASERO_BURN_SESSION (self));
489
 
        if (!burner) {
490
 
                priv->is_valid = BRASERO_SESSION_NO_OUTPUT;
491
 
                return BRASERO_SESSION_NO_OUTPUT;
492
 
        }
493
 
 
494
 
        /* FIXME: here we could check the hard drive space */
495
 
        if (brasero_drive_is_fake (burner)) {
496
 
                priv->is_valid = BRASERO_SESSION_VALID;
497
 
                return BRASERO_SESSION_VALID;
498
 
        }
499
 
 
500
 
        medium = brasero_drive_get_medium (burner);
501
 
        if (!medium) {
502
 
                priv->is_valid = BRASERO_SESSION_NO_OUTPUT;
503
 
                return BRASERO_SESSION_NO_OUTPUT;
504
 
        }
505
 
 
506
 
        flags = brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self));
507
 
        if (flags & (BRASERO_BURN_FLAG_MERGE|BRASERO_BURN_FLAG_APPEND))
508
 
                brasero_medium_get_free_space (medium, NULL, &disc_size);
509
 
        else
510
 
                brasero_medium_get_capacity (medium, NULL, &disc_size);
511
 
 
512
 
        if (disc_size < 0)
513
 
                disc_size = 0;
514
 
 
515
 
        /* get input track size */
516
 
        iter = brasero_burn_session_get_tracks (BRASERO_BURN_SESSION (self));
517
 
        session_size = 0;
518
 
 
519
 
        if (brasero_burn_session_tag_lookup (BRASERO_BURN_SESSION (self),
520
 
                                             BRASERO_DATA_TRACK_SIZE_TAG,
521
 
                                             &value) == BRASERO_BURN_OK) {
522
 
                session_size = g_value_get_int64 (value);
523
 
        }
524
 
        else if (brasero_burn_session_tag_lookup (BRASERO_BURN_SESSION (self),
525
 
                                                  BRASERO_AUDIO_TRACK_SIZE_TAG,
526
 
                                                  &value) == BRASERO_BURN_OK) {
527
 
                session_size = g_value_get_int64 (value);
528
 
        }
529
 
        else for (; iter; iter = iter->next) {
530
 
                BraseroTrackDataType type;
531
 
                BraseroTrack *track;
532
 
                gint64 sectors;
533
 
 
534
 
                track = iter->data;
535
 
                sectors = 0;
536
 
 
537
 
                type = brasero_track_get_type (track, NULL);
538
 
                if (type == BRASERO_TRACK_TYPE_DISC)
539
 
                        brasero_track_get_disc_data_size (track, &sectors, NULL);
540
 
                else if (type == BRASERO_TRACK_TYPE_IMAGE)
541
 
                        brasero_track_get_image_size (track, NULL, &sectors, NULL, NULL);
542
 
                else if (type == BRASERO_TRACK_TYPE_AUDIO) {
543
 
                        gint64 len = 0;
544
 
 
545
 
                        brasero_track_get_audio_length (track, &len);
546
 
                        sectors = BRASERO_DURATION_TO_SECTORS (len);
547
 
                }
548
 
 
549
 
                session_size += sectors;
550
 
        }
551
 
 
552
 
        BRASERO_BURN_LOG ("Session size %lli/Disc size %lli",
553
 
                          session_size,
554
 
                          disc_size);
555
 
 
556
 
        if (session_size < disc_size) {
557
 
                priv->is_valid = BRASERO_SESSION_VALID;
558
 
                return BRASERO_SESSION_VALID;
559
 
        }
560
 
 
561
 
        /* FIXME: This is not good since with a DVD 3% of 4.3G may be too much
562
 
         * with 3% we are slightly over the limit of the most overburnable discs
563
 
         * but at least users can try to overburn as much as they can. */
564
 
 
565
 
        /* The idea would be to test write the disc with cdrecord from /dev/null
566
 
         * until there is an error and see how much we were able to write. So,
567
 
         * when we propose overburning to the user, we could ask if he wants
568
 
         * us to determine how much data can be written to a particular disc
569
 
         * provided he has chosen a real disc. */
570
 
        max_sectors = disc_size * 103 / 100;
571
 
        if (max_sectors < session_size) {
572
 
                priv->is_valid = BRASERO_SESSION_INSUFFICIENT_SPACE;
573
 
                return BRASERO_SESSION_INSUFFICIENT_SPACE;
574
 
        }
575
 
 
576
 
        if (!(flags & BRASERO_BURN_FLAG_OVERBURN)) {
577
 
                BraseroSessionCfgPrivate *priv;
578
 
 
579
 
                priv = BRASERO_SESSION_CFG_PRIVATE (self);
580
 
 
581
 
                if (!(priv->supported & BRASERO_BURN_FLAG_OVERBURN)) {
582
 
                        priv->is_valid = BRASERO_SESSION_INSUFFICIENT_SPACE;
583
 
                        return BRASERO_SESSION_INSUFFICIENT_SPACE;
584
 
                }
585
 
 
586
 
                priv->is_valid = BRASERO_SESSION_OVERBURN_NECESSARY;
587
 
                return BRASERO_SESSION_OVERBURN_NECESSARY;
588
 
        }
589
 
 
590
 
        priv->is_valid = BRASERO_SESSION_VALID;
591
 
        return BRASERO_SESSION_VALID;
592
 
}
593
 
 
594
 
static void
595
 
brasero_session_cfg_update (BraseroSessionCfg *self,
596
 
                            gboolean update,
597
 
                            gboolean check)
598
 
{
599
 
        BraseroSessionCfgPrivate *priv;
600
 
        BraseroTrackType source = { 0, };
601
 
        BraseroBurnResult result;
602
 
        BraseroDrive *burner;
603
 
 
604
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
605
 
 
606
 
        if (priv->configuring)
607
 
                return;
608
 
 
609
 
        /* Make sure there is a source */
610
 
        brasero_burn_session_get_input_type (BRASERO_BURN_SESSION (self), &source);
611
 
        if (source.type == BRASERO_TRACK_TYPE_NONE) {
612
 
                priv->is_valid = BRASERO_SESSION_NOT_SUPPORTED;
613
 
                g_signal_emit (self,
614
 
                               session_cfg_signals [IS_VALID_SIGNAL],
615
 
                               0);
616
 
                return;
617
 
        }
618
 
 
619
 
        if (source.type == BRASERO_TRACK_TYPE_DISC
620
 
        &&  source.subtype.media == BRASERO_MEDIUM_NONE) {
621
 
                priv->is_valid = BRASERO_SESSION_NO_INPUT_MEDIUM;
622
 
                g_signal_emit (self,
623
 
                               session_cfg_signals [IS_VALID_SIGNAL],
624
 
                               0);
625
 
                return;
626
 
        }
627
 
 
628
 
        if (source.type == BRASERO_TRACK_TYPE_IMAGE
629
 
        &&  source.subtype.img_format == BRASERO_IMAGE_FORMAT_NONE) {
630
 
                gchar *uri;
631
 
                GSList *tracks;
632
 
 
633
 
                tracks = brasero_burn_session_get_tracks (BRASERO_BURN_SESSION (self));
634
 
 
635
 
                /* It can be two cases:
636
 
                 * - no image set
637
 
                 * - image format cannot be detected */
638
 
                if (tracks) {
639
 
                        BraseroTrack *track;
640
 
 
641
 
                        track = tracks->data;
642
 
                        uri = brasero_track_get_image_source (track, TRUE);
643
 
                        if (uri) {
644
 
                                priv->is_valid = BRASERO_SESSION_UNKNOWN_IMAGE;
645
 
                                g_free (uri);
646
 
                        }
647
 
                        else
648
 
                                priv->is_valid = BRASERO_SESSION_NO_INPUT_IMAGE;
649
 
                }
650
 
                else
651
 
                        priv->is_valid = BRASERO_SESSION_NO_INPUT_IMAGE;
652
 
 
653
 
                g_signal_emit (self,
654
 
                               session_cfg_signals [IS_VALID_SIGNAL],
655
 
                               0);
656
 
                return;
657
 
        }
658
 
 
659
 
        /* FIXME: another easy error to catch: AUDIO project with a DVD */
660
 
 
661
 
        /* make sure there is an output set */
662
 
        burner = brasero_burn_session_get_burner (BRASERO_BURN_SESSION (self));
663
 
        if (!burner) {
664
 
                priv->is_valid = BRASERO_SESSION_NO_OUTPUT;
665
 
                g_signal_emit (self,
666
 
                               session_cfg_signals [IS_VALID_SIGNAL],
667
 
                               0);
668
 
                return;
669
 
        }
670
 
 
671
 
        /* Check that current input and output work */
672
 
        if (priv->CD_TEXT_modified) {
673
 
                /* Try to redo what we undid (after all a new plugin could have
674
 
                 * been activated in the mean time ...) and see what happens */
675
 
                source.subtype.audio_format |= BRASERO_METADATA_INFO;
676
 
                result = brasero_burn_caps_is_input_supported (priv->caps,
677
 
                                                               BRASERO_BURN_SESSION (self),
678
 
                                                               &source,
679
 
                                                               FALSE);
680
 
                if (result == BRASERO_BURN_OK) {
681
 
                        priv->CD_TEXT_modified = FALSE;
682
 
 
683
 
                        priv->configuring = TRUE;
684
 
                        brasero_burn_session_set_input_type (BRASERO_BURN_SESSION (self), &source);
685
 
                        priv->configuring = FALSE;
686
 
                }
687
 
                else {
688
 
                        /* No, nothing's changed */
689
 
                        source.subtype.audio_format &= ~BRASERO_METADATA_INFO;
690
 
                        result = brasero_burn_caps_is_input_supported (priv->caps,
691
 
                                                                       BRASERO_BURN_SESSION (self),
692
 
                                                                       &source,
693
 
                                                                       FALSE);
694
 
                }
695
 
        }
696
 
        else {
697
 
                /* Don't use flags as they'll be adapted later. */
698
 
                result = brasero_burn_caps_is_session_supported (priv->caps,
699
 
                                                                 BRASERO_BURN_SESSION (self),
700
 
                                                                 FALSE);
701
 
                if (result != BRASERO_BURN_OK
702
 
                &&  source.type == BRASERO_TRACK_TYPE_AUDIO
703
 
                && (source.subtype.audio_format & BRASERO_METADATA_INFO)) {
704
 
                        /* Another special case in case some burning backends 
705
 
                         * don't support CD-TEXT for audio (libburn). If no
706
 
                         * other backend is available remove CD-TEXT option but
707
 
                         * tell user... */
708
 
                        source.subtype.audio_format &= ~BRASERO_METADATA_INFO;
709
 
                        result = brasero_burn_caps_is_input_supported (priv->caps,
710
 
                                                                       BRASERO_BURN_SESSION (self),
711
 
                                                                       &source,
712
 
                                                                       FALSE);
713
 
                        BRASERO_BURN_LOG ("Tested support without Metadata information (result %d)", result);
714
 
                        if (result == BRASERO_BURN_OK) {
715
 
                                priv->CD_TEXT_modified = TRUE;
716
 
 
717
 
                                priv->configuring = TRUE;
718
 
                                brasero_burn_session_set_input_type (BRASERO_BURN_SESSION (self), &source);
719
 
                                priv->configuring = FALSE;
720
 
                        }
721
 
                }
722
 
        }
723
 
 
724
 
        if (result != BRASERO_BURN_OK) {
725
 
                if (source.type == BRASERO_TRACK_TYPE_DISC
726
 
                && (source.subtype.media & BRASERO_MEDIUM_PROTECTED)
727
 
                &&  brasero_track_type_is_supported (&source) != BRASERO_BURN_OK) {
728
 
                        /* This is a special case to display a helpful message */
729
 
                        priv->is_valid = BRASERO_SESSION_DISC_PROTECTED;
730
 
                        g_signal_emit (self,
731
 
                                       session_cfg_signals [IS_VALID_SIGNAL],
732
 
                                       0);
733
 
                }
734
 
                else {
735
 
                        priv->is_valid = BRASERO_SESSION_NOT_SUPPORTED;
736
 
                        g_signal_emit (self,
737
 
                                       session_cfg_signals [IS_VALID_SIGNAL],
738
 
                                       0);
739
 
                }
740
 
 
741
 
                return;
742
 
        }
743
 
 
744
 
        /* Configure flags */
745
 
        priv->configuring = TRUE;
746
 
 
747
 
        if (brasero_drive_is_fake (burner))
748
 
                /* Remove some impossible flags */
749
 
                brasero_burn_session_remove_flag (BRASERO_BURN_SESSION (self),
750
 
                                                  BRASERO_BURN_FLAG_DUMMY|
751
 
                                                  BRASERO_BURN_FLAG_NO_TMP_FILES);
752
 
 
753
 
        if (update)
754
 
                brasero_session_cfg_set_drive_properties (self);
755
 
        else if (check)
756
 
                brasero_session_cfg_check_drive_settings (self);
757
 
 
758
 
        priv->configuring = FALSE;
759
 
 
760
 
        /* Finally check size */
761
 
        if (brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self))) {
762
 
                priv->is_valid = BRASERO_SESSION_VALID;
763
 
                g_signal_emit (self,
764
 
                               session_cfg_signals [IS_VALID_SIGNAL],
765
 
                               0);
766
 
        }
767
 
        else {
768
 
                brasero_session_cfg_check_size (self);
769
 
                g_signal_emit (self,
770
 
                               session_cfg_signals [IS_VALID_SIGNAL],
771
 
                               0);
772
 
        }
773
 
}
774
 
 
775
 
static void
776
 
brasero_session_cfg_input_changed (BraseroBurnSession *session)
777
 
{
778
 
        BraseroSessionCfgPrivate *priv;
779
 
 
780
 
        priv = BRASERO_SESSION_CFG_PRIVATE (session);
781
 
        if (priv->disabled)
782
 
                return;
783
 
 
784
 
        /* when that happens it's mostly because a medium source changed, or
785
 
         * a new image was set. 
786
 
         * - reload saved flags
787
 
         * - check if all flags are thereafter supported
788
 
         * - check available formats for path
789
 
         * - set one path
790
 
         */
791
 
        brasero_session_cfg_update (BRASERO_SESSION_CFG (session),
792
 
                                    TRUE,
793
 
                                    FALSE);
794
 
}
795
 
 
796
 
static void
797
 
brasero_session_cfg_output_changed (BraseroBurnSession *session)
798
 
{
799
 
        BraseroSessionCfgPrivate *priv;
800
 
 
801
 
        priv = BRASERO_SESSION_CFG_PRIVATE (session);
802
 
        if (priv->disabled)
803
 
                return;
804
 
 
805
 
        /* In this case need to :
806
 
         * - load flags 
807
 
         * - check if all flags are thereafter supported
808
 
         * - for images, set a path if it wasn't already set
809
 
         */
810
 
        brasero_session_cfg_update (BRASERO_SESSION_CFG (session),
811
 
                                    TRUE,
812
 
                                    FALSE);
813
 
}
814
 
 
815
 
static void
816
 
brasero_session_cfg_caps_changed (BraseroPluginManager *manager,
817
 
                                  BraseroSessionCfg *self)
818
 
{
819
 
        BraseroSessionCfgPrivate *priv;
820
 
 
821
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
822
 
        if (priv->disabled)
823
 
                return;
824
 
 
825
 
        /* In this case we need to check if:
826
 
         * - new flags are supported or not supported anymore
827
 
         * - new image types as input/output are supported
828
 
         * - if the current set of flags/input/output still works */
829
 
        brasero_session_cfg_update (self,
830
 
                                    FALSE,
831
 
                                    TRUE);
832
 
}
833
 
 
834
 
void
835
 
brasero_session_cfg_add_flags (BraseroSessionCfg *self,
836
 
                               BraseroBurnFlag flags)
837
 
{
838
 
        BraseroSessionCfgPrivate *priv;
839
 
 
840
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
841
 
 
842
 
        if ((priv->supported & flags) != flags)
843
 
                return;
844
 
 
845
 
        if ((brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self)) & flags) == flags)
846
 
                return;
847
 
 
848
 
        brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self), flags);
849
 
        priv->supported = BRASERO_BURN_FLAG_NONE;
850
 
        priv->compulsory = BRASERO_BURN_FLAG_NONE;
851
 
        brasero_burn_caps_get_flags (priv->caps,
852
 
                                     BRASERO_BURN_SESSION (self),
853
 
                                     &priv->supported,
854
 
                                     &priv->compulsory);
855
 
 
856
 
        /* Always save flags */
857
 
        brasero_session_cfg_save_drive_properties (self);
858
 
 
859
 
        brasero_session_cfg_update (self,
860
 
                                    FALSE,
861
 
                                    FALSE);
862
 
}
863
 
 
864
 
void
865
 
brasero_session_cfg_remove_flags (BraseroSessionCfg *self,
866
 
                                  BraseroBurnFlag flags)
867
 
{
868
 
        BraseroSessionCfgPrivate *priv;
869
 
 
870
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
871
 
 
872
 
        brasero_burn_session_remove_flag (BRASERO_BURN_SESSION (self), flags);
873
 
        priv->supported = BRASERO_BURN_FLAG_NONE;
874
 
        priv->compulsory = BRASERO_BURN_FLAG_NONE;
875
 
        brasero_burn_caps_get_flags (priv->caps,
876
 
                                     BRASERO_BURN_SESSION (self),
877
 
                                     &priv->supported,
878
 
                                     &priv->compulsory);
879
 
 
880
 
        /* Always save flags */
881
 
        brasero_session_cfg_save_drive_properties (self);
882
 
 
883
 
        brasero_session_cfg_update (self,
884
 
                                    FALSE,
885
 
                                    FALSE);
886
 
}
887
 
 
888
 
gboolean
889
 
brasero_session_cfg_is_supported (BraseroSessionCfg *self,
890
 
                                  BraseroBurnFlag flags)
891
 
{
892
 
        BraseroSessionCfgPrivate *priv;
893
 
 
894
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
895
 
        return (priv->supported & flags) == flags;
896
 
}
897
 
 
898
 
gboolean
899
 
brasero_session_cfg_is_compulsory (BraseroSessionCfg *self,
900
 
                                   BraseroBurnFlag flags)
901
 
{
902
 
        BraseroSessionCfgPrivate *priv;
903
 
 
904
 
        priv = BRASERO_SESSION_CFG_PRIVATE (self);
905
 
        return (priv->compulsory & flags) == flags;
906
 
}
907
 
 
908
 
static void
909
 
brasero_session_cfg_init (BraseroSessionCfg *object)
910
 
{
911
 
        BraseroSessionCfgPrivate *priv;
912
 
        BraseroPluginManager *manager;
913
 
 
914
 
        priv = BRASERO_SESSION_CFG_PRIVATE (object);
915
 
 
916
 
        priv->caps = brasero_burn_caps_get_default ();
917
 
 
918
 
        manager = brasero_plugin_manager_get_default ();
919
 
        priv->caps_sig = g_signal_connect (manager,
920
 
                                           "caps-changed",
921
 
                                           G_CALLBACK (brasero_session_cfg_caps_changed),
922
 
                                           object);
923
 
}
924
 
 
925
 
static void
926
 
brasero_session_cfg_finalize (GObject *object)
927
 
{
928
 
        BraseroSessionCfgPrivate *priv;
929
 
 
930
 
        priv = BRASERO_SESSION_CFG_PRIVATE (object);
931
 
 
932
 
        if (priv->caps_sig) {
933
 
                BraseroPluginManager *manager;
934
 
 
935
 
                manager = brasero_plugin_manager_get_default ();
936
 
                g_signal_handler_disconnect (manager, priv->caps_sig);
937
 
                priv->caps_sig = 0;
938
 
        }
939
 
 
940
 
        if (priv->caps) {
941
 
                g_object_unref (priv->caps);
942
 
                priv->caps = NULL;
943
 
        }
944
 
 
945
 
        G_OBJECT_CLASS (brasero_session_cfg_parent_class)->finalize (object);
946
 
}
947
 
 
948
 
static void
949
 
brasero_session_cfg_class_init (BraseroSessionCfgClass *klass)
950
 
{
951
 
        GObjectClass* object_class = G_OBJECT_CLASS (klass);
952
 
        BraseroBurnSessionClass *session_class = BRASERO_BURN_SESSION_CLASS (klass);
953
 
 
954
 
        g_type_class_add_private (klass, sizeof (BraseroSessionCfgPrivate));
955
 
 
956
 
        object_class->finalize = brasero_session_cfg_finalize;
957
 
 
958
 
        session_class->input_changed = brasero_session_cfg_input_changed;
959
 
        session_class->output_changed = brasero_session_cfg_output_changed;
960
 
 
961
 
        session_cfg_signals[IS_VALID_SIGNAL] =
962
 
                g_signal_new ("is_valid",
963
 
                              G_OBJECT_CLASS_TYPE (klass),
964
 
                              G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP | G_SIGNAL_ACTION,
965
 
                              0,
966
 
                              NULL, NULL,
967
 
                              g_cclosure_marshal_VOID__VOID,
968
 
                              G_TYPE_NONE,
969
 
                              0,
970
 
                              G_TYPE_NONE);
971
 
}
972
 
 
973
 
BraseroSessionCfg *
974
 
brasero_session_cfg_new (void)
975
 
{
976
 
        return g_object_new (BRASERO_TYPE_SESSION_CFG, NULL);
977
 
}