From 0bbc8f6b5f2aaa626bc39fa6ef619d31043f2c36 Mon Sep 17 00:00:00 2001 From: Itamar Turner-Trauring Date: Fri, 1 Mar 2024 12:16:40 -0500 Subject: [PATCH] Delete Python 2 specific code. --- src/allmydata/windows/fixups.py | 194 -------------------------------- 1 file changed, 194 deletions(-) diff --git a/src/allmydata/windows/fixups.py b/src/allmydata/windows/fixups.py index c48db2f82..1b204ccf4 100644 --- a/src/allmydata/windows/fixups.py +++ b/src/allmydata/windows/fixups.py @@ -11,104 +11,19 @@ import sys assert sys.platform == "win32" -import codecs -from functools import partial - -from ctypes import WINFUNCTYPE, windll, POINTER, c_int, WinError, byref, get_last_error -from ctypes.wintypes import BOOL, HANDLE, DWORD, LPWSTR, LPCWSTR, LPVOID - # from win32api import ( - STD_OUTPUT_HANDLE, - STD_ERROR_HANDLE, SetErrorMode, - - # - # HANDLE WINAPI GetStdHandle(DWORD nStdHandle); - # returns INVALID_HANDLE_VALUE, NULL, or a valid handle - GetStdHandle, ) from win32con import ( SEM_FAILCRITICALERRORS, SEM_NOOPENFILEERRORBOX, ) -from win32file import ( - INVALID_HANDLE_VALUE, - FILE_TYPE_CHAR, - - # - # DWORD WINAPI GetFileType(DWORD hFile); - GetFileType, -) - -from allmydata.util import ( - log, -) - # Keep track of whether `initialize` has run so we don't do any of the # initialization more than once. _done = False -# -# pywin32 for Python 2.7 does not bind any of these *W variants so we do it -# ourselves. -# - -# -# BOOL WINAPI WriteConsoleW(HANDLE hOutput, LPWSTR lpBuffer, DWORD nChars, -# LPDWORD lpCharsWritten, LPVOID lpReserved); -WriteConsoleW = WINFUNCTYPE( - BOOL, HANDLE, LPWSTR, DWORD, POINTER(DWORD), LPVOID, - use_last_error=True -)(("WriteConsoleW", windll.kernel32)) - -# -GetCommandLineW = WINFUNCTYPE( - LPWSTR, - use_last_error=True -)(("GetCommandLineW", windll.kernel32)) - -# -CommandLineToArgvW = WINFUNCTYPE( - POINTER(LPWSTR), LPCWSTR, POINTER(c_int), - use_last_error=True -)(("CommandLineToArgvW", windll.shell32)) - -# -# BOOL WINAPI GetConsoleMode(HANDLE hConsole, LPDWORD lpMode); -GetConsoleMode = WINFUNCTYPE( - BOOL, HANDLE, POINTER(DWORD), - use_last_error=True -)(("GetConsoleMode", windll.kernel32)) - - -STDOUT_FILENO = 1 -STDERR_FILENO = 2 - -def get_argv(): - """ - :return [unicode]: The argument list this process was invoked with, as - unicode. - - Python 2 does not do a good job exposing this information in - ``sys.argv`` on Windows so this code re-retrieves the underlying - information using Windows API calls and massages it into the right - shape. - """ - command_line = GetCommandLineW() - argc = c_int(0) - argv_unicode = CommandLineToArgvW(command_line, byref(argc)) - if argv_unicode is None: - raise WinError(get_last_error()) - - # Convert it to a normal Python list - return list( - argv_unicode[i] - for i - in range(argc.value) - ) - def initialize(): global _done @@ -118,112 +33,3 @@ def initialize(): _done = True SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX) - - -def a_console(handle): - """ - :return: ``True`` if ``handle`` refers to a console, ``False`` otherwise. - """ - if handle == INVALID_HANDLE_VALUE: - return False - return ( - # It's a character file (eg a printer or a console) - GetFileType(handle) == FILE_TYPE_CHAR and - # Checking the console mode doesn't fail (thus it's a console) - GetConsoleMode(handle, byref(DWORD())) != 0 - ) - - -class UnicodeOutput(object): - """ - ``UnicodeOutput`` is a file-like object that encodes unicode to UTF-8 and - writes it to another file or writes unicode natively to the Windows - console. - """ - def __init__(self, hConsole, stream, fileno, name, _complain): - """ - :param hConsole: ``None`` or a handle on the console to which to write - unicode. Mutually exclusive with ``stream``. - - :param stream: ``None`` or a file-like object to which to write bytes. - - :param fileno: A result to hand back from method of the same name. - - :param name: A human-friendly identifier for this output object. - - :param _complain: A one-argument callable which accepts bytes to be - written when there's a problem. Care should be taken to not make - this do a write on this object. - """ - self._hConsole = hConsole - self._stream = stream - self._fileno = fileno - self.closed = False - self.softspace = False - self.mode = 'w' - self.encoding = 'utf-8' - self.name = name - - self._complain = _complain - - from allmydata.util.encodingutil import canonical_encoding - from allmydata.util import log - if hasattr(stream, 'encoding') and canonical_encoding(stream.encoding) != 'utf-8': - log.msg("%s: %r had encoding %r, but we're going to write UTF-8 to it" % - (name, stream, stream.encoding), level=log.CURIOUS) - self.flush() - - def isatty(self): - return False - def close(self): - # don't really close the handle, that would only cause problems - self.closed = True - def fileno(self): - return self._fileno - def flush(self): - if self._hConsole is None: - try: - self._stream.flush() - except Exception as e: - self._complain("%s.flush: %r from %r" % (self.name, e, self._stream)) - raise - - def write(self, text): - try: - if self._hConsole is None: - # There is no Windows console available. That means we are - # responsible for encoding the unicode to a byte string to - # write it to a Python file object. - if isinstance(text, str): - text = text.encode('utf-8') - self._stream.write(text) - else: - # There is a Windows console available. That means Windows is - # responsible for dealing with the unicode itself. - if not isinstance(text, str): - text = str(text).decode('utf-8') - remaining = len(text) - while remaining > 0: - n = DWORD(0) - # There is a shorter-than-documented limitation on the - # length of the string passed to WriteConsoleW (see - # #1232). - retval = WriteConsoleW(self._hConsole, text, min(remaining, 10000), byref(n), None) - if retval == 0: - raise IOError("WriteConsoleW failed with WinError: %s" % (WinError(get_last_error()),)) - if n.value == 0: - raise IOError("WriteConsoleW returned %r, n.value = 0" % (retval,)) - remaining -= n.value - if remaining == 0: break - text = text[n.value:] - except Exception as e: - self._complain("%s.write: %r" % (self.name, e)) - raise - - def writelines(self, lines): - try: - for line in lines: - self.write(line) - except Exception as e: - self._complain("%s.writelines: %r" % (self.name, e)) - raise