Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
36 kaklik 1
#written by John Hoffman
2
 
3
from ConnChoice import *
4
from wxPython.wx import *
5
from types import IntType, FloatType, StringType
6
from download_bt1 import defaults
7
from ConfigDir import ConfigDir
8
import sys,os
9
import socket
10
from parseargs import defaultargs
11
 
12
try:
13
    True
14
except:
15
    True = 1
16
    False = 0
17
 
18
try:
19
    wxFULL_REPAINT_ON_RESIZE
20
except:
21
    wxFULL_REPAINT_ON_RESIZE = 0        # fix for wx pre-2.5
22
 
23
if (sys.platform == 'win32'):
24
    _FONT = 9
25
else:
26
    _FONT = 10
27
 
28
def HexToColor(s):
29
    r,g,b = s.split(' ')
30
    return wxColour(red=int(r,16), green=int(g,16), blue=int(b,16))
31
 
32
def hex2(c):
33
    h = hex(c)[2:]
34
    if len(h) == 1:
35
        h = '0'+h
36
    return h
37
def ColorToHex(c):
38
    return hex2(c.Red()) + ' ' + hex2(c.Green()) + ' ' + hex2(c.Blue())
39
 
40
ratesettingslist = []
41
for x in connChoices:
42
    if not x.has_key('super-seed'):
43
        ratesettingslist.append(x['name'])
44
 
45
 
46
configFileDefaults = [
47
    #args only available for the gui client
48
    ('win32_taskbar_icon', 1,
49
         "whether to iconize do system try or not on win32"),
50
    ('gui_stretchwindow', 0,
51
         "whether to stretch the download status window to fit the torrent name"),
52
    ('gui_displaystats', 1,
53
         "whether to display statistics on peers and seeds"),
54
    ('gui_displaymiscstats', 1,
55
         "whether to display miscellaneous other statistics"),
56
    ('gui_ratesettingsdefault', ratesettingslist[0],
57
         "the default setting for maximum upload rate and users"),
58
    ('gui_ratesettingsmode', 'full',
59
         "what rate setting controls to display; options are 'none', 'basic', and 'full'"),
60
    ('gui_forcegreenonfirewall', 0,
61
         "forces the status icon to be green even if the client seems to be firewalled"),
62
    ('gui_default_savedir', '',
63
         "default save directory"),
64
    ('last_saved', '',       # hidden; not set in config
65
         "where the last torrent was saved"),
66
    ('gui_font', _FONT,
67
         "the font size to use"),
68
    ('gui_saveas_ask', -1,
69
         "whether to ask where to download to (0 = never, 1 = always, -1 = automatic resume"),
70
]
71
 
72
def setwxconfigfiledefaults():
73
    CHECKINGCOLOR = ColorToHex(wxSystemSettings_GetColour(wxSYS_COLOUR_3DSHADOW)) 	 
74
    DOWNLOADCOLOR = ColorToHex(wxSystemSettings_GetColour(wxSYS_COLOUR_ACTIVECAPTION))
75
 
76
    configFileDefaults.extend([
77
        ('gui_checkingcolor', CHECKINGCOLOR,
78
            "progress bar checking color"),
79
        ('gui_downloadcolor', DOWNLOADCOLOR,
80
            "progress bar downloading color"),
81
        ('gui_seedingcolor', '00 FF 00',
82
            "progress bar seeding color"),
83
    ])
84
 
85
defaultsToIgnore = ['responsefile', 'url', 'priority']
86
 
87
 
88
class configReader:
89
 
90
    def __init__(self):
91
        self.configfile = wxConfig("BitTorrent",style=wxCONFIG_USE_LOCAL_FILE)
92
        self.configMenuBox = None
93
        self.advancedMenuBox = None
94
        self._configReset = True         # run reset for the first time
95
 
96
        setwxconfigfiledefaults()
97
 
98
        defaults.extend(configFileDefaults)
99
        self.defaults = defaultargs(defaults)
100
 
101
        self.configDir = ConfigDir('gui')
102
        self.configDir.setDefaults(defaults,defaultsToIgnore)
103
        if self.configDir.checkConfig():
104
            self.config = self.configDir.loadConfig()
105
        else:
106
            self.config = self.configDir.getConfig()
107
            self.importOldGUIConfig()
108
            self.configDir.saveConfig()
109
 
110
        updated = False     # make all config default changes here
111
 
112
        if self.config['gui_ratesettingsdefault'] not in ratesettingslist:
113
            self.config['gui_ratesettingsdefault'] = (
114
                                self.defaults['gui_ratesettingsdefault'] )
115
            updated = True
116
        if self.config['ipv6_enabled'] and (
117
                        sys.version_info < (2,3) or not socket.has_ipv6 ):
118
            self.config['ipv6_enabled'] = 0
119
            updated = True
120
        for c in ['gui_checkingcolor','gui_downloadcolor','gui_seedingcolor']:
121
            try:
122
                HexToColor(self.config[c])
123
            except:
124
                self.config[c] = self.defaults[c]
125
                updated = True
126
 
127
        if updated:
128
            self.configDir.saveConfig()
129
 
130
        self.configDir.deleteOldCacheData(self.config['expire_cache_data'])
131
 
132
 
133
    def importOldGUIConfig(self):
134
        oldconfig = wxConfig("BitTorrent",style=wxCONFIG_USE_LOCAL_FILE)
135
        cont, s, i = oldconfig.GetFirstEntry()
136
        if not cont:
137
            oldconfig.DeleteAll()
138
            return False
139
        while cont:     # import old config data
140
            if self.config.has_key(s):
141
                t = oldconfig.GetEntryType(s)
142
                try:
143
                    if t == 1:
144
                        assert type(self.config[s]) == type('')
145
                        self.config[s] = oldconfig.Read(s)
146
                    elif t == 2 or t == 3:
147
                        assert type(self.config[s]) == type(1)
148
                        self.config[s] = int(oldconfig.ReadInt(s))
149
                    elif t == 4:
150
                        assert type(self.config[s]) == type(1.0)
151
                        self.config[s] = oldconfig.ReadFloat(s)
152
                except:
153
                    pass
154
            cont, s, i = oldconfig.GetNextEntry(i)
155
 
156
#        oldconfig.DeleteAll()
157
        return True
158
 
159
 
160
    def resetConfigDefaults(self):
161
        for p,v in self.defaults.items():
162
            if not p in defaultsToIgnore:
163
                self.config[p] = v
164
        self.configDir.saveConfig()
165
 
166
    def writeConfigFile(self):
167
        self.configDir.saveConfig()
168
 
169
    def WriteLastSaved(self, l):
170
        self.config['last_saved'] = l
171
        self.configDir.saveConfig()
172
 
173
 
174
    def getcheckingcolor(self):
175
        return HexToColor(self.config['gui_checkingcolor'])
176
    def getdownloadcolor(self):
177
        return HexToColor(self.config['gui_downloadcolor'])
178
    def getseedingcolor(self):
179
        return HexToColor(self.config['gui_seedingcolor'])
180
 
181
    def configReset(self):
182
        r = self._configReset
183
        self._configReset = False
184
        return r
185
 
186
    def getConfigDir(self):
187
        return self.configDir
188
 
189
    def getIconDir(self):
190
        return self.configDir.getIconDir()
