From 6e35d6b5d480f416e77b356285734525c3b992dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Cort=C3=A9z?= Date: Tue, 5 Apr 2016 12:44:35 -0500 Subject: [PATCH] Included accessible_output2 fixed --- src/accessible_output2/__init__.py | 12 +- src/accessible_output2/lib/SAAPI32.dll | Bin 103424 -> 77792 bytes src/accessible_output2/lib/jfwapi.dll | Bin 27192 -> 0 bytes src/accessible_output2/outputs/__init__.py | 28 +- src/accessible_output2/outputs/auto.py | 30 +- src/accessible_output2/outputs/base.py | 40 +- src/accessible_output2/outputs/dolphin.py | 10 +- src/accessible_output2/outputs/e_speak.py | 31 + src/accessible_output2/outputs/jaws.py | 3 +- src/accessible_output2/outputs/nvda.py | 12 +- src/accessible_output2/outputs/pc_talker.py | 9 +- src/accessible_output2/outputs/sapi4.py | 143 +++ src/accessible_output2/outputs/sapi5.py | 95 ++ src/accessible_output2/outputs/say.py | 21 + .../outputs/speechDispatcher.py | 29 - .../outputs/speechd/__init__.py | 18 - .../outputs/speechd/client.py | 1125 ----------------- .../outputs/speechd/paths.py | 1 - .../outputs/system_access.py | 12 +- src/accessible_output2/outputs/voiceover.py | 24 +- src/accessible_output2/outputs/window_eyes.py | 3 +- src/libloader/com.py | 15 +- src/libloader/libloader.py | 2 +- src/output.py | 31 +- 24 files changed, 430 insertions(+), 1264 deletions(-) delete mode 100644 src/accessible_output2/lib/jfwapi.dll create mode 100644 src/accessible_output2/outputs/e_speak.py create mode 100644 src/accessible_output2/outputs/sapi4.py create mode 100644 src/accessible_output2/outputs/sapi5.py create mode 100644 src/accessible_output2/outputs/say.py delete mode 100644 src/accessible_output2/outputs/speechDispatcher.py delete mode 100644 src/accessible_output2/outputs/speechd/__init__.py delete mode 100644 src/accessible_output2/outputs/speechd/client.py delete mode 100644 src/accessible_output2/outputs/speechd/paths.py diff --git a/src/accessible_output2/__init__.py b/src/accessible_output2/__init__.py index 311513a..c826e7a 100644 --- a/src/accessible_output2/__init__.py +++ b/src/accessible_output2/__init__.py @@ -1,19 +1,23 @@ +from __future__ import absolute_import import ctypes import os import types from platform_utils import paths -def load_library(libname): +def load_library(libname, cdll=False): if paths.is_frozen(): libfile = os.path.join(paths.embedded_data_path(), 'accessible_output2', 'lib', libname) else: libfile = os.path.join(paths.module_path(), 'lib', libname) - return ctypes.windll[libfile] + if cdll: + return ctypes.cdll[libfile] + else: + return ctypes.windll[libfile] def get_output_classes(): - import outputs + from . import outputs module_type = types.ModuleType - classes = [m.output_class for m in outputs.__dict__.itervalues() if type(m) == module_type and hasattr(m, 'output_class')] + classes = [m.output_class for m in outputs.__dict__.values() if type(m) == module_type and hasattr(m, 'output_class')] return sorted(classes, key=lambda c: c.priority) def find_datafiles(): diff --git a/src/accessible_output2/lib/SAAPI32.dll b/src/accessible_output2/lib/SAAPI32.dll index 0384e7dea664f6a8b2f4811b9a15eddf259147a5..166f7d3226848f428b931ae0e5e8e3d98acafd85 100644 GIT binary patch literal 77792 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 literal 103424 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

