Newer
Older
Digital_Repository / OARiNZ / DIY / deb_package / eprints-3.0 / perl_lib / EPrints / Plugin / Convert / Unpack.pm
package EPrints::Plugin::Convert::Unpack;

=pod

=head1 NAME

EPrints::Plugin::Convert::Unpack - Unpack archive files (zip, tarball etc)

=head1 DESCRIPTION

This *only* handles single-files.

=cut

use strict;
use warnings;

use Carp;

use EPrints::Plugin::Convert;
our @ISA = qw/ EPrints::Plugin::Convert /;

our %TYPES = qw(
	application/x-gzip gunzip
	application/x-tar tar
	application/x-zip unzip
	application/x-bzip2 bzip2
);

sub new
{
	my( $class, %opts ) = @_;

	my $self = $class->SUPER::new( %opts );

	$self->{name} = "Archive unpacking";
	$self->{visible} = "api";

	return $self;
}

sub can_convert
{
	my ($plugin, $doc) = @_;

	# Get the main file name
	my $mt = $doc->mime_type() or return ();
	return $TYPES{$mt} ? ($TYPES{$mt}=>{plugin=>$plugin}) : ();
}

sub export
{
	my ( $plugin, $dir, $doc, $type ) = @_;

	# What to call the temporary file
	my $fn = $doc->local_path . '/' . $doc->get_main;
	
	my $cmd = $plugin->get_repository->get_conf( 'executables', $type ) or die "Executable location not set for $type conversion";
	my $invo = $plugin->get_repository->get_conf->( 'invocation', $type ) or die "Invocation not set for $type conversion";
	system(EPrints::Utils::prepare_cmd($invo,
		$type => $cmd,
		DIR => $dir,
		ARC => $fn,
		FILENAME => $doc->get_main,
		FILEPATH => $doc->local_path,
	));

	local *DIR;
	opendir DIR, $dir or die "Unable to open directory $dir: $!";
	my @files = grep { $_ !~ /^\./ } readdir(DIR);
	closedir DIR;

	foreach( @files ) { EPrints::Utils::chown_for_eprints( $_ ); }
	
	return @files;
}

1;