mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Dont use pywin32 for share_file.py
This commit is contained in:
parent
6bcbd1b42e
commit
c9df881fd9
@ -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:
|
||||
|
@ -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):
|
||||
|
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user