191
 
192
    def getTorrentData(self,t):
193
        return self.configDir.getTorrentData(t)
194
 
195
    def setColorIcon(self, xxicon, xxiconptr, xxcolor):
196
        idata = wxMemoryDC()
197
        idata.SelectObject(xxicon)
198
        idata.SetBrush(wxBrush(xxcolor,wxSOLID))
199
        idata.DrawRectangle(0,0,16,16)
200
        idata.SelectObject(wxNullBitmap)
201
        xxiconptr.Refresh()
202
 
203
 
204
    def getColorFromUser(self, parent, colInit):
205
        data = wxColourData()
206
        if colInit.Ok():
207
            data.SetColour(colInit)
208
        data.SetCustomColour(0, self.checkingcolor)
209
        data.SetCustomColour(1, self.downloadcolor)
210
        data.SetCustomColour(2, self.seedingcolor)
211
        dlg = wxColourDialog(parent,data)
212
        if not dlg.ShowModal():
213
            return colInit
214
        return dlg.GetColourData().GetColour()
215
 
216
 
217
    def configMenu(self, parent):
218
      self.parent = parent
219
      try:
220
        self.FONT = self.config['gui_font']
221
        self.default_font = wxFont(self.FONT, wxDEFAULT, wxNORMAL, wxNORMAL, False)
222
        self.checkingcolor = HexToColor(self.config['gui_checkingcolor'])
223
        self.downloadcolor = HexToColor(self.config['gui_downloadcolor'])
224
        self.seedingcolor = HexToColor(self.config['gui_seedingcolor'])
225
 
226
        if (self.configMenuBox is not None):
227
            try:
228
                self.configMenuBox.Close()
229
            except wxPyDeadObjectError, e:
230
                self.configMenuBox = None
231
 
232
        self.configMenuBox = wxFrame(None, -1, 'BitTorrent Preferences', size = (1,1),
233
                            style = wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE)
234
        if (sys.platform == 'win32'):
235
            self.icon = self.parent.icon
236
            self.configMenuBox.SetIcon(self.icon)
237
 
238
        panel = wxPanel(self.configMenuBox, -1)
239
        self.panel = panel
240
 
241
        def StaticText(text, font = self.FONT, underline = False, color = None, panel = panel):
242
            x = wxStaticText(panel, -1, text, style = wxALIGN_LEFT)
243
            x.SetFont(wxFont(font, wxDEFAULT, wxNORMAL, wxNORMAL, underline))
244
            if color is not None:
245
                x.SetForegroundColour(color)
246
            return x
247
 
248
        colsizer = wxFlexGridSizer(cols = 1, vgap = 8)
249
 
250
        self.gui_stretchwindow_checkbox = wxCheckBox(panel, -1, "Stretch window to fit torrent name *")
251
        self.gui_stretchwindow_checkbox.SetFont(self.default_font)
252
        self.gui_stretchwindow_checkbox.SetValue(self.config['gui_stretchwindow'])
253
 
254
        self.gui_displaystats_checkbox = wxCheckBox(panel, -1, "Display peer and seed statistics")
255
        self.gui_displaystats_checkbox.SetFont(self.default_font)
256
        self.gui_displaystats_checkbox.SetValue(self.config['gui_displaystats'])
257
 
258
        self.gui_displaymiscstats_checkbox = wxCheckBox(panel, -1, "Display miscellaneous other statistics")
259
        self.gui_displaymiscstats_checkbox.SetFont(self.default_font)
260
        self.gui_displaymiscstats_checkbox.SetValue(self.config['gui_displaymiscstats'])
261
 
262
        self.security_checkbox = wxCheckBox(panel, -1, "Don't allow multiple connections from the same IP")
263
        self.security_checkbox.SetFont(self.default_font)
264
        self.security_checkbox.SetValue(self.config['security'])
265
 
266
        self.autokick_checkbox = wxCheckBox(panel, -1, "Kick/ban clients that send you bad data *")
267
        self.autokick_checkbox.SetFont(self.default_font)
268
        self.autokick_checkbox.SetValue(self.config['auto_kick'])
269
 
270
        self.buffering_checkbox = wxCheckBox(panel, -1, "Enable read/write buffering *")
271
        self.buffering_checkbox.SetFont(self.default_font)
272
        self.buffering_checkbox.SetValue(self.config['buffer_reads'])
273
 
274
        self.breakup_checkbox = wxCheckBox(panel, -1, "Break-up seed bitfield to foil ISP manipulation")
275
        self.breakup_checkbox.SetFont(self.default_font)
276
        self.breakup_checkbox.SetValue(self.config['breakup_seed_bitfield'])
277
 
278
        self.autoflush_checkbox = wxCheckBox(panel, -1, "Flush data to disk every 5 minutes")
279
        self.autoflush_checkbox.SetFont(self.default_font)
280
        self.autoflush_checkbox.SetValue(self.config['auto_flush'])
281
 
282
        if sys.version_info >= (2,3) and socket.has_ipv6:
283
            self.ipv6enabled_checkbox = wxCheckBox(panel, -1, "Initiate and receive connections via IPv6 *")
284
            self.ipv6enabled_checkbox.SetFont(self.default_font)
285
            self.ipv6enabled_checkbox.SetValue(self.config['ipv6_enabled'])
286
 
287
        self.gui_forcegreenonfirewall_checkbox = wxCheckBox(panel, -1,
288
                            "Force icon to display green when firewalled")
289
        self.gui_forcegreenonfirewall_checkbox.SetFont(self.default_font)
290
        self.gui_forcegreenonfirewall_checkbox.SetValue(self.config['gui_forcegreenonfirewall'])
291
 
292
 
293
        self.minport_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*8, -1))
294
        self.minport_data.SetFont(self.default_font)
295
        self.minport_data.SetRange(1,65535)
296
        self.minport_data.SetValue(self.config['minport'])
297
 
298
        self.maxport_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*8, -1))
299
        self.maxport_data.SetFont(self.default_font)
300
        self.maxport_data.SetRange(1,65535)
301
        self.maxport_data.SetValue(self.config['maxport'])
302
 
303
        self.randomport_checkbox = wxCheckBox(panel, -1, "randomize")
304
        self.randomport_checkbox.SetFont(self.default_font)
305
        self.randomport_checkbox.SetValue(self.config['random_port'])
306
 
307
        self.gui_font_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*5, -1))
308
        self.gui_font_data.SetFont(self.default_font)
309
        self.gui_font_data.SetRange(8,16)
310
        self.gui_font_data.SetValue(self.config['gui_font'])
311
 
312
        self.gui_ratesettingsdefault_data=wxChoice(panel, -1, choices = ratesettingslist)
313
        self.gui_ratesettingsdefault_data.SetFont(self.default_font)
314
        self.gui_ratesettingsdefault_data.SetStringSelection(self.config['gui_ratesettingsdefault'])
315
 
316
        self.maxdownload_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
317
        self.maxdownload_data.SetFont(self.default_font)
318
        self.maxdownload_data.SetRange(0,5000)
319
        self.maxdownload_data.SetValue(self.config['max_download_rate'])
320
 
321
        self.gui_ratesettingsmode_data=wxRadioBox(panel, -1, 'Rate Settings Mode',
322
                 choices = [ 'none', 'basic', 'full' ] )
