From 255fe03b289000c46f83eb4a2c93362e8179be53 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 2 May 2011 12:25:45 +0100 Subject: [PATCH 1/5] First attempt at a user_defined device --- src/calibre/customize/builtins.py | 2 + src/calibre/devices/__init__.py | 52 ++++++++++ src/calibre/devices/user_defined/__init__.py | 0 src/calibre/devices/user_defined/driver.py | 86 +++++++++++++++++ .../gui2/preferences/device_user_defined.py | 94 +++++++++++++++++++ src/calibre/gui2/preferences/misc.py | 6 ++ src/calibre/gui2/preferences/misc.ui | 9 +- 7 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 src/calibre/devices/user_defined/__init__.py create mode 100644 src/calibre/devices/user_defined/driver.py create mode 100644 src/calibre/gui2/preferences/device_user_defined.py diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 36bcbdbfe2..776b04d5f6 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -595,6 +595,7 @@ from calibre.devices.jetbook.driver import JETBOOK, MIBUK, JETBOOK_MINI from calibre.devices.kindle.driver import KINDLE, KINDLE2, KINDLE_DX from calibre.devices.nook.driver import NOOK, NOOK_COLOR from calibre.devices.prs505.driver import PRS505 +from calibre.devices.user_defined.driver import USER_DEFINED from calibre.devices.android.driver import ANDROID, S60 from calibre.devices.nokia.driver import N770, N810, E71X, E52 from calibre.devices.eslick.driver import ESLICK, EBK52 @@ -742,6 +743,7 @@ plugins += [ EEEREADER, NEXTBOOK, ITUNES, + USER_DEFINED, ] plugins += [x for x in list(locals().values()) if isinstance(x, type) and \ x.__name__.endswith('MetadataReader')] diff --git a/src/calibre/devices/__init__.py b/src/calibre/devices/__init__.py index 63b0b89a17..d151ae1844 100644 --- a/src/calibre/devices/__init__.py +++ b/src/calibre/devices/__init__.py @@ -156,3 +156,55 @@ def debug(ioreg_to_tmp=False, buf=None): sys.stdout = oldo sys.stderr = olde +def device_info(ioreg_to_tmp=False, buf=None): + from calibre.devices.scanner import DeviceScanner, win_pnp_drives + from calibre.constants import iswindows + from calibre import prints + import re + + res = {} + if not iswindows: + return None + try: + s = DeviceScanner() + s.scan() + devices = (s.devices) + device_details = {} + device_set = set() + for dev in devices: + vid = re.search('vid_([0-9a-f]*)&', dev) + if vid: + vid = vid.group(1) + pid = re.search('pid_([0-9a-f]*)&', dev) + if pid: + pid = pid.group(1) + rev = re.search('rev_([0-9a-f]*)$', dev) + if rev: + rev = rev.group(1) + d = vid+pid+rev + prints(d) + device_set.add(d) + device_details[d] = (vid, pid, rev) + res['device_set'] = device_set + res['device_details'] = device_details + drives = win_pnp_drives(debug=False) + drive_details = {} + print drives + drive_set = set() + for drive,details in drives.iteritems(): + order = 'ORD_' + str(drive.order) + ven = re.search('VEN_([^&]*)&', details) + if ven: + ven = ven.group(1) + prod = re.search('PROD_([^&]*)&', details) + if prod: + prod = prod.group(1) + d = (order, ven, prod) + print d + drive_details[drive] = d + drive_set.add(drive) + res['drive_details'] = drive_details + res['drive_set'] = drive_set + finally: + pass + return res \ No newline at end of file diff --git a/src/calibre/devices/user_defined/__init__.py b/src/calibre/devices/user_defined/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/calibre/devices/user_defined/driver.py b/src/calibre/devices/user_defined/driver.py new file mode 100644 index 0000000000..682ed1712e --- /dev/null +++ b/src/calibre/devices/user_defined/driver.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- + +__license__ = 'GPL v3' +__copyright__ = '2009, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from calibre.devices.usbms.driver import USBMS +from calibre.ebooks import BOOK_EXTENSIONS + +class USER_DEFINED(USBMS): + + name = 'User Defined USB driver' + gui_name = 'User Defined phone' + author = 'Kovid Goyal' + supported_platforms = ['windows', 'osx', 'linux'] + + # Ordered list of supported formats + FORMATS = BOOK_EXTENSIONS + + VENDOR_ID = 0xFFFF + PRODUCT_ID = 0xFFFF + BCD = None + + EBOOK_DIR_MAIN = '' + EBOOK_DIR_CARD_A = '' + + VENDOR_NAME = [] + WINDOWS_MAIN_MEM = '' + WINDOWS_CARD_A_MEM = '' + + OSX_MAIN_MEM = 'Device Main Memory' + + MAIN_MEMORY_VOLUME_LABEL = 'Device Main Memory' + + SUPPORTS_SUB_DIRS = True + + EXTRA_CUSTOMIZATION_MESSAGE = [ + _('USB Vendor ID (in hex)'), + _('USB Product ID (in hex)'), + _('USB Revision ID (in hex)'), + _('Windows main memory vendor string'), + _('Windows main memory ID string'), + _('Windows card A vendor string'), + _('Windows card A ID string'), + _('Main memory folder'), + _('Card A folder'), + ] + EXTRA_CUSTOMIZATION_DEFAULT = [ + '0x0000', + '0x0000', + '0x0000', + '', + '', + '', + '', + '', + '', + ] + OPT_USB_VENDOR_ID = 0 + OPT_USB_PRODUCT_ID = 1 + OPT_USB_REVISION_ID = 2 + OPT_USB_WINDOWS_MM_VEN_ID = 3 + OPT_USB_WINDOWS_MM_ID = 4 + OPT_USB_WINDOWS_CA_VEN_ID = 5 + OPT_USB_WINDOWS_CA_ID = 6 + OPT_MAIN_MEM_FOLDER = 7 + OPT_CARD_A_FOLDER = 8 + + def __init__(self, *args): + USBMS.__init__(self, args) + try: + e = self.settings().extra_customization + self.VENDOR_ID = int(e[self.OPT_USB_VENDOR_ID], 16) + self.PRODUCT_ID = int(e[self.OPT_USB_PRODUCT_ID], 16) + self.BCD = [int(e[self.OPT_USB_REVISION_ID], 16)] + print '%x, %x, %s' %(self.VENDOR_ID, self.PRODUCT_ID, str(self.BCD)) + if e[self.OPT_USB_WINDOWS_MM_VEN_ID]: + self.VENDOR_NAME.append(e[self.OPT_USB_WINDOWS_MM_VEN_ID]) + if e[self.OPT_USB_WINDOWS_CA_VEN_ID]: + self.VENDOR_NAME.append(e[self.OPT_USB_WINDOWS_CA_VEN_ID]) + self.WINDOWS_MAIN_MEM = e[self.OPT_USB_WINDOWS_MM_ID] + self.WINDOWS_CARD_A_MEM = e[self.OPT_USB_WINDOWS_CA_ID] + self.EBOOK_DIR_MAIN = e[self.OPT_MAIN_MEM_FOLDER] + self.EBOOK_DIR_CARD_A = e[self.OPT_CARD_A_FOLDER] + except: + pass \ No newline at end of file diff --git a/src/calibre/gui2/preferences/device_user_defined.py b/src/calibre/gui2/preferences/device_user_defined.py new file mode 100644 index 0000000000..0b820bd742 --- /dev/null +++ b/src/calibre/gui2/preferences/device_user_defined.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai +from __future__ import with_statement + +__license__ = 'GPL v3' +__copyright__ = '2009, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + +from PyQt4.Qt import QDialog, QVBoxLayout, QPlainTextEdit, QTimer, \ + QDialogButtonBox, QPushButton, QApplication, QIcon, QMessageBox + +def step_dialog(parent, title, msg, det_msg=''): + d = QMessageBox(parent) + d.setWindowTitle(title) + d.setText(msg) + d.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + return d.exec_() & QMessageBox.Cancel + + +class UserDefinedDevice(QDialog): + + def __init__(self, parent=None): + QDialog.__init__(self, parent) + self._layout = QVBoxLayout(self) + self.setLayout(self._layout) + self.log = QPlainTextEdit(self) + self._layout.addWidget(self.log) + self.log.setPlainText(_('Getting debug information')+'...') + self.copy = QPushButton(_('Copy to &clipboard')) + self.copy.setDefault(True) + self.setWindowTitle(_('Debug device detection')) + self.setWindowIcon(QIcon(I('debug.png'))) + self.copy.clicked.connect(self.copy_to_clipboard) + self.ok = QPushButton('&OK') + self.ok.setAutoDefault(False) + self.ok.clicked.connect(self.accept) + self.bbox = QDialogButtonBox(self) + self.bbox.addButton(self.copy, QDialogButtonBox.ActionRole) + self.bbox.addButton(self.ok, QDialogButtonBox.AcceptRole) + self._layout.addWidget(self.bbox) + self.resize(750, 500) + self.bbox.setEnabled(False) + QTimer.singleShot(1000, self.device_info) + + def device_info(self): + try: + from calibre.devices import device_info + r = step_dialog(self.parent(), _('Device Detection'), + _('Ensure your device is disconnected, then press OK')) + if r: + return + before = device_info() + r = step_dialog(self.parent(), _('Device Detection'), + _('Ensure your device is connected, then press OK')) + if r: + return + after = device_info() + new_drives = after['drive_set'] - before['drive_set'] + new_devices = after['device_set'] - before['device_set'] + res = '' + if len(new_drives) and len(new_devices) == 1: + for d in new_devices: + res = _('USB Vendor ID (in hex)') + ': 0x' + \ + after['device_details'][d][0] + '\n' + res += _('USB Product ID (in hex)') + ': 0x' + \ + after['device_details'][d][1] + '\n' + res += _('USB Revision ID (in hex)') + ': 0x' + \ + after['device_details'][d][2] + '\n' + # sort the drives by the order number + for i,d in enumerate(sorted(new_drives, + key=lambda x: after['drive_details'][x][0])): + if i == 0: + res += _('Windows main memory ID string') + ': ' + \ + after['drive_details'][d][1] + '\n' + res += _('Windows main memory ID string') + ': ' + \ + after['drive_details'][d][2] + '\n' + else: + res += _('Windows card A vendor string') + ': ' + \ + after['drive_details'][d][1] + '\n' + res += _('Windows card A ID string') + ': ' + \ + after['drive_details'][d][2] + '\n' + + self.log.setPlainText(res) + finally: + self.bbox.setEnabled(True) + + def copy_to_clipboard(self): + QApplication.clipboard().setText(self.log.toPlainText()) + +if __name__ == '__main__': + app = QApplication([]) + d = UserDefinedDevice() + d.exec_() diff --git a/src/calibre/gui2/preferences/misc.py b/src/calibre/gui2/preferences/misc.py index ead5da4ce4..80bfdffcd8 100644 --- a/src/calibre/gui2/preferences/misc.py +++ b/src/calibre/gui2/preferences/misc.py @@ -30,6 +30,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): r('enforce_cpu_limit', config, restart_required=True) self.device_detection_button.clicked.connect(self.debug_device_detection) self.button_open_config_dir.clicked.connect(self.open_config_dir) + self.user_defined_device_button.clicked.connect(self.user_defined_device) self.button_osx_symlinks.clicked.connect(self.create_symlinks) self.button_osx_symlinks.setVisible(isosx) @@ -38,6 +39,11 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): d = DebugDevice(self) d.exec_() + def user_defined_device(self, *args): + from calibre.gui2.preferences.device_user_defined import UserDefinedDevice + d = UserDefinedDevice(self) + d.exec_() + def open_config_dir(self, *args): from calibre.utils.config import config_dir open_local_file(config_dir) diff --git a/src/calibre/gui2/preferences/misc.ui b/src/calibre/gui2/preferences/misc.ui index 8b0189b0a1..cce14f5ade 100644 --- a/src/calibre/gui2/preferences/misc.ui +++ b/src/calibre/gui2/preferences/misc.ui @@ -58,7 +58,14 @@ - + + + + Setup the &user defined device + + + + Qt::Vertical From f74bed638111653a7d302c17da8938e34d962f16 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 2 May 2011 13:29:08 +0100 Subject: [PATCH 2/5] ... --- src/calibre/devices/__init__.py | 4 ---- src/calibre/devices/user_defined/driver.py | 17 +++++++++-------- .../gui2/preferences/device_user_defined.py | 7 ++++++- src/calibre/gui2/preferences/misc.py | 3 ++- src/calibre/gui2/preferences/misc.ui | 2 +- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/calibre/devices/__init__.py b/src/calibre/devices/__init__.py index d151ae1844..02c42a1d6e 100644 --- a/src/calibre/devices/__init__.py +++ b/src/calibre/devices/__init__.py @@ -159,7 +159,6 @@ def debug(ioreg_to_tmp=False, buf=None): def device_info(ioreg_to_tmp=False, buf=None): from calibre.devices.scanner import DeviceScanner, win_pnp_drives from calibre.constants import iswindows - from calibre import prints import re res = {} @@ -182,14 +181,12 @@ def device_info(ioreg_to_tmp=False, buf=None): if rev: rev = rev.group(1) d = vid+pid+rev - prints(d) device_set.add(d) device_details[d] = (vid, pid, rev) res['device_set'] = device_set res['device_details'] = device_details drives = win_pnp_drives(debug=False) drive_details = {} - print drives drive_set = set() for drive,details in drives.iteritems(): order = 'ORD_' + str(drive.order) @@ -200,7 +197,6 @@ def device_info(ioreg_to_tmp=False, buf=None): if prod: prod = prod.group(1) d = (order, ven, prod) - print d drive_details[drive] = d drive_set.add(drive) res['drive_details'] = drive_details diff --git a/src/calibre/devices/user_defined/driver.py b/src/calibre/devices/user_defined/driver.py index 682ed1712e..03ed7dee94 100644 --- a/src/calibre/devices/user_defined/driver.py +++ b/src/calibre/devices/user_defined/driver.py @@ -10,7 +10,7 @@ from calibre.ebooks import BOOK_EXTENSIONS class USER_DEFINED(USBMS): name = 'User Defined USB driver' - gui_name = 'User Defined phone' + gui_name = 'User Defined USB Device' author = 'Kovid Goyal' supported_platforms = ['windows', 'osx', 'linux'] @@ -66,21 +66,22 @@ class USER_DEFINED(USBMS): OPT_MAIN_MEM_FOLDER = 7 OPT_CARD_A_FOLDER = 8 - def __init__(self, *args): - USBMS.__init__(self, args) + def initialize(self): try: e = self.settings().extra_customization self.VENDOR_ID = int(e[self.OPT_USB_VENDOR_ID], 16) self.PRODUCT_ID = int(e[self.OPT_USB_PRODUCT_ID], 16) self.BCD = [int(e[self.OPT_USB_REVISION_ID], 16)] - print '%x, %x, %s' %(self.VENDOR_ID, self.PRODUCT_ID, str(self.BCD)) if e[self.OPT_USB_WINDOWS_MM_VEN_ID]: self.VENDOR_NAME.append(e[self.OPT_USB_WINDOWS_MM_VEN_ID]) - if e[self.OPT_USB_WINDOWS_CA_VEN_ID]: + if e[self.OPT_USB_WINDOWS_CA_VEN_ID] and \ + e[self.OPT_USB_WINDOWS_CA_VEN_ID] not in self.VENDOR_NAME: self.VENDOR_NAME.append(e[self.OPT_USB_WINDOWS_CA_VEN_ID]) - self.WINDOWS_MAIN_MEM = e[self.OPT_USB_WINDOWS_MM_ID] - self.WINDOWS_CARD_A_MEM = e[self.OPT_USB_WINDOWS_CA_ID] + self.WINDOWS_MAIN_MEM = e[self.OPT_USB_WINDOWS_MM_ID] + '&' + self.WINDOWS_CARD_A_MEM = e[self.OPT_USB_WINDOWS_CA_ID] + '&' self.EBOOK_DIR_MAIN = e[self.OPT_MAIN_MEM_FOLDER] self.EBOOK_DIR_CARD_A = e[self.OPT_CARD_A_FOLDER] except: - pass \ No newline at end of file + import traceback + traceback.print_exc() + USBMS.initialize(self) \ No newline at end of file diff --git a/src/calibre/gui2/preferences/device_user_defined.py b/src/calibre/gui2/preferences/device_user_defined.py index 0b820bd742..914e2b5666 100644 --- a/src/calibre/gui2/preferences/device_user_defined.py +++ b/src/calibre/gui2/preferences/device_user_defined.py @@ -81,7 +81,12 @@ class UserDefinedDevice(QDialog): res += _('Windows card A ID string') + ': ' + \ after['drive_details'][d][2] + '\n' - self.log.setPlainText(res) + trailer = _('Enter the above values into the USER_DEVICE by ' + 'customizing the device plugin. Be sure to also ' + 'enter the folders where you want the books to ' + 'be put. You must restart calibre for your changes ' + 'to take effect.\n') + self.log.setPlainText(res + '\n\n' + trailer) finally: self.bbox.setEnabled(True) diff --git a/src/calibre/gui2/preferences/misc.py b/src/calibre/gui2/preferences/misc.py index 80bfdffcd8..179e8a995d 100644 --- a/src/calibre/gui2/preferences/misc.py +++ b/src/calibre/gui2/preferences/misc.py @@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en' from calibre.gui2.preferences import ConfigWidgetBase, test_widget, Setting from calibre.gui2.preferences.misc_ui import Ui_Form from calibre.gui2 import error_dialog, config, open_local_file, info_dialog -from calibre.constants import isosx +from calibre.constants import isosx, iswindows class WorkersSetting(Setting): @@ -33,6 +33,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.user_defined_device_button.clicked.connect(self.user_defined_device) self.button_osx_symlinks.clicked.connect(self.create_symlinks) self.button_osx_symlinks.setVisible(isosx) + self.user_defined_device_button.setVisible(iswindows) def debug_device_detection(self, *args): from calibre.gui2.preferences.device_debug import DebugDevice diff --git a/src/calibre/gui2/preferences/misc.ui b/src/calibre/gui2/preferences/misc.ui index cce14f5ade..df530bbe9a 100644 --- a/src/calibre/gui2/preferences/misc.ui +++ b/src/calibre/gui2/preferences/misc.ui @@ -61,7 +61,7 @@ - Setup the &user defined device + Get information to setup the &user defined device (Windows only) From 0962ebb3ba0016b223d603a819e0b59b5bfe6984 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 2 May 2011 14:58:26 +0100 Subject: [PATCH 3/5] Make user_defined_device information work on linux --- src/calibre/devices/__init__.py | 81 ++++++++++--------- .../gui2/preferences/device_user_defined.py | 36 +++++---- src/calibre/gui2/preferences/misc.py | 3 +- src/calibre/gui2/preferences/misc.ui | 2 +- 4 files changed, 66 insertions(+), 56 deletions(-) diff --git a/src/calibre/devices/__init__.py b/src/calibre/devices/__init__.py index 02c42a1d6e..e47cd82b50 100644 --- a/src/calibre/devices/__init__.py +++ b/src/calibre/devices/__init__.py @@ -162,45 +162,54 @@ def device_info(ioreg_to_tmp=False, buf=None): import re res = {} - if not iswindows: - return None + device_details = {} + device_set = set() + drive_details = {} + drive_set = set() + res['device_set'] = device_set + res['device_details'] = device_details + res['drive_details'] = drive_details + res['drive_set'] = drive_set + try: s = DeviceScanner() s.scan() devices = (s.devices) - device_details = {} - device_set = set() - for dev in devices: - vid = re.search('vid_([0-9a-f]*)&', dev) - if vid: - vid = vid.group(1) - pid = re.search('pid_([0-9a-f]*)&', dev) - if pid: - pid = pid.group(1) - rev = re.search('rev_([0-9a-f]*)$', dev) - if rev: - rev = rev.group(1) - d = vid+pid+rev - device_set.add(d) - device_details[d] = (vid, pid, rev) - res['device_set'] = device_set - res['device_details'] = device_details - drives = win_pnp_drives(debug=False) - drive_details = {} - drive_set = set() - for drive,details in drives.iteritems(): - order = 'ORD_' + str(drive.order) - ven = re.search('VEN_([^&]*)&', details) - if ven: - ven = ven.group(1) - prod = re.search('PROD_([^&]*)&', details) - if prod: - prod = prod.group(1) - d = (order, ven, prod) - drive_details[drive] = d - drive_set.add(drive) - res['drive_details'] = drive_details - res['drive_set'] = drive_set + if not iswindows: + devices = [list(x) for x in devices] + for dev in devices: + for i in range(3): + dev[i] = hex(dev[i]) + d = dev[0] + dev[1] + dev[2] + device_set.add(d) + device_details[d] = dev[0:3] + else: + for dev in devices: + vid = re.search('vid_([0-9a-f]*)&', dev) + if vid: + vid = vid.group(1) + pid = re.search('pid_([0-9a-f]*)&', dev) + if pid: + pid = pid.group(1) + rev = re.search('rev_([0-9a-f]*)$', dev) + if rev: + rev = rev.group(1) + d = vid+pid+rev + device_set.add(d) + device_details[d] = (vid, pid, rev) + + drives = win_pnp_drives(debug=False) + for drive,details in drives.iteritems(): + order = 'ORD_' + str(drive.order) + ven = re.search('VEN_([^&]*)&', details) + if ven: + ven = ven.group(1) + prod = re.search('PROD_([^&]*)&', details) + if prod: + prod = prod.group(1) + d = (order, ven, prod) + drive_details[drive] = d + drive_set.add(drive) finally: pass - return res \ No newline at end of file + return res diff --git a/src/calibre/gui2/preferences/device_user_defined.py b/src/calibre/gui2/preferences/device_user_defined.py index 914e2b5666..c2a27d3937 100644 --- a/src/calibre/gui2/preferences/device_user_defined.py +++ b/src/calibre/gui2/preferences/device_user_defined.py @@ -10,6 +10,8 @@ __docformat__ = 'restructuredtext en' from PyQt4.Qt import QDialog, QVBoxLayout, QPlainTextEdit, QTimer, \ QDialogButtonBox, QPushButton, QApplication, QIcon, QMessageBox +from calibre.constants import iswindows + def step_dialog(parent, title, msg, det_msg=''): d = QMessageBox(parent) d.setWindowTitle(title) @@ -26,10 +28,10 @@ class UserDefinedDevice(QDialog): self.setLayout(self._layout) self.log = QPlainTextEdit(self) self._layout.addWidget(self.log) - self.log.setPlainText(_('Getting debug information')+'...') + self.log.setPlainText(_('Getting device information')+'...') self.copy = QPushButton(_('Copy to &clipboard')) self.copy.setDefault(True) - self.setWindowTitle(_('Debug device detection')) + self.setWindowTitle(_('User-defined device information')) self.setWindowIcon(QIcon(I('debug.png'))) self.copy.clicked.connect(self.copy_to_clipboard) self.ok = QPushButton('&OK') @@ -59,7 +61,7 @@ class UserDefinedDevice(QDialog): new_drives = after['drive_set'] - before['drive_set'] new_devices = after['device_set'] - before['device_set'] res = '' - if len(new_drives) and len(new_devices) == 1: + if (not iswindows or len(new_drives)) and len(new_devices) == 1: for d in new_devices: res = _('USB Vendor ID (in hex)') + ': 0x' + \ after['device_details'][d][0] + '\n' @@ -67,20 +69,20 @@ class UserDefinedDevice(QDialog): after['device_details'][d][1] + '\n' res += _('USB Revision ID (in hex)') + ': 0x' + \ after['device_details'][d][2] + '\n' - # sort the drives by the order number - for i,d in enumerate(sorted(new_drives, - key=lambda x: after['drive_details'][x][0])): - if i == 0: - res += _('Windows main memory ID string') + ': ' + \ - after['drive_details'][d][1] + '\n' - res += _('Windows main memory ID string') + ': ' + \ - after['drive_details'][d][2] + '\n' - else: - res += _('Windows card A vendor string') + ': ' + \ - after['drive_details'][d][1] + '\n' - res += _('Windows card A ID string') + ': ' + \ - after['drive_details'][d][2] + '\n' - + if iswindows: + # sort the drives by the order number + for i,d in enumerate(sorted(new_drives, + key=lambda x: after['drive_details'][x][0])): + if i == 0: + res += _('Windows main memory ID string') + ': ' + \ + after['drive_details'][d][1] + '\n' + res += _('Windows main memory ID string') + ': ' + \ + after['drive_details'][d][2] + '\n' + else: + res += _('Windows card A vendor string') + ': ' + \ + after['drive_details'][d][1] + '\n' + res += _('Windows card A ID string') + ': ' + \ + after['drive_details'][d][2] + '\n' trailer = _('Enter the above values into the USER_DEVICE by ' 'customizing the device plugin. Be sure to also ' 'enter the folders where you want the books to ' diff --git a/src/calibre/gui2/preferences/misc.py b/src/calibre/gui2/preferences/misc.py index 179e8a995d..80bfdffcd8 100644 --- a/src/calibre/gui2/preferences/misc.py +++ b/src/calibre/gui2/preferences/misc.py @@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en' from calibre.gui2.preferences import ConfigWidgetBase, test_widget, Setting from calibre.gui2.preferences.misc_ui import Ui_Form from calibre.gui2 import error_dialog, config, open_local_file, info_dialog -from calibre.constants import isosx, iswindows +from calibre.constants import isosx class WorkersSetting(Setting): @@ -33,7 +33,6 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.user_defined_device_button.clicked.connect(self.user_defined_device) self.button_osx_symlinks.clicked.connect(self.create_symlinks) self.button_osx_symlinks.setVisible(isosx) - self.user_defined_device_button.setVisible(iswindows) def debug_device_detection(self, *args): from calibre.gui2.preferences.device_debug import DebugDevice diff --git a/src/calibre/gui2/preferences/misc.ui b/src/calibre/gui2/preferences/misc.ui index df530bbe9a..843f0f01b7 100644 --- a/src/calibre/gui2/preferences/misc.ui +++ b/src/calibre/gui2/preferences/misc.ui @@ -61,7 +61,7 @@ - Get information to setup the &user defined device (Windows only) + Get information to setup the &user defined device From ffdfb6ebe552f26a8b9e3fceb6494edab328dfb6 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 2 May 2011 15:21:51 +0100 Subject: [PATCH 4/5] ... --- src/calibre/gui2/preferences/device_user_defined.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/preferences/device_user_defined.py b/src/calibre/gui2/preferences/device_user_defined.py index c2a27d3937..198ae0d7a9 100644 --- a/src/calibre/gui2/preferences/device_user_defined.py +++ b/src/calibre/gui2/preferences/device_user_defined.py @@ -51,11 +51,13 @@ class UserDefinedDevice(QDialog): r = step_dialog(self.parent(), _('Device Detection'), _('Ensure your device is disconnected, then press OK')) if r: + self.close() return before = device_info() r = step_dialog(self.parent(), _('Device Detection'), _('Ensure your device is connected, then press OK')) if r: + self.close() return after = device_info() new_drives = after['drive_set'] - before['drive_set'] @@ -83,7 +85,8 @@ class UserDefinedDevice(QDialog): after['drive_details'][d][1] + '\n' res += _('Windows card A ID string') + ': ' + \ after['drive_details'][d][2] + '\n' - trailer = _('Enter the above values into the USER_DEVICE by ' + trailer = _('Copy these values to the clipboard, paste them into an ' + 'editor, then enter them into the USER_DEVICE by ' 'customizing the device plugin. Be sure to also ' 'enter the folders where you want the books to ' 'be put. You must restart calibre for your changes ' From 106396f76806aa2647b85268c9ab18e7688301ed Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 2 May 2011 15:36:25 +0100 Subject: [PATCH 5/5] ... --- src/calibre/devices/user_defined/driver.py | 40 +++++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/calibre/devices/user_defined/driver.py b/src/calibre/devices/user_defined/driver.py index 03ed7dee94..3211bd19ef 100644 --- a/src/calibre/devices/user_defined/driver.py +++ b/src/calibre/devices/user_defined/driver.py @@ -35,15 +35,37 @@ class USER_DEFINED(USBMS): SUPPORTS_SUB_DIRS = True EXTRA_CUSTOMIZATION_MESSAGE = [ - _('USB Vendor ID (in hex)'), - _('USB Product ID (in hex)'), - _('USB Revision ID (in hex)'), - _('Windows main memory vendor string'), - _('Windows main memory ID string'), - _('Windows card A vendor string'), - _('Windows card A ID string'), - _('Main memory folder'), - _('Card A folder'), + _('USB Vendor ID (in hex)') + ':::' + + _('Get this ID using Preferences -> Misc -> Get information to ' + 'set up the user-defined device'), + _('USB Product ID (in hex)')+ ':::' + + _('Get this ID using Preferences -> Misc -> Get information to ' + 'set up the user-defined device'), + _('USB Revision ID (in hex)')+ ':::' + + _('Get this ID using Preferences -> Misc -> Get information to ' + 'set up the user-defined device'), + _('Windows main memory vendor string') + ':::' + + _('This field is used only on windows. ' + 'Get this ID using Preferences -> Misc -> Get information to ' + 'set up the user-defined device'), + _('Windows main memory ID string') + ':::' + + _('This field is used only on windows. ' + 'Get this ID using Preferences -> Misc -> Get information to ' + 'set up the user-defined device'), + _('Windows card A vendor string') + ':::' + + _('This field is used only on windows. ' + 'Get this ID using Preferences -> Misc -> Get information to ' + 'set up the user-defined device'), + _('Windows card A ID string') + ':::' + + _('This field is used only on windows. ' + 'Get this ID using Preferences -> Misc -> Get information to ' + 'set up the user-defined device'), + _('Main memory folder') + ':::' + + _('Enter the folder where the books are to be stored. This folder ' + 'is prepended to any send_to_device template'), + _('Card A folder') + ':::' + + _('Enter the folder where the books are to be stored. This folder ' + 'is prepended to any send_to_device template'), ] EXTRA_CUSTOMIZATION_DEFAULT = [ '0x0000',