Merge from trunk

This commit is contained in:
Charles Haley 2012-08-09 11:35:58 +02:00
commit 2361d7be01
3 changed files with 29 additions and 18 deletions

View File

@ -56,6 +56,12 @@ def get_connected_device():
return dev return dev
def debug(ioreg_to_tmp=False, buf=None, plugins=None): def debug(ioreg_to_tmp=False, buf=None, plugins=None):
'''
If plugins is None, then this method calls startup and shutdown on the
device plugins. So if you are using it in a context where startup could
already have been called (for example in the main GUI), pass in the list of
device plugins as the plugins parameter.
'''
import textwrap import textwrap
from calibre.customize.ui import device_plugins from calibre.customize.ui import device_plugins
from calibre.devices.scanner import DeviceScanner, win_pnp_drives from calibre.devices.scanner import DeviceScanner, win_pnp_drives

View File

@ -7,8 +7,17 @@ __license__ = 'GPL v3'
__copyright__ = '2012, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2012, Kovid Goyal <kovid at kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
from functools import wraps
from calibre.devices.interface import DevicePlugin from calibre.devices.interface import DevicePlugin
def synchronous(func):
@wraps(func)
def synchronizer(self, *args, **kwargs):
with self.lock:
return func(self, *args, **kwargs)
return synchronizer
class MTPDeviceBase(DevicePlugin): class MTPDeviceBase(DevicePlugin):
name = 'SmartDevice App Interface' name = 'SmartDevice App Interface'
gui_name = _('MTP Device') gui_name = _('MTP Device')

View File

@ -9,23 +9,15 @@ __docformat__ = 'restructuredtext en'
import time, operator import time, operator
from threading import RLock from threading import RLock
from functools import wraps
from itertools import chain from itertools import chain
from collections import deque, OrderedDict from collections import deque, OrderedDict
from io import BytesIO from io import BytesIO
from calibre import prints from calibre import prints
from calibre.devices.errors import OpenFailed from calibre.devices.errors import OpenFailed
from calibre.devices.mtp.base import MTPDeviceBase from calibre.devices.mtp.base import MTPDeviceBase, synchronous
from calibre.devices.mtp.unix.detect import MTPDetect from calibre.devices.mtp.unix.detect import MTPDetect
def synchronous(func):
@wraps(func)
def synchronizer(self, *args, **kwargs):
with self.lock:
return func(self, *args, **kwargs)
return synchronizer
class FilesystemCache(object): class FilesystemCache(object):
def __init__(self, files, folders): def __init__(self, files, folders):
@ -190,6 +182,7 @@ class MTP_DEVICE(MTPDeviceBase):
if len(storage) > 2: if len(storage) > 2:
self._cardb_id = storage[2]['id'] self._cardb_id = storage[2]['id']
try:
files, errs = self.dev.get_filelist(self) files, errs = self.dev.get_filelist(self)
if errs and not files: if errs and not files:
raise OpenFailed('Failed to read files from device. Underlying errors:\n' raise OpenFailed('Failed to read files from device. Underlying errors:\n'
@ -199,6 +192,9 @@ class MTP_DEVICE(MTPDeviceBase):
raise OpenFailed('Failed to read folders from device. Underlying errors:\n' raise OpenFailed('Failed to read folders from device. Underlying errors:\n'
+self.format_errorstack(errs)) +self.format_errorstack(errs))
self.filesystem_cache = FilesystemCache(files, folders) self.filesystem_cache = FilesystemCache(files, folders)
except:
self.dev = self._main_id = self._carda_id = self._cardb_id = None
raise
@synchronous @synchronous
def get_device_information(self, end_session=True): def get_device_information(self, end_session=True):