| Server IP : 182.53.201.61 / Your IP : 216.73.217.175 Web Server : Apache/2.2.15 (Fedora) System : Linux km10.dyndns.org 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 User : apache ( 48) PHP Version : 5.3.3 Disable Function : NONE MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/lib/python2.6/site-packages/orca/ |
Upload File : |
# Orca
#
# Copyright 2006-2008 Sun Microsystems Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
# Boston MA 02110-1301 USA.
"""Provides an HTTP server for Orca. This currently serves mainly as
something that self-voicing applications can use as their speech
service."""
__id__ = "$Id$"
__version__ = "$Revision$"
__date__ = "$Date$"
__copyright__ = "Copyright (c) 2006-2008 Sun Microsystems Inc."
__license__ = "LGPL"
import threading
import BaseHTTPServer
import debug
import platform
import settings
import speech
_httpRequestThread = None
# Handlers for logging speech and braille output.
#
loggingFileHandlers = {}
loggingStreamHandlers = {}
class _HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
"""Provides support for communicating with Orca via HTTP. This is
mainly to support self-voicing applications that want to use Orca
as a speech service.
The protocol is simple: POST content is 'stop', 'speak:<text>',
or 'isSpeaking'.
To test this, run:
wget --post-data='speak:hello world' localhost:20433
"""
def log_request(self, code=None, size=None):
"""Override to avoid getting a log message on stdout for
each GET, POST, etc. request"""
pass
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write("<html><body><p>Orca %s</p></body></html>" \
% platform.version)
def do_POST(self):
contentLength = self.headers.getheader('content-length')
if contentLength:
contentLength = int(contentLength)
inputBody = self.rfile.read(contentLength)
debug.println(debug.LEVEL_FINEST,
"httpserver._HTTPRequestHandler received %s" \
% inputBody)
if inputBody.startswith("speak:"):
speech.speak(inputBody[6:])
self.send_response(200, 'OK')
elif inputBody == "stop":
speech.stop()
self.send_response(200, 'OK')
elif inputBody == "isSpeaking":
self.send_response(200, 'OK')
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write("%s" % speech.isSpeaking())
else:
debug.println(debug.LEVEL_FINEST,
"httpserver._HTTPRequestHandler received no data")
class _HTTPRequestThread(threading.Thread):
"""Runs a _HTTPRequestHandler in a separate thread."""
def run(self):
"""Try to start an HTTP server on settings.httpServerPort.
If this fails, retry settings.maxHttpServerRetries times,
each time incrementing the server port number by 1. If we
are still unable to start a server, just fail gracefully.
"""
portNo = settings.httpServerPort
connected = False
while not connected and \
(portNo < settings.httpServerPort + settings.maxHttpServerRetries):
try:
httpd = BaseHTTPServer.HTTPServer(('', portNo),
_HTTPRequestHandler)
connected = True
except:
if portNo == settings.httpServerPort:
debug.printException(debug.LEVEL_WARNING)
debug.println(debug.LEVEL_WARNING,
"httpserver._HTTPRequestThread unable to start server " \
"on port %d" % portNo)
portNo += 1
if not connected:
debug.println(debug.LEVEL_WARNING,
"httpserver._HTTPRequestThread server startup failed.")
else:
httpd.serve_forever()
def init():
"""Creates an HTTP server that listens for speak commands from a
separate port defined by settings.httpServerPort. We run this
as a daemon so it will die automatically when orca dies."""
global _httpRequestThread
if settings.httpServerPort and (not _httpRequestThread):
try:
_httpRequestThread = _HTTPRequestThread()
_httpRequestThread.setDaemon(True)
_httpRequestThread.start()
except:
debug.printException(debug.LEVEL_WARNING)
def shutdown():
"""Stops the HTTP server. [[[WDW - not implemented yet.]]]"""
pass