#!/usr/local/bin/perl
# !!!
# *** make sure this is the correctly perl path!
#
#
# Animate 0.9
#
# Do cool animations using the Netscape 1.1 multipart/x-mixed-replace
# functionality...
#
#
# Copyright 1995, Home Pages, Inc. All rights reserved.
#
# Home Pages, Inc.
# 257 Castro St. Suite 219
# Mountain View, CA 94041
#
# Please contact support@homepages.com regarding bugs or problems
# or http://www.homepages.com/tools/
#
$SIG{"ALRM"} = "exit";
alarm 10*60;
#
# defimage is the default image to use when under a non-Netscape browers
# [defaults to the first image in the images list]
#
$defimage = "";
#
# The animation sequence
#
$basedir = "/stat1/faculty/west/";
@images = (
"$basedir/NEWGIFA.WEEK001.GIF",
"$basedir/NEWGIFA.WEEK105.GIF",
"$basedir/NEWGIFA.WEEK209.GIF",
"$basedir/NEWGIFA.WEEK313.GIF",
"$basedir/NEWGIFA.WEEK417.GIF",
"$basedir/NEWGIFA.WEEK521.GIF",
"$basedir/NEWGIFA.WEEK625.GIF",
# "$basedir/whiteball.gif",
# "$basedir/orangeball.gif",
# "$basedir/purpleball.gif",
# "$basedir/redball.gif",
# "$basedir/yellowball.gif",
);
#
# The sleep delay between sending the first and second image
#
$delay = 0.9;
#
# You probably don't want to change the rest of this...
#
#
# If there is no default image use the first image of the loop
#
$defimage = $images[0] if $defimage eq "";
#
# Default content type
#
$defsufix = "txt";
#
# Suffix to content type list
#
%sufixes = (
"gif", "image/gif",
"jpeg", "image/jpeg",
"jpg", "image/jpeg",
"jpe", "image/jpeg",
"tiff", "image/tiff",
"tif", "image/tiff",
"pnm", "image/x-portable-anymap",
"pbm", "image/x-portable-bitmap",
"pgm", "image/x-portable-graymap",
"ppm", "image/x-portable-pixmap",
"rgb", "image/x-rgb",
"xbm", "image/x-xbitmap",
"xpm", "image/x-xpixmap",
"xwd", "image/x-xwindowdump",
"html", "text/html",
"htm", "text/html",
"txt", "text/plain",
"tsv", "text/tab-separated-values",
);
#
#
#
$agent = $ENV{'HTTP_USER_AGENT'}.$ENV{'HTTP_USERAGENT'};
$sep = "=-+=-+=-+=MULTI__PART__SEPERATOR-+=-+=-+=";
#$sep = "ThisRandomString";
$| = 1;
#
#
#
if ($ENV{'SERVER_SOFTWARE'} =~ /NCSA/) {
$dostdhdrs = 1;
}
if ($ENV{'SERVER_SOFTWARE'} =~ /NCSA/ && $0 !~ /\/nph-/) {
&error("Bad script name for NCSA server (must be nph-$0)");
}
if ($ENV{'SERVER_PROTOCOL'} =~ /0\.9/) {
$dostdhdrs = 0;
}
# Print the "OK" response
#
#
if ($dostdhdrs) {
print <<"END";
$ENV{'SERVER_PROTOCOL'} 200 OK
Server: $ENV{'SERVER_SOFTWARE'} -- Animate0.9
MIME-version: 1.0
END
}
&ReadParse;
#
#
#
if ($agent =~ /Mozilla\/([1-9].[0-9])/ && $1 > 1.0 && !defined $in{"frame"}) {
print "Content-type: multipart/x-mixed-replace; boundary=$sep\n";
$first = 1;
if (defined $in{"start"}) {
while ($in{"start"} > 0 && $#images != -1) {
shift(@images);
$in{"start"}--;
}
}
if (!defined $in{"loop"}) {
$sz = 0;
foreach $f (@images) {
$sz += &contentsize($f);
$sz += length($sep) + 4;
}
$sz += 3;
print "Content-length: ", $sz, "\n";
}
do {
foreach $f (@images) {
print "\n--$sep\n";
if (!$first) {
$first = 0;
} else {
sleep($delay)
}
&output($f);
}
} while (defined $in{"loop"});
print "\n--$sep--\n";
} else {
if (defined $in{"frame"}) {
while ($in{"frame"} > 0 && $#images != -1) {
$file = shift(@images);
$in{"frame"}--;
}
} else {
$file = "";
}
$file = $defimage if ($file eq "");
&output($file);
}
sub output {
local($file) = @_;
local($type);
local($len);
open(FILE, $file) || return &error("Error finding file $file");
$type = &gettype($file);
print "Content-type: $type\n";
$len = (stat($file))[7];
print "Content-length: $len\n\n";
read(FILE, $buf, $len);
print $buf;
}
sub error {
local($msg) = @_;
print "Content-type: $sufixes{'html'}\n\n";
print "Error\n";
print "$msg
\n";
}
sub contentsize {
local($file) = @_;
local($size,$type);
$size = (stat($file))[7];
$type = &gettype($file);
$size += length("Content-type: $type\n");
$size += length("Content-length: $len\n\n");
return $size;
}
#
# Given a file name return a MIME type
#
sub gettype {
local($file) = @_;
local($suf);
$file =~ /.*\.(\w+)/;
$suf = $1;
$suf =~ tr/A-Z/a-z/;
if (defined $sufixes{$suf}) {
return $sufixes{$suf};
} else {
return $sufixes{$defsufix};
}
}
# Perl Routines to Manipulate CGI input
# S.E.Brenner@bioc.cam.ac.uk
# $Header: /people/seb1005/http/cgi-bin/RCS/cgi-lib.pl,v 1.2 1994/01/10 15:05:40 seb1005 Exp $
#
# Copyright 1993 Steven E. Brenner
# Unpublished work.
# Permission granted to use and modify this library so long as the
# copyright above is maintained, modifications are documented, and
# credit is given for any use of the library.
# ReadParse
# Reads in GET or POST data, converts it to unescaped text, and puts
# one key=value in each member of the list "@in"
# Also creates key/value pairs in %in, using '\0' to separate multiple
# selections
# If a variable-glob parameter (e.g., *cgi_input) is passed to ReadParse,
# information is stored there, rather than in $in, @in, and %in.
sub ReadParse {
if (@_) {
local (*in) = @_;
}
local ($i, $loc, $key, $val);
# Read in text
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$in = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
for ($i = 0; $i < $ENV{'CONTENT_LENGTH'}; $i++) {
$in .= getc;
}
}
while ($in ne "") {
@in = split(/&/,$in);
foreach $i (0 .. $#in) {
# Convert plus's to spaces
$in[$i] =~ s/\+/ /g;
# Convert %XX from hex numbers to alphanumeric
$in[$i] =~ s/%(..)/pack("c",hex($1))/ge;
# Split into key and value.
$loc = index($in[$i],"=");
$key = substr($in[$i],0,$loc);
$val = substr($in[$i],$loc+1);
$in{$key} .= '\0' if (defined($in{$key}));
# \0 is the multiple separator
$in{$key} .= $val;
}
$in = "";
}
return 1; # just for fun
}