summaryrefslogtreecommitdiff
path: root/lib/Archive/Zip/StringMember.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Archive/Zip/StringMember.pm')
-rw-r--r--lib/Archive/Zip/StringMember.pm64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/Archive/Zip/StringMember.pm b/lib/Archive/Zip/StringMember.pm
new file mode 100644
index 0000000..50e74c6
--- /dev/null
+++ b/lib/Archive/Zip/StringMember.pm
@@ -0,0 +1,64 @@
+package Archive::Zip::StringMember;
+
+use strict;
+use vars qw( $VERSION @ISA );
+
+BEGIN {
+ $VERSION = '1.49';
+ @ISA = qw( Archive::Zip::Member );
+}
+
+use Archive::Zip qw(
+ :CONSTANTS
+ :ERROR_CODES
+);
+
+# Create a new string member. Default is COMPRESSION_STORED.
+# Can take a ref to a string as well.
+sub _newFromString {
+ my $class = shift;
+ my $string = shift;
+ my $name = shift;
+ my $self = $class->new(@_);
+ $self->contents($string);
+ $self->fileName($name) if defined($name);
+
+ # Set the file date to now
+ $self->setLastModFileDateTimeFromUnix(time());
+ $self->unixFileAttributes($self->DEFAULT_FILE_PERMISSIONS);
+ return $self;
+}
+
+sub _become {
+ my $self = shift;
+ my $newClass = shift;
+ return $self if ref($self) eq $newClass;
+ delete($self->{'contents'});
+ return $self->SUPER::_become($newClass);
+}
+
+# Get or set my contents. Note that we do not call the superclass
+# version of this, because it calls us.
+sub contents {
+ my $self = shift;
+ my $string = shift;
+ if (defined($string)) {
+ $self->{'contents'} =
+ pack('C0a*', (ref($string) eq 'SCALAR') ? $$string : $string);
+ $self->{'uncompressedSize'} = $self->{'compressedSize'} =
+ length($self->{'contents'});
+ $self->{'compressionMethod'} = COMPRESSION_STORED;
+ }
+ return $self->{'contents'};
+}
+
+# Return bytes read. Note that first parameter is a ref to a buffer.
+# my $data;
+# my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize );
+sub _readRawChunk {
+ my ($self, $dataRef, $chunkSize) = @_;
+ $$dataRef = substr($self->contents(), $self->_readOffset(), $chunkSize);
+ return (length($$dataRef), AZ_OK);
+}
+
+1;