package Lire::Config::ConfigFile;
use strict;
use base qw/ Lire::Config::Dictionary /;
use Carp;
use Lire::Config::Parser;
use Lire::I18N qw/ set_fh_encoding /;
use Lire::Utils qw/ check_param check_object_param /;
=pod
=head1 NAME
Lire::Config::ConfigFile - Class for configuration file manipulation.
=head1 SYNOPSIS
use Lire::Config::ConfigFile;
=head1 DESCRIPTION
Object representing a Lire configuration file.
=head2 new( 'filename' => $file, spec => $config_spec )
Creates a new Lire::Config::ConfigFile object. The constructor
takes two parameters:
=over
=item filename
The file form where the configuration was stored or was loaded from.
=item spec
The Lire::Config::TypeSpec object to which this configuration adheres.
=end
=cut
sub new {
my ( $proto, %args ) = @_;
my $class = ref $proto || $proto;
check_object_param( $args{'spec'}, 'spec', 'Lire::Config::ConfigSpec' );
check_param( $args{'filename'}, 'filename' );
my $self = bless {
'spec' => $args{'spec'},
'filename' => $args{'filename'},
'global' => new Lire::Config::Dictionary( 'spec' => $args{'spec'} ),
}, $class;
return $self;
}
=pod
=head2 filename( [$new_filename] )
Returns (and optionally changes) the filename where this configuration
file should be stored.
=cut
sub filename {
my ( $self, $filename ) = @_;
if ( @_ == 2 ) {
check_param( $filename, 'filename' );
$self->{'filename'} = $filename;
}
return $self->{'filename'};
}
=pod
=head2 spec()
Returns the Lire::Config::TypeSpec object to which this configuration file
adheres.
=cut
sub spec {
$_[0]{'spec'};
}
=pod
=head2 global( [ $config] )
Returns or modify the 'global' configuration part of the file. This is
an instance Lire::Config::Compound object.
=cut
sub global {
my ( $self, $config ) = @_;
if ( @_ == 2 ) {
if ( defined $config ) {
croak "'config' parameter isn't an Lire::Config::Dictionary instance: $config"
unless UNIVERSAL::isa( $config, "Lire::Config::Dictionary" );
}
$self->{'global'} = $config;
}
return $self->{'global'};
}
sub save_global {
my ( $self, $fh, $indent, $xmlns ) = @_;
$indent ||= 0;
$xmlns ||= '';
print $fh ' 'x$indent, "<${xmlns}global>\n";
$self->global()->save_value( $fh, $indent, $xmlns );
print $fh ' 'x$indent, "${xmlns}global>\n";
return;
}
=pod
=head2 save()
Saves this ConfigConfigFile object back to the filename from which
it was loaded.
=cut
sub save {
my $self = $_[0];
open my $fh, "> $self->{'filename'}"
or die "open '$self->{'filename'}' for writing failed: $!\n";
$self->save_xml( $fh );
close $fh;
return;
}
=pod
=head2 revert()
Reads back the configuration from the file.
=cut
sub revert {
my $self = $_[0];
my $parser = new Lire::Config::Parser( 'spec' => $self->{'spec'} );
my $new_self = $parser->load_config_file( $self->{'filename'} );
%$self = %$new_self;
return;
}
sub save_xml {
my $self = shift;
my $fh = $_[0];
set_fh_encoding( $fh, 'UTF-8' );
print $fh join("\n",
'',
'',
']>',
'', '');
$self->save_global($fh, 1);
print $fh "\n";
return;
}
=pod
=head2 as_value()
Returns this configuration file as an hash reference. Delegates
to the global configuration object contained in the file.
=cut
sub as_value { shift->{'global'}->as_value( @_ ) };
=pod
=head2 get( $name )
Returns the configuration parameter $name from this configuration file.
Delegates to the global configuration object contained in the file.
=cut
sub get { shift->{'global'}->get( @_ ) };
=pod
=head2 is_set( $name )
Checks that a configuration parameter is set in this file.
Delegates to the global configuration object contained in the file.
=cut
sub is_set { shift->{'global'}->is_set( @_ ) };
=pod
=head2 set( $param )
Sets a configuration variable in the file. Delegates
to the global configuration object contained in the file.
=cut
sub set { shift->{'global'}->set( @_ ) };
1; # whine, whine
__END__
=pod
=head1 SEE ALSO
Lire::Config::Dictionary(3pm)
=head1 AUTHORS
Wessel Dankers
Francis J. Lacoste
Wolfgang Sourdeau
=head1 VERSION
$Id: ConfigFile.pm,v 1.9 2006/07/23 13:16:30 vanbaal Exp $
=head1 COPYRIGHT
Copyright (C) 2002-2004 Stichting LogReport Foundation LogReport@LogReport.org
This file is part of Lire.
Lire 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 of the License, 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 (see COPYING); if not, check with
http://www.gnu.org/copyleft/gpl.html.
=cut