Author: andrewjlawrence Branch: winconsoleio Changeset: r96706:c795c20ce4b8 Date: 2019-05-27 23:33 +0100 http://bitbucket.org/pypy/pypy/changeset/c795c20ce4b8/
Log: Initial implementation of winconsoleio diff --git a/pypy/module/_io/interp_win32consoleio.py b/pypy/module/_io/interp_win32consoleio.py --- a/pypy/module/_io/interp_win32consoleio.py +++ b/pypy/module/_io/interp_win32consoleio.py @@ -1,6 +1,10 @@ import sys from pypy.module._io.interp_iobase import W_RawIOBase +from rpython.rlib import rwin32 + +def _pyio_get_console_type(): + pass class W_WinConsoleIO(W_RawIOBase): def __init__(self, space): @@ -9,11 +13,54 @@ def descr_init(self, space, w_nameobj, w_mode="r", w_closefd=True, w_opener=None): #self.fd = -1 #self.created = 0 - #self.readable = 0 - #self.writable = 0 + self.readable = False + self.writable = False #self.closehandle = 0; #self.blksize = 0 - fd = space.int_w(w_nameobj) + rwa = False + console_type = '\0' + self.fd = space.int_w(w_nameobj) if self.fd < 0: - raise oefmt(space.w_ValueError, "negative file descriptor") - self.fd = fd + decodedname = space.fsdecode_w(w_nameobj) + name = rffi.cast(rffi.CWCHARP, decodedname) + console_type = _pyio_get_console_type(decodedname) + if not console_type: + raise oefmt(space.w_ValueError, + "Invalid console type") + if console_type == '\0': + raise oefmt(space.w_ValueError, + "Cannot open non-console file") + s = space.text_w(w_mode) + + for char in s: + if char in "+abx": + # OK do nothing + pass + else if char == "r": + if rwa: + raise oefmt(space.w_ValueError, + "invalid mode: %.200s", mode) + rwa = True + self.readable = True + if console_type == "x": + console_type = "r" + else if char == "w": + if rwa: + raise oefmt(space.w_ValueError, + "invalid mode: %.200s", mode) + rwa = True + self.writable = True; + if console_type == 'x': + console_type = 'w' + else: + raise oefmt(space.w_ValueError, + "invalid mode: %.200s", mode) + if not rwa: + raise oefmt(space.w_ValueError, + "Must have exactly one of read or write mode") + + if self.fd >= 0: + self.handle = rwin32.get_osfhandle(self.fd) + self.closehandle = False + else: + access = rwin32.GENERIC_READ diff --git a/rpython/rlib/rwin32.py b/rpython/rlib/rwin32.py --- a/rpython/rlib/rwin32.py +++ b/rpython/rlib/rwin32.py @@ -137,6 +137,11 @@ HMODULE = HANDLE NULL_HANDLE = rffi.cast(HANDLE, 0) INVALID_HANDLE_VALUE = rffi.cast(HANDLE, -1) + GENERIC_READ = rffi.cast(DWORD, 0x80000000) + GENERIC_WRITE = rffi.cast(DWORD, 0x40000000) + GENERIC_EXECUTE= rffi.cast(DWORD, 0x20000000) + GENERIC_ALL = rffi.cast(DWORD, 0x10000000) + PFILETIME = rffi.CArrayPtr(FILETIME) _GetLastError = winexternal('GetLastError', [], DWORD, _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit