diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index c237e15dff..737fa0b383 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -445,6 +445,9 @@ def prepare_string_for_xml(raw, attribute=False): raw = raw.replace('"', '"').replace("'", ''') return raw +def isbytestring(obj): + return isinstance(obj, (str, bytes)) + if isosx: import glob, shutil fdir = os.path.expanduser('~/.fonts') diff --git a/src/calibre/devices/folder_device/driver.py b/src/calibre/devices/folder_device/driver.py index 00f2db282d..e1c95e865a 100644 --- a/src/calibre/devices/folder_device/driver.py +++ b/src/calibre/devices/folder_device/driver.py @@ -54,6 +54,7 @@ class FOLDER_DEVICE(USBMS): def __init__(self, path): if not os.path.isdir(path): raise IOError, 'Path is not a folder' + path = USBMS.normalize_path(path) if path.endswith(os.sep): self._main_prefix = path else: diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 5273ffe579..cd6bddfc28 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -15,7 +15,8 @@ import re import json from itertools import cycle -from calibre import prints +from calibre import prints, isbytestring +from calibre.constants import filesystem_encoding from calibre.devices.usbms.cli import CLI from calibre.devices.usbms.device import Device from calibre.devices.usbms.books import BookList, Book @@ -90,7 +91,6 @@ class USBMS(CLI, Device): #print 'update_metadata_item returned true' changed = True else: - #print "adding new book", lpath if bl.add_book(self.book_from_path(prefix, lpath), replace_metadata=False): changed = True @@ -102,6 +102,8 @@ class USBMS(CLI, Device): if isinstance(ebook_dirs, basestring): ebook_dirs = [ebook_dirs] for ebook_dir in ebook_dirs: + if isbytestring(ebook_dir): + ebook_dir = ebook_dir.decode(filesystem_encoding) ebook_dir = self.normalize_path( \ os.path.join(prefix, *(ebook_dir.split('/'))) \ if ebook_dir else prefix) @@ -113,7 +115,8 @@ class USBMS(CLI, Device): for path, dirs, files in os.walk(ebook_dir): for filename in files: if filename != self.METADATA_CACHE: - flist.append({'filename':filename, 'path': path}) + flist.append({'filename':filename, + 'path':path}) for i, f in enumerate(flist): self.report_progress(i/float(len(flist)), _('Getting list of books on device...')) changed = update_booklist(f['filename'], f['path'], prefix) @@ -189,20 +192,22 @@ class USBMS(CLI, Device): for i, location in enumerate(locations): self.report_progress((i+1) / float(len(locations)), _('Adding books to device metadata listing...')) info = metadata.next() - path = location[0] blist = 2 if location[1] == 'cardb' else 1 if location[1] == 'carda' else 0 + # Extract the correct prefix from the pathname. To do this correctly, + # we must ensure that both the prefix and the path are normalized + # so that the comparison will work. Book's __init__ will fix up + # lpath, so we don't need to worry about that here. + path = self.normalize_path(location[0]) if self._main_prefix: - # Normalize path and prefix - if self._main_prefix.find('\\') >= 0: - path = path.replace('/', '\\') - else: - path = path.replace('\\', '/') - prefix = self._main_prefix if path.startswith(self._main_prefix) else None + prefix = self._main_prefix if \ + path.startswith(self.normalize_path(self._main_prefix)) else None if not prefix and self._card_a_prefix: - prefix = self._card_a_prefix if path.startswith(self._card_a_prefix) else None + prefix = self._card_a_prefix if \ + path.startswith(self.normalize_path(self._card_a_prefix)) else None if not prefix and self._card_b_prefix: - prefix = self._card_b_prefix if path.startswith(self._card_b_prefix) else None + prefix = self._card_b_prefix if \ + path.startswith(self.normalize_path(self._card_b_prefix)) else None if prefix is None: prints('in add_books_to_metadata. Prefix is None!', path, self._main_prefix) @@ -274,6 +279,8 @@ class USBMS(CLI, Device): path = path.replace('/', '\\') else: path = path.replace('\\', '/') + if isbytestring(path): + path = path.decode(filesystem_encoding) return path @classmethod diff --git a/src/calibre/utils/windows/winutil.c b/src/calibre/utils/windows/winutil.c index 2f176043b2..42b6462313 100644 --- a/src/calibre/utils/windows/winutil.c +++ b/src/calibre/utils/windows/winutil.c @@ -560,6 +560,7 @@ get_device_ancestors(HDEVINFO hDevInfo, DWORD index, PyObject *candidates, BOOL return NULL; } interfaceDetailData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA); + devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); status = SetupDiGetDeviceInterfaceDetail ( hDevInfo, // Interface Device info handle