323
        self.gui_ratesettingsmode_data.SetFont(self.default_font)
324
        self.gui_ratesettingsmode_data.SetStringSelection(self.config['gui_ratesettingsmode'])
325
 
326
        if (sys.platform == 'win32'):
327
            self.win32_taskbar_icon_checkbox = wxCheckBox(panel, -1, "Minimize to system tray")
328
            self.win32_taskbar_icon_checkbox.SetFont(self.default_font)
329
            self.win32_taskbar_icon_checkbox.SetValue(self.config['win32_taskbar_icon'])
330
 
331
#            self.upnp_checkbox = wxCheckBox(panel, -1, "Enable automatic UPnP port forwarding")
332
#            self.upnp_checkbox.SetFont(self.default_font)
333
#            self.upnp_checkbox.SetValue(self.config['upnp_nat_access'])
334
            self.upnp_data=wxChoice(panel, -1,
335
                        choices = ['disabled', 'type 1 (fast)', 'type 2 (slow)'])
336
            self.upnp_data.SetFont(self.default_font)
337
            self.upnp_data.SetSelection(self.config['upnp_nat_access'])
338
 
339
        self.gui_default_savedir_ctrl = wxTextCtrl(parent = panel, id = -1, 
340
                            value = self.config['gui_default_savedir'],        
341
                            size = (26*self.FONT, -1), style = wxTE_PROCESS_TAB)
342
        self.gui_default_savedir_ctrl.SetFont(self.default_font)
343
 
344
        self.gui_savemode_data=wxRadioBox(panel, -1, 'Ask where to save: *',
345
                 choices = [ 'always', 'never', 'auto-resume' ] )
346
        self.gui_savemode_data.SetFont(self.default_font)
347
        self.gui_savemode_data.SetSelection(1-self.config['gui_saveas_ask'])
348
 
349
        self.checkingcolor_icon = wxEmptyBitmap(16,16)
350
        self.checkingcolor_iconptr = wxStaticBitmap(panel, -1, self.checkingcolor_icon)
351
        self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, self.checkingcolor)
352
 
353
        self.downloadcolor_icon = wxEmptyBitmap(16,16)
354
        self.downloadcolor_iconptr = wxStaticBitmap(panel, -1, self.downloadcolor_icon)
355
        self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, self.downloadcolor)
356
 
357
        self.seedingcolor_icon = wxEmptyBitmap(16,16)
358
        self.seedingcolor_iconptr = wxStaticBitmap(panel, -1, self.seedingcolor_icon)
359
        self.setColorIcon(self.seedingcolor_icon, self.downloadcolor_iconptr, self.seedingcolor)
360
 
361
        rowsizer = wxFlexGridSizer(cols = 2, hgap = 20)
362
 
363
        block12sizer = wxFlexGridSizer(cols = 1, vgap = 7)
364
 
365
        block1sizer = wxFlexGridSizer(cols = 1, vgap = 2)
366
        if (sys.platform == 'win32'):
367
            block1sizer.Add(self.win32_taskbar_icon_checkbox)
368
#            block1sizer.Add(self.upnp_checkbox)
369
        block1sizer.Add(self.gui_stretchwindow_checkbox)
370
        block1sizer.Add(self.gui_displaystats_checkbox)
371
        block1sizer.Add(self.gui_displaymiscstats_checkbox)
372
        block1sizer.Add(self.security_checkbox)
373
        block1sizer.Add(self.autokick_checkbox)
374
        block1sizer.Add(self.buffering_checkbox)
375
        block1sizer.Add(self.breakup_checkbox)
376
        block1sizer.Add(self.autoflush_checkbox)
377
        if sys.version_info >= (2,3) and socket.has_ipv6:
378
            block1sizer.Add(self.ipv6enabled_checkbox)
379
        block1sizer.Add(self.gui_forcegreenonfirewall_checkbox)
380
 
381
        block12sizer.Add(block1sizer)
382
 
383
        colorsizer = wxStaticBoxSizer(wxStaticBox(panel, -1, "Gauge Colors:"), wxVERTICAL)
384
        colorsizer1 = wxFlexGridSizer(cols = 7)
385
        colorsizer1.Add(StaticText('           Checking: '), 1, wxALIGN_BOTTOM)
386
        colorsizer1.Add(self.checkingcolor_iconptr, 1, wxALIGN_BOTTOM)
387
        colorsizer1.Add(StaticText('   Downloading: '), 1, wxALIGN_BOTTOM)
388
        colorsizer1.Add(self.downloadcolor_iconptr, 1, wxALIGN_BOTTOM)
389
        colorsizer1.Add(StaticText('   Seeding: '), 1, wxALIGN_BOTTOM)
390
        colorsizer1.Add(self.seedingcolor_iconptr, 1, wxALIGN_BOTTOM)
391
        colorsizer1.Add(StaticText('  '))
392
        minsize = self.checkingcolor_iconptr.GetBestSize()
393
        minsize.SetHeight(minsize.GetHeight()+5)
394
        colorsizer1.SetMinSize(minsize)
395
        colorsizer.Add(colorsizer1)
396
 
397
        block12sizer.Add(colorsizer, 1, wxALIGN_LEFT)
398
 
399
        rowsizer.Add(block12sizer)
400
 
401
        block3sizer = wxFlexGridSizer(cols = 1)
402
 
403
        portsettingsSizer = wxStaticBoxSizer(wxStaticBox(panel, -1, "Port Range:*"), wxVERTICAL)
404
        portsettingsSizer1 = wxGridSizer(cols = 2, vgap = 1)
405
        portsettingsSizer1.Add(StaticText('From: '), 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT)
406
        portsettingsSizer1.Add(self.minport_data, 1, wxALIGN_BOTTOM)
407
        portsettingsSizer1.Add(StaticText('To: '), 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT)
408
        portsettingsSizer1.Add(self.maxport_data, 1, wxALIGN_BOTTOM)
409
        portsettingsSizer.Add(portsettingsSizer1)
410
        portsettingsSizer.Add(self.randomport_checkbox, 1, wxALIGN_CENTER)
411
        block3sizer.Add(portsettingsSizer, 1, wxALIGN_CENTER)
412
        block3sizer.Add(StaticText(' '))
413
        block3sizer.Add(self.gui_ratesettingsmode_data, 1, wxALIGN_CENTER)
414
        block3sizer.Add(StaticText(' '))
415
        ratesettingsSizer = wxFlexGridSizer(cols = 1, vgap = 2)
416
        ratesettingsSizer.Add(StaticText('Default Rate Setting: *'), 1, wxALIGN_CENTER)
417
        ratesettingsSizer.Add(self.gui_ratesettingsdefault_data, 1, wxALIGN_CENTER)
418
        block3sizer.Add(ratesettingsSizer, 1, wxALIGN_CENTER)
419
        if (sys.platform == 'win32'):
420
            block3sizer.Add(StaticText(' '))
421
            upnpSizer = wxFlexGridSizer(cols = 1, vgap = 2)
422
            upnpSizer.Add(StaticText('UPnP Port Forwarding: *'), 1, wxALIGN_CENTER)
423
            upnpSizer.Add(self.upnp_data, 1, wxALIGN_CENTER)
