summaryrefslogtreecommitdiff
path: root/presentty/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'presentty/server.py')
-rw-r--r--presentty/server.py112
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
16import os
17import threading
18import SocketServer
19
20class 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
56class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
57 allow_reuse_address=True
58
59class 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()