package AxKit::App::Gallery::Provider;
# Copyright (c) 2003 Nik Clayton
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $Id: Provider.pm,v 1.4 2003/11/09 12:33:44 nik Exp $
use Apache::Constants qw(:common);
use Apache::Request;
use File::Path;
use URI;
use URI::Escape; # For unescaping URIs
use Apache::AxKit::Provider::File;
use Apache::AxKit::Exception;
#use Data::Dumper;
use base qw(Apache::AxKit::Provider::File);
sub get_fh {
my $self = shift;
my $r = $self->{apache};
# $r->log_error("get_fh(), r is " . Dumper($r));
return $self->SUPER::get_fh()
unless substr($r->content_type(), 0, 6) eq 'image/';
my $format = $r->param('format');
# $r->log_error("get_fh(), format is $format");
$format = 'raw' unless $format; # Default format is raw
# If the format is not 'raw' then generate the XML info for the
# image. That's done by get_strref(), so bail out here
if($format ne 'raw') {
AxKit::Debug(5, "Format is not 'raw'");
throw Apache::AxKit::Exception::IO(
-text => "Format is not 'raw'");
}
return $self->SUPER::get_fh();
}
# Given an image's filename, generate some XML with information about
# just that image.
sub get_strref {
my $self = shift;
# XXX $self->{apache} seems to be an Apache object, not
# an Apache::Request object. So $r->param() doesn't work. Make
# sure it's a ::Request object. No idea why we need to do this
# here, but not in get_fh() -- maybe we do?
my $r = Apache::Request->new($self->{apache});
# $r->log_error("get_strref() called: file: " . $r->filename() . " type: " . $r->content_type());
# $r->log_error(Dumper($r));
return $self->SUPER::get_strref() if ! -f $r->filename();
$r->content_type('text/xml');
# Get the filename, extract some stats
my $file = $r->filename();
# $r->log_error("stat()ing $file");
my $filesize = (stat($file))[7];
my $mod = (stat(_))[9];
# Use the filename to retrive the path, and separate out the filename
my $path;
($path, $file) = $file =~ /(.*)\/(.*)/; # Extract the path/file info
my $uri = URI->new($r->uri());
$uri =~ s/^\///; # Trim the leading '/'
$uri = join("\n",
map { "$_" . uri_unescape($_) . "" } split(/\//, $uri));
my $ct = $r->content_type();
my $xml = <
EOXML
foreach my $var (qw(ProofsheetColumns ImagesPerProofsheet
GalleryCache GalleryThumbQuality)) {
$xml .= "" . $r->dir_config($var) . "\n";
}
my $size = $r->param('size');
# Make sure the specified size is one we're configured to
# support. If it isn't then use the default size
my $sizelist = $r->dir_config('GallerySizes');
$sizelist = '133 640 800 1024' unless defined $sizelist;
my @sizes = split(/\s+/, $sizelist);
if($size eq 'thumb') {
$size = $sizes[0];
} else {
$size = $sizes[1] unless grep { $_ eq $size } @sizes;
}
$xml .= <
$sizes[0]
EOXML
foreach (@sizes[1..$#sizes]) {
if($_ == $size) {
$xml .= "$_\n";
} else {
$xml .= "$_\n";
}
}
$xml .= "";
$xml .= <
$file
$filesize
$size
$mod
$uri
$path
$ct
EOXML
# $r->log_error("Provider returning $xml");
return \$xml;
}
1;