424
            block3sizer.Add(upnpSizer, 1, wxALIGN_CENTER)
425
 
426
        rowsizer.Add(block3sizer)
427
        colsizer.Add(rowsizer)
428
 
429
        block4sizer = wxFlexGridSizer(cols = 3, hgap = 15)        
430
        savepathsizer = wxFlexGridSizer(cols = 2, vgap = 1)
431
        savepathsizer.Add(StaticText('Default Save Path: *'))
432
        savepathsizer.Add(StaticText(' '))
433
        savepathsizer.Add(self.gui_default_savedir_ctrl, 1, wxEXPAND)
434
        savepathButton = wxButton(panel, -1, '...', size = (18,18))
435
#        savepathButton.SetFont(self.default_font)
436
        savepathsizer.Add(savepathButton, 0, wxALIGN_CENTER)
437
        savepathsizer.Add(self.gui_savemode_data, 0, wxALIGN_CENTER)
438
        block4sizer.Add(savepathsizer, -1, wxALIGN_BOTTOM)
439
 
440
        fontsizer = wxFlexGridSizer(cols = 1, vgap = 2)
441
        fontsizer.Add(StaticText(''))
442
        fontsizer.Add(StaticText('Font: *'), 1, wxALIGN_CENTER)
443
        fontsizer.Add(self.gui_font_data, 1, wxALIGN_CENTER)
444
        block4sizer.Add(fontsizer, 1, wxALIGN_CENTER_VERTICAL)
445
 
446
        dratesettingsSizer = wxFlexGridSizer(cols = 1, vgap = 2)
447
        dratesettingsSizer.Add(StaticText('Default Max'), 1, wxALIGN_CENTER)
448
        dratesettingsSizer.Add(StaticText('Download Rate'), 1, wxALIGN_CENTER)
449
        dratesettingsSizer.Add(StaticText('(kB/s): *'), 1, wxALIGN_CENTER)
450
        dratesettingsSizer.Add(self.maxdownload_data, 1, wxALIGN_CENTER)
451
        dratesettingsSizer.Add(StaticText('(0 = disabled)'), 1, wxALIGN_CENTER)
452
 
453
        block4sizer.Add(dratesettingsSizer, 1, wxALIGN_CENTER_VERTICAL)
454
 
455
        colsizer.Add(block4sizer, 0, wxALIGN_CENTER)
456
#        colsizer.Add(StaticText(' '))
457
 
458
        savesizer = wxGridSizer(cols = 4, hgap = 10)
459
        saveButton = wxButton(panel, -1, 'Save')
460
#        saveButton.SetFont(self.default_font)
461
        savesizer.Add(saveButton, 0, wxALIGN_CENTER)
462
 
463
        cancelButton = wxButton(panel, -1, 'Cancel')
464
#        cancelButton.SetFont(self.default_font)
465
        savesizer.Add(cancelButton, 0, wxALIGN_CENTER)
466
 
467
        defaultsButton = wxButton(panel, -1, 'Revert to Defaults')
468
#        defaultsButton.SetFont(self.default_font)
469
        savesizer.Add(defaultsButton, 0, wxALIGN_CENTER)
470
 
471
        advancedButton = wxButton(panel, -1, 'Advanced...')
472
#        advancedButton.SetFont(self.default_font)
473
        savesizer.Add(advancedButton, 0, wxALIGN_CENTER)
474
        colsizer.Add(savesizer, 1, wxALIGN_CENTER)
475
 
476
        resizewarningtext=StaticText('* These settings will not take effect until the next time you start BitTorrent', self.FONT-2)
477
        colsizer.Add(resizewarningtext, 1, wxALIGN_CENTER)
478
 
479
        border = wxBoxSizer(wxHORIZONTAL)
480
        border.Add(colsizer, 1, wxEXPAND | wxALL, 4)
481
 
482
        panel.SetSizer(border)
483
        panel.SetAutoLayout(True)
484
 
485
        self.advancedConfig = {}
486
 
487
        def setDefaults(evt, self = self):
488
          try:
489
            self.minport_data.SetValue(self.defaults['minport'])
490
            self.maxport_data.SetValue(self.defaults['maxport'])
491
            self.randomport_checkbox.SetValue(self.defaults['random_port'])
492
            self.gui_stretchwindow_checkbox.SetValue(self.defaults['gui_stretchwindow'])
493
            self.gui_displaystats_checkbox.SetValue(self.defaults['gui_displaystats'])
494
            self.gui_displaymiscstats_checkbox.SetValue(self.defaults['gui_displaymiscstats'])
495
            self.security_checkbox.SetValue(self.defaults['security'])
496
            self.autokick_checkbox.SetValue(self.defaults['auto_kick'])
497
            self.buffering_checkbox.SetValue(self.defaults['buffer_reads'])
498
            self.breakup_checkbox.SetValue(self.defaults['breakup_seed_bitfield'])
499
            self.autoflush_checkbox.SetValue(self.defaults['auto_flush'])
500
            if sys.version_info >= (2,3) and socket.has_ipv6:
501
                self.ipv6enabled_checkbox.SetValue(self.defaults['ipv6_enabled'])
502
            self.gui_forcegreenonfirewall_checkbox.SetValue(self.defaults['gui_forcegreenonfirewall'])
503
            self.gui_font_data.SetValue(self.defaults['gui_font'])
504
            self.gui_ratesettingsdefault_data.SetStringSelection(self.defaults['gui_ratesettingsdefault'])
505
            self.maxdownload_data.SetValue(self.defaults['max_download_rate'])
506
            self.gui_ratesettingsmode_data.SetStringSelection(self.defaults['gui_ratesettingsmode'])
507
            self.gui_default_savedir_ctrl.SetValue(self.defaults['gui_default_savedir'])
508
            self.gui_savemode_data.SetSelection(1-self.defaults['gui_saveas_ask'])
509
 
510
            self.checkingcolor = HexToColor(self.defaults['gui_checkingcolor'])
511
            self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, self.checkingcolor)
512
            self.downloadcolor = HexToColor(self.defaults['gui_downloadcolor'])
513
            self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, self.downloadcolor)
514
            self.seedingcolor = HexToColor(self.defaults['gui_seedingcolor'])
515
            self.setColorIcon(self.seedingcolor_icon, self.seedingcolor_iconptr, self.seedingcolor)
516
 
517
            if (sys.platform == 'win32'):
518
                self.win32_taskbar_icon_checkbox.SetValue(self.defaults['win32_taskbar_icon'])
519
#                self.upnp_checkbox.SetValue(self.defaults['upnp_nat_access'])
520
                self.upnp_data.SetSelection(self.defaults['upnp_nat_access'])
521
 
522
            # reset advanced too
523
            self.advancedConfig = {}
524
            for key in ['ip', 'bind', 'min_peers', 'max_initiate', 'display_interval',
525
        'alloc_type', 'alloc_rate', 'max_files_open', 'max_connections', 'super_seeder',
526
        'ipv6_binds_v4', 'double_check', 'triple_check', 'lock_files', 'lock_while_reading',
527
        'expire_cache_data']:
528
                self.advancedConfig[key] = self.defaults[key]
529
            self.CloseAdvanced()
530
          except:
531
            self.parent.exception()
532
 
533
 
534
        def saveConfigs(evt, self = self):
535
          try:
