The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package MDV::Distribconf::MediaCFG;

use strict;
use warnings;
use MDV::Distribconf;

our $VERSION = (qq$Revision$ =~ /(\d+)/)[0];

=head1 NAME

MDV::Distribconf::MediaCFG

=head1 DESCRIPTION

This module provides documenation of known values in F<media.cfg>.

=head1 MEDIACFG VERSION

The media.cfg version is given by the 'mediacfg_version' in 'media_info'.
This value should be set is you want to use new features that can change the
behavior of this module.

=head2 1

This is the default and the first version of media.cfg format.

=head2 2

Since this version, all media paths are relative to the media_info path.
Previously, media paths were relative to media_info except when beginning with
F</>, which were relative to the root of the distrib.

=head2 3

This version allows to include in values variables that refer to
other values defined in the configuration file:

=over 4

=item ${...}

refers to a global value (distribution version, arch...)

=item %{...}

refers to a value specific to the media (name, ...)

=back

=head2 4

This version support xml files as replacement of hdlist/synthesis.

=head1 VALUE

=cut

my $value = {};

=head2 GLOBAL VALUES

This value can only be set into 'media_info' section.

=cut

$value->{mediacfg_version} = { 
    validation => sub {
        my ($val) = @_;
        if ($val !~ /^(\d|.)+$/) {
            return ("should be a number");
        }
        return ();
    },
};

=head3 mediacfg_version

The version of the media_cfg

See L<MEDIACFG VERSION>

=cut

$value->{version} = { section => 'media_info' };

=head3 version

The version of distrib

=cut

$value->{arch} = { section => 'media_info' };

=head3 arch

The arcitecture of the distribution

=cut

$value->{suppl} = { section => 'media_info' };

=head3 suppl

This tag is used to change installer behavior, when set, user should be allow
to add media not provided by this distribution.

=cut

$value->{askmedia} = { section => 'media_info' };

=head3 askmedia

This tag is used to change installer behavior, when set, user should be prompt
before adding each media.

=cut

$value->{branch} = { section => 'media_info' };

=head3 branch

The branch of the distribution.

=cut

$value->{product} = { section => 'media_info' };

=head3 product

The name of the product, 'Download' by default

=cut

$value->{minor} = { section => 'media_info' };

=head3 minor

No documentation

=cut

$value->{subversion} = { section => 'media_info' };

=head3 subversion

No documentation

=cut

$value->{cdmode} = { section => 'media_info' };

=head3 cdmode

If set, indexes located into global directory should be used
instead of per media ones.

=cut

$value->{'synthesis-filter'} = { section => 'media_info' };

=head3 synthesis-filter

Compression filter used for synthesis

=cut

$value->{'xml-info'} = { section => 'media_info' };

=head3 xml-info

The distribution handle xml format

=cut

$value->{'xml-info-filter'} = { section => 'media_info' };

=head3 xml-info-filter

Compression filter used for xml-info

=cut

=head2 MEDIA VALUES

=cut

foreach (qw(hdlist name synthesis pubkey media_info)) {
    $value->{$_} = { };
}

=head3 name

The name of the media. If unset, the section is the name.

=head3 hdlist

The hdlist file holding rpm infos for the media

=head3 synthesis

The synthesis file holding rpm infos for the media

=head3 pubkey

The file holding public gpg key used to sign rpms in this media.

=cut

=head3 media_type

Contains a comma-separated list of tags meant to help tools to better
describe the media

=cut

$value->{srpms} = { deny => 'rpms', cross => 'rpms', ismedialist => 1 };

=head3 srpms

If the media hold binaries rpms, this parameter contains
the list of medias holding corresponding sources rpms.

=cut

$value->{rpms} = { deny => 'srpms', cross => 'srpms', ismedialist => 1 };

=head3 rpms

If the media hold sources rpms, this parameter contains
the list of media holding binaries rpms build by srpms from this media.

=cut

$value->{updates_for} = { ismedialist => 1 };

=head3 updates_for

If the media contain updates, it contain the list of media for which
rpms are updates.

=cut

$value->{debug_for} = { ismedialist => 1 };

=head3 debug_for

If the media contain debug rpms, it contain the list of media for which
rpms are debug rpms.

=cut

$value->{noauto} = {};

=head3 noauto

This value is used by tools to assume if the media should automatically
added to the config (urpmi).

=cut

$value->{size} = {
    validation => sub {
        my ($v) = @_;
        if ($v =~ /^(\d+)(\w)?$/) {
            if ($2) {
                if (! grep { lc($2) eq $_ } qw(k m g t p)) {
                    return("wrong unit");
                }
            }
            return;
        } else {
            return ("malformed value");
        }
    },
};

=head3 size

The size of the media. The value is suffixed by the unit.

=cut

# valid_param($media, $var, $val)
#
# Return a list of errors (if any) about having such value in the config

sub _valid_param {
    my ($media, $var, $val) = @_[-3..-1];
    if (!exists($value->{$var})) {
        return ("unknown var");
    }
    $media ||= 'media_info'; # assume default
    my @errors;
    if ($value->{$var}{section} && $value->{$var}{section} ne $media) {
        push(@errors, "wrong section: should be in $value->{$var}{section}");
    }
    if ($value->{$var}{validation}) {
        push(@errors, $value->{$var}{validation}->($val));
    }
    return @errors;
}

# Retun a hash containing information about $var

sub _value_info {
    my ($var) = $_[-1];
    if (exists($value->{$var})) {
        return $value->{$var}
    }
    return;
}

1;

__END__

=head1 AUTHOR

Olivier Thauvin <nanardon@mandriva.org>

=head1 LICENSE AND COPYRIGHT

(c) 2005, 2006, 2007 Olivier Thauvin
(c) 2005, 2006, 2007 Mandriva

This program 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 2, or (at your option)
any later version.

This program 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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

=cut