diff options
Diffstat (limited to 'lib/gcstar/GCImport/GCImportTarGz.pm')
| -rw-r--r-- | lib/gcstar/GCImport/GCImportTarGz.pm | 152 | 
1 files changed, 152 insertions, 0 deletions
diff --git a/lib/gcstar/GCImport/GCImportTarGz.pm b/lib/gcstar/GCImport/GCImportTarGz.pm new file mode 100644 index 0000000..b995b82 --- /dev/null +++ b/lib/gcstar/GCImport/GCImportTarGz.pm @@ -0,0 +1,152 @@ +package GCImport::GCImportTarGz; + +################################################### +# +#  Copyright 2005-2010 Christian Jodar +# +#  This file is part of GCstar. +# +#  GCstar 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. +# +#  GCstar 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 GCstar; if not, write to the Free Software +#  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# +################################################### + +use strict; +use GCImport::GCImportBase; + +{ +    package GCImport::GCImporterTarGz; + +    use base qw(GCImport::GCImportBaseClass); +  +    use GCBackend::GCBackendXmlParser; + +    use File::Spec; +    use File::Temp qw/ tempfile tempdir /; +    use Cwd; +    use File::Copy; +     +    #use GCData; + +     +    sub new +    { +        my $proto = shift; +        my $class = ref($proto) || $proto; +        my $self  = $class->SUPER::new(); +        bless ($self, $class); + +        $self->checkModule('Compress::Zlib'); +        $self->checkModule('Archive::Tar'); +        $self->checkModule('File::Path'); + +        return $self; +    } + +    sub getName +    { +        return ".tar.gz"; +    } +     +    sub getFilePatterns +    { +       return (['Tar gzip (.tar.gz)', '*.tar.gz']); +    } +     +    sub getModelName +    { +        my $self = shift; +         +        return $self->{model}->getName; +    } + +    sub getOptions +    { +        my $self = shift; +        my @options; +        return \@options; +    } +     +    # Ignored for the moment +    sub wantsFieldsSelection +    { +        return 0; +    } +    sub getEndInfo +    { +        my $self = shift; +        return ($self->{parsingError}, 'error'); +    } +     +    sub addFieldsToDefaultModel +    { +        my ($self, $inlineModel) = @_; +        my $model = GCModelLoader->newFromInline($self, {inlineModel => $inlineModel, defaultModifier => 1}); +        $self->{model}->addFields($model); +        $self->{options}->{parent}->setCurrentModel($self->{model}); +        $self->{modelAlreadySet} = 1; +    } + +    sub getItemsArray +    { +        my ($self, $file) = @_; +         +        my ($tarFh, $tarFilename) = tempfile(); +        my $gz = Compress::Zlib::gzopen($file, "rb"); +        my $buffer; +        print $tarFh $buffer while $gz->gzread($buffer) > 0 ; +        close $tarFh; +        $gz->gzclose; + +        my $tmpDir = tempdir(); +        my $oldCwd = getcwd; +        chdir $tmpDir; +        my $tar = Archive::Tar->new($tarFilename); +        $tar->extract; +        my $listFile = './collection.gcs'; + +        my $parent = $self->{options}->{parent}; +        $self->{modelsFactory} = $parent->{modelsFactory}; +        $self->{modelAlreadySet} = 0; + +        my $backend = new GCBackend::GCBeXmlParser($self);             +        $backend->setParameters(file => $listFile); +        my $loaded = $backend->load(0); +        my $itemsArray = []; +        if ($loaded->{error}) +        { +            $self->{parsingError} = GCUtils::formatOpenSaveError( +                $parent->{lang}, +                $file, +                $loaded->{error} +            ); +        } +        else +        { +            $itemsArray = $loaded->{data}; + +            #Copying pictures +            $self->copyPictures($itemsArray, $file); +        } + +        #Cleaning +        chdir $oldCwd; +        File::Path::rmtree($tmpDir); +        unlink $tarFilename; +         +        return $itemsArray; +    } +} + +1;  | 
