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