| 1 | #!/usr/bin/env perl |
|---|
| 2 | |
|---|
| 3 | use strict; |
|---|
| 4 | use warnings; |
|---|
| 5 | |
|---|
| 6 | use Getopt::Long; |
|---|
| 7 | use Pod::Usage; |
|---|
| 8 | |
|---|
| 9 | { |
|---|
| 10 | package Server; |
|---|
| 11 | use POE qw/Component::Server::HTTP/; |
|---|
| 12 | use base qw/Class::Accessor::Fast/; |
|---|
| 13 | |
|---|
| 14 | use Win32::OLE; |
|---|
| 15 | |
|---|
| 16 | sub new { |
|---|
| 17 | my $self = shift->SUPER::new( @_ > 1 ? {@_} : $_[0] ); |
|---|
| 18 | } |
|---|
| 19 | |
|---|
| 20 | sub run { |
|---|
| 21 | my $self = shift; |
|---|
| 22 | |
|---|
| 23 | POE::Session->create( |
|---|
| 24 | object_states => [ |
|---|
| 25 | $self => [qw/_start/], |
|---|
| 26 | ], |
|---|
| 27 | ); |
|---|
| 28 | POE::Kernel->run; |
|---|
| 29 | } |
|---|
| 30 | |
|---|
| 31 | sub _start { |
|---|
| 32 | my ($self, $kernel) = @_[OBJECT, KERNEL]; |
|---|
| 33 | |
|---|
| 34 | my $bind = sub { |
|---|
| 35 | my ($sub) = @_; |
|---|
| 36 | |
|---|
| 37 | sub { |
|---|
| 38 | $self->$sub(@_); |
|---|
| 39 | }; |
|---|
| 40 | }; |
|---|
| 41 | |
|---|
| 42 | $kernel->alias_set('main'); |
|---|
| 43 | POE::Component::Server::HTTP->new( |
|---|
| 44 | Port => $self->{port}, |
|---|
| 45 | ContentHandler => { |
|---|
| 46 | '/cmd/' => $bind->('handle_key'), |
|---|
| 47 | '/swf/' => $bind->('handle_swf'), |
|---|
| 48 | '/' => $bind->('handle_root'), |
|---|
| 49 | }, |
|---|
| 50 | ); |
|---|
| 51 | } |
|---|
| 52 | |
|---|
| 53 | sub handle_root { |
|---|
| 54 | my ($self, $req, $res) = @_; |
|---|
| 55 | $res->code(200); |
|---|
| 56 | |
|---|
| 57 | $res->content_type('text/html'); |
|---|
| 58 | $res->content(<<"__HTML__"); |
|---|
| 59 | <html> |
|---|
| 60 | <head> |
|---|
| 61 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
|---|
| 62 | <title>PSPスライド操作パネル</title> |
|---|
| 63 | </head> |
|---|
| 64 | <body style="margin:0;padding:0"> |
|---|
| 65 | <object data="/swf/?total=$self->{total}&max=$self->{max}" width="480" height="272" type="application/x-shockwave-flash"></object> |
|---|
| 66 | </body> |
|---|
| 67 | </html> |
|---|
| 68 | __HTML__ |
|---|
| 69 | } |
|---|
| 70 | |
|---|
| 71 | sub handle_swf { |
|---|
| 72 | my ($self, $req, $res) = @_; |
|---|
| 73 | $res->code(200); |
|---|
| 74 | |
|---|
| 75 | open my $fh, '<', 'psp.swf'; |
|---|
| 76 | my $swf = do { local $/; <$fh> }; |
|---|
| 77 | close $fh; |
|---|
| 78 | |
|---|
| 79 | $res->content_type('application/x-shockwave-flash'); |
|---|
| 80 | $res->content($swf); |
|---|
| 81 | } |
|---|
| 82 | |
|---|
| 83 | sub handle_key { |
|---|
| 84 | my ($self, $req, $res) = @_; |
|---|
| 85 | |
|---|
| 86 | my $app = Win32::OLE->GetActiveObject('PowerPoint.Application'); |
|---|
| 87 | unless (defined $app) { |
|---|
| 88 | $app = Win32::OLE->new('PowerPoint.Application') |
|---|
| 89 | or die Win32::OLE->LastError; |
|---|
| 90 | } |
|---|
| 91 | |
|---|
| 92 | my ($key) = $req->uri->path =~ m!cmd/([^/]+)!; |
|---|
| 93 | my $view = $app->ActivePresentation->SlideShowSettings->Run->View or die Win32::OLE->LastError; |
|---|
| 94 | |
|---|
| 95 | if ($key eq 'left') { |
|---|
| 96 | $view->Previous; |
|---|
| 97 | } |
|---|
| 98 | elsif ($key eq 'up') { |
|---|
| 99 | } |
|---|
| 100 | elsif ($key eq 'right') { |
|---|
| 101 | $view->Next; |
|---|
| 102 | } |
|---|
| 103 | elsif ($key eq 'down') { |
|---|
| 104 | } |
|---|
| 105 | |
|---|
| 106 | $res->code(200); |
|---|
| 107 | $res->content( $view->CurrentShowPosition ); |
|---|
| 108 | } |
|---|
| 109 | } |
|---|
| 110 | |
|---|
| 111 | GetOptions( |
|---|
| 112 | \my %opt, |
|---|
| 113 | qw/help num=s sec=s port=s/ |
|---|
| 114 | ); |
|---|
| 115 | pod2usage(0) if $opt{help}; |
|---|
| 116 | |
|---|
| 117 | my $server = new Server->new( port => $opt{port} || 80, max => $opt{num} || 10, total => $opt{sec} || 300 ); |
|---|
| 118 | $server->run; |
|---|