536
            self.config['gui_stretchwindow']=int(self.gui_stretchwindow_checkbox.GetValue())
537
            self.config['gui_displaystats']=int(self.gui_displaystats_checkbox.GetValue())
538
            self.config['gui_displaymiscstats']=int(self.gui_displaymiscstats_checkbox.GetValue())
539
            self.config['security']=int(self.security_checkbox.GetValue())
540
            self.config['auto_kick']=int(self.autokick_checkbox.GetValue())
541
            buffering=int(self.buffering_checkbox.GetValue())
542
            self.config['buffer_reads']=buffering
543
            if buffering:
544
                self.config['write_buffer_size']=self.defaults['write_buffer_size']
545
            else:
546
                self.config['write_buffer_size']=0
547
            self.config['breakup_seed_bitfield']=int(self.breakup_checkbox.GetValue())
548
            if self.autoflush_checkbox.GetValue():
549
                self.config['auto_flush']=5
550
            else:
551
                self.config['auto_flush']=0
552
            if sys.version_info >= (2,3) and socket.has_ipv6:
553
                self.config['ipv6_enabled']=int(self.ipv6enabled_checkbox.GetValue())
554
            self.config['gui_forcegreenonfirewall']=int(self.gui_forcegreenonfirewall_checkbox.GetValue())
555
            self.config['minport']=self.minport_data.GetValue()
556
            self.config['maxport']=self.maxport_data.GetValue()
557
            self.config['random_port']=int(self.randomport_checkbox.GetValue())
558
            self.config['gui_font']=self.gui_font_data.GetValue()
559
            self.config['gui_ratesettingsdefault']=self.gui_ratesettingsdefault_data.GetStringSelection()
560
            self.config['max_download_rate']=self.maxdownload_data.GetValue()
561
            self.config['gui_ratesettingsmode']=self.gui_ratesettingsmode_data.GetStringSelection()
562
            self.config['gui_default_savedir']=self.gui_default_savedir_ctrl.GetValue()
563
            self.config['gui_saveas_ask']=1-self.gui_savemode_data.GetSelection()
564
            self.config['gui_checkingcolor']=ColorToHex(self.checkingcolor)
565
            self.config['gui_downloadcolor']=ColorToHex(self.downloadcolor)
566
            self.config['gui_seedingcolor']=ColorToHex(self.seedingcolor)
567
 
568
            if (sys.platform == 'win32'):
569
                self.config['win32_taskbar_icon']=int(self.win32_taskbar_icon_checkbox.GetValue())
570
#                self.config['upnp_nat_access']=int(self.upnp_checkbox.GetValue())
571
                self.config['upnp_nat_access']=self.upnp_data.GetSelection()
572
 
573
            if self.advancedConfig:
574
                for key,val in self.advancedConfig.items():
575
                    self.config[key] = val
576
 
577
            self.writeConfigFile()
578
            self._configReset = True
579
            self.Close()
580
          except:
581
            self.parent.exception()
582
 
583
        def cancelConfigs(evt, self = self):
584
            self.Close()
585
 
586
        def savepath_set(evt, self = self):
587
          try:
588
            d = self.gui_default_savedir_ctrl.GetValue()
589
            if d == '':
590
                d = self.config['last_saved']
591
            dl = wxDirDialog(self.panel, 'Choose a default directory to save to', 
592
                d, style = wxDD_DEFAULT_STYLE | wxDD_NEW_DIR_BUTTON)
593
            if dl.ShowModal() == wxID_OK:
594
                self.gui_default_savedir_ctrl.SetValue(dl.GetPath())
595
          except:
596
            self.parent.exception()
597
 
598
        def checkingcoloricon_set(evt, self = self):
599
          try:
600
            newcolor = self.getColorFromUser(self.panel,self.checkingcolor)
601
            self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, newcolor)
602
            self.checkingcolor = newcolor
603
          except:
604
            self.parent.exception()
605
 
606
        def downloadcoloricon_set(evt, self = self):
607
          try:
608
            newcolor = self.getColorFromUser(self.panel,self.downloadcolor)
609
            self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, newcolor)
610
            self.downloadcolor = newcolor
611
          except:
612
            self.parent.exception()
613
 
614
        def seedingcoloricon_set(evt, self = self):
615
          try:
616
            newcolor = self.getColorFromUser(self.panel,self.seedingcolor)
617
            self.setColorIcon(self.seedingcolor_icon, self.seedingcolor_iconptr, newcolor)
618
            self.seedingcolor = newcolor
619
          except:
620
            self.parent.exception()
621
 
622
        EVT_BUTTON(self.configMenuBox, saveButton.GetId(), saveConfigs)
623
        EVT_BUTTON(self.configMenuBox, cancelButton.GetId(), cancelConfigs)
624
        EVT_BUTTON(self.configMenuBox, defaultsButton.GetId(), setDefaults)
625
        EVT_BUTTON(self.configMenuBox, advancedButton.GetId(), self.advancedMenu)
626
        EVT_BUTTON(self.configMenuBox, savepathButton.GetId(), savepath_set)
627
        EVT_LEFT_DOWN(self.checkingcolor_iconptr, checkingcoloricon_set)
628
        EVT_LEFT_DOWN(self.downloadcolor_iconptr, downloadcoloricon_set)
629
        EVT_LEFT_DOWN(self.seedingcolor_iconptr, seedingcoloricon_set)
630
 
631
        self.configMenuBox.Show ()
632
        border.Fit(panel)
633
        self.configMenuBox.Fit()
634
      except:
635
        self.parent.exception()
636
 
637
 
638
    def Close(self):
639
        self.CloseAdvanced()
640
        if self.configMenuBox is not None:
641
            try:
642
                self.configMenuBox.Close ()
643
            except wxPyDeadObjectError, e:
644
                pass
645
            self.configMenuBox = None
646
 
647
    def advancedMenu(self, event = None):
648
      try:
649
        if not self.advancedConfig:
650
            for key in ['ip', 'bind', 'min_peers', 'max_initiate', 'display_interval',
651
        'alloc_type', 'alloc_rate', 'max_files_open', 'max_connections', 'super_seeder',
652
        'ipv6_binds_v4', 'double_check', 'triple_check', 'lock_files', 'lock_while_reading',
653
        'expire_cache_data']:
654
                self.advancedConfig[key] = self.config[key]
655
 
656
        if (self.advancedMenuBox is not None):
657
            try:
658
                self.advancedMenuBox.Close ()
659
            except wxPyDeadObjectError, e:
660
                self.advancedMenuBox = None
661
 
662
        self.advancedMenuBox = wxFrame(None, -1, 'BitTorrent Advanced Preferences', size = (1,1),
663
                            style = wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE)
664
        if (sys.platform == 'win32'):
665
            self.advancedMenuBox.SetIcon(self.icon)
666
 
667
        panel = wxPanel(self.advancedMenuBox, -1)
668
#        self.panel = panel
669
 
670
        def StaticText(text, font = self.FONT, underline = False, color = None, panel = panel):
671
            x = wxStaticText(panel, -1, text, style = wxALIGN_LEFT)
672
            x.SetFont(wxFont(font, wxDEFAULT, wxNORMAL, wxNORMAL, underline))
673
            if color is not None:
674
                x.SetForegroundColour(color)
