1 package Archive::Zip::BufferedFileHandle;
3 # File handle that uses a string internally and can seek
4 # This is given as a demo for getting a zip file written
6 # I probably should just use IO::Scalar instead.
13 use vars qw{$VERSION};
17 $VERSION = eval $VERSION;
21 my $class = shift || __PACKAGE__;
22 $class = ref($class) || $class;
34 # Utility method to read entire file
38 my $fh = IO::File->new( $fileName, "r" );
41 Carp::carp("Can't open $fileName: $!\n");
45 $self->{content} = <$fh>;
46 $self->{size} = length( $self->{content} );
53 $self->{content} = shift;
54 $self->{size} = length( $self->{content} );
56 return $self->{content};
67 return $self->{position} >= $self->{size};
76 if ( $whence == 0 ) { $self->{position} = $pos; }
79 elsif ( $whence == 1 ) { $self->{position} += $pos; }
82 elsif ( $whence == 2 ) { $self->{position} = $self->{size} + $pos; }
88 sub tell { return shift->{position}; }
90 # Copy my data to given buffer
96 my $offset = shift || 0;
98 $$buf = '' if not defined($$buf);
100 ( $self->{position} + $len > $self->{size} )
101 ? ( $self->{size} - $self->{position} )
103 substr( $$buf, $offset, $bytesRead ) =
104 substr( $self->{content}, $self->{position}, $bytesRead );
105 $self->{position} += $bytesRead;
109 # Copy given buffer to me
112 my $buf = \( $_[0] );
115 my $offset = shift || 0;
117 $$buf = '' if not defined($$buf);
118 my $bufLen = length($$buf);
120 ( $offset + $len > $bufLen )
123 substr( $self->{content}, $self->{position}, $bytesWritten ) =
124 substr( $$buf, $offset, $bytesWritten );
125 $self->{size} = length( $self->{content} );
126 return $bytesWritten;