diff options
Diffstat (limited to 'presentty/server.py')
-rw-r--r-- | presentty/server.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/presentty/server.py b/presentty/server.py new file mode 100644 index 0000000..74e64b2 --- /dev/null +++ b/presentty/server.py | |||
@@ -0,0 +1,112 @@ | |||
1 | # Copyright (C) 2015 James E. Blair <corvus@gnu.org> | ||
2 | # | ||
3 | # This program is free software: you can redistribute it and/or modify | ||
4 | # it under the terms of the GNU General Public License as published by | ||
5 | # the Free Software Foundation, either version 3 of the License, or | ||
6 | # (at your option) any later version. | ||
7 | # | ||
8 | # This program is distributed in the hope that it will be useful, | ||
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | # GNU General Public License for more details. | ||
12 | # | ||
13 | # You should have received a copy of the GNU General Public License | ||
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | |||
16 | import os | ||
17 | import threading | ||
18 | import SocketServer | ||
19 | |||
20 | class ConsoleHandler(SocketServer.StreamRequestHandler): | ||
21 | def handle(self): | ||
22 | server = self.server.server | ||
23 | while True: | ||
24 | try: | ||
25 | data = self.rfile.readline() | ||
26 | except Exception: | ||
27 | break | ||
28 | if not data: | ||
29 | break | ||
30 | data = data.strip() | ||
31 | if data == 'list': | ||
32 | for i, slide in enumerate(server.list()): | ||
33 | self.wfile.write('slide %i %s\n' % (i, slide.title)) | ||
34 | self.wfile.write('end\n') | ||
35 | elif data == 'current': | ||
36 | i, slide = server.current() | ||
37 | self.wfile.write('current %i %i %s\n' % ( | ||
38 | i, slide.progressive_state, slide.title)) | ||
39 | elif data == 'next': | ||
40 | i, slide = server.next() | ||
41 | self.wfile.write('current %i %i %s\n' % ( | ||
42 | i, slide.progressive_state, slide.title)) | ||
43 | elif data == 'prev': | ||
44 | i, slide = server.prev() | ||
45 | self.wfile.write('current %i %i %s\n' % ( | ||
46 | i, slide.progressive_state, slide.title)) | ||
47 | elif data.startswith('jump'): | ||
48 | parts = data.split() | ||
49 | i, slide = server.jump(int(parts[1].strip())) | ||
50 | self.wfile.write('current %i %i %s\n' % ( | ||
51 | i, slide.progressive_state, slide.title)) | ||
52 | elif data == 'size': | ||
53 | size = server.size() | ||
54 | self.wfile.write('size %s %s\n' % size) | ||
55 | |||
56 | class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): | ||
57 | allow_reuse_address=True | ||
58 | |||
59 | class ConsoleServer(object): | ||
60 | def __init__(self, presenter, host='localhost', port=1292): | ||
61 | self.presenter = presenter | ||
62 | self.server = ThreadedTCPServer((host, port), ConsoleHandler) | ||
63 | self.server.server = self | ||
64 | self.lock = threading.Lock() | ||
65 | |||
66 | def start(self): | ||
67 | self.thread=threading.Thread(target=self._run, name="Console Server") | ||
68 | self.thread.daemon=True | ||
69 | self.thread.start() | ||
70 | |||
71 | def _run(self): | ||
72 | self.server.serve_forever() | ||
73 | |||
74 | def stop(self): | ||
75 | self.server.shutdown() | ||
76 | |||
77 | def list(self): | ||
78 | return self.presenter.program | ||
79 | |||
80 | def current(self): | ||
81 | s = self.presenter.program[self.presenter.pos] | ||
82 | return (self.presenter.pos, s) | ||
83 | |||
84 | def size(self): | ||
85 | return self.presenter.loop.screen.get_cols_rows() | ||
86 | |||
87 | def next(self): | ||
88 | self.lock.acquire() | ||
89 | try: | ||
90 | os.write(self.presenter.server_pipe_in, 'next') | ||
91 | self.presenter.server_pipe_out_read.readline() | ||
92 | return self.current() | ||
93 | finally: | ||
94 | self.lock.release() | ||
95 | |||
96 | def prev(self): | ||
97 | self.lock.acquire() | ||
98 | try: | ||
99 | os.write(self.presenter.server_pipe_in, 'prev') | ||
100 | self.presenter.server_pipe_out_read.readline() | ||
101 | return self.current() | ||
102 | finally: | ||
103 | self.lock.release() | ||
104 | |||
105 | def jump(self, pos): | ||
106 | self.lock.acquire() | ||
107 | try: | ||
108 | os.write(self.presenter.server_pipe_in, 'jump %s' % (pos,)) | ||
109 | self.presenter.server_pipe_out_read.readline() | ||
110 | return self.current() | ||
111 | finally: | ||
112 | self.lock.release() | ||