diff options
Diffstat (limited to 'Master/tlpkg/tlperl/lib/Archive/Zip/BufferedFileHandle.pm')
-rwxr-xr-x | Master/tlpkg/tlperl/lib/Archive/Zip/BufferedFileHandle.pm | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl/lib/Archive/Zip/BufferedFileHandle.pm b/Master/tlpkg/tlperl/lib/Archive/Zip/BufferedFileHandle.pm new file mode 100755 index 00000000000..4e56f9f007c --- /dev/null +++ b/Master/tlpkg/tlperl/lib/Archive/Zip/BufferedFileHandle.pm @@ -0,0 +1,131 @@ +package Archive::Zip::BufferedFileHandle; + +# File handle that uses a string internally and can seek +# This is given as a demo for getting a zip file written +# to a string. +# I probably should just use IO::Scalar instead. +# Ned Konz, March 2000 + +use strict; +use IO::File; +use Carp; + +use vars qw{$VERSION}; + +BEGIN { + $VERSION = '1.30'; + $VERSION = eval $VERSION; +} + +sub new { + my $class = shift || __PACKAGE__; + $class = ref($class) || $class; + my $self = bless( + { + content => '', + position => 0, + size => 0 + }, + $class + ); + return $self; +} + +# Utility method to read entire file +sub readFromFile { + my $self = shift; + my $fileName = shift; + my $fh = IO::File->new( $fileName, "r" ); + CORE::binmode($fh); + if ( !$fh ) { + Carp::carp("Can't open $fileName: $!\n"); + return undef; + } + local $/ = undef; + $self->{content} = <$fh>; + $self->{size} = length( $self->{content} ); + return $self; +} + +sub contents { + my $self = shift; + if (@_) { + $self->{content} = shift; + $self->{size} = length( $self->{content} ); + } + return $self->{content}; +} + +sub binmode { 1 } + +sub close { 1 } + +sub opened { 1 } + +sub eof { + my $self = shift; + return $self->{position} >= $self->{size}; +} + +sub seek { + my $self = shift; + my $pos = shift; + my $whence = shift; + + # SEEK_SET + if ( $whence == 0 ) { $self->{position} = $pos; } + + # SEEK_CUR + elsif ( $whence == 1 ) { $self->{position} += $pos; } + + # SEEK_END + elsif ( $whence == 2 ) { $self->{position} = $self->{size} + $pos; } + else { return 0; } + + return 1; +} + +sub tell { return shift->{position}; } + +# Copy my data to given buffer +sub read { + my $self = shift; + my $buf = \( $_[0] ); + shift; + my $len = shift; + my $offset = shift || 0; + + $$buf = '' if not defined($$buf); + my $bytesRead = + ( $self->{position} + $len > $self->{size} ) + ? ( $self->{size} - $self->{position} ) + : $len; + substr( $$buf, $offset, $bytesRead ) = + substr( $self->{content}, $self->{position}, $bytesRead ); + $self->{position} += $bytesRead; + return $bytesRead; +} + +# Copy given buffer to me +sub write { + my $self = shift; + my $buf = \( $_[0] ); + shift; + my $len = shift; + my $offset = shift || 0; + + $$buf = '' if not defined($$buf); + my $bufLen = length($$buf); + my $bytesWritten = + ( $offset + $len > $bufLen ) + ? $bufLen - $offset + : $len; + substr( $self->{content}, $self->{position}, $bytesWritten ) = + substr( $$buf, $offset, $bytesWritten ); + $self->{size} = length( $self->{content} ); + return $bytesWritten; +} + +sub clearerr() { 1 } + +1; |