diff --git a/src/calibre/utils/filenames.py b/src/calibre/utils/filenames.py index 85d39a01e1..1d2417e6d9 100644 --- a/src/calibre/utils/filenames.py +++ b/src/calibre/utils/filenames.py @@ -12,7 +12,7 @@ from math import ceil from calibre import force_unicode, isbytestring, prints, sanitize_file_name from calibre.constants import ( - filesystem_encoding, iswindows, plugins, preferred_encoding, isosx + filesystem_encoding, iswindows, plugins, preferred_encoding, isosx, ispy3 ) from calibre.utils.localization import get_udc from polyglot.builtins import iteritems, itervalues, unicode_type, range @@ -545,7 +545,7 @@ def remove_dir_if_empty(path, ignore_metadata_caches=False): raise -if iswindows: +if iswindows and not ispy3: # Python's expanduser is broken for non-ASCII usernames def expanduser(path): if isinstance(path, bytes): @@ -555,8 +555,7 @@ if iswindows: i, n = 1, len(path) while i < n and path[i] not in '/\\': i += 1 - from win32com.shell import shell, shellcon - userhome = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0) + userhome = plugins['winutil'][0].special_folder_path(plugins['winutil'][0].CSIDL_PROFILE) return userhome + path[i:] else: expanduser = os.path.expanduser diff --git a/src/calibre/utils/windows/wintest.py b/src/calibre/utils/windows/wintest.py index 51980b8557..611ac7f304 100644 --- a/src/calibre/utils/windows/wintest.py +++ b/src/calibre/utils/windows/wintest.py @@ -27,6 +27,9 @@ class TestWinutil(unittest.TestCase): self.assertIn('notepad.exe', self.winutil.file_association('.txt')) self.assertIsNone(self.winutil.file_association('.mkjsfks')) + def test_special_folder_path(self): + self.assertEqual(os.path.expanduser('~'), self.winutil.special_folder_path(self.winutil.CSIDL_PROFILE)) + def find_tests(): return unittest.defaultTestLoader.loadTestsFromTestCase(TestWinutil) diff --git a/src/calibre/utils/windows/winutilpp.cpp b/src/calibre/utils/windows/winutilpp.cpp index 6050c5b488..23cd6a7c0b 100644 --- a/src/calibre/utils/windows/winutilpp.cpp +++ b/src/calibre/utils/windows/winutilpp.cpp @@ -71,3 +71,5 @@ file_association(PyObject *self, PyObject *args) { if (!SUCCEEDED(hr)) Py_RETURN_NONE; return Py_BuildValue("u#", buf, (int)sz); } + +}