1{Dt~hgN|k7d9p}m= z?&dnBBX%cA-B}@po(`a$9rh?*=mcIRnroz&F}kQH9Fvh9Ir>n(a#P{;cXdVp%yJ5kH@2DFm!8Fh#WYb zYcM3CcE)Zw0%Wvjp8)&0E_WV!UmUR)gg5@r#7AK^L?KtII1 z%+RS@Y^Fyo4ovto463B(0SJU7jf-wt_i)aw2BO2B?uffzA-BI*dLG>fI_zS8q{2fn zWF`phYLJx3t2OT9VgtC_L1tA?Oo<7SYB=hM=Uz;;})EIL83gtX>9L_wpv0&UqfZr(?C+D z<8`2N%JY*Y>XWF%GWYTGO~>+P0>hG6UjgSB6;hT6&-4{*^4}oF6FP$9*Q- z%In6F%)Ib&49DZ=9h36v#9^vykZT|ggZ9kKei)Cgo*+B}=}imAf;&4hy-4oCH9Vf* z@*+x)7Q(uCF;Qa&-A>Enm3Bym#3WzhK3>5WP&}sB(mV=_t+Db(#+G`W zH7cYAh-Jrr1Xu=ub$4P*(<$ud9CO~R6C=g){zpOSf$%GUG!QgMkxC7GUJf4lj?cSc{gh^Dj|@E_$hsn`o<7=N-%b@n3gXYj2^+!^`BR1xldk zye_)jCjr;L=&H1T)m0iU@>qCzYgaj9x<%h&Bn{{XCOpO-1zKiTA9Pvo*6zZVTInqn zSi$VW#G~<#p9TGk+(noU|EP<^pip$mXb(QNYw`b;22b~nJTt4F*o>ol=?QBXc)CsR zqcJ^LlVhpFm-XKTV+LvJ-wZ8qwkzl5M8?0tE&D4tmTByKeWT=ljvb_ zt)osn+P_@J=AYmb2qGr(B;`{r$A9#oboTYN6@Lz;vBVR)vUWXw0b)~|s(Y5oG;)E} zVvqq~2d327ZkQl91j0`eFWQsU_RiqrykQV9yK3#-=P~(rMD2a~e`OAh0Eqwh&7p%) zYnnr;_WvK7L;qEW{r_VQ9ga@msWs0?Qe;A}sK()Yjf97^r_2Xp91 zc>no1bZz^y0~3XZ6P9@cIM&BSmd>=BH)BI&PuXM_UbUxuYERh-nqzP_*i*LHQ+C@^ zUId3V#8~yleL7?EP-NESgTfbAXxNob_N8l0y*+W)M(-E{uZ{8NH8BAY6B8t;#<*Oc zL~QgPW4jTkd-`7N!9el#UK0e{mRReDS#M}o`(isc(N!y2!bE?Mw&qb@kZkIc>?($a z1)CJk_rkS%kWB(jnn(wla@Pl-(E}p|XT@d4Uu~(IAfqSQ^%~35F6>0MtKPjmL%NuK zKPH?X6f=YmgFL@4V#ey8i9vQT=5_j*g}P@V$epTtb`b1zUsuk=^gu>p=7CiA6t0PI z>CgdAT`q2@+@rwj3Zg!@n7FGx7|8*Ht4B=K`W_(U?4A_>V()tjH~4|2#cke=wis2I zeg1d(q#!-Ovje=m`uX^fi9mPSh3પ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 GUermbz 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 Y9}E0rfqyLUj|Kj*z&{rFFIwRL09FWp>i_@% diff --git a/src/accessible_output2/lib/jfwapi.dll b/src/accessible_output2/lib/jfwapi.dll deleted file mode 100644 index e052823445f4727941a5e9055a633d5b0b675466..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27192 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" % (round(self._pitch), text.replace("<", "<")) + self.object.Speak(textOutput, SVSFlagsAsync | SVSFIsXML) + + def silence(self): + self.object.Speak("", SVSFlagsAsync | SVSFPurgeBeforeSpeak) + + def is_active(self): + if self.object: + return True + return False + +output_class = SAPI5 diff --git a/src/accessible_output2/outputs/say.py b/src/accessible_output2/outputs/say.py new file mode 100644 index 0000000..5eb3bc4 --- /dev/null +++ b/src/accessible_output2/outputs/say.py @@ -0,0 +1,21 @@ +from __future__ import absolute_import +import os +from .base import Output + +class AppleSay(Output): + """Speech output supporting the Apple Say subsystem.""" + name = 'Apple Say' + def __init__(self, voice = 'Alex', rate = '300'): + self.voice = voice + self.rate = rate + super(AppleSay, self).__init__() + def is_active(self): + return not os.system('which say') + def speak(self, text, interrupt = 0): + if interrupt: + self.silence() + os.system('say -v %s -r %s "%s" &' % (self.voice, self.rate, text)) + def silence(self): + os.system('killall say') + +output_class = AppleSay \ No newline at end of file diff --git a/src/accessible_output2/outputs/speechDispatcher.py b/src/accessible_output2/outputs/speechDispatcher.py deleted file mode 100644 index 1509ecd..0000000 --- a/src/accessible_output2/outputs/speechDispatcher.py +++ /dev/null @@ -1,29 +0,0 @@ -from base import Output, OutputError -import atexit -import application -class SpeechDispatcher(Output): - """Supports speech dispatcher on Linux. - Note that this module will use the configuration of speech dispatcher, the user will need to configure the voice, language, punctuation and rate before using this module. - """ - name = 'SpeechDispatcher' - - def __init__(self, *args, **kwargs): - super(SpeechDispatcher, self).__init__(*args, **kwargs) - try: - import speechd - self.spd = speechd.SSIPClient(application.name) - except ImportError: - raise OutputError - atexit.register(self.on_exit_event) - - def speak(self, text, interupt=False): - if interupt == True: - self.spd.cancel() - self.spd.speak(text) - - def is_active(self): - return True - - def on_exit_event(self): - self.spd.close() - del self.spd diff --git a/src/accessible_output2/outputs/speechd/__init__.py b/src/accessible_output2/outputs/speechd/__init__.py deleted file mode 100644 index 5b59f0c..0000000 --- a/src/accessible_output2/outputs/speechd/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2001, 2002 Brailcom, o.p.s. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -from .client import * - diff --git a/src/accessible_output2/outputs/speechd/client.py b/src/accessible_output2/outputs/speechd/client.py deleted file mode 100644 index 8d34363..0000000 --- a/src/accessible_output2/outputs/speechd/client.py +++ /dev/null @@ -1,1125 +0,0 @@ -# Copyright (C) 2003-2008 Brailcom, o.p.s. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -"""Python API to Speech Dispatcher - -Basic Python client API to Speech Dispatcher is provided by the 'SSIPClient' -class. This interface maps directly to available SSIP commands and logic. - -A more convenient interface is provided by the 'Speaker' class. - -""" - -#TODO: Blocking variants for speak, char, key, sound_icon. - -import socket, sys, os, subprocess, time, tempfile - -try: - import threading -except: - import dummy_threading as threading - -from . import paths - -class CallbackType(object): - """Constants describing the available types of callbacks""" - INDEX_MARK = 'index_marks' - """Index mark events are reported when the place they were - included into the text by the client application is reached - when speaking them""" - BEGIN = 'begin' - """The begin event is reported when Speech Dispatcher starts - actually speaking the message.""" - END = 'end' - """The end event is reported after the message has terminated and - there is no longer any sound from it being produced""" - CANCEL = 'cancel' - """The cancel event is reported when a message is canceled either - on request of the user, because of prioritization of messages or - due to an error""" - PAUSE = 'pause' - """The pause event is reported after speaking of a message - was paused. It no longer produces any audio.""" - RESUME = 'resume' - """The resume event is reported right after speaking of a message - was resumed after previous pause.""" - -class SSIPError(Exception): - """Common base class for exceptions during SSIP communication.""" - -class SSIPCommunicationError(SSIPError): - """Exception raised when trying to operate on a closed connection.""" - - _additional_exception = None - - def __init__(self, description=None, original_exception=None, **kwargs): - self._original_exception = original_exception - self._description = description - super(SSIPError, self).__init__(**kwargs) - - def original_exception(self): - """Return the original exception if any - - If this exception is secondary, being caused by a lower - level exception, return this original exception, otherwise - None""" - return self._original_exception - - def set_additional_exception(self, exception): - """Set an additional exception - - See method additional_exception(). - """ - self._additional_exception = exception - - def additional_exception(self): - """Return an additional exception - - Additional exceptions araise from failed attempts to resolve - the former problem""" - return self._additional_exception - - def description(self): - """Return error description""" - return self._description - - def __str__(self): - msgs = [] - if self.description(): - msgs.append(self.description()) - if self.original_exception: - msgs.append("Original error: " + str(self.original_exception())) - if self.additional_exception: - msgs.append("Additional error: " + str(self.additional_exception())) - return "\n".join(msgs) - -class SSIPResponseError(Exception): - def __init__(self, code, msg, data): - Exception.__init__(self, "%s: %s" % (code, msg)) - self._code = code - self._msg = msg - self._data = data - - def code(self): - """Return the server response error code as integer number.""" - return self._code - - def msg(self): - """Return server response error message as string.""" - return self._msg - - -class SSIPCommandError(SSIPResponseError): - """Exception raised on error response after sending command.""" - - def command(self): - """Return the command string which resulted in this error.""" - return self._data - - -class SSIPDataError(SSIPResponseError): - """Exception raised on error response after sending data.""" - - def data(self): - """Return the data which resulted in this error.""" - return self._data - - -class SpawnError(Exception): - """Indicates failure in server autospawn.""" - -class CommunicationMethod(object): - """Constants describing the possible methods of connection to server.""" - UNIX_SOCKET = 'unix_socket' - """Unix socket communication using a filesystem path""" - INET_SOCKET = 'inet_socket' - """Inet socket communication using a host and port""" - -class _SSIP_Connection(object): - """Implemantation of low level SSIP communication.""" - - _NEWLINE = b"\r\n" - _END_OF_DATA_MARKER = b'.' - _END_OF_DATA_MARKER_ESCAPED = b'..' - _END_OF_DATA = _NEWLINE + _END_OF_DATA_MARKER + _NEWLINE - _END_OF_DATA_ESCAPED = _NEWLINE + _END_OF_DATA_MARKER_ESCAPED + _NEWLINE - # Constants representing \r\n. and \r\n.. - _RAW_DOTLINE = _NEWLINE + _END_OF_DATA_MARKER - _ESCAPED_DOTLINE = _NEWLINE + _END_OF_DATA_MARKER_ESCAPED - - _CALLBACK_TYPE_MAP = {700: CallbackType.INDEX_MARK, - 701: CallbackType.BEGIN, - 702: CallbackType.END, - 703: CallbackType.CANCEL, - 704: CallbackType.PAUSE, - 705: CallbackType.RESUME, - } - - def __init__(self, communication_method, socket_path, host, port): - """Init connection: open the socket to server, - initialize buffers, launch a communication handling - thread. - """ - - if communication_method == CommunicationMethod.UNIX_SOCKET: - socket_family = socket.AF_UNIX - socket_connect_args = socket_path - elif communication_method == CommunicationMethod.INET_SOCKET: - assert host and port - socket_family = socket.AF_INET - socket_connect_args = (socket.gethostbyname(host), port) - else: - raise ValueError("Unsupported communication method") - - try: - self._socket = socket.socket(socket_family, socket.SOCK_STREAM) - self._socket.connect(socket_connect_args) - except socket.error as ex: - raise SSIPCommunicationError("Can't open socket using method " - + communication_method, - original_exception = ex) - - self._buffer = b"" - self._com_buffer = [] - self._callback = None - self._ssip_reply_semaphore = threading.Semaphore(0) - self._communication_thread = \ - threading.Thread(target=self._communication, kwargs={}, - name="SSIP client communication thread") - self._communication_thread.start() - - def close(self): - """Close the server connection, destroy the communication thread.""" - # Read-write shutdown here is necessary, otherwise the socket.recv() - # function in the other thread won't return at last on some platforms. - try: - self._socket.shutdown(socket.SHUT_RDWR) - except socket.error: - pass - self._socket.close() - # Wait for the other thread to terminate - self._communication_thread.join() - - def _communication(self): - """Handle incomming socket communication. - - Listens for all incomming communication on the socket, dispatches - events and puts all other replies into self._com_buffer list in the - already parsed form as (code, msg, data). Each time a new item is - appended to the _com_buffer list, the corresponding semaphore - 'self._ssip_reply_semaphore' is incremented. - - This method is designed to run in a separate thread. The thread can be - interrupted by closing the socket on which it is listening for - reading.""" - - while True: - try: - code, msg, data = self._recv_message() - except IOError: - # If the socket has been closed, exit the thread - sys.exit() - if code//100 != 7: - # This is not an index mark nor an event - self._com_buffer.append((code, msg, data)) - self._ssip_reply_semaphore.release() - continue - # Ignore the event if no callback function has been registered. - if self._callback is not None: - type = self._CALLBACK_TYPE_MAP[code] - if type == CallbackType.INDEX_MARK: - kwargs = {'index_mark': data[2]} - else: - kwargs = {} - # Get message and client ID of the event - msg_id, client_id = map(int, data[:2]) - self._callback(msg_id, client_id, type, **kwargs) - - - def _readline(self): - """Read one whole line from the socket. - - Blocks until the line delimiter ('_NEWLINE') is read. - - """ - pointer = self._buffer.find(self._NEWLINE) - while pointer == -1: - try: - d = self._socket.recv(1024) - except: - raise IOError - if len(d) == 0: - raise IOError - self._buffer += d - pointer = self._buffer.find(self._NEWLINE) - line = self._buffer[:pointer] - self._buffer = self._buffer[pointer+len(self._NEWLINE):] - return line.decode('utf-8') - - def _recv_message(self): - """Read server response or a callback - and return the triplet (code, msg, data).""" - data = [] - c = None - while True: - line = self._readline() - assert len(line) >= 4, "Malformed data received from server!" - code, sep, text = line[:3], line[3], line[4:] - assert code.isalnum() and (c is None or code == c) and \ - sep in ('-', ' '), "Malformed data received from server!" - if sep == ' ': - msg = text - return int(code), msg, tuple(data) - data.append(text) - - def _recv_response(self): - """Read server response from the communication thread - and return the triplet (code, msg, data).""" - # TODO: This check is dumb but seems to work. The main thread - # hangs without it, when the Speech Dispatcher connection is lost. - if not self._communication_thread.isAlive(): - raise SSIPCommunicationError - self._ssip_reply_semaphore.acquire() - # The list is sorted, read the first item - response = self._com_buffer[0] - del self._com_buffer[0] - return response - - def send_command(self, command, *args): - """Send SSIP command with given arguments and read server response. - - Arguments can be of any data type -- they are all stringified before - being sent to the server. - - Returns a triplet (code, msg, data), where 'code' is a numeric SSIP - response code as an integer, 'msg' is an SSIP rsponse message as string - and 'data' is a tuple of strings (all lines of response data) when a - response contains some data. - - 'SSIPCommandError' is raised in case of non 2xx return code. See SSIP - documentation for more information about server responses and codes. - - 'IOError' is raised when the socket was closed by the remote side. - - """ - if __debug__: - if command in ('SET', 'CANCEL', 'STOP',): - assert args[0] in (Scope.SELF, Scope.ALL) \ - or isinstance(args[0], int) - cmd = ' '.join((command,) + tuple(map(str, args))) - try: - self._socket.send(cmd.encode('utf-8') + self._NEWLINE) - except socket.error: - raise SSIPCommunicationError("Speech Dispatcher connection lost.") - code, msg, data = self._recv_response() - if code//100 != 2: - raise SSIPCommandError(code, msg, cmd) - return code, msg, data - - def send_data(self, data): - """Send multiline data and read server response. - - Returned value is the same as for 'send_command()' method. - - 'SSIPDataError' is raised in case of non 2xx return code. See SSIP - documentation for more information about server responses and codes. - - 'IOError' is raised when the socket was closed by the remote side. - - """ - data = data.encode('utf-8') - # Escape the end-of-data marker even if present at the beginning - # The start of the string is also the start of a line. - if data.startswith(self._END_OF_DATA_MARKER): - l = len(self._END_OF_DATA_MARKER) - data = self._END_OF_DATA_MARKER_ESCAPED + data[l:] - - # Escape the end of data marker at the start of each subsequent - # line. We can do that by simply replacing \r\n. with \r\n.., - # since the start of a line is immediately preceded by \r\n, - # when the line is not the beginning of the string. - data = data.replace(self._RAW_DOTLINE, self._ESCAPED_DOTLINE) - - try: - self._socket.send(data + self._END_OF_DATA) - except socket.error: - raise SSIPCommunicationError("Speech Dispatcher connection lost.") - code, msg, response_data = self._recv_response() - if code//100 != 2: - raise SSIPDataError(code, msg, data) - return code, msg, response_data - - def set_callback(self, callback): - """Register a callback function for handling asynchronous events. - - Arguments: - callback -- a callable object (function) which will be called to - handle asynchronous events (arguments described below). Passing - `None' results in removing the callback function and ignoring - events. Just one callback may be registered. Attempts to register - a second callback will result in the former callback being - replaced. - - The callback function must accept three positional arguments - ('message_id', 'client_id', 'event_type') and an optional keyword - argument 'index_mark' (when INDEX_MARK events are turned on). - - Note, that setting the callback function doesn't turn the events on. - The user is responsible to turn them on by sending the appropriate `SET - NOTIFICATION' command. - - """ - self._callback = callback - -class _CallbackHandler(object): - """Internal object which handles callbacks.""" - - def __init__(self, client_id): - self._client_id = client_id - self._callbacks = {} - self._lock = threading.Lock() - - def __call__(self, msg_id, client_id, type, **kwargs): - if client_id != self._client_id: - # TODO: does that ever happen? - return - self._lock.acquire() - try: - try: - callback, event_types = self._callbacks[msg_id] - except KeyError: - pass - else: - if event_types is None or type in event_types: - callback(type, **kwargs) - if type in (CallbackType.END, CallbackType.CANCEL): - del self._callbacks[msg_id] - finally: - self._lock.release() - - def add_callback(self, msg_id, callback, event_types): - self._lock.acquire() - try: - self._callbacks[msg_id] = (callback, event_types) - finally: - self._lock.release() - -class Scope(object): - """An enumeration of valid SSIP command scopes. - - The constants of this class should be used to specify the 'scope' argument - for the 'Client' methods. - - """ - SELF = 'self' - """The command (mostly a setting) applies to current connection only.""" - ALL = 'all' - """The command applies to all current Speech Dispatcher connections.""" - - -class Priority(object): - """An enumeration of valid SSIP message priorities. - - The constants of this class should be used to specify the 'priority' - argument for the 'Client' methods. For more information about message - priorities and their interaction, see the SSIP documentation. - - """ - IMPORTANT = 'important' - TEXT = 'text' - MESSAGE = 'message' - NOTIFICATION = 'notification' - PROGRESS = 'progress' - - -class PunctuationMode(object): - """Constants for selecting a punctuation mode. - - The mode determines which characters should be read. - - """ - ALL = 'all' - """Read all punctuation characters.""" - NONE = 'none' - """Don't read any punctuation character at all.""" - SOME = 'some' - """Only the user-defined punctuation characters are read. - - The set of characters is specified in Speech Dispatcher configuration. - - """ - -class DataMode(object): - """Constants specifying the type of data contained within messages - to be spoken. - - """ - TEXT = 'text' - """Data is plain text.""" - SSML = 'ssml' - """Data is SSML (Speech Synthesis Markup Language).""" - - -class SSIPClient(object): - """Basic Speech Dispatcher client interface. - - This class provides a Python interface to Speech Dispatcher functionality - over an SSIP connection. The API maps directly to available SSIP commands. - Each connection to Speech Dispatcher is represented by one instance of this - class. - - Many commands take the 'scope' argument, thus it is shortly documented - here. It is either one of 'Scope' constants or a number of connection. By - specifying the connection number, you are applying the command to a - particular connection. This feature is only meant to be used by Speech - Dispatcher control application, however. More datails can be found in - Speech Dispatcher documentation. - - """ - - DEFAULT_HOST = '127.0.0.1' - """Default host for server connections.""" - DEFAULT_PORT = 6560 - """Default port number for server connections.""" - DEFAULT_SOCKET_PATH = "speech-dispatcher/speechd.sock" - """Default name of the communication unix socket""" - - def __init__(self, name, component='default', user='unknown', address=None, - autospawn=None, - # Deprecated -> - host=None, port=None, method=None, socket_path=None): - """Initialize the instance and connect to the server. - - Arguments: - name -- client identification string - component -- connection identification string. When one client opens - multiple connections, this can be used to identify each of them. - user -- user identification string (user name). When multi-user - acces is expected, this can be used to identify their connections. - address -- server address as specified in Speech Dispatcher - documentation (e.g. "unix:/run/user/joe/speech-dispatcher/speechd.sock" - or "inet:192.168.0.85:6561") - autospawn -- a flag to specify whether the library should - try to start the server if it determines its not already - running or not - - Deprecated arguments: - method -- communication method to use, one of the constants defined in class - CommunicationMethod - socket_path -- for CommunicationMethod.UNIX_SOCKET, socket - path in filesystem. By default, this is $XDG_RUNTIME_DIR/speech-dispatcher/speechd.sock - where $XDG_RUNTIME_DIR is determined using the XDG Base Directory - Specification. - host -- for CommunicationMethod.INET_SOCKET, server hostname - or IP address as a string. If None, the default value is - taken from SPEECHD_HOST environment variable (if it - exists) or from the DEFAULT_HOST attribute of this class. - port -- for CommunicationMethod.INET_SOCKET method, server - port as number or None. If None, the default value is - taken from SPEECHD_PORT environment variable (if it - exists) or from the DEFAULT_PORT attribute of this class. - - For more information on client identification strings see Speech - Dispatcher documentation. - """ - - _home = os.path.expanduser("~") - _runtime_dir = os.environ.get('XDG_RUNTIME_DIR', os.environ.get('XDG_CACHE_HOME', os.path.join(_home, '.cache'))) - _sock_path = os.path.join(_runtime_dir, self.DEFAULT_SOCKET_PATH) - # Resolve connection parameters: - connection_args = {'communication_method': CommunicationMethod.UNIX_SOCKET, - 'socket_path': _sock_path, - 'host': self.DEFAULT_HOST, - 'port': self.DEFAULT_PORT, - } - # Respect address method argument and SPEECHD_ADDRESS environemt variable - _address = address or os.environ.get("SPEECHD_ADDRESS") - - if _address: - connection_args.update(self._connection_arguments_from_address(_address)) - # Respect the old (deprecated) key arguments and environment variables - # TODO: Remove this section in 0.8 release - else: - # Read the environment variables - env_speechd_host = os.environ.get("SPEECHD_HOST") - try: - env_speechd_port = int(os.environ.get("SPEECHD_PORT")) - except: - env_speechd_port = None - env_speechd_socket_path = os.environ.get("SPEECHD_SOCKET") - # Prefer old (deprecated) function arguments, but if - # not specified and old (deprecated) environment variable - # is set, use the value of the environment variable - if method: - connection_args['method'] = method - if port: - connection_args['port'] = port - elif env_speechd_port: - connection_args['port'] = env_speechd_port - if socket_path: - connection_args['socket_path'] = socket_path - elif env_speechd_socket_path: - connection_args['socket_path'] = env_speechd_socket_path - self._connect_with_autospawn(connection_args, autospawn) - self._initialize_connection(user, name, component) - - def _connect_with_autospawn(self, connection_args, autospawn): - """Establish new connection (and/or autospawn server)""" - try: - self._conn = _SSIP_Connection(**connection_args) - except SSIPCommunicationError as ce: - # Suppose server might not be running, try the autospawn mechanism - if autospawn != False: - # Autospawn is however not guaranteed to start the server. The server - # will decide, based on it's configuration, whether to honor the request. - try: - self._server_spawn(connection_args) - except SpawnError as se: - ce.set_additional_exception(se) - raise ce - self._conn = _SSIP_Connection(**connection_args) - else: - raise - - def _initialize_connection(self, user, name, component): - """Initialize connection -- Set client name, get id, register callbacks etc.""" - full_name = '%s:%s:%s' % (user, name, component) - self._conn.send_command('SET', Scope.SELF, 'CLIENT_NAME', full_name) - code, msg, data = self._conn.send_command('HISTORY', 'GET', 'CLIENT_ID') - self._client_id = int(data[0]) - self._callback_handler = _CallbackHandler(self._client_id) - self._conn.set_callback(self._callback_handler) - for event in (CallbackType.INDEX_MARK, - CallbackType.BEGIN, - CallbackType.END, - CallbackType.CANCEL, - CallbackType.PAUSE, - CallbackType.RESUME): - self._conn.send_command('SET', 'self', 'NOTIFICATION', event, 'on') - - def _connection_arguments_from_address(self, address): - """Parse a Speech Dispatcher address line and return a dictionary - of connection arguments""" - connection_args = {} - address_params = address.split(":") - try: - _method = address_params[0] - except: - raise SSIPCommunicationErrror("Wrong format of server address") - connection_args['communication_method'] = _method - if _method == CommunicationMethod.UNIX_SOCKET: - try: - connection_args['socket_path'] = address_params[1] - except IndexError: - pass # The additional parameters was not set, let's stay with defaults - elif _method == CommunicationMethod.INET_SOCKET: - try: - connection_args['host'] = address_params[1] - connection_args['port'] = int(address_params[2]) - except ValueError: # Failed conversion to int - raise SSIPCommunicationError("Third parameter of inet_socket address must be a port number") - except IndexError: - pass # The additional parameters was not set, let's stay with defaults - else: - raise SSIPCommunicationError("Unknown communication method in address."); - return connection_args - - def __del__(self): - """Close the connection""" - self.close() - - def _server_spawn(self, connection_args): - """Attempts to spawn the speech-dispatcher server.""" - # Check whether we are not connecting to a remote host - # TODO: This is a hack. inet sockets specific code should - # belong to _SSIPConnection. We do not however have an _SSIPConnection - # yet. - if connection_args['communication_method'] == 'inet_socket': - addrinfos = socket.getaddrinfo(connection_args['host'], - connection_args['port']) - # Check resolved addrinfos for presence of localhost - ip_addresses = [addrinfo[4][0] for addrinfo in addrinfos] - localhost=False - for ip in ip_addresses: - if ip.startswith("127.") or ip == "::1": - connection_args['host'] = ip - localhost=True - if not localhost: - # The hostname didn't resolve on localhost in neither case, - # do not spawn server on localhost... - raise SpawnError( - "Can't start server automatically (autospawn), requested address %s " - "resolves on %s which seems to be a remote host. You must start the " - "server manually or choose another connection address." % (connection_args['host'], - str(ip_addresses),)) - if os.path.exists(paths.SPD_SPAWN_CMD): - connection_params = [] - for param, value in connection_args.items(): - if param not in ["host",]: - connection_params += ["--"+param.replace("_","-"), str(value)] - - server = subprocess.Popen([paths.SPD_SPAWN_CMD, "--spawn"]+connection_params, - stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout_reply, stderr_reply = server.communicate() - retcode = server.wait() - if retcode != 0: - raise SpawnError("Server refused to autospawn, stating this reason: %s" % (stderr_reply,)) - return server.pid - else: - raise SpawnError("Can't find Speech Dispatcher spawn command %s" - % (paths.SPD_SPAWN_CMD,)) - - def set_priority(self, priority): - """Set the priority category for the following messages. - - Arguments: - priority -- one of the 'Priority' constants. - - """ - assert priority in (Priority.IMPORTANT, Priority.MESSAGE, - Priority.TEXT, Priority.NOTIFICATION, - Priority.PROGRESS), priority - self._conn.send_command('SET', Scope.SELF, 'PRIORITY', priority) - - def set_data_mode(self, value): - """Set the data mode for further speech commands. - - Arguments: - value - one of the constants defined by the DataMode class. - - """ - if value == DataMode.SSML: - ssip_val = 'on' - elif value == DataMode.TEXT: - ssip_val = 'off' - else: - raise ValueError( - 'Value "%s" is not one of the constants from the DataMode class.' % \ - value) - self._conn.send_command('SET', Scope.SELF, 'SSML_MODE', ssip_val) - - def speak(self, text, callback=None, event_types=None): - """Say given message. - - Arguments: - text -- message text to be spoken. This may be either a UTF-8 - encoded byte string or a Python unicode string. - callback -- a callback handler for asynchronous event notifications. - A callable object (function) which accepts one positional argument - `type' and one keyword argument `index_mark'. See below for more - details. - event_types -- a tuple of event types for which the callback should - be called. Each item must be one of `CallbackType' constants. - None (the default value) means to handle all event types. This - argument is irrelevant when `callback' is not used. - - The callback function will be called whenever one of the events occurs. - The event type will be passed as argument. Its value is one of the - `CallbackType' constants. In case of an index mark event, additional - keyword argument `index_mark' will be passed and will contain the index - mark identifier as specified within the text. - - The callback function should not perform anything complicated and is - not allowed to issue any further SSIP client commands. An attempt to - do so would lead to a deadlock in SSIP communication. - - This method is non-blocking; it just sends the command, given - message is queued on the server and the method returns immediately. - - """ - self._conn.send_command('SPEAK') - result = self._conn.send_data(text) - if callback: - msg_id = int(result[2][0]) - # TODO: Here we risk, that the callback arrives earlier, than we - # add the item to `self._callback_handler'. Such a situation will - # lead to the callback being ignored. - self._callback_handler.add_callback(msg_id, callback, event_types) - return result - - def char(self, char): - """Say given character. - - Arguments: - char -- a character to be spoken. Either a Python unicode string or - a UTF-8 encoded byte string. - - This method is non-blocking; it just sends the command, given - message is queued on the server and the method returns immediately. - - """ - self._conn.send_command('CHAR', char.replace(' ', 'space')) - - def key(self, key): - """Say given key name. - - Arguments: - key -- the key name (as defined in SSIP); string. - - This method is non-blocking; it just sends the command, given - message is queued on the server and the method returns immediately. - - """ - self._conn.send_command('KEY', key) - - def sound_icon(self, sound_icon): - """Output given sound_icon. - - Arguments: - sound_icon -- the name of the sound icon as defined by SSIP; string. - - This method is non-blocking; it just sends the command, given message - is queued on the server and the method returns immediately. - - """ - self._conn.send_command('SOUND_ICON', sound_icon) - - def cancel(self, scope=Scope.SELF): - """Immediately stop speaking and discard messages in queues. - - Arguments: - scope -- see the documentation of this class. - - """ - self._conn.send_command('CANCEL', scope) - - - def stop(self, scope=Scope.SELF): - """Immediately stop speaking the currently spoken message. - - Arguments: - scope -- see the documentation of this class. - - """ - self._conn.send_command('STOP', scope) - - def pause(self, scope=Scope.SELF): - """Pause speaking and postpone other messages until resume. - - This method is non-blocking. However, speaking can continue for a - short while even after it's called (typically to the end of the - sentence). - - Arguments: - scope -- see the documentation of this class. - - """ - self._conn.send_command('PAUSE', scope) - - def resume(self, scope=Scope.SELF): - """Resume speaking of the currently paused messages. - - This method is non-blocking. However, speaking can continue for a - short while even after it's called (typically to the end of the - sentence). - - Arguments: - scope -- see the documentation of this class. - - """ - self._conn.send_command('RESUME', scope) - - def list_output_modules(self): - """Return names of all active output modules as a tuple of strings.""" - code, msg, data = self._conn.send_command('LIST', 'OUTPUT_MODULES') - return data - - def list_synthesis_voices(self): - """Return names of all available voices for the current output module. - - Returns a tuple of tripplets (name, language, dialect). - - 'name' is a string, 'language' is an ISO 639-1 Alpha-2 language code - and 'dialect' is a string. Language and dialect may be None. - - """ - try: - code, msg, data = self._conn.send_command('LIST', 'SYNTHESIS_VOICES') - except SSIPCommandError: - return () - def split(item): - name, lang, dialect = tuple(item.rsplit(' ', 3)) - return (name, lang or None, dialect or None) - return tuple([split(item) for item in data]) - - def set_language(self, language, scope=Scope.SELF): - """Switch to a particular language for further speech commands. - - Arguments: - language -- two letter language code according to RFC 1776 as string. - scope -- see the documentation of this class. - - """ - assert isinstance(language, str) and len(language) == 2 - self._conn.send_command('SET', scope, 'LANGUAGE', language) - - def set_output_module(self, name, scope=Scope.SELF): - """Switch to a particular output module. - - Arguments: - name -- module (string) as returned by 'list_output_modules()'. - scope -- see the documentation of this class. - - """ - self._conn.send_command('SET', scope, 'OUTPUT_MODULE', name) - - def set_pitch(self, value, scope=Scope.SELF): - """Set the pitch for further speech commands. - - Arguments: - value -- integer value within the range from -100 to 100, with 0 - corresponding to the default pitch of the current speech synthesis - output module, lower values meaning lower pitch and higher values - meaning higher pitch. - scope -- see the documentation of this class. - - """ - assert isinstance(value, int) and -100 <= value <= 100, value - self._conn.send_command('SET', scope, 'PITCH', value) - - def set_rate(self, value, scope=Scope.SELF): - """Set the speech rate (speed) for further speech commands. - - Arguments: - value -- integer value within the range from -100 to 100, with 0 - corresponding to the default speech rate of the current speech - synthesis output module, lower values meaning slower speech and - higher values meaning faster speech. - scope -- see the documentation of this class. - - """ - assert isinstance(value, int) and -100 <= value <= 100 - self._conn.send_command('SET', scope, 'RATE', value) - - def set_volume(self, value, scope=Scope.SELF): - """Set the speech volume for further speech commands. - - Arguments: - value -- integer value within the range from -100 to 100, with 100 - corresponding to the default speech volume of the current speech - synthesis output module, lower values meaning softer speech. - scope -- see the documentation of this class. - - """ - assert isinstance(value, int) and -100 <= value <= 100 - self._conn.send_command('SET', scope, 'VOLUME', value) - - def set_punctuation(self, value, scope=Scope.SELF): - """Set the punctuation pronounciation level. - - Arguments: - value -- one of the 'PunctuationMode' constants. - scope -- see the documentation of this class. - - """ - assert value in (PunctuationMode.ALL, PunctuationMode.SOME, - PunctuationMode.NONE), value - self._conn.send_command('SET', scope, 'PUNCTUATION', value) - - def set_spelling(self, value, scope=Scope.SELF): - """Toogle the spelling mode or on off. - - Arguments: - value -- if 'True', all incomming messages will be spelled - instead of being read as normal words. 'False' switches - this behavior off. - scope -- see the documentation of this class. - - """ - assert value in [True, False] - if value == True: - self._conn.send_command('SET', scope, 'SPELLING', "on") - else: - self._conn.send_command('SET', scope, 'SPELLING', "off") - - def set_cap_let_recogn(self, value, scope=Scope.SELF): - """Set capital letter recognition mode. - - Arguments: - value -- one of 'none', 'spell', 'icon'. None means no signalization - of capital letters, 'spell' means capital letters will be spelled - with a syntetic voice and 'icon' means that the capital-letter icon - will be prepended before each capital letter. - scope -- see the documentation of this class. - - """ - assert value in ("none", "spell", "icon") - self._conn.send_command('SET', scope, 'CAP_LET_RECOGN', value) - - def set_voice(self, value, scope=Scope.SELF): - """Set voice by a symbolic name. - - Arguments: - value -- one of the SSIP symbolic voice names: 'MALE1' .. 'MALE3', - 'FEMALE1' ... 'FEMALE3', 'CHILD_MALE', 'CHILD_FEMALE' - scope -- see the documentation of this class. - - Symbolic voice names are mapped to real synthesizer voices in the - configuration of the output module. Use the method - 'set_synthesis_voice()' if you want to work with real voices. - - """ - assert isinstance(value, str) and \ - value.lower() in ("male1", "male2", "male3", "female1", - "female2", "female3", "child_male", - "child_female") - self._conn.send_command('SET', scope, 'VOICE', value) - - def set_synthesis_voice(self, value, scope=Scope.SELF): - """Set voice by its real name. - - Arguments: - value -- voice name as returned by 'list_synthesis_voices()' - scope -- see the documentation of this class. - - """ - self._conn.send_command('SET', scope, 'SYNTHESIS_VOICE', value) - - def set_pause_context(self, value, scope=Scope.SELF): - """Set the amount of context when resuming a paused message. - - Arguments: - value -- a positive or negative value meaning how many chunks of data - after or before the pause should be read when resume() is executed. - scope -- see the documentation of this class. - - """ - assert isinstance(value, int) - self._conn.send_command('SET', scope, 'PAUSE_CONTEXT', value) - - def set_debug(self, val): - """Switch debugging on and off. When switched on, - debugging files will be created in the chosen destination - (see set_debug_destination()) for Speech Dispatcher and all - its running modules. All logging information will then be - written into these files with maximal verbosity until switched - off. You should always first call set_debug_destination. - - The intended use of this functionality is to switch debuging - on for a period of time while the user will repeat the behavior - and then send the logs to the appropriate bug-reporting place. - - Arguments: - val -- a boolean value determining whether debugging - is switched on or off - scope -- see the documentation of this class. - - """ - assert isinstance(val, bool) - if val == True: - ssip_val = "ON" - else: - ssip_val = "OFF" - - self._conn.send_command('SET', scope.ALL, 'DEBUG', ssip_val) - - - def set_debug_destination(self, path): - """Set debug destination. - - Arguments: - path -- path (string) to the directory where debuging - files will be created - scope -- see the documentation of this class. - - """ - assert isinstance(val, string) - - self._conn.send_command('SET', scope.ALL, 'DEBUG_DESTINATION', val) - - def block_begin(self): - """Begin an SSIP block. - - See SSIP documentation for more details about blocks. - - """ - self._conn.send_command('BLOCK', 'BEGIN') - - def block_end(self): - """Close an SSIP block. - - See SSIP documentation for more details about blocks. - - """ - self._conn.send_command('BLOCK', 'END') - - def close(self): - """Close the connection to Speech Dispatcher.""" - if hasattr(self, '_conn'): - self._conn.close() - del self._conn - - -class Client(SSIPClient): - """A DEPRECATED backwards-compatible API. - - This Class is provided only for backwards compatibility with the prevoius - unofficial API. It will be removed in future versions. Please use either - 'SSIPClient' or 'Speaker' interface instead. As deprecated, the API is no - longer documented. - - """ - def __init__(self, name=None, client=None, **kwargs): - name = name or client or 'python' - super(Client, self).__init__(name, **kwargs) - - def say(self, text, priority=Priority.MESSAGE): - self.set_priority(priority) - self.speak(text) - - def char(self, char, priority=Priority.TEXT): - self.set_priority(priority) - super(Client, self).char(char) - - def key(self, key, priority=Priority.TEXT): - self.set_priority(priority) - super(Client, self).key(key) - - def sound_icon(self, sound_icon, priority=Priority.TEXT): - self.set_priority(priority) - super(Client, self).sound_icon(sound_icon) - - -class Speaker(SSIPClient): - """Extended Speech Dispatcher Interface. - - This class provides an extended intercace to Speech Dispatcher - functionality and tries to hide most of the lower level details of SSIP - (such as a more sophisticated handling of blocks and priorities and - advanced event notifications) under a more convenient API. - - Please note that the API is not yet stabilized and thus is subject to - change! Please contact the authors if you plan using it and/or if you have - any suggestions. - - Well, in fact this class is currently not implemented at all. It is just a - draft. The intention is to hide the SSIP details and provide a generic - interface practical for screen readers. - - """ - - -# Deprecated but retained for backwards compatibility - -# This class was introduced in 0.7 but later renamed to CommunicationMethod -class ConnectionMethod(object): - """Constants describing the possible methods of connection to server. - - Retained for backwards compatibility but DEPRECATED. See CommunicationMethod.""" - UNIX_SOCKET = 'unix_socket' - """Unix socket communication using a filesystem path""" - INET_SOCKET = 'inet_socket' - """Inet socket communication using a host and port""" diff --git a/src/accessible_output2/outputs/speechd/paths.py b/src/accessible_output2/outputs/speechd/paths.py deleted file mode 100644 index 817bd24..0000000 --- a/src/accessible_output2/outputs/speechd/paths.py +++ /dev/null @@ -1 +0,0 @@ -SPD_SPAWN_CMD = "/usr/bin/speech-dispatcher" diff --git a/src/accessible_output2/outputs/system_access.py b/src/accessible_output2/outputs/system_access.py index cd6099d..f8f3d25 100644 --- a/src/accessible_output2/outputs/system_access.py +++ b/src/accessible_output2/outputs/system_access.py @@ -1,18 +1,24 @@ -from base import Output +from __future__ import absolute_import +import ctypes +from .base import Output class SystemAccess (Output): """Supports System Access and System Access Mobile""" name = "System Access" lib32 = 'saapi32.dll' + argtypes = { + 'SA_BrlShowTextW': (ctypes.c_wchar_p,), + 'SA_SayW': (ctypes.c_wchar_p,), + } priority = 99 def braille(self, text, **options): - self.lib.SA_BrlShowTextW(unicode(text)) + self.lib.SA_BrlShowTextW(text) def speak(self, text, interrupt=False): if self.is_active(): - self.dll.SA_SayW(unicode(text)) + self.dll.SA_SayW(str(text)) def is_active(self): try: diff --git a/src/accessible_output2/outputs/voiceover.py b/src/accessible_output2/outputs/voiceover.py index a9b96c2..6a432e3 100644 --- a/src/accessible_output2/outputs/voiceover.py +++ b/src/accessible_output2/outputs/voiceover.py @@ -1,23 +1 @@ -from base import Output, OutputError - -class VoiceOver (Output): - """Supports the VoiceOver screenreader on the Mac. - - Note that this will also output as a message to the braille display if VoiceOver is used with braille. - Calling this module could cause VoiceOver to be started. - """ - name = 'VoiceOver' - - def __init__(self, *args, **kwargs): - super(VoiceOver, self).__init__(*args, **kwargs) - try: - from appscript import app - self.app = app('VoiceOver') - except ImportError: - raise OutputError - - def speak(self, text, interupt=False): - self.app.output(text) - - def is_active(self): - return True +from __future__ import absolute_import from builtins import str import subprocess, os from .base import Output class VoiceOver(Output): """Speech output supporting the Apple VoiceOver screen reader.""" def runAppleScript(self, command, process = 'voiceover'): return subprocess.Popen(['osascript', '-e', 'tell application "' + process + '"\n' + command + '\nend tell'], stdout = subprocess.PIPE).communicate()[0] name = 'VoiceOver' def speak(self, text, interrupt=0): if interrupt: self.silence() os.system('osascript -e \"tell application \\\"voiceover\\\" to output \\\"%s\\\"\" &' % text) def silence (self): self.runAppleScript('output ""') def is_active(self): return self.runAppleScript('return (name of processes) contains "VoiceOver"', 'system events').startswith('true') and not self.runAppleScript('try\nreturn bounds of vo cursor\non error\nreturn false\nend try').startswith('false') output_class = VoiceOver \ No newline at end of file diff --git a/src/accessible_output2/outputs/window_eyes.py b/src/accessible_output2/outputs/window_eyes.py index 6dd1c31..efed1b6 100644 --- a/src/accessible_output2/outputs/window_eyes.py +++ b/src/accessible_output2/outputs/window_eyes.py @@ -1,6 +1,7 @@ +from __future__ import absolute_import import win32gui from libloader.com import load_com -from base import Output, OutputError +from .base import Output, OutputError import pywintypes class WindowEyes (Output): diff --git a/src/libloader/com.py b/src/libloader/com.py index 75d9ac8..29ede4c 100644 --- a/src/libloader/com.py +++ b/src/libloader/com.py @@ -1,13 +1,26 @@ from pywintypes import com_error +import win32com +import paths +win32com.__gen_path__=paths.data_path(u"com_cache") +import sys +import os +sys.path.append(os.path.join(win32com.__gen_path__, ".")) from win32com.client import gencache +fixed=False def prepare_gencache(): gencache.is_readonly = False gencache.GetGeneratePath() - +def patched_getmodule(modname): + mod=__import__(modname) + return sys.modules[modname] def load_com(*names): + global fixed + if fixed==False: + gencache._GetModule=patched_getmodule + fixed=True result = None for name in names: try: diff --git a/src/libloader/libloader.py b/src/libloader/libloader.py index 6ab2c0e..6aa7c32 100644 --- a/src/libloader/libloader.py +++ b/src/libloader/libloader.py @@ -32,7 +32,7 @@ def load_library(library, x86_path='.', x64_path='.', *args, **kwargs): loaded = _do_load(lib, *args, **kwargs) if loaded is not None: return loaded - raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, path)) + raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, lib)) def _do_load(file, *args, **kwargs): loader = TYPES[platform.system()]['loader'] diff --git a/src/output.py b/src/output.py index d7e0912..c655be8 100644 --- a/src/output.py +++ b/src/output.py @@ -8,17 +8,26 @@ import sys speaker = None def speak(text, interrupt=0): - global speaker - if not speaker: - setup() - speaker.speak(text, interrupt) - speaker.braille(text) + global speaker + if not speaker: + setup() + speaker.speak(text, interrupt) + speaker.braille(text) def setup (): - global speaker - logging.debug("Initializing output subsystem.") - try: - speaker = outputs.auto.Auto() - except: - return logging.exception("Output: Error during initialization.") + global speaker + logging.debug("Initializing output subsystem.") + try: +# speaker = speech.Speaker(speech.outputs.Sapi5()) +# else: + speaker = outputs.auto.Auto() + except: + return logging.exception("Output: Error during initialization.") +def copy(text): + import win32clipboard + #Copies text to the clipboard. + win32clipboard.OpenClipboard() + win32clipboard.EmptyClipboard() + win32clipboard.SetClipboardText(text) + win32clipboard.CloseClipboard()