1# -*- coding: utf-8 -*- 2 3 4__license__ = 'GPL v3' 5__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' 6__docformat__ = 'restructuredtext en' 7 8from calibre.devices.usbms.driver import USBMS 9 10 11class USER_DEFINED(USBMS): 12 13 name = 'User Defined USB driver' 14 gui_name = 'User Defined USB Device' 15 author = 'Kovid Goyal' 16 supported_platforms = ['windows', 'osx', 'linux'] 17 18 # Ordered list of supported formats 19 FORMATS = ['epub', 'mobi', 'pdf'] 20 21 VENDOR_ID = 0xFFFF 22 PRODUCT_ID = 0xFFFF 23 BCD = None 24 25 EBOOK_DIR_MAIN = '' 26 EBOOK_DIR_CARD_A = '' 27 28 VENDOR_NAME = [] 29 WINDOWS_MAIN_MEM = '' 30 WINDOWS_CARD_A_MEM = '' 31 32 OSX_MAIN_MEM = 'Device Main Memory' 33 34 MAIN_MEMORY_VOLUME_LABEL = 'Device Main Memory' 35 36 SUPPORTS_SUB_DIRS = True 37 38 EXTRA_CUSTOMIZATION_MESSAGE = [ 39 _('USB Vendor ID (in hex)') + ':::<p>' + _( 40 'Get this ID using Preferences -> Misc -> Get information to ' 41 'set up the user-defined device') + '</p>', 42 _('USB Product ID (in hex)')+ ':::<p>' + _( 43 'Get this ID using Preferences -> Misc -> Get information to ' 44 'set up the user-defined device') + '</p>', 45 _('USB Revision ID (in hex)')+ ':::<p>' + _( 46 'Get this ID using Preferences -> Misc -> Get information to ' 47 'set up the user-defined device') + '</p>', 48 '', 49 _('Unused (leave blank)') + ':::<p>' + _( 50 'This field is no longer used, leave it blank.') + '</p>', 51 _('Unused (leave blank)') + ':::<p>' + _( 52 'This field is no longer used, leave it blank.') + '</p>', 53 _('Unused (leave blank)') + ':::<p>' + _( 54 'This field is no longer used, leave it blank.') + '</p>', 55 _('Unused (leave blank)') + ':::<p>' + _( 56 'This field is no longer used, leave it blank.') + '</p>', 57 _('Main memory folder') + ':::<p>' + _( 58 'Enter the folder where the books are to be stored. This folder ' 59 'is prepended to any send_to_device template') + '</p>', 60 _('Card A folder') + ':::<p>' + _( 61 'Enter the folder where the books are to be stored. This folder ' 62 'is prepended to any send_to_device template') + '</p>', 63 _('Swap main and card A') + ':::<p>' + _( 64 'Check this box if the device\'s main memory is being seen as ' 65 'card a and the card is being seen as main memory') + '</p>', 66 ] 67 EXTRA_CUSTOMIZATION_DEFAULT = [ 68 '0xffff', 69 '0xffff', 70 '0xffff', 71 None, 72 '', 73 '', 74 '', 75 '', 76 '', 77 '', 78 False, 79 ] 80 OPT_USB_VENDOR_ID = 0 81 OPT_USB_PRODUCT_ID = 1 82 OPT_USB_REVISION_ID = 2 83 # OPT 3 isn't used 84 OPT_USB_WINDOWS_MM_VEN_ID = 4 85 OPT_USB_WINDOWS_MM_ID = 5 86 OPT_USB_WINDOWS_CA_VEN_ID = 6 87 OPT_USB_WINDOWS_CA_ID = 7 88 OPT_MAIN_MEM_FOLDER = 8 89 OPT_CARD_A_FOLDER = 9 90 OPT_SWAP_MAIN_AND_CARD = 10 91 92 def initialize(self): 93 self.plugin_needs_delayed_initialization = True 94 USBMS.initialize(self) 95 96 def do_delayed_plugin_initialization(self): 97 try: 98 e = self.settings().extra_customization 99 if e[self.OPT_USB_VENDOR_ID]: 100 self.VENDOR_ID = int(e[self.OPT_USB_VENDOR_ID], 16) 101 self.PRODUCT_ID = int(e[self.OPT_USB_PRODUCT_ID], 16) 102 self.BCD = [int(e[self.OPT_USB_REVISION_ID], 16)] 103 if e[self.OPT_USB_WINDOWS_MM_VEN_ID]: 104 self.VENDOR_NAME.append(e[self.OPT_USB_WINDOWS_MM_VEN_ID]) 105 if e[self.OPT_USB_WINDOWS_CA_VEN_ID] and \ 106 e[self.OPT_USB_WINDOWS_CA_VEN_ID] not in self.VENDOR_NAME: 107 self.VENDOR_NAME.append(e[self.OPT_USB_WINDOWS_CA_VEN_ID]) 108 self.WINDOWS_MAIN_MEM = e[self.OPT_USB_WINDOWS_MM_ID] + '&' 109 self.WINDOWS_CARD_A_MEM = e[self.OPT_USB_WINDOWS_CA_ID] + '&' 110 self.EBOOK_DIR_MAIN = e[self.OPT_MAIN_MEM_FOLDER] 111 self.EBOOK_DIR_CARD_A = e[self.OPT_CARD_A_FOLDER] 112 except: 113 import traceback 114 traceback.print_exc() 115 self.plugin_needs_delayed_initialization = False 116 117 def windows_sort_drives(self, drives): 118 if len(drives) < 2: 119 return drives 120 e = self.settings().extra_customization 121 if not e[self.OPT_SWAP_MAIN_AND_CARD]: 122 return drives 123 main = drives.get('main', None) 124 carda = drives.get('carda', None) 125 if main and carda: 126 drives['main'] = carda 127 drives['carda'] = main 128 return drives 129 130 def linux_swap_drives(self, drives): 131 if len(drives) < 2 or not drives[0] or not drives[1]: 132 return drives 133 e = self.settings().extra_customization 134 if not e[self.OPT_SWAP_MAIN_AND_CARD]: 135 return drives 136 drives = list(drives) 137 t = drives[0] 138 drives[0] = drives[1] 139 drives[1] = t 140 return tuple(drives) 141 142 def osx_sort_names(self, names): 143 if len(names) < 2: 144 return names 145 e = self.settings().extra_customization 146 if not e[self.OPT_SWAP_MAIN_AND_CARD]: 147 return names 148 main = names.get('main', None) 149 card = names.get('carda', None) 150 151 if main is not None and card is not None: 152 names['main'] = card 153 names['carda'] = main 154 155 return names 156