675
            return x
676
 
677
        colsizer = wxFlexGridSizer(cols = 1, hgap = 13, vgap = 13)
678
        warningtext = StaticText('CHANGE THESE SETTINGS AT YOUR OWN RISK', self.FONT+4, True, 'Red')
679
        colsizer.Add(warningtext, 1, wxALIGN_CENTER)
680
 
681
        self.ip_data = wxTextCtrl(parent = panel, id = -1, 
682
                    value = self.advancedConfig['ip'],
683
                    size = (self.FONT*13, int(self.FONT*2.2)), style = wxTE_PROCESS_TAB)
684
        self.ip_data.SetFont(self.default_font)
685
 
686
        self.bind_data = wxTextCtrl(parent = panel, id = -1, 
687
                    value = self.advancedConfig['bind'],
688
                    size = (self.FONT*13, int(self.FONT*2.2)), style = wxTE_PROCESS_TAB)
689
        self.bind_data.SetFont(self.default_font)
690
 
691
        if sys.version_info >= (2,3) and socket.has_ipv6:
692
            self.ipv6bindsv4_data=wxChoice(panel, -1,
693
                             choices = ['separate sockets', 'single socket'])
694
            self.ipv6bindsv4_data.SetFont(self.default_font)
695
            self.ipv6bindsv4_data.SetSelection(self.advancedConfig['ipv6_binds_v4'])
696
 
697
        self.minpeers_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
698
        self.minpeers_data.SetFont(self.default_font)
699
        self.minpeers_data.SetRange(10,100)
700
        self.minpeers_data.SetValue(self.advancedConfig['min_peers'])
701
        # max_initiate = 2*minpeers
702
 
703
        self.displayinterval_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
704
        self.displayinterval_data.SetFont(self.default_font)
705
        self.displayinterval_data.SetRange(100,2000)
706
        self.displayinterval_data.SetValue(int(self.advancedConfig['display_interval']*1000))
707
 
708
        self.alloctype_data=wxChoice(panel, -1,
709
                         choices = ['normal', 'background', 'pre-allocate', 'sparse'])
710
        self.alloctype_data.SetFont(self.default_font)
711
        self.alloctype_data.SetStringSelection(self.advancedConfig['alloc_type'])
712
 
713
        self.allocrate_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7,-1))
714
        self.allocrate_data.SetFont(self.default_font)
715
        self.allocrate_data.SetRange(1,100)
716
        self.allocrate_data.SetValue(int(self.advancedConfig['alloc_rate']))
717
 
718
        self.locking_data=wxChoice(panel, -1,
719
                           choices = ['no locking', 'lock while writing', 'lock always'])
720
        self.locking_data.SetFont(self.default_font)
721
        if self.advancedConfig['lock_files']:
722
            if self.advancedConfig['lock_while_reading']:
723
                self.locking_data.SetSelection(2)
724
            else:
725
                self.locking_data.SetSelection(1)
726
        else:
727
            self.locking_data.SetSelection(0)
728
 
729
        self.doublecheck_data=wxChoice(panel, -1,
730
                           choices = ['no extra checking', 'double-check', 'triple-check'])
731
        self.doublecheck_data.SetFont(self.default_font)
732
        if self.advancedConfig['double_check']:
733
            if self.advancedConfig['triple_check']:
734
                self.doublecheck_data.SetSelection(2)
735
            else:
736
                self.doublecheck_data.SetSelection(1)
737
        else:
738
            self.doublecheck_data.SetSelection(0)
739
 
740
        self.maxfilesopen_choices = ['50', '100', '200', 'no limit ']
741
        self.maxfilesopen_data=wxChoice(panel, -1, choices = self.maxfilesopen_choices)
742
        self.maxfilesopen_data.SetFont(self.default_font)
743
        setval = self.advancedConfig['max_files_open']
744
        if setval == 0:
745
            setval = 'no limit '
746
        else:
747
            setval = str(setval)
748
        if not setval in self.maxfilesopen_choices:
749
            setval = self.maxfilesopen_choices[0]
750
        self.maxfilesopen_data.SetStringSelection(setval)
751
 
752
        self.maxconnections_choices = ['no limit ', '20', '30', '40', '50', '60', '100', '200']
753
        self.maxconnections_data=wxChoice(panel, -1, choices = self.maxconnections_choices)
754
        self.maxconnections_data.SetFont(self.default_font)
755
        setval = self.advancedConfig['max_connections']
756
        if setval == 0:
757
            setval = 'no limit '
758
        else:
759
            setval = str(setval)
760
        if not setval in self.maxconnections_choices:
761
            setval = self.maxconnections_choices[0]
762
        self.maxconnections_data.SetStringSelection(setval)
763
 
764
        self.superseeder_data=wxChoice(panel, -1,
765
                         choices = ['normal', 'super-seed'])
766
        self.superseeder_data.SetFont(self.default_font)
767
        self.superseeder_data.SetSelection(self.advancedConfig['super_seeder'])
768
 
769
        self.expirecache_choices = ['never ', '3', '5', '7', '10', '15', '30', '60', '90']
770
        self.expirecache_data=wxChoice(panel, -1, choices = self.expirecache_choices)
771
        setval = self.advancedConfig['expire_cache_data']
772
        if setval == 0:
773
            setval = 'never '
774
        else:
775
            setval = str(setval)
776
        if not setval in self.expirecache_choices:
777
            setval = self.expirecache_choices[0]
778
        self.expirecache_data.SetFont(self.default_font)
779
        self.expirecache_data.SetStringSelection(setval)
780
 
781
 
782
        twocolsizer = wxFlexGridSizer(cols = 2, hgap = 20)
783
        datasizer = wxFlexGridSizer(cols = 2, vgap = 2)
784
        datasizer.Add(StaticText('Local IP: '), 1, wxALIGN_CENTER_VERTICAL)
785
        datasizer.Add(self.ip_data)
786
        datasizer.Add(StaticText('IP to bind to: '), 1, wxALIGN_CENTER_VERTICAL)
787
        datasizer.Add(self.bind_data)
788
        if sys.version_info >= (2,3) and socket.has_ipv6:
789
            datasizer.Add(StaticText('IPv6 socket handling: '), 1, wxALIGN_CENTER_VERTICAL)
790
            datasizer.Add(self.ipv6bindsv4_data)
791
        datasizer.Add(StaticText('Minimum number of peers: '), 1, wxALIGN_CENTER_VERTICAL)
792
        datasizer.Add(self.minpeers_data)
793
        datasizer.Add(StaticText('Display interval (ms): '), 1, wxALIGN_CENTER_VERTICAL)
794
        datasizer.Add(self.displayinterval_data)
795
        datasizer.Add(StaticText('Disk allocation type:'), 1, wxALIGN_CENTER_VERTICAL)
796
        datasizer.Add(self.alloctype_data)
797
        datasizer.Add(StaticText('Allocation rate (MiB/s):'), 1, wxALIGN_CENTER_VERTICAL)
798
        datasizer.Add(self.allocrate_data)
799
        datasizer.Add(StaticText('File locking:'), 1, wxALIGN_CENTER_VERTICAL)
800
        datasizer.Add(self.locking_data)
801
        datasizer.Add(StaticText('Extra data checking:'), 1, wxALIGN_CENTER_VERTICAL)
802
        datasizer.Add(self.doublecheck_data)
803
        datasizer.Add(StaticText('Max files open:'), 1, wxALIGN_CENTER_VERTICAL)
804
        datasizer.Add(self.maxfilesopen_data)
805
        datasizer.Add(StaticText('Max peer connections:'), 1, wxALIGN_CENTER_VERTICAL)
806
        datasizer.Add(self.maxconnections_data)
807
        datasizer.Add(StaticText('Default seeding mode:'), 1, wxALIGN_CENTER_VERTICAL)
808
        datasizer.Add(self.superseeder_data)
809
        datasizer.Add(StaticText('Expire resume data(days):'), 1, wxALIGN_CENTER_VERTICAL)
810
        datasizer.Add(self.expirecache_data)
811
 
812
        twocolsizer.Add(datasizer)
813
 
814
        infosizer = wxFlexGridSizer(cols = 1)
815
        self.hinttext = StaticText('', self.FONT, False, 'Blue')
816
        infosizer.Add(self.hinttext, 1, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL)
817
        infosizer.SetMinSize((180,100))
818
        twocolsizer.Add(infosizer, 1, wxEXPAND)
819
 
820
        colsizer.Add(twocolsizer)
821
 
822
        savesizer = wxGridSizer(cols = 3, hgap = 20)
823
        okButton = wxButton(panel, -1, 'OK')
824
#        okButton.SetFont(self.default_font)
825
        savesizer.Add(okButton, 0, wxALIGN_CENTER)
826
 
827
        cancelButton = wxButton(panel, -1, 'Cancel')
828
#        cancelButton.SetFont(self.default_font)
829
        savesizer.Add(cancelButton, 0, wxALIGN_CENTER)
830
 
831
        defaultsButton = wxButton(panel, -1, 'Revert to Defaults')
832
#        defaultsButton.SetFont(self.default_font)
833
        savesizer.Add(defaultsButton, 0, wxALIGN_CENTER)
834
        colsizer.Add(savesizer, 1, wxALIGN_CENTER)
835
 
836
        resizewarningtext=StaticText('None of these settings will take effect until the next time you start BitTorrent', self.FONT-2)
837
        colsizer.Add(resizewarningtext, 1, wxALIGN_CENTER)
838
 
839
        border = wxBoxSizer(wxHORIZONTAL)
840
        border.Add(colsizer, 1, wxEXPAND | wxALL, 4)
841
 
842
        panel.SetSizer(border)
843
        panel.SetAutoLayout(True)
844
 
845
        def setDefaults(evt, self = self):
846
          try:
847
            self.ip_data.SetValue(self.defaults['ip'])
848
            self.bind_data.SetValue(self.defaults['bind'])
849
            if sys.version_info >= (2,3) and socket.has_ipv6:
850
                self.ipv6bindsv4_data.SetSelection(self.defaults['ipv6_binds_v4'])
851
            self.minpeers_data.SetValue(self.defaults['min_peers'])
852
            self.displayinterval_data.SetValue(int(self.defaults['display_interval']*1000))
853
            self.alloctype_data.SetStringSelection(self.defaults['alloc_type'])
854
            self.allocrate_data.SetValue(int(self.defaults['alloc_rate']))
855
            if self.defaults['lock_files']:
856
                if self.defaults['lock_while_reading']:
857
                    self.locking_data.SetSelection(2)
858
                else:
859
                    self.locking_data.SetSelection(1)
860
            else:
861
                self.locking_data.SetSelection(0)
862
            if self.defaults['double_check']:
863
                if self.defaults['triple_check']:
864
                    self.doublecheck_data.SetSelection(2)
865
                else:
866
                    self.doublecheck_data.SetSelection(1)
867
            else:
868
                self.doublecheck_data.SetSelection(0)
869
            setval = self.defaults['max_files_open']
870
            if setval == 0:
871
                setval = 'no limit '
872
            else:
873
                setval = str(setval)
874
            if not setval in self.maxfilesopen_choices:
875
                setval = self.maxfilesopen_choices[0]
876
            self.maxfilesopen_data.SetStringSelection(setval)
877
            setval = self.defaults['max_connections']
878
            if setval == 0:
879
                setval = 'no limit '
880
            else:
881
                setval = str(setval)
882
            if not setval in self.maxconnections_choices:
883
                setval = self.maxconnections_choices[0]
884
            self.maxconnections_data.SetStringSelection(setval)
885
            self.superseeder_data.SetSelection(int(self.defaults['super_seeder']))
886
            setval = self.defaults['expire_cache_data']
887
            if setval == 0:
888
                setval = 'never '
889
            else:
890
                setval = str(setval)
891
            if not setval in self.expirecache_choices:
892
                setval = self.expirecache_choices[0]
893
            self.expirecache_data.SetStringSelection(setval)
894
          except:
895
            self.parent.exception()
896
 
897
        def saveConfigs(evt, self = self):
898
          try:
899
            self.advancedConfig['ip'] = self.ip_data.GetValue()
900
            self.advancedConfig['bind'] = self.bind_data.GetValue()
901
            if sys.version_info >= (2,3) and socket.has_ipv6:
902
                self.advancedConfig['ipv6_binds_v4'] = self.ipv6bindsv4_data.GetSelection()
903
            self.advancedConfig['min_peers'] = self.minpeers_data.GetValue()
904
            self.advancedConfig['display_interval'] = float(self.displayinterval_data.GetValue())/1000
905
            self.advancedConfig['alloc_type'] = self.alloctype_data.GetStringSelection()
906
            self.advancedConfig['alloc_rate'] = float(self.allocrate_data.GetValue())
907
            self.advancedConfig['lock_files'] = int(self.locking_data.GetSelection() >= 1)
908
            self.advancedConfig['lock_while_reading'] = int(self.locking_data.GetSelection() > 1)
909
            self.advancedConfig['double_check'] = int(self.doublecheck_data.GetSelection() >= 1)
910
            self.advancedConfig['triple_check'] = int(self.doublecheck_data.GetSelection() > 1)
911
            try:
912
                self.advancedConfig['max_files_open'] = int(self.maxfilesopen_data.GetStringSelection())
913
            except:       # if it ain't a number, it must be "no limit"
914
                self.advancedConfig['max_files_open'] = 0
915
            try:
916
                self.advancedConfig['max_connections'] = int(self.maxconnections_data.GetStringSelection())
917
                self.advancedConfig['max_initiate'] = min(
918
                    2*self.advancedConfig['min_peers'], self.advancedConfig['max_connections'])
919
            except:       # if it ain't a number, it must be "no limit"
920
                self.advancedConfig['max_connections'] = 0
921
                self.advancedConfig['max_initiate'] = 2*self.advancedConfig['min_peers']
922
            self.advancedConfig['super_seeder']=int(self.superseeder_data.GetSelection())
923
            try:
924
                self.advancedConfig['expire_cache_data'] = int(self.expirecache_data.GetStringSelection())
925
            except:
926
                self.advancedConfig['expire_cache_data'] = 0
927
            self.advancedMenuBox.Close()
928
          except:
929
            self.parent.exception()
930
 
931
        def cancelConfigs(evt, self = self):            
932
            self.advancedMenuBox.Close()
933
 
934
        def ip_hint(evt, self = self):
935
            self.hinttext.SetLabel('\n\n\nThe IP reported to the tracker.\n' +
936
                                  'unless the tracker is on the\n' +
937
                                  'same intranet as this client,\n' +
938
                                  'the tracker will autodetect the\n' +
939
                                  "client's IP and ignore this\n" +
940
                                  "value.")
941
 
942
        def bind_hint(evt, self = self):
943
            self.hinttext.SetLabel('\n\n\nThe IP the client will bind to.\n' +
944
                                  'Only useful if your machine is\n' +
945
                                  'directly handling multiple IPs.\n' +
946
                                  "If you don't know what this is,\n" +
947
                                  "leave it blank.")
948
 
949
        def ipv6bindsv4_hint(evt, self = self):
950
            self.hinttext.SetLabel('\n\n\nCertain operating systems will\n' +
951
                                  'open IPv4 protocol connections on\n' +
952
                                  'an IPv6 socket; others require you\n' +
953
                                  "to open two sockets on the same\n" +
954
                                  "port, one IPv4 and one IPv6.")
955
 
956
        def minpeers_hint(evt, self = self):
957
            self.hinttext.SetLabel('\n\n\nThe minimum number of peers the\n' +
958
                                  'client tries to stay connected\n' +
959
                                  'with.  Do not set this higher\n' +
960
                                  'unless you have a very fast\n' +
961
                                  "connection and a lot of system\n" +
962
                                  "resources.")
963
 
964
        def displayinterval_hint(evt, self = self):
965
            self.hinttext.SetLabel('\n\n\nHow often to update the\n' +
966
                                  'graphical display, in 1/1000s\n' +
967
                                  'of a second. Setting this too low\n' +
968
                                  "will strain your computer's\n" +
969
                                  "processor and video access.")
970
 
971
        def alloctype_hint(evt, self = self):
972
            self.hinttext.SetLabel('\n\nHow to allocate disk space.\n' +
973
                                  'normal allocates space as data is\n' +
974
                                  'received, background also adds\n' +
975
                                  "space in the background, pre-\n" +
976
                                  "allocate reserves up front, and\n" +
977
                                  'sparse is only for filesystems\n' +
978
                                  'that support it by default.')
979
 
980
        def allocrate_hint(evt, self = self):
981
            self.hinttext.SetLabel('\n\n\nAt what rate to allocate disk\n' +
982
                                  'space when allocating in the\n' +
983
                                  'background.  Set this too high on a\n' +
984
                                  "slow filesystem and your download\n" +
985
                                  "will slow to a crawl.")
986
 
987
        def locking_hint(evt, self = self):
988
            self.hinttext.SetLabel('\n\n\n\nFile locking prevents other\n' +
989
                                  'programs (including other instances\n' +
990
                                  'of BitTorrent) from accessing files\n' +
991
                                  "you are downloading.")
992
 
993
        def doublecheck_hint(evt, self = self):
994
            self.hinttext.SetLabel('\n\n\nHow much extra checking to do\n' +
995
                                  'making sure no data is corrupted.\n' +
996
                                  'Double-check mode uses more CPU,\n' +
997
                                  "while triple-check mode increases\n" +
998
                                  "disk accesses.")
999
 
1000
        def maxfilesopen_hint(evt, self = self):
1001
            self.hinttext.SetLabel('\n\n\nThe maximum number of files to\n' +
1002
                                  'keep open at the same time.  Zero\n' +
1003
                                  'means no limit.  Please note that\n' +
1004
                                  "if this option is in effect,\n" +
1005
                                  "files are not guaranteed to be\n" +
1006
                                  "locked.")
1007
 
1008
        def maxconnections_hint(evt, self = self):
1009
            self.hinttext.SetLabel('\n\nSome operating systems, most\n' +
1010
                                  'notably Windows 9x/ME combined\n' +
1011
                                  'with certain network drivers,\n' +
1012
                                  "cannot handle more than a certain\n" +
1013
                                  "number of open ports.  If the\n" +
1014
                                  "client freezes, try setting this\n" +
1015
                                  "to 60 or below.")
1016
 
1017
        def superseeder_hint(evt, self = self):
1018
            self.hinttext.SetLabel('\n\nThe "super-seed" method allows\n' +
1019
                                  'a single source to more efficiently\n' +
1020
                                  'seed a large torrent, but is not\n' +
1021
                                  "necessary in a well-seeded torrent,\n" +
1022
                                  "and causes problems with statistics.\n" +
1023
                                  "Unless you routinely seed torrents\n" +
1024
                                  "you can enable this by selecting\n" +
1025
                                  '"SUPER-SEED" for connection type.\n' +
1026
                                  '(once enabled it does not turn off.)')
1027
 
1028
        def expirecache_hint(evt, self = self):
1029
            self.hinttext.SetLabel('\n\nThe client stores temporary data\n' +
1030
                                  'in order to handle downloading only\n' +
1031
                                  'specific files from the torrent and\n' +
1032
                                  "so it can resume downloads more\n" +
1033
                                  "quickly.  This sets how long the\n" +
1034
                                  "client will keep this data before\n" +
1035
                                  "deleting it to free disk space.")
1036
 
1037
        EVT_BUTTON(self.advancedMenuBox, okButton.GetId(), saveConfigs)
1038
        EVT_BUTTON(self.advancedMenuBox, cancelButton.GetId(), cancelConfigs)
1039
        EVT_BUTTON(self.advancedMenuBox, defaultsButton.GetId(), setDefaults)
1040
        EVT_ENTER_WINDOW(self.ip_data, ip_hint)
1041
        EVT_ENTER_WINDOW(self.bind_data, bind_hint)
1042
        if sys.version_info >= (2,3) and socket.has_ipv6:
1043
            EVT_ENTER_WINDOW(self.ipv6bindsv4_data, ipv6bindsv4_hint)
1044
        EVT_ENTER_WINDOW(self.minpeers_data, minpeers_hint)
1045
        EVT_ENTER_WINDOW(self.displayinterval_data, displayinterval_hint)
1046
        EVT_ENTER_WINDOW(self.alloctype_data, alloctype_hint)
1047
        EVT_ENTER_WINDOW(self.allocrate_data, allocrate_hint)
1048
        EVT_ENTER_WINDOW(self.locking_data, locking_hint)
1049
        EVT_ENTER_WINDOW(self.doublecheck_data, doublecheck_hint)
1050
        EVT_ENTER_WINDOW(self.maxfilesopen_data, maxfilesopen_hint)
1051
        EVT_ENTER_WINDOW(self.maxconnections_data, maxconnections_hint)
1052
        EVT_ENTER_WINDOW(self.superseeder_data, superseeder_hint)
1053
        EVT_ENTER_WINDOW(self.expirecache_data, expirecache_hint)
1054
 
1055
        self.advancedMenuBox.Show ()
1056
        border.Fit(panel)
1057
        self.advancedMenuBox.Fit()
1058
      except:
1059
        self.parent.exception()
1060
 
1061
 
1062
    def CloseAdvanced(self):
1063
        if self.advancedMenuBox is not None:
1064
            try:
1065
                self.advancedMenuBox.Close()
1066
            except wxPyDeadObjectError, e:
1067
                self.advancedMenuBox = None
1068