#!/usr/bin/env perl use strict; use warnings; { package Server; use POE qw/Component::Server::HTTP/; use base qw/Class::Accessor::Fast/; use Win32::OLE; sub new { my $self = shift->SUPER::new( @_ > 1 ? {@_} : $_[0] ); } sub run { my $self = shift; POE::Session->create( object_states => [ $self => [qw/_start/], ], ); POE::Kernel->run; } sub _start { my ($self, $kernel) = @_[OBJECT, KERNEL]; $kernel->alias_set('main'); POE::Component::Server::HTTP->new( Port => $self->{port}, ContentHandler => { '/key/' => \&handle_key, '/' => \&handle_root, }, ); } sub handle_root { my ($req, $res) = @_; $res->code(200); open my $fh, '<', 'psp.swf'; my $swf = do { local $/; <$fh> }; close $fh; $res->content_type('application/x-shockwave-flash'); $res->content($swf); return 200; } sub handle_key { my ($req, $res) = @_; $res->code(200); my $app = Win32::OLE->GetActiveObject('PowerPoint.Application'); unless (defined $app) { $app = Win32::OLE->new('PowerPoint.Application') or die Win32::OLE->LastError; } my ($key) = $req->uri =~ m!key/(\d+)!; my $view = $app->ActivePresentation->SlideShowSettings->Run->View or die Win32::OLE->LastError; if ($key eq '37') { $view->Previous; } elsif ($key eq '38') { } elsif ($key eq '39') { $view->Next; } elsif ($key eq '40') { } $res->code(200); $res->content( $view->CurrentShowPosition ); } } my $server = new Server->new( port => 80 ); $server->run;