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;