package OpenFrame::AppKit::Segment::Images;

use strict;
use warnings::register;

use IO::File;
use File::MMagic;
use File::Spec;
use Pipeline::Segment;
use OpenFrame::Response;

our $VERSION=3.03;
use base qw ( Pipeline::Segment );

sub directory {
  my $self = shift;
  my $dir  = shift;
  if (defined($dir)) {
    $self->{directory} = $dir;
    return $self;
  } else {
    return $self->{directory};
  }
}

sub dispatch {
  my $self = shift;
  my $pipe = shift;

  # get the path from the request, via the store.
  my $ofr  = $pipe->store->get('OpenFrame::Request');
  if (!$ofr) {
    $self->emit("no OpenFrame::Request available in store");
    return undef;
  }

  my $path = $ofr->uri->path();

  # add the images directory
  my ($volume, $dirs, $file) = File::Spec->splitpath( $path );
  my $realfile = File::Spec->catfile( $self->directory, $dirs, $file );

  $self->emit("trying to access $realfile");

  return unless -f $realfile;
  return unless -r _;

  my $mm = File::MMagic->new();
  my $type = $mm->checktype_filename($realfile);
  $self->emit("found type: $type");

  return unless $type =~ m:^image/:;

  $self->emit("serving image");

  my $fh = IO::File->new($realfile);
  my $data = join('', <$fh>);

  my $response = OpenFrame::Response->new();
  $response->code(ofOK());
  $response->message($data);
  $response->mimetype($type);
  return $response;
}


1;

__END__

=head1 NAME

OpenFrame::AppKit::Segment::Images - a pipeline segment to manage images

=head1 SYNOPSIS

  use OpenFrame::AppKit;
  my $images_engine = OpenFrame::Segment::Images->new();
  $images_engine->directory("./images");

=head1 DESCRIPTION

The C<OpenFrame::AppKit::Segment::Images> class is a pipeline segment
and inherits its interface from there. It provides additional
interface in the form of the director() method, which gets and sets
the root template directory that the template engine will examine.

=head1 AUTHOR

Leon Brocard <leon@fotango.com>

=head1 COPYRIGHT

Copyright 2002 Fotango Ltd. All Rights Reserved

This program is released under the same license as Perl itself.