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.localization import get_translator
|
||||||
from calibre.utils.socket_inheritance import set_socket_inherit
|
from calibre.utils.socket_inheritance import set_socket_inherit
|
||||||
from calibre.utils.logging import ThreadSafeLog
|
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.builtins import iteritems, map, range
|
||||||
from polyglot import reprlib
|
from polyglot import reprlib
|
||||||
from polyglot.http_cookie import SimpleCookie
|
from polyglot.http_cookie import SimpleCookie
|
||||||
@ -334,11 +334,8 @@ class RotatingStream(object):
|
|||||||
def rename(self, src, dest):
|
def rename(self, src, dest):
|
||||||
try:
|
try:
|
||||||
if iswindows:
|
if iswindows:
|
||||||
import win32file, pywintypes
|
from calibre_extensions import winutil
|
||||||
try:
|
winutil.move_file(src, dest)
|
||||||
win32file.MoveFileEx(src, dest, win32file.MOVEFILE_REPLACE_EXISTING|win32file.MOVEFILE_WRITE_THROUGH)
|
|
||||||
except pywintypes.error as e:
|
|
||||||
raise_winerror(e)
|
|
||||||
else:
|
else:
|
||||||
os.rename(src, dest)
|
os.rename(src, dest)
|
||||||
except EnvironmentError as e:
|
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))
|
self.assertTrue(False, 'Failed to load DLL %s with error: %s' % (x, err))
|
||||||
from Crypto.Cipher import AES
|
from Crypto.Cipher import AES
|
||||||
del AES
|
del AES
|
||||||
from pywintypes import error
|
|
||||||
del error
|
|
||||||
|
|
||||||
@unittest.skipUnless(islinux, 'DBUS only used on linux')
|
@unittest.skipUnless(islinux, 'DBUS only used on linux')
|
||||||
def test_dbus(self):
|
def test_dbus(self):
|
||||||
|
@ -31,55 +31,28 @@ file before deleting it.
|
|||||||
if iswindows:
|
if iswindows:
|
||||||
from numbers import Integral
|
from numbers import Integral
|
||||||
import msvcrt
|
import msvcrt
|
||||||
import win32file, pywintypes
|
from calibre_extensions import winutil
|
||||||
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
|
|
||||||
|
|
||||||
_ACCESS_MASK = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
|
_ACCESS_MASK = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
|
||||||
_ACCESS_MAP = {
|
_ACCESS_MAP = {
|
||||||
os.O_RDONLY : GENERIC_READ,
|
os.O_RDONLY : winutil.GENERIC_READ,
|
||||||
os.O_WRONLY : GENERIC_WRITE,
|
os.O_WRONLY : winutil.GENERIC_WRITE,
|
||||||
os.O_RDWR : GENERIC_READ | GENERIC_WRITE
|
os.O_RDWR : winutil.GENERIC_READ | winutil.GENERIC_WRITE
|
||||||
}
|
}
|
||||||
|
|
||||||
_CREATE_MASK = os.O_CREAT | os.O_EXCL | os.O_TRUNC
|
_CREATE_MASK = os.O_CREAT | os.O_EXCL | os.O_TRUNC
|
||||||
_CREATE_MAP = {
|
_CREATE_MAP = {
|
||||||
0 : OPEN_EXISTING,
|
0 : winutil.OPEN_EXISTING,
|
||||||
os.O_EXCL : OPEN_EXISTING,
|
os.O_EXCL : winutil.OPEN_EXISTING,
|
||||||
os.O_CREAT : OPEN_ALWAYS,
|
os.O_CREAT : winutil.OPEN_ALWAYS,
|
||||||
os.O_CREAT | os.O_EXCL : CREATE_NEW,
|
os.O_CREAT | os.O_EXCL : winutil.CREATE_NEW,
|
||||||
os.O_CREAT | os.O_TRUNC | os.O_EXCL : CREATE_NEW,
|
os.O_CREAT | os.O_TRUNC | os.O_EXCL : winutil.CREATE_NEW,
|
||||||
os.O_TRUNC : TRUNCATE_EXISTING,
|
os.O_TRUNC : winutil.TRUNCATE_EXISTING,
|
||||||
os.O_TRUNC | os.O_EXCL : TRUNCATE_EXISTING,
|
os.O_TRUNC | os.O_EXCL : winutil.TRUNCATE_EXISTING,
|
||||||
os.O_CREAT | os.O_TRUNC : CREATE_ALWAYS
|
os.O_CREAT | os.O_TRUNC : winutil.CREATE_ALWAYS
|
||||||
}
|
}
|
||||||
|
|
||||||
def raise_winerror(pywinerr, path=None):
|
def os_open(path, flags, mode=0o777, share_flags=winutil.FILE_SHARE_VALID_FLAGS):
|
||||||
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):
|
|
||||||
'''
|
'''
|
||||||
Replacement for os.open() allowing moving or unlinking before closing
|
Replacement for os.open() allowing moving or unlinking before closing
|
||||||
'''
|
'''
|
||||||
@ -88,36 +61,34 @@ if iswindows:
|
|||||||
if not isinstance(mode, Integral):
|
if not isinstance(mode, Integral):
|
||||||
raise TypeError('mode must be an integer')
|
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)
|
raise ValueError('bad share_flags: %r' % share_flags)
|
||||||
|
|
||||||
access_flags = _ACCESS_MAP[flags & _ACCESS_MASK]
|
access_flags = _ACCESS_MAP[flags & _ACCESS_MASK]
|
||||||
create_flags = _CREATE_MAP[flags & _CREATE_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:
|
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:
|
if flags & os.O_TEMPORARY:
|
||||||
share_flags |= FILE_SHARE_DELETE
|
share_flags |= winutil.FILE_SHARE_DELETE
|
||||||
attrib_flags |= FILE_FLAG_DELETE_ON_CLOSE
|
attrib_flags |= winutil.FILE_FLAG_DELETE_ON_CLOSE
|
||||||
access_flags |= DELETE
|
access_flags |= winutil.DELETE
|
||||||
|
|
||||||
if flags & os.O_SHORT_LIVED:
|
if flags & os.O_SHORT_LIVED:
|
||||||
attrib_flags |= FILE_ATTRIBUTE_TEMPORARY
|
attrib_flags |= winutil.FILE_ATTRIBUTE_TEMPORARY
|
||||||
|
|
||||||
if flags & os.O_SEQUENTIAL:
|
if flags & os.O_SEQUENTIAL:
|
||||||
attrib_flags |= FILE_FLAG_SEQUENTIAL_SCAN
|
attrib_flags |= winutil.FILE_FLAG_SEQUENTIAL_SCAN
|
||||||
|
|
||||||
if flags & os.O_RANDOM:
|
if flags & os.O_RANDOM:
|
||||||
attrib_flags |= FILE_FLAG_RANDOM_ACCESS
|
attrib_flags |= winutil.FILE_FLAG_RANDOM_ACCESS
|
||||||
|
|
||||||
try:
|
h = winutil.create_file(
|
||||||
h = win32file.CreateFileW(
|
path, access_flags, share_flags, create_flags, attrib_flags)
|
||||||
path, access_flags, share_flags, None, create_flags, attrib_flags, None)
|
ans = msvcrt.open_osfhandle(int(h), flags | os.O_NOINHERIT)
|
||||||
except pywintypes.error as e:
|
h.detach()
|
||||||
raise_winerror(e, path)
|
|
||||||
ans = msvcrt.open_osfhandle(h.Detach(), flags | os.O_NOINHERIT)
|
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
def share_open(*a, **kw):
|
def share_open(*a, **kw):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user