root/platform/psp/pspslidepanel/server-pp.pl @ 2922

Revision 2922, 2.7 kB (checked in by typester, 7 years ago)

パワポ用サーバーも最新に追従

Line 
1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5
6use Getopt::Long;
7use 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
111GetOptions(
112    \my %opt,
113    qw/help num=s sec=s port=s/
114);
115pod2usage(0) if $opt{help};
116
117my $server = new Server->new( port => $opt{port} || 80, max => $opt{num} || 10, total => $opt{sec} || 300 );
118$server->run;
Note: See TracBrowser for help on using the browser.