Fixed the windows explorer bug
[archive-zip.git] / lib / Archive / Zip / BufferedFileHandle.pm
blob9532f82faaf3c46f58a8310e2f8130d5c9e3a2dd
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
5 # to a string.
6 # I probably should just use IO::Scalar instead.
7 # Ned Konz, March 2000
9 use strict;
10 use IO::File;
11 use Carp;
13 use vars qw{$VERSION};
15 BEGIN {
16 $VERSION = '1.26';
17 $VERSION = eval $VERSION;
20 sub new {
21 my $class = shift || __PACKAGE__;
22 $class = ref($class) || $class;
23 my $self = bless(
25 content => '',
26 position => 0,
27 size => 0
29 $class
31 return $self;
34 # Utility method to read entire file
35 sub readFromFile {
36 my $self = shift;
37 my $fileName = shift;
38 my $fh = IO::File->new( $fileName, "r" );
39 CORE::binmode($fh);
40 if ( !$fh ) {
41 Carp::carp("Can't open $fileName: $!\n");
42 return undef;
44 local $/ = undef;
45 $self->{content} = <$fh>;
46 $self->{size} = length( $self->{content} );
47 return $self;
50 sub contents {
51 my $self = shift;
52 if (@_) {
53 $self->{content} = shift;
54 $self->{size} = length( $self->{content} );
56 return $self->{content};
59 sub binmode { 1 }
61 sub close { 1 }
63 sub opened { 1 }
65 sub eof {
66 my $self = shift;
67 return $self->{position} >= $self->{size};
70 sub seek {
71 my $self = shift;
72 my $pos = shift;
73 my $whence = shift;
75 # SEEK_SET
76 if ( $whence == 0 ) { $self->{position} = $pos; }
78 # SEEK_CUR
79 elsif ( $whence == 1 ) { $self->{position} += $pos; }
81 # SEEK_END
82 elsif ( $whence == 2 ) { $self->{position} = $self->{size} + $pos; }
83 else { return 0; }
85 return 1;
88 sub tell { return shift->{position}; }
90 # Copy my data to given buffer
91 sub read {
92 my $self = shift;
93 my $buf = \( $_[0] );
94 shift;
95 my $len = shift;
96 my $offset = shift || 0;
98 $$buf = '' if not defined($$buf);
99 my $bytesRead =
100 ( $self->{position} + $len > $self->{size} )
101 ? ( $self->{size} - $self->{position} )
102 : $len;
103 substr( $$buf, $offset, $bytesRead ) =
104 substr( $self->{content}, $self->{position}, $bytesRead );
105 $self->{position} += $bytesRead;
106 return $bytesRead;
109 # Copy given buffer to me
110 sub write {
111 my $self = shift;
112 my $buf = \( $_[0] );
113 shift;
114 my $len = shift;
115 my $offset = shift || 0;
117 $$buf = '' if not defined($$buf);
118 my $bufLen = length($$buf);
119 my $bytesWritten =
120 ( $offset + $len > $bufLen )
121 ? $bufLen - $offset
122 : $len;
123 substr( $self->{content}, $self->{position}, $bytesWritten ) =
124 substr( $$buf, $offset, $bytesWritten );
125 $self->{size} = length( $self->{content} );
126 return $bytesWritten;
129 sub clearerr() { 1 }