diff -r 22486c9c7b15 -r 378360dbbdba releasing/cbrtools/perl/Archive/Zip/MockFileHandle.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/releasing/cbrtools/perl/Archive/Zip/MockFileHandle.pm Wed Jun 30 11:35:58 2010 +0800 @@ -0,0 +1,87 @@ +# Copyright (c) 2000 Ned Konz. All rights reserved. This program is free +# software; you can redistribute it and/or modify it under the same terms +# as Perl itself. + +# Output file handle that calls a custom write routine +# Ned Konz, March 2000 +# This is provided to help with writing zip files +# when you have to process them a chunk at a time. +# +# See the examples. +# +# $Revision: 1.2 $ + +use strict; +package Archive::Zip::MockFileHandle; + +sub new +{ + my $class = shift || __PACKAGE__; + $class = ref($class) || $class; + my $self = bless( { + 'position' => 0, + 'size' => 0 + }, $class ); + return $self; +} + +sub eof +{ + my $self = shift; + return $self->{'position'} >= $self->{'size'}; +} + +# 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; + $bytesWritten = $self->writeHook(substr($$buf, $offset, $bytesWritten)); + if ($self->{'position'} + $bytesWritten > $self->{'size'}) + { + $self->{'size'} = $self->{'position'} + $bytesWritten + } + $self->{'position'} += $bytesWritten; + return $bytesWritten; +} + +# Called on each write. +# Override in subclasses. +# Return number of bytes written (0 on error). +sub writeHook +{ + my $self = shift; + my $bytes = shift; + return length($bytes); +} + +sub binmode { 1 } + +sub close { 1 } + +sub clearerr { 1 } + +# I'm write-only! +sub read { 0 } + +sub tell { return shift->{'position'} } + +# vim: ts=4 sw=4 +1; +__END__ + +=head1 COPYRIGHT + +Copyright (c) 2000 Ned Konz. All rights reserved. This program is free +software; you can redistribute it and/or modify it under the same terms +as Perl itself. + +=cut