321
* Used to test what the library can do based on the medium type.
322
* Returns BRASERO_MEDIUM_WRITABLE if the disc can be written
323
* and / or BRASERO_MEDIUM_REWRITABLE if the disc can be erased.
327
brasero_burn_caps_media_capabilities (BraseroBurnCaps *self,
333
BraseroCaps *caps = NULL;
335
retval = BRASERO_MEDIUM_NONE;
336
BRASERO_BURN_LOG_DISC_TYPE (media, "checking media caps for");
338
/* we're only interested in DISC caps. There should be only one caps fitting */
339
for (iter = self->priv->caps_list; iter; iter = iter->next) {
341
if (caps->type.type != BRASERO_TRACK_TYPE_DISC)
344
if ((media & caps->type.subtype.media) == media)
351
return BRASERO_MEDIUM_NONE;
353
/* check the links */
354
for (links = caps->links; links; links = links->next) {
357
BraseroCapsLink *link;
361
/* this link must have at least one active plugin to be valid
362
* plugins are not sorted but in this case we don't need them
363
* to be. we just need one active if another is with a better
364
* priority all the better. */
366
for (plugins = link->plugins; plugins; plugins = plugins->next) {
367
BraseroPlugin *plugin;
369
plugin = plugins->data;
370
if (brasero_plugin_get_active (plugin)) {
371
/* this link is valid */
381
/* means that it can be blanked */
382
retval |= BRASERO_MEDIUM_REWRITABLE;
386
/* means it can be written. NOTE: if this disc has already some
387
* data on it, it even means it can be appended */
388
retval |= BRASERO_MEDIUM_WRITABLE;
394
265
static BraseroCaps *
395
266
brasero_caps_find_start_caps (BraseroTrackType *output)
2217
2091
/* filter as we are only interested in these */
2218
2092
required_media &= BRASERO_MEDIUM_WRITABLE|
2219
2093
BRASERO_MEDIUM_CD|
2221
BRASERO_MEDIUM_DVD_DL;
2223
2096
return required_media;
2100
brasero_burn_caps_get_default_output_format (BraseroBurnCaps *self,
2101
BraseroBurnSession *session)
2103
BraseroTrackType source;
2104
BraseroTrackType output;
2105
BraseroBurnResult result;
2107
if (!brasero_burn_session_is_dest_file (session))
2108
return BRASERO_IMAGE_FORMAT_NONE;
2110
brasero_burn_session_get_input_type (session, &source);
2111
if (source.type == BRASERO_TRACK_TYPE_NONE)
2112
return BRASERO_IMAGE_FORMAT_NONE;
2114
if (source.type == BRASERO_TRACK_TYPE_IMAGE)
2115
return source.subtype.img_format;
2117
output.type = BRASERO_TRACK_TYPE_IMAGE;
2118
output.subtype.img_format = BRASERO_IMAGE_FORMAT_NONE;
2120
if (source.type == BRASERO_TRACK_TYPE_AUDIO) {
2121
/* If that's AUDIO only without VIDEO then return */
2122
if (!(source.subtype.audio_format & (BRASERO_VIDEO_FORMAT_UNDEFINED|BRASERO_VIDEO_FORMAT_VCD|BRASERO_VIDEO_FORMAT_VIDEO_DVD)))
2123
return BRASERO_IMAGE_FORMAT_NONE;
2125
/* Otherwise try all possible image types */
2126
output.subtype.img_format = BRASERO_IMAGE_FORMAT_CDRDAO;
2127
for (; output.subtype.img_format != BRASERO_IMAGE_FORMAT_NONE;
2128
output.subtype.img_format >>= 1) {
2130
result = brasero_burn_caps_is_output_supported (self,
2133
if (result == BRASERO_BURN_OK)
2134
return output.subtype.img_format;
2137
return BRASERO_IMAGE_FORMAT_NONE;
2140
if (source.type == BRASERO_TRACK_TYPE_DATA
2141
|| (source.type == BRASERO_TRACK_TYPE_DISC
2142
&& (source.subtype.media & BRASERO_MEDIUM_DVD))) {
2143
output.subtype.img_format = BRASERO_IMAGE_FORMAT_BIN;
2144
result = brasero_burn_caps_is_output_supported (self,
2147
if (result != BRASERO_BURN_OK)
2148
return BRASERO_IMAGE_FORMAT_NONE;
2150
return BRASERO_IMAGE_FORMAT_BIN;
2153
/* for the input which are CDs there are lots of possible formats */
2154
output.subtype.img_format = BRASERO_IMAGE_FORMAT_CDRDAO;
2155
for (; output.subtype.img_format != BRASERO_IMAGE_FORMAT_NONE;
2156
output.subtype.img_format >>= 1) {
2158
result = brasero_burn_caps_is_output_supported (self,
2161
if (result == BRASERO_BURN_OK)
2162
return output.subtype.img_format;
2165
return BRASERO_IMAGE_FORMAT_NONE;
2168
static BraseroCapsLink *
2169
brasero_caps_find_link_for_input (BraseroCaps *caps,
2174
for (links = caps->links; links; links = links->next) {
2175
BraseroCapsLink *link;
2178
if (link->caps == input)
2186
brasero_caps_has_active_input (BraseroCaps *caps,
2191
for (links = caps->links; links; links = links->next) {
2192
BraseroCapsLink *link;
2195
if (link->caps != input)
2198
if (brasero_caps_link_active (link))
2206
brasero_burn_caps_is_input (BraseroBurnCaps *self,
2211
for (iter = self->priv->caps_list; iter; iter = iter->next) {
2218
if (brasero_caps_has_active_input (tmp, input))
2226
2225
static BraseroPluginIOFlag
2227
2226
brasero_caps_get_flags (BraseroCaps *caps,
2228
2227
BraseroBurnFlag session_flags,
2440
2454
* then write on its own. Basically that works only with
2441
2455
* overwrite formatted discs, DVD+RW, ...) */
2443
if (!(media & (BRASERO_MEDIUM_HAS_AUDIO|
2444
BRASERO_MEDIUM_HAS_DATA|
2445
BRASERO_MEDIUM_UNFORMATTED))) {
2446
/* media must have data/audio */
2447
return BRASERO_BURN_NOT_SUPPORTED;
2450
if (session_flags & (BRASERO_BURN_FLAG_MERGE|BRASERO_BURN_FLAG_APPEND)) {
2451
/* There is nothing we can do here */
2452
return BRASERO_BURN_NOT_SUPPORTED;
2455
if (brasero_burn_caps_can_blank_real (self, media, session_flags) != BRASERO_BURN_OK)
2456
return BRASERO_BURN_NOT_SUPPORTED;
2457
/* What's above is not entirely true. In fact we always need to
2458
* check even if we first succeeded. There are some cases like
2459
* CDRW where it's useful.
2460
* Ex: a CDRW with data appendable can be either appended (then
2461
* no DAO possible) or blanked and written (DAO possible). */
2458
2463
(*supported_flags) |= BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE;
2459
(*compulsory_flags) |= BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE;
2465
/* result here is the result of the first operation, so if it
2466
* failed, BLANK before becomes compulsory. */
2467
if (result != BRASERO_BURN_OK)
2468
(*compulsory_flags) |= BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE;
2461
2470
/* pretends it is blank and formatted to see if it would work.
2462
2471
* If it works then that means that the BLANK_BEFORE_WRITE flag
3316
3312
return g_slist_prepend (retval, caps);
3320
brasero_caps_disc_new_status (GSList *retval,
3324
if ((type & BRASERO_MEDIUM_BLANK)
3325
&& !(media & BRASERO_MEDIUM_ROM)) {
3326
/* If media is blank there is no other possible property.
3327
* BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_RESTRICTED)
3328
* condition is checked but in fact it's never valid since
3329
* such a medium cannot exist if it hasn't been formatted before
3330
* which is in contradiction with the fact is unformatted. */
3331
if (BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_PLUS)
3332
|| BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_RESTRICTED)
3333
|| BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW)
3334
|| BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_PLUS_DL)) {
3335
/* This is only for above types */
3336
retval = brasero_caps_disc_lookup_or_create (retval,
3338
BRASERO_MEDIUM_BLANK);
3339
if (type & BRASERO_MEDIUM_UNFORMATTED)
3340
retval = brasero_caps_disc_lookup_or_create (retval,
3342
BRASERO_MEDIUM_BLANK|
3343
BRASERO_MEDIUM_UNFORMATTED);
3346
retval = brasero_caps_disc_lookup_or_create (retval,
3348
BRASERO_MEDIUM_BLANK);
3351
if (type & BRASERO_MEDIUM_CLOSED) {
3352
if (media & (BRASERO_MEDIUM_DVD|BRASERO_MEDIUM_DVD_DL))
3353
retval = brasero_caps_disc_lookup_or_create (retval,
3355
BRASERO_MEDIUM_CLOSED|
3356
(type & BRASERO_MEDIUM_HAS_DATA)|
3357
(type & BRASERO_MEDIUM_PROTECTED));
3359
if (type & BRASERO_MEDIUM_HAS_AUDIO)
3360
retval = brasero_caps_disc_lookup_or_create (retval,
3362
BRASERO_MEDIUM_CLOSED|
3363
BRASERO_MEDIUM_HAS_AUDIO);
3364
if (type & BRASERO_MEDIUM_HAS_DATA)
3365
retval = brasero_caps_disc_lookup_or_create (retval,
3367
BRASERO_MEDIUM_CLOSED|
3368
BRASERO_MEDIUM_HAS_DATA);
3369
if (BRASERO_MEDIUM_IS (type, BRASERO_MEDIUM_HAS_AUDIO|BRASERO_MEDIUM_HAS_DATA))
3370
retval = brasero_caps_disc_lookup_or_create (retval,
3372
BRASERO_MEDIUM_CLOSED|
3373
BRASERO_MEDIUM_HAS_DATA|
3374
BRASERO_MEDIUM_HAS_AUDIO);
3378
if ((type & BRASERO_MEDIUM_APPENDABLE)
3379
&& !(media & BRASERO_MEDIUM_ROM)
3380
&& !(media & BRASERO_MEDIUM_RESTRICTED)
3381
&& ! BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVD|BRASERO_MEDIUM_PLUS|BRASERO_MEDIUM_REWRITABLE)
3382
&& ! BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVD_DL|BRASERO_MEDIUM_PLUS|BRASERO_MEDIUM_REWRITABLE)) {
3383
if (media & BRASERO_MEDIUM_DVD)
3384
retval = brasero_caps_disc_lookup_or_create (retval,
3386
BRASERO_MEDIUM_APPENDABLE|
3387
BRASERO_MEDIUM_HAS_DATA);
3389
if (type & BRASERO_MEDIUM_HAS_AUDIO)
3390
retval = brasero_caps_disc_lookup_or_create (retval,
3392
BRASERO_MEDIUM_APPENDABLE|
3393
BRASERO_MEDIUM_HAS_AUDIO);
3394
if (type & BRASERO_MEDIUM_HAS_DATA)
3395
retval = brasero_caps_disc_lookup_or_create (retval,
3397
BRASERO_MEDIUM_APPENDABLE|
3398
BRASERO_MEDIUM_HAS_DATA);
3399
if (BRASERO_MEDIUM_IS (type, BRASERO_MEDIUM_HAS_AUDIO|BRASERO_MEDIUM_HAS_DATA))
3400
retval = brasero_caps_disc_lookup_or_create (retval,
3402
BRASERO_MEDIUM_HAS_DATA|
3403
BRASERO_MEDIUM_APPENDABLE|
3404
BRASERO_MEDIUM_HAS_AUDIO);
3412
brasero_caps_disc_new_attribute (GSList *retval,
3416
if (type & BRASERO_MEDIUM_REWRITABLE) {
3417
/* Always true for + media there are both single and dual layer */
3418
if (media & BRASERO_MEDIUM_PLUS)
3419
retval = brasero_caps_disc_new_status (retval,
3420
media|BRASERO_MEDIUM_REWRITABLE,
3422
/* There is no dual layer DVD-RW */
3423
else if (!(media & BRASERO_MEDIUM_DVD_DL))
3424
retval = brasero_caps_disc_new_status (retval,
3425
media|BRASERO_MEDIUM_REWRITABLE,
3429
if ((type & BRASERO_MEDIUM_WRITABLE)
3430
&& !(media & BRASERO_MEDIUM_RESTRICTED))
3431
retval = brasero_caps_disc_new_status (retval,
3432
media|BRASERO_MEDIUM_WRITABLE,
3435
if (type & BRASERO_MEDIUM_ROM)
3436
retval = brasero_caps_disc_new_status (retval,
3437
media|BRASERO_MEDIUM_ROM,
3444
brasero_caps_disc_new_subtype (GSList *retval,
3448
if (media & BRASERO_MEDIUM_BD) {
3449
if (type & BRASERO_MEDIUM_RANDOM)
3450
retval = brasero_caps_disc_new_attribute (retval,
3451
media|BRASERO_MEDIUM_RANDOM,
3453
if (type & BRASERO_MEDIUM_SRM)
3454
retval = brasero_caps_disc_new_attribute (retval,
3455
media|BRASERO_MEDIUM_SRM,
3457
if (type & BRASERO_MEDIUM_POW)
3458
retval = brasero_caps_disc_new_attribute (retval,
3459
media|BRASERO_MEDIUM_POW,
3463
if (media & BRASERO_MEDIUM_DVD) {
3464
if (type & BRASERO_MEDIUM_SEQUENTIAL)
3465
retval = brasero_caps_disc_new_attribute (retval,
3466
media|BRASERO_MEDIUM_SEQUENTIAL,
3469
if (type & BRASERO_MEDIUM_RESTRICTED)
3470
retval = brasero_caps_disc_new_attribute (retval,
3471
media|BRASERO_MEDIUM_RESTRICTED,
3474
if (type & BRASERO_MEDIUM_PLUS)
3475
retval = brasero_caps_disc_new_attribute (retval,
3476
media|BRASERO_MEDIUM_PLUS,
3478
if (type & BRASERO_MEDIUM_ROM)
3479
retval = brasero_caps_disc_new_status (retval,
3480
media|BRASERO_MEDIUM_ROM,
3484
if (media & BRASERO_MEDIUM_DVD_DL) {
3485
/* There is no such thing as DVD-RW DL */
3486
if ((type & BRASERO_MEDIUM_SEQUENTIAL) && !(type & BRASERO_MEDIUM_REWRITABLE))
3487
retval = brasero_caps_disc_new_attribute (retval,
3488
media|BRASERO_MEDIUM_SEQUENTIAL,
3491
if ((type & BRASERO_MEDIUM_JUMP) && !(type & BRASERO_MEDIUM_REWRITABLE))
3492
retval = brasero_caps_disc_new_attribute (retval,
3493
media|BRASERO_MEDIUM_JUMP,
3496
if (type & BRASERO_MEDIUM_PLUS)
3497
retval = brasero_caps_disc_new_attribute (retval,
3498
media|BRASERO_MEDIUM_PLUS,
3501
if (type & BRASERO_MEDIUM_ROM)
3502
retval = brasero_caps_disc_new_status (retval,
3503
media|BRASERO_MEDIUM_ROM,
3511
3316
brasero_caps_disc_new (BraseroMedia type)
3513
3318
GSList *retval = NULL;
3515
if (type & BRASERO_MEDIUM_FILE)
3516
retval = brasero_caps_disc_lookup_or_create (retval, BRASERO_MEDIUM_FILE);
3518
if (type & BRASERO_MEDIUM_CD)
3519
retval = brasero_caps_disc_new_attribute (retval,
3523
if (type & BRASERO_MEDIUM_DVD)
3524
retval = brasero_caps_disc_new_subtype (retval,
3528
if (type & BRASERO_MEDIUM_DVD_DL)
3529
retval = brasero_caps_disc_new_subtype (retval,
3530
BRASERO_MEDIUM_DVD_DL,
3533
if (type & BRASERO_MEDIUM_RAM)
3534
retval = brasero_caps_disc_new_attribute (retval,
3538
if (type & BRASERO_MEDIUM_BD)
3539
retval = brasero_caps_disc_new_subtype (retval,
3322
list = brasero_media_get_all_list (type);
3323
for (iter = list; iter; iter = iter->next) {
3324
BraseroMedia medium;
3326
medium = GPOINTER_TO_INT (iter->data);
3327
retval = brasero_caps_disc_lookup_or_create (retval, medium);
3329
g_slist_free (list);
3498
* This is to register a plugin group
3499
* This function is only define here (though it's implemented in burn-plugin.c).
3503
brasero_plugin_set_group (BraseroPlugin *plugin, gint group_id);
3506
brasero_plugin_register_group (BraseroPlugin *plugin,
3510
BraseroBurnCaps *self;
3513
brasero_plugin_set_group (plugin, 0);
3517
self = brasero_burn_caps_get_default ();
3519
if (!self->priv->groups)
3520
self->priv->groups = g_hash_table_new_full (g_str_hash,
3525
retval = GPOINTER_TO_INT (g_hash_table_lookup (self->priv->groups, name));
3527
brasero_plugin_set_group (plugin, retval);
3531
g_hash_table_insert (self->priv->groups,
3533
GINT_TO_POINTER (g_hash_table_size (self->priv->groups) + 1));
3535
/* see if we have a group id now */
3536
if (!self->priv->group_id
3537
&& self->priv->group_str
3538
&& !strcmp (name, self->priv->group_str))
3539
self->priv->group_id = g_hash_table_size (self->priv->groups) + 1;
3541
brasero_plugin_set_group (plugin, g_hash_table_size (self->priv->groups) + 1);
3727
* This is to find out what are the capacities of a plugin
3545
* This is to find out what are the capacities of a plugin
3546
* Declared in brasero-plugin-private.h
3730
3549
BraseroBurnResult
3731
brasero_burn_caps_plugin_can_burn (BraseroBurnCaps *self,
3732
BraseroPlugin *plugin)
3550
brasero_plugin_can_burn (BraseroPlugin *plugin)
3553
BraseroBurnCaps *self;
3555
self = brasero_burn_caps_get_default ();
3736
3557
for (iter = self->priv->caps_list; iter; iter = iter->next) {
3737
3558
BraseroCaps *caps;
3842
3665
return BRASERO_BURN_NOT_SUPPORTED;
3669
* Used to test what the library can do based on the medium type.
3670
* Returns BRASERO_MEDIUM_WRITABLE if the disc can be written
3671
* and / or BRASERO_MEDIUM_REWRITABLE if the disc can be erased.
3672
* Declared in burn-media.h.
3676
brasero_media_capabilities (BraseroMedia media)
3680
BraseroMedia retval;
3681
BraseroBurnCaps *self;
3682
BraseroCaps *caps = NULL;
3684
self = brasero_burn_caps_get_default ();
3686
retval = BRASERO_MEDIUM_NONE;
3687
BRASERO_BURN_LOG_DISC_TYPE (media, "checking media caps for");
3689
/* we're only interested in DISC caps. There should be only one caps fitting */
3690
for (iter = self->priv->caps_list; iter; iter = iter->next) {
3692
if (caps->type.type != BRASERO_TRACK_TYPE_DISC)
3695
if ((media & caps->type.subtype.media) == media)
3702
return BRASERO_MEDIUM_NONE;
3704
/* check the links */
3705
for (links = caps->links; links; links = links->next) {
3708
BraseroCapsLink *link;
3712
/* this link must have at least one active plugin to be valid
3713
* plugins are not sorted but in this case we don't need them
3714
* to be. we just need one active if another is with a better
3715
* priority all the better. */
3717
for (plugins = link->plugins; plugins; plugins = plugins->next) {
3718
BraseroPlugin *plugin;
3720
plugin = plugins->data;
3721
if (brasero_plugin_get_active (plugin)) {
3722
/* this link is valid */
3732
/* means that it can be blanked */
3733
retval |= BRASERO_MEDIUM_REWRITABLE;
3737
/* means it can be written. NOTE: if this disc has already some
3738
* data on it, it even means it can be appended */
3739
retval |= BRASERO_MEDIUM_WRITABLE;
3746
* This function is declared in burn-basics.h
3747
* It can be used to determine whether or not brasero can do any checksuming.
3846
brasero_burn_caps_can_checksum (BraseroBurnCaps *self)
3751
brasero_burn_library_can_checksum (void)
3754
BraseroBurnCaps *self;
3756
self = brasero_burn_caps_get_default ();
3850
3758
if (self->priv->tests == NULL)