1999-11-15 23:15:49 +00:00
|
|
|
#!/usr/bin/perl -w
|
|
|
|
#
|
|
|
|
# The contents of this file are subject to the Netscape Public
|
|
|
|
# License Version 1.1 (the "License"); you may not use this file
|
|
|
|
# except in compliance with the License. You may obtain a copy of
|
|
|
|
# the License at http://www.mozilla.org/NPL/
|
|
|
|
#
|
|
|
|
# Software distributed under the License is distributed on an "AS
|
|
|
|
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
|
|
# implied. See the License for the specific language governing
|
|
|
|
# rights and limitations under the License.
|
|
|
|
#
|
|
|
|
# The Original Code is Mozilla Communicator client code.
|
|
|
|
#
|
|
|
|
# The Initial Developer of the Original Code is Netscape Communications
|
|
|
|
# Corporation. Portions created by Netscape are
|
|
|
|
# Copyright (C) 1998 Netscape Communications Corporation. All
|
|
|
|
# Rights Reserved.
|
|
|
|
#
|
|
|
|
# Contributor(s):
|
|
|
|
#
|
|
|
|
# $Id: Zip.pm,v 1.2 1999/11/15 23:15:49 waterson%netscape.com Exp $
|
|
|
|
#
|
|
|
|
|
|
|
|
#
|
|
|
|
# Simple, incomplete interface to .zip files.
|
|
|
|
#
|
|
|
|
|
|
|
|
|
1999-11-15 22:31:34 +00:00
|
|
|
package Zip;
|
|
|
|
|
|
|
|
require 5.000;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
use Carp;
|
|
|
|
use IO;
|
|
|
|
use Symbol;
|
|
|
|
use Time::Local;
|
|
|
|
|
|
|
|
my $zipname;
|
|
|
|
|
|
|
|
sub new($$) {
|
|
|
|
@_ == 2 || croak 'usage: new Zip [FILENAME]';
|
|
|
|
my $class = shift;
|
|
|
|
my $zip = gensym;
|
|
|
|
if (@_) {
|
|
|
|
Zip::open($zip, $_[0]) || return undef;
|
|
|
|
}
|
|
|
|
bless $zip, $class;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub DESTROY($) {
|
|
|
|
}
|
|
|
|
|
|
|
|
sub open($$) {
|
|
|
|
@_ == 2 || croak 'usage: $zip->open(FILENAME)';
|
|
|
|
my ($zip, $filename) = @_;
|
|
|
|
$zipname = $filename;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub close($) {
|
|
|
|
@_ == 1 || croak 'usage: $zip->close()';
|
|
|
|
$zipname = undef;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub dir($) {
|
|
|
|
@_ == 1 || croak 'usage: $zip->dir()';
|
|
|
|
$zipname || croak 'no open zipfile';
|
|
|
|
|
|
|
|
|
|
|
|
my @result = ();
|
|
|
|
|
|
|
|
my @list = qx/unzip -l $zipname/;
|
|
|
|
ENTRY: foreach (@list) {
|
|
|
|
# Entry expected to be in the format
|
|
|
|
# size mm-dd-yy hh:mm name
|
|
|
|
next ENTRY unless (/ *(\d+) +(\d+)-(\d+)-(\d+) +(\d+):(\d+) +(.+)$/);
|
|
|
|
|
|
|
|
my $mtime = Time::Local::timelocal(0, $6, $5, $3, $2, ($4 < 1900) ? ($4 + 1900) : $4);
|
|
|
|
|
|
|
|
push(@result, { name => $7,
|
|
|
|
size => $1,
|
|
|
|
mtime => $mtime });
|
|
|
|
}
|
|
|
|
|
|
|
|
return @result;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub expand($$) {
|
|
|
|
@_ == 2 || croak 'usage: $zip->expand(FILENAME)';
|
|
|
|
$zipname || croak 'no open zipfile';
|
|
|
|
|
|
|
|
my $filename = $_[1];
|
|
|
|
|
|
|
|
my $result = new IO::Handle;
|
|
|
|
CORE::open($result, "unzip -p $zipname $filename |");
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|