diff --git a/src/calibre/srv/utils.py b/src/calibre/srv/utils.py index d5da92999e..a46058ce7c 100644 --- a/src/calibre/srv/utils.py +++ b/src/calibre/srv/utils.py @@ -16,7 +16,7 @@ from calibre.srv.errors import HTTPNotFound from calibre.utils.localization import get_translator from calibre.utils.socket_inheritance import set_socket_inherit from calibre.utils.logging import ThreadSafeLog -from calibre.utils.shared_file import share_open, raise_winerror +from calibre.utils.shared_file import share_open from polyglot.builtins import iteritems, map, range from polyglot import reprlib from polyglot.http_cookie import SimpleCookie @@ -334,11 +334,8 @@ class RotatingStream(object): def rename(self, src, dest): try: if iswindows: - import win32file, pywintypes - try: - win32file.MoveFileEx(src, dest, win32file.MOVEFILE_REPLACE_EXISTING|win32file.MOVEFILE_WRITE_THROUGH) - except pywintypes.error as e: - raise_winerror(e) + from calibre_extensions import winutil + winutil.move_file(src, dest) else: os.rename(src, dest) except EnvironmentError as e: diff --git a/src/calibre/test_build.py b/src/calibre/test_build.py index 5c1dc4aa50..4be76a0b26 100644 --- a/src/calibre/test_build.py +++ b/src/calibre/test_build.py @@ -31,8 +31,6 @@ class BuildTest(unittest.TestCase): self.assertTrue(False, 'Failed to load DLL %s with error: %s' % (x, err)) from Crypto.Cipher import AES del AES - from pywintypes import error - del error @unittest.skipUnless(islinux, 'DBUS only used on linux') def test_dbus(self): diff --git a/src/calibre/utils/shared_file.py b/src/calibre/utils/shared_file.py index 2f122f141e..2c3d8ee982 100644 --- a/src/calibre/utils/shared_file.py +++ b/src/calibre/utils/shared_file.py @@ -31,55 +31,28 @@ file before deleting it. if iswindows: from numbers import Integral import msvcrt - import win32file, pywintypes - CREATE_NEW = win32file.CREATE_NEW - CREATE_ALWAYS = win32file.CREATE_ALWAYS - OPEN_EXISTING = win32file.OPEN_EXISTING - OPEN_ALWAYS = win32file.OPEN_ALWAYS - TRUNCATE_EXISTING = win32file.TRUNCATE_EXISTING - FILE_SHARE_READ = win32file.FILE_SHARE_READ - FILE_SHARE_WRITE = win32file.FILE_SHARE_WRITE - FILE_SHARE_DELETE = win32file.FILE_SHARE_DELETE - FILE_SHARE_VALID_FLAGS = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE - FILE_ATTRIBUTE_READONLY = win32file.FILE_ATTRIBUTE_READONLY - FILE_ATTRIBUTE_NORMAL = win32file.FILE_ATTRIBUTE_NORMAL - FILE_ATTRIBUTE_TEMPORARY = win32file.FILE_ATTRIBUTE_TEMPORARY - FILE_FLAG_DELETE_ON_CLOSE = win32file.FILE_FLAG_DELETE_ON_CLOSE - FILE_FLAG_SEQUENTIAL_SCAN = win32file.FILE_FLAG_SEQUENTIAL_SCAN - FILE_FLAG_RANDOM_ACCESS = win32file.FILE_FLAG_RANDOM_ACCESS - GENERIC_READ = win32file.GENERIC_READ & 0xffffffff - GENERIC_WRITE = win32file.GENERIC_WRITE & 0xffffffff - DELETE = 0x00010000 + from calibre_extensions import winutil _ACCESS_MASK = os.O_RDONLY | os.O_WRONLY | os.O_RDWR _ACCESS_MAP = { - os.O_RDONLY : GENERIC_READ, - os.O_WRONLY : GENERIC_WRITE, - os.O_RDWR : GENERIC_READ | GENERIC_WRITE + os.O_RDONLY : winutil.GENERIC_READ, + os.O_WRONLY : winutil.GENERIC_WRITE, + os.O_RDWR : winutil.GENERIC_READ | winutil.GENERIC_WRITE } _CREATE_MASK = os.O_CREAT | os.O_EXCL | os.O_TRUNC _CREATE_MAP = { - 0 : OPEN_EXISTING, - os.O_EXCL : OPEN_EXISTING, - os.O_CREAT : OPEN_ALWAYS, - os.O_CREAT | os.O_EXCL : CREATE_NEW, - os.O_CREAT | os.O_TRUNC | os.O_EXCL : CREATE_NEW, - os.O_TRUNC : TRUNCATE_EXISTING, - os.O_TRUNC | os.O_EXCL : TRUNCATE_EXISTING, - os.O_CREAT | os.O_TRUNC : CREATE_ALWAYS + 0 : winutil.OPEN_EXISTING, + os.O_EXCL : winutil.OPEN_EXISTING, + os.O_CREAT : winutil.OPEN_ALWAYS, + os.O_CREAT | os.O_EXCL : winutil.CREATE_NEW, + os.O_CREAT | os.O_TRUNC | os.O_EXCL : winutil.CREATE_NEW, + os.O_TRUNC : winutil.TRUNCATE_EXISTING, + os.O_TRUNC | os.O_EXCL : winutil.TRUNCATE_EXISTING, + os.O_CREAT | os.O_TRUNC : winutil.CREATE_ALWAYS } - def raise_winerror(pywinerr, path=None): - exc = OSError( - pywinerr.winerror, - (pywinerr.funcname or '') + ': ' + (pywinerr.strerror or ''), - path, - pywinerr.winerror - ) - reraise(type(exc), exc, sys.exc_info()[2]) - - def os_open(path, flags, mode=0o777, share_flags=FILE_SHARE_VALID_FLAGS): + def os_open(path, flags, mode=0o777, share_flags=winutil.FILE_SHARE_VALID_FLAGS): ''' Replacement for os.open() allowing moving or unlinking before closing ''' @@ -88,36 +61,34 @@ if iswindows: if not isinstance(mode, Integral): raise TypeError('mode must be an integer') - if share_flags & ~FILE_SHARE_VALID_FLAGS: + if share_flags & ~winutil.FILE_SHARE_VALID_FLAGS: raise ValueError('bad share_flags: %r' % share_flags) access_flags = _ACCESS_MAP[flags & _ACCESS_MASK] create_flags = _CREATE_MAP[flags & _CREATE_MASK] - attrib_flags = FILE_ATTRIBUTE_NORMAL + attrib_flags = winutil.FILE_ATTRIBUTE_NORMAL if flags & os.O_CREAT and mode & ~0o444 == 0: - attrib_flags = FILE_ATTRIBUTE_READONLY + attrib_flags = winutil.FILE_ATTRIBUTE_READONLY if flags & os.O_TEMPORARY: - share_flags |= FILE_SHARE_DELETE - attrib_flags |= FILE_FLAG_DELETE_ON_CLOSE - access_flags |= DELETE + share_flags |= winutil.FILE_SHARE_DELETE + attrib_flags |= winutil.FILE_FLAG_DELETE_ON_CLOSE + access_flags |= winutil.DELETE if flags & os.O_SHORT_LIVED: - attrib_flags |= FILE_ATTRIBUTE_TEMPORARY + attrib_flags |= winutil.FILE_ATTRIBUTE_TEMPORARY if flags & os.O_SEQUENTIAL: - attrib_flags |= FILE_FLAG_SEQUENTIAL_SCAN + attrib_flags |= winutil.FILE_FLAG_SEQUENTIAL_SCAN if flags & os.O_RANDOM: - attrib_flags |= FILE_FLAG_RANDOM_ACCESS + attrib_flags |= winutil.FILE_FLAG_RANDOM_ACCESS - try: - h = win32file.CreateFileW( - path, access_flags, share_flags, None, create_flags, attrib_flags, None) - except pywintypes.error as e: - raise_winerror(e, path) - ans = msvcrt.open_osfhandle(h.Detach(), flags | os.O_NOINHERIT) + h = winutil.create_file( + path, access_flags, share_flags, create_flags, attrib_flags) + ans = msvcrt.open_osfhandle(int(h), flags | os.O_NOINHERIT) + h.detach() return ans def share_open(*a, **kw):