+++ /dev/null
-#!/usr/bin/python\r
-\r
-#########################################################################\r
-#\r
-# Author : Choopan RATTANAPOKA, Jie Yang, Arno Bakker\r
-#\r
-# Description : Main ABC [Yet Another Bittorrent Client] python script.\r
-# you can run from source code by using\r
-# >python abc.py\r
-# need Python, WxPython in order to run from source code.\r
-#########################################################################\r
-\r
-# Arno: M2Crypto overrides the method for https:// in the\r
-# standard Python libraries. This causes msnlib to fail and makes Tribler\r
-# freakout when "http://www.tribler.org/version" is redirected to\r
-# "https://www.tribler.org/version/" (which happened during our website\r
-# changeover) Until M2Crypto 0.16 is patched I'll restore the method to the\r
-# original, as follows.\r
-#\r
-# This must be done in the first python file that is started.\r
-#\r
-\r
-import urllib\r
-original_open_https = urllib.URLopener.open_https\r
-import M2Crypto\r
-urllib.URLopener.open_https = original_open_https\r
-\r
-import sys, locale\r
-import os\r
-import wx, commands\r
-from wx import xrc\r
-#import hotshot\r
-\r
-if sys.platform == "darwin":\r
- # on Mac, we can only load VLC libraries\r
- # relative to the location of tribler.py\r
- os.chdir(os.path.abspath(os.path.dirname(sys.argv[0])))\r
-\r
-from threading import Thread, Timer, Event,currentThread,enumerate\r
-from time import time, ctime, sleep\r
-from traceback import print_exc, print_stack\r
-from cStringIO import StringIO\r
-import urllib\r
-\r
-from interconn import ServerListener, ClientPassParam\r
-from launchmanycore import ABCLaunchMany\r
-\r
-from ABC.Toolbars.toolbars import ABCBottomBar2, ABCStatusBar, ABCMenuBar, ABCToolBar\r
-from ABC.GUI.menu import ABCMenu\r
-from ABC.Scheduler.scheduler import ABCScheduler\r
-\r
-from webservice import WebListener\r
-\r
-if (sys.platform == 'win32'):\r
- from Dialogs.regdialog import RegCheckDialog\r
-\r
-from ABC.GUI.list import ManagedList\r
-from Utility.utility import Utility\r
-from Utility.constants import * #IGNORE:W0611\r
-\r
-from Tribler.__init__ import tribler_init, tribler_done\r
-from BitTornado.__init__ import product_name\r
-from safeguiupdate import DelayedInvocation,FlaglessDelayedInvocation\r
-import webbrowser\r
-from Tribler.Dialogs.MugshotManager import MugshotManager\r
-from Tribler.vwxGUI.GuiUtility import GUIUtility\r
-import Tribler.vwxGUI.updateXRC as updateXRC\r
-from Tribler.Video.VideoPlayer import VideoPlayer,return_feasible_playback_modes,PLAYBACKMODE_INTERNAL\r
-from Tribler.Video.VideoServer import VideoHTTPServer\r
-from Tribler.Dialogs.GUIServer import GUIServer\r
-from Tribler.vwxGUI.TasteHeart import set_tasteheart_bitmaps\r
-from Tribler.vwxGUI.perfBar import set_perfBar_bitmaps\r
-from Tribler.Dialogs.BandwidthSelector import BandwidthSelector\r
-from Tribler.Subscriptions.rss_client import TorrentFeedThread\r
-from Tribler.Dialogs.activities import *\r
-from Tribler.DecentralizedTracking import mainlineDHT\r
-from Tribler.DecentralizedTracking.rsconvert import RawServerConverter\r
-from Tribler.DecentralizedTracking.mainlineDHTChecker import mainlineDHTChecker\r
-\r
-from Tribler.notification import init as notification_init\r
-from Tribler.vwxGUI.font import *\r
-from Tribler.Web2.util.update import Web2Updater\r
-\r
-from Tribler.CacheDB.CacheDBHandler import BarterCastDBHandler\r
-from Tribler.Overlay.permid import permid_for_user\r
-from BitTornado.download_bt1 import EVIL\r
-\r
-DEBUG = False\r
-ALLOW_MULTIPLE = False\r
-start_time = 0\r
-start_time2 = 0\r
-\r
-\r
-################################################################\r
-#\r
-# Class: FileDropTarget\r
-#\r
-# To enable drag and drop for ABC list in main menu\r
-#\r
-################################################################\r
-class FileDropTarget(wx.FileDropTarget): \r
- def __init__(self, utility):\r
- # Initialize the wsFileDropTarget Object \r
- wx.FileDropTarget.__init__(self) \r
- # Store the Object Reference for dropped files \r
- self.utility = utility\r
- \r
- def OnDropFiles(self, x, y, filenames):\r
- for filename in filenames:\r
- self.utility.queue.addtorrents.AddTorrentFromFile(filename)\r
- return True\r
-\r
-\r
-##############################################################\r
-#\r
-# Class : ABCList\r
-#\r
-# ABC List class that contains the torrent list\r
-#\r
-############################################################## \r
-class ABCList(ManagedList):\r
- def __init__(self, parent):\r
- style = wx.LC_REPORT|wx.LC_VRULES|wx.CLIP_CHILDREN\r
- \r
- prefix = 'column'\r
- minid = 4\r
- maxid = 26\r
- exclude = []\r
- rightalign = [COL_PROGRESS, \r
- COL_SIZE, \r
- COL_DLSPEED, \r
- COL_ULSPEED, \r
- COL_RATIO, \r
- COL_PEERPROGRESS, \r
- COL_DLSIZE, \r
- COL_ULSIZE, \r
- COL_TOTALSPEED]\r
-\r
- ManagedList.__init__(self, parent, style, prefix, minid, maxid, exclude, rightalign)\r
- \r
- dragdroplist = FileDropTarget(self.utility)\r
- self.SetDropTarget(dragdroplist)\r
- \r
- self.lastcolumnsorted = -1\r
- self.reversesort = 0\r
-\r
- self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)\r
- self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColLeftClick)\r
-\r
- self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.OnItemSelected)\r
- \r
- # Bring up advanced details on left double click\r
- self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)\r
- \r
- # Bring up local settings on middle double click\r
- self.Bind(wx.EVT_MIDDLE_DCLICK, self.utility.actions[ACTION_LOCALUPLOAD].action)\r
-\r
- # Do thing when keys are pressed down\r
- def OnKeyDown(self, event):\r
- keycode = event.GetKeyCode()\r
- if event.CmdDown():\r
- if keycode == ord('a') or keycode == ord('A'):\r
- # Select all files (CTRL-A)\r
- self.selectAll()\r
- elif keycode == ord('x') or keycode == ord('X'):\r
- # Invert file selection (CTRL-X)\r
- self.invertSelection()\r
- elif keycode == wx.WXK_RETURN or keycode == wx.WXK_NUMPAD_ENTER:\r
- # Open advanced details (Enter)\r
- self.utility.actions[ACTION_DETAILS].action()\r
- elif keycode == wx.WXK_SPACE:\r
- # Open local settings (Space)\r
- self.utility.actions[ACTION_LOCALUPLOAD].action()\r
- elif keycode == 399:\r
- # Open right-click menu (windows menu key)\r
- self.OnItemSelected()\r
- \r
- event.Skip()\r
- \r
- def OnColLeftClick(self, event):\r
- rank = event.GetColumn()\r
- colid = self.columns.getIDfromRank(rank)\r
- if colid == self.lastcolumnsorted:\r
- self.reversesort = 1 - self.reversesort\r
- else:\r
- self.reversesort = 0\r
- self.lastcolumnsorted = colid\r
- self.utility.queue.sortList(colid, self.reversesort) \r
- \r
- def selectAll(self):\r
- self.updateSelected(select = range(0, self.GetItemCount()))\r
-\r
- def updateSelected(self, unselect = None, select = None):\r
- if unselect is not None:\r
- for index in unselect:\r
- self.SetItemState(index, 0, wx.LIST_STATE_SELECTED)\r
- if select is not None:\r
- for index in select:\r
- self.Select(index)\r
- self.SetFocus()\r
-\r
- def getTorrentSelected(self, firstitemonly = False, reverse = False):\r
- queue = self.utility.queue\r
- \r
- torrentselected = []\r
- for index in self.getSelected(firstitemonly, reverse):\r
- ABCTorrentTemp = queue.getABCTorrent(index = index)\r
- if ABCTorrentTemp is not None:\r
- torrentselected.append(ABCTorrentTemp)\r
- return torrentselected\r
-\r
- def OnItemSelected(self, event = None):\r
- selected = self.getTorrentSelected()\r
- if not selected:\r
- return\r
-\r
- popupmenu = ABCMenu(self.utility, 'menu_listrightclick')\r
-\r
- # Popup the menu. If an item is selected then its handler\r
- # will be called before PopupMenu returns.\r
- if event is None:\r
- # use the position of the first selected item (key event)\r
- ABCTorrentTemp = selected[0]\r
- position = self.GetItemPosition(ABCTorrentTemp.listindex)\r
- else:\r
- # use the cursor position (mouse event)\r
- position = event.GetPosition()\r
- \r
- self.PopupMenu(popupmenu, position)\r
-\r
- def OnLeftDClick(self, event):\r
- event.Skip()\r
- try:\r
- self.utility.actions[ACTION_DETAILS].action()\r
- except:\r
- print_exc()\r
-\r
-\r
-##############################################################\r
-#\r
-# Class : ABCPanel\r
-#\r
-# Main ABC Panel class\r
-#\r
-############################################################## \r
-class ABCPanel(wx.Panel):\r
- def __init__(self, parent):\r
- style = wx.CLIP_CHILDREN\r
- wx.Panel.__init__(self, parent, -1, style = style)\r
-\r
- #Debug Output.\r
- sys.stdout.write('Preparing GUI.\n');\r
- \r
- self.utility = parent.utility\r
- self.utility.window = self\r
- self.queue = self.utility.queue\r
- \r
- # List of deleting torrents events that occur when the RateManager is active\r
- # Such events are processed after the RateManager finishes\r
- # postponedevents is a list of tupples : each tupple contains the method of ABCPanel to be called to\r
- # deal with the event and the event.\r
- self.postponedevents = []\r
-\r
- #Manual Bittorrent Adding UI\r
- ##############################\r
- colSizer = wx.BoxSizer(wx.VERTICAL)\r
- \r
- self.list = ABCList(self)\r
- self.utility.list = self.list\r
- colSizer.Add(self.list, 1, wx.ALL|wx.EXPAND, 3)\r
- \r
- """\r
- # Add status bar\r
- statbarbox = wx.BoxSizer(wx.HORIZONTAL)\r
- self.sb_buttons = ABCStatusButtons(self,self.utility)\r
- statbarbox.Add(self.sb_buttons, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 0)\r
- self.abc_sb = ABCStatusBar(self,self.utility)\r
- statbarbox.Add(self.abc_sb, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 0)\r
- colSizer.Add(statbarbox, 0, wx.ALL|wx.EXPAND, 0)\r
- """\r
- \r
- #colSizer.Add(self.contentPanel, 1, wx.ALL|wx.EXPAND, 3)\r
- self.SetSizer(colSizer)\r
- self.SetAutoLayout(True)\r
- \r
- self.list.SetFocus()\r
- \r
- \r
- def getSelectedList(self, event = None):\r
- return self.list\r
-\r
- ######################################\r
- # Update ABC on-the-fly\r
- ######################################\r
- def updateColumns(self, force = False):\r
- # Update display in column for inactive torrent\r
- for ABCTorrentTemp in self.utility.torrents["all"]:\r
- ABCTorrentTemp.updateColumns(force = force)\r
- \r
- \r
-##############################################################\r
-#\r
-# Class : ABCTaskBarIcon\r
-#\r
-# Task Bar Icon\r
-#\r
-############################################################## \r
-class ABCTaskBarIcon(wx.TaskBarIcon):\r
- def __init__(self, parent):\r
- wx.TaskBarIcon.__init__(self)\r
- \r
- self.utility = parent.utility\r
- \r
- self.TBMENU_RESTORE = wx.NewId()\r
-\r
- # setup a taskbar icon, and catch some events from it\r
- self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, parent.onTaskBarActivate)\r
- self.Bind(wx.EVT_MENU, parent.onTaskBarActivate, id = self.TBMENU_RESTORE)\r
- \r
- self.updateIcon(False)\r
- \r
- def updateIcon(self,iconifying = False):\r
- remove = True\r
- \r
- mintray = self.utility.config.Read('mintray', "int")\r
- if (mintray >= 2) or ((mintray >= 1) and iconifying):\r
- remove = False\r
- \r
- if remove and self.IsIconInstalled():\r
- self.RemoveIcon()\r
- elif not remove and not self.IsIconInstalled():\r
- self.SetIcon(self.utility.icon, product_name)\r
- \r
- def CreatePopupMenu(self): \r
- menu = wx.Menu()\r
- \r
- self.utility.actions[ACTION_STOPALL].addToMenu(menu, bindto = self)\r
- self.utility.actions[ACTION_UNSTOPALL].addToMenu(menu, bindto = self)\r
- menu.AppendSeparator()\r
- menu.Append(self.TBMENU_RESTORE, self.utility.lang.get('showabcwindow'))\r
- self.utility.actions[ACTION_EXIT].addToMenu(menu, bindto = self)\r
- return menu\r
-\r
-\r
-##############################################################\r
-#\r
-# Class : ABColdFrame\r
-#\r
-# Main ABC Frame class that contains menu and menu bar management\r
-# and contains ABCPanel\r
-#\r
-############################################################## \r
-class ABCOldFrame(wx.Frame,FlaglessDelayedInvocation):\r
- def __init__(self, ID, params, utility):\r
- self.utility = utility\r
- #self.utility.frame = self\r
- \r
- title = "Old Interface"\r
- # Get window size and position from config file\r
- size = (400,400)\r
- style = wx.DEFAULT_FRAME_STYLE | wx.CLIP_CHILDREN\r
- \r
- wx.Frame.__init__(self, None, ID, title, size = size, style = style)\r
- \r
- FlaglessDelayedInvocation.__init__(self)\r
-\r
- self.GUIupdate = True\r
-\r
- self.window = ABCPanel(self)\r
- self.Bind(wx.EVT_SET_FOCUS, self.onFocus)\r
- self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)\r
- \r
- self.tb = ABCToolBar(self) # new Tribler gui has no toolbar\r
- self.SetToolBar(self.tb)\r
-\r
- \r
- def onFocus(self, event = None):\r
- if event is not None:\r
- event.Skip()\r
- self.window.getSelectedList(event).SetFocus()\r
-\r
- def OnCloseWindow(self, event = None):\r
- self.Hide()\r
-\r
-# Custom class loaded by XRC\r
-class ABCFrame(wx.Frame, DelayedInvocation):\r
- def __init__(self, *args):\r
- if len(args) == 0:\r
- pre = wx.PreFrame()\r
- # the Create step is done by XRC.\r
- self.PostCreate(pre)\r
- self.Bind(wx.EVT_WINDOW_CREATE, self.OnCreate)\r
- else:\r
- wx.Frame.__init__(self, args[0], args[1], args[2], args[3])\r
- self._PostInit()\r
- \r
- def OnCreate(self, event):\r
- self.Unbind(wx.EVT_WINDOW_CREATE)\r
- wx.CallAfter(self._PostInit)\r
- event.Skip()\r
- return True\r
- \r
- def _PostInit(self):\r
- # Do all init here\r
- self.guiUtility = GUIUtility.getInstance()\r
- self.utility = self.guiUtility.utility\r
- self.params = self.guiUtility.params\r
- self.utility.frame = self\r
- \r
- title = self.utility.lang.get('title') + \\r
- " " + \\r
- self.utility.lang.get('version')\r
- \r
- # Get window size and position from config file\r
- size, position = self.getWindowSettings()\r
- style = wx.DEFAULT_FRAME_STYLE | wx.CLIP_CHILDREN\r
- \r
- self.SetSize(size)\r
- self.SetPosition(position)\r
- self.SetTitle(title)\r
- tt = self.GetToolTip()\r
- if tt is not None:\r
- tt.SetTip('')\r
- \r
- #wx.Frame.__init__(self, None, ID, title, position, size, style = style)\r
- \r
- self.doneflag = Event()\r
- DelayedInvocation.__init__(self)\r
-\r
- dragdroplist = FileDropTarget(self.utility)\r
- self.SetDropTarget(dragdroplist)\r
-\r
- self.tbicon = None\r
-\r
- # Arno: see ABCPanel\r
- #self.abc_sb = ABCStatusBar(self,self.utility)\r
- #self.SetStatusBar(self.abc_sb)\r
-\r
- """\r
- # Add status bar\r
- statbarbox = wx.BoxSizer(wx.HORIZONTAL)\r
- self.sb_buttons = ABCStatusButtons(self,self.utility)\r
- statbarbox.Add(self.sb_buttons, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 0)\r
- self.abc_sb = ABCStatusBar(self,self.utility)\r
- statbarbox.Add(self.abc_sb, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 0)\r
- #colSizer.Add(statbarbox, 0, wx.ALL|wx.EXPAND, 0)\r
- self.SetStatusBar(statbarbox)\r
- """\r
- \r
- \r
- try:\r
- self.SetIcon(self.utility.icon)\r
- except:\r
- pass\r
-\r
- # Don't update GUI as often when iconized\r
- self.GUIupdate = True\r
-\r
- # Start the scheduler before creating the ListCtrl\r
- self.utility.queue = ABCScheduler(self.utility)\r
- #self.window = ABCPanel(self)\r
- #self.abc_sb = self.window.abc_sb\r
- \r
- \r
- self.oldframe = ABCOldFrame(-1, self.params, self.utility)\r
- self.oldframe.Refresh()\r
- self.oldframe.Layout()\r
- #self.oldframe.Show(True)\r
- \r
- self.window = self.GetChildren()[0]\r
- self.window.utility = self.utility\r
- \r
- """\r
- self.list = ABCList(self.window)\r
- self.list.Show(False)\r
- self.utility.list = self.list\r
- print self.window.GetName()\r
- self.window.list = self.list\r
- self.utility.window = self.window\r
- """\r
- #self.window.sb_buttons = ABCStatusButtons(self,self.utility)\r
- \r
- self.utility.window.postponedevents = []\r
- \r
- # Menu Options\r
- ############################\r
- menuBar = ABCMenuBar(self)\r
- if sys.platform == "darwin":\r
- wx.App.SetMacExitMenuItemId(wx.ID_CLOSE)\r
- self.SetMenuBar(menuBar)\r
- \r
- #self.tb = ABCToolBar(self) # new Tribler gui has no toolbar\r
- #self.SetToolBar(self.tb)\r
- \r
- self.buddyFrame = None\r
- self.fileFrame = None\r
- self.buddyFrame_page = 0\r
- self.buddyFrame_size = (800, 500)\r
- self.buddyFrame_pos = None\r
- self.fileFrame_size = (800, 500)\r
- self.fileFrame_pos = None\r
- \r
- # Menu Events \r
- ############################\r
-\r
- self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)\r
-# self.Bind(wx.EVT_MENU, self.OnMenuExit, id = wx.ID_CLOSE)\r
-\r
- # leaving here for the time being:\r
- # wxMSW apparently sends the event to the App object rather than\r
- # the top-level Frame, but there seemed to be some possibility of\r
- # change\r
- self.Bind(wx.EVT_QUERY_END_SESSION, self.OnCloseWindow)\r
- self.Bind(wx.EVT_END_SESSION, self.OnCloseWindow)\r
- \r
- try:\r
- self.tbicon = ABCTaskBarIcon(self)\r
- except:\r
- pass\r
- self.Bind(wx.EVT_ICONIZE, self.onIconify)\r
- self.Bind(wx.EVT_SET_FOCUS, self.onFocus)\r
- self.Bind(wx.EVT_SIZE, self.onSize)\r
- self.Bind(wx.EVT_MAXIMIZE, self.onSize)\r
- #self.Bind(wx.EVT_IDLE, self.onIdle)\r
- \r
- # Start up the controller\r
- self.utility.controller = ABCLaunchMany(self.utility)\r
- self.utility.controller.start()\r
- \r
- # Start up mainline DHT\r
- # Arno: do this in a try block, as khashmir gives a very funky\r
- # error when started from a .dmg (not from cmd line) on Mac. In particular\r
- # it complains that it cannot find the 'hex' encoding method when\r
- # hstr.encode('hex') is called, and hstr is a string?!\r
- #\r
- try:\r
- rsconvert = RawServerConverter(self.utility.controller.get_rawserver())\r
- mainlineDHT.init('', self.utility.listen_port, self.utility.getConfigPath(),rawserver=rsconvert)\r
- # Create torrent-liveliness checker based on DHT\r
- c = mainlineDHTChecker.getInstance()\r
- c.register(mainlineDHT.dht)\r
- except:\r
- print_exc()\r
-\r
- # Give GUI time to set up stuff\r
- wx.Yield()\r
-\r
- #if server start with params run it\r
- #####################################\r
- \r
- if DEBUG:\r
- print >>sys.stderr,"abc: wxFrame: params is",self.params\r
- \r
- if self.params[0] != "":\r
- success, msg, ABCTorrentTemp = self.utility.queue.addtorrents.AddTorrentFromFile(self.params[0],caller=CALLER_ARGV)\r
-\r
- self.utility.queue.postInitTasks(self.params)\r
-\r
- if self.params[0] != "":\r
- # Update torrent.list, but after having read the old list of torrents, otherwise we get interference\r
- ABCTorrentTemp.torrentconfig.writeSrc(False)\r
- self.utility.torrentconfig.Flush()\r
-\r
- self.videoFrame = None\r
- feasible = return_feasible_playback_modes(self.utility.getPath())\r
- if PLAYBACKMODE_INTERNAL in feasible:\r
- # This means vlc is available\r
- from Tribler.Video.EmbeddedPlayer import VideoFrame\r
- self.videoFrame = VideoFrame(self)\r
-\r
- #self.videores = xrc.XmlResource("Tribler/vwxGUI/MyPlayer.xrc")\r
- #self.videoframe = self.videores.LoadFrame(None, "MyPlayer")\r
- #self.videoframe.Show()\r
- \r
- videoplayer = VideoPlayer.getInstance()\r
- videoplayer.set_parentwindow(self.videoFrame)\r
- else:\r
- videoplayer = VideoPlayer.getInstance()\r
- videoplayer.set_parentwindow(self)\r
-\r
- sys.stdout.write('GUI Complete.\n')\r
-\r
- self.Show(True)\r
- \r
- \r
- # Just for debugging: add test permids and display top 5 peers from which the most is downloaded in bartercastdb\r
- bartercastdb = BarterCastDBHandler()\r
- mypermid = bartercastdb.my_permid\r
- \r
- if DEBUG:\r
- bartercastdb.incrementItem((mypermid, "testpermid_1"), 'uploaded', 1024)\r
- bartercastdb.incrementItem((mypermid, "testpermid_1"), 'downloaded', 20000)\r
- \r
- bartercastdb.incrementItem((mypermid, "testpermid_2"), 'uploaded', 40000)\r
- bartercastdb.incrementItem((mypermid, "testpermid_2"), 'downloaded', 60000)\r
- \r
- top = bartercastdb.getTopNPeers(5)['top']\r
- \r
- print 'My Permid: ', permid_for_user(mypermid)\r
- \r
- print 'Top 5 BarterCast peers:'\r
- print '======================='\r
- \r
- i = 1\r
- for (permid, up, down) in top:\r
- print '%2d: %15s - %10d up %10d down' % (i, bartercastdb.getName(permid), up, down)\r
- i += 1\r
- \r
- \r
- # Check to see if ABC is associated with torrents\r
- #######################################################\r
- if (sys.platform == 'win32'):\r
- if self.utility.config.Read('associate', "boolean"):\r
- if self.utility.regchecker and not self.utility.regchecker.testRegistry():\r
- dialog = RegCheckDialog(self)\r
- dialog.ShowModal()\r
- dialog.Destroy()\r
-\r
- self.checkVersion()\r
-\r
- \r
- def checkVersion(self):\r
- t = Timer(2.0, self._checkVersion)\r
- t.start()\r
- \r
- def _checkVersion(self):\r
- my_version = self.utility.getVersion()\r
- try:\r
- curr_status = urllib.urlopen('http://tribler.org/version').readlines()\r
- line1 = curr_status[0]\r
- if len(curr_status) > 1:\r
- self.update_url = curr_status[1].strip()\r
- else:\r
- self.update_url = 'http://tribler.org'\r
- _curr_status = line1.split()\r
- self.curr_version = _curr_status[0]\r
- if self.newversion(self.curr_version, my_version):\r
- # Arno: we are a separate thread, delegate GUI updates to MainThread\r
- self.upgradeCallback()\r
- \r
- # Also check new version of web2definitions for youtube etc. search\r
- Web2Updater(self.utility).checkUpdate()\r
- except Exception,e:\r
- print >> sys.stderr, "Tribler: Version check failed", ctime(time()), str(e)\r
- #print_exc()\r
- \r
- def newversion(self, curr_version, my_version):\r
- curr = curr_version.split('.')\r
- my = my_version.split('.')\r
- if len(my) >= len(curr):\r
- nversion = len(my)\r
- else:\r
- nversion = len(curr)\r
- for i in range(nversion):\r
- if i < len(my):\r
- my_v = int(my[i])\r
- else:\r
- my_v = 0\r
- if i < len(curr):\r
- curr_v = int(curr[i])\r
- else:\r
- curr_v = 0\r
- if curr_v > my_v:\r
- return True\r
- elif curr_v < my_v:\r
- return False\r
- return False\r
-\r
- def upgradeCallback(self):\r
- self.invokeLater(self.OnUpgrade) \r
- # TODO: warn multiple times?\r
- \r
- def OnUpgrade(self, event=None):\r
- self.setActivity(ACT_NEW_VERSION)\r
- \r
- def onFocus(self, event = None):\r
- if event is not None:\r
- event.Skip()\r
- #self.window.getSelectedList(event).SetFocus()\r
- \r
- def setGUIupdate(self, update):\r
- oldval = self.GUIupdate\r
- self.GUIupdate = update\r
- \r
- if self.GUIupdate and not oldval:\r
- # Force an update of all torrents\r
- for torrent in self.utility.torrents["all"]:\r
- torrent.updateColumns()\r
- torrent.updateColor()\r
-\r
-\r
- def taskbarCallback(self):\r
- self.invokeLater(self.onTaskBarActivate,[])\r
-\r
-\r
- #######################################\r
- # minimize to tray bar control\r
- #######################################\r
- def onTaskBarActivate(self, event = None):\r
- self.Iconize(False)\r
- self.Show(True)\r
- self.Raise()\r
- \r
- if self.tbicon is not None:\r
- self.tbicon.updateIcon(False)\r
-\r
- #self.window.list.SetFocus()\r
-\r
- # Resume updating GUI\r
- self.setGUIupdate(True)\r
-\r
- def onIconify(self, event = None):\r
- # This event handler is called both when being minimalized\r
- # and when being restored.\r
- if DEBUG:\r
- if event is not None:\r
- print >> sys.stderr,"abc: onIconify(",event.Iconized()\r
- else:\r
- print >> sys.stderr,"abc: onIconify event None"\r
- if event.Iconized(): \r
- if (self.utility.config.Read('mintray', "int") > 0\r
- and self.tbicon is not None):\r
- self.tbicon.updateIcon(True)\r
- self.Show(False)\r
-\r
- # Don't update GUI while minimized\r
- self.setGUIupdate(False)\r
- else:\r
- self.setGUIupdate(True)\r
- if event is not None:\r
- event.Skip()\r
-\r
- def onSize(self, event = None):\r
- # Arno: On Windows when I enable the tray icon and then change\r
- # virtual desktop (see MS DeskmanPowerToySetup.exe)\r
- # I get a onIconify(event.Iconized()==True) event, but when\r
- # I switch back, I don't get an event. As a result the GUIupdate\r
- # remains turned off. The wxWidgets wiki on the TaskBarIcon suggests\r
- # catching the onSize event. \r
- \r
- if DEBUG:\r
- if event is not None:\r
- print >> sys.stderr,"abc: onSize:",self.GetSize()\r
- else:\r
- print >> sys.stderr,"abc: onSize: None"\r
- self.setGUIupdate(True)\r
- if event is not None:\r
- if event.GetEventType() == wx.EVT_MAXIMIZE:\r
- self.window.SetClientSize(self.GetClientSize())\r
- event.Skip()\r
- \r
-\r
- # Refresh subscreens\r
- self.refreshNeeded = True\r
- self.guiUtility.refreshOnResize()\r
- \r
- def onIdle(self, event = None):\r
- """\r
- Only refresh screens (especially detailsPanel) when resizes are finished\r
- This gives less flickering, but doesnt look pretty, so i commented it out\r
- """\r
- if self.refreshNeeded:\r
- self.guiUtility.refreshOnResize()\r
- self.refreshNeeded = False\r
- \r
- def getWindowSettings(self):\r
- width = self.utility.config.Read("window_width")\r
- height = self.utility.config.Read("window_height")\r
- try:\r
- size = wx.Size(int(width), int(height))\r
- except:\r
- size = wx.Size(710, 400)\r
- \r
- x = self.utility.config.Read("window_x")\r
- y = self.utility.config.Read("window_y")\r
- if (x == "" or y == ""):\r
- position = wx.DefaultPosition\r
- else:\r
- position = wx.Point(int(x), int(y))\r
- \r
- return size, position \r
- \r
- def saveWindowSettings(self):\r
- width, height = self.GetSizeTuple()\r
- x, y = self.GetPositionTuple()\r
- self.utility.config.Write("window_width", width)\r
- self.utility.config.Write("window_height", height)\r
- self.utility.config.Write("window_x", x)\r
- self.utility.config.Write("window_y", y)\r
-\r
- self.utility.config.Flush()\r
- \r
- ##################################\r
- # Close Program\r
- ##################################\r
- \r
- def OnCloseWindow(self, event = None):\r
- if event != None:\r
- nr = event.GetEventType()\r
- lookup = { wx.EVT_CLOSE.evtType[0]: "EVT_CLOSE", wx.EVT_QUERY_END_SESSION.evtType[0]: "EVT_QUERY_END_SESSION", wx.EVT_END_SESSION.evtType[0]: "EVT_END_SESSION" }\r
- if nr in lookup: nr = lookup[nr]\r
- print "Closing due to event ",nr\r
- print >>sys.stderr,"Closing due to event ",nr\r
- else:\r
- print "Closing untriggered by event"\r
- \r
- # Don't do anything if the event gets called twice for some reason\r
- if self.utility.abcquitting:\r
- return\r
-\r
- # Check to see if we can veto the shutdown\r
- # (might not be able to in case of shutting down windows)\r
- if event is not None:\r
- try:\r
- if event.CanVeto() and self.utility.config.Read('confirmonclose', "boolean") and not event.GetEventType() == wx.EVT_QUERY_END_SESSION.evtType[0]:\r
- dialog = wx.MessageDialog(None, self.utility.lang.get('confirmmsg'), self.utility.lang.get('confirm'), wx.OK|wx.CANCEL)\r
- result = dialog.ShowModal()\r
- dialog.Destroy()\r
- if result != wx.ID_OK:\r
- event.Veto()\r
- return\r
- except:\r
- data = StringIO()\r
- print_exc(file = data)\r
- sys.stderr.write(data.getvalue())\r
- pass\r
- \r
- self.utility.abcquitting = True\r
- self.GUIupdate = False\r
- \r
- self.guiUtility.guiOpen.clear()\r
- \r
- # Close the Torrent Maker\r
- self.utility.actions[ACTION_MAKETORRENT].closeWin()\r
-\r
- try:\r
- self.utility.webserver.stop()\r
- except:\r
- data = StringIO()\r
- print_exc(file = data)\r
- sys.stderr.write(data.getvalue())\r
- pass\r
-\r
- try:\r
- # tell scheduler to close all active thread\r
- self.utility.queue.clearScheduler()\r
- except:\r
- data = StringIO()\r
- print_exc(file = data)\r
- sys.stderr.write(data.getvalue())\r
- pass\r
-\r
- try:\r
- # Restore the window before saving size and position\r
- # (Otherwise we'll get the size of the taskbar button and a negative position)\r
- self.onTaskBarActivate()\r
- self.saveWindowSettings()\r
- except:\r
- #print_exc(file=sys.stderr)\r
- print_exc()\r
-\r
- try:\r
- if self.buddyFrame is not None:\r
- self.buddyFrame.Destroy()\r
- if self.fileFrame is not None:\r
- self.fileFrame.Destroy()\r
- if self.videoFrame is not None:\r
- self.videoFrame.Destroy()\r
- except:\r
- pass\r
-\r
- self.oldframe.Destroy()\r
-\r
- try:\r
- if self.tbicon is not None:\r
- self.tbicon.RemoveIcon()\r
- self.tbicon.Destroy()\r
- self.Destroy()\r
- except:\r
- data = StringIO()\r
- print_exc(file = data)\r
- sys.stderr.write(data.getvalue())\r
- pass\r
-\r
- # Arno: at the moment, Tribler gets a segmentation fault when the\r
- # tray icon is always enabled. This SEGV occurs in the wx mainloop\r
- # which is entered as soon as we leave this method. Hence I placed\r
- # tribler_done() here, so the database are closed properly\r
- # before the crash.\r
- #\r
- # Arno, 2007-02-28: Preferably this should be moved to the main \r
- # run() method below, that waits a while to allow threads to finish.\r
- # Ideally, the database should still be open while they finish up.\r
- # Because of the crash problem with the icontray this is the safer\r
- # place.\r
- #\r
- # Arno, 2007-08-10: When a torrentfile is passed on the command line,\r
- # the client will crash just after this point due to unknown reasons\r
- # (it even does it when we don't look at the cmd line args at all!)\r
- # Hence, for safety, I close the DB here already. \r
- #if sys.platform == 'linux2':\r
- #\r
- \r
- #tribler_done(self.utility.getConfigPath()) \r
- \r
- if DEBUG: \r
- print >>sys.stderr,"abc: OnCloseWindow END"\r
-\r
- if DEBUG:\r
- ts = enumerate()\r
- for t in ts:\r
- print >>sys.stderr,"abc: Thread still running",t.getName(),"daemon",t.isDaemon()\r
-\r
-\r
-\r
- def onWarning(self,exc):\r
- msg = self.utility.lang.get('tribler_startup_nonfatalerror')\r
- msg += str(exc.__class__)+':'+str(exc)\r
- dlg = wx.MessageDialog(None, msg, self.utility.lang.get('tribler_warning'), wx.OK|wx.ICON_WARNING)\r
- result = dlg.ShowModal()\r
- dlg.Destroy()\r
-\r
- def onUPnPError(self,upnp_type,listenport,error_type,exc=None,listenproto='TCP'):\r
-\r
- if error_type == 0:\r
- errormsg = unicode(' UPnP mode '+str(upnp_type)+' ')+self.utility.lang.get('tribler_upnp_error1')\r
- elif error_type == 1:\r
- errormsg = unicode(' UPnP mode '+str(upnp_type)+' ')+self.utility.lang.get('tribler_upnp_error2')+unicode(str(exc))+self.utility.lang.get('tribler_upnp_error2_postfix')\r
- elif error_type == 2:\r
- errormsg = unicode(' UPnP mode '+str(upnp_type)+' ')+self.utility.lang.get('tribler_upnp_error3')\r
- else:\r
- errormsg = unicode(' UPnP mode '+str(upnp_type)+' Unknown error')\r
-\r
- msg = self.utility.lang.get('tribler_upnp_error_intro')\r
- msg += listenproto+' '\r
- msg += str(listenport)\r
- msg += self.utility.lang.get('tribler_upnp_error_intro_postfix')\r
- msg += errormsg\r
- msg += self.utility.lang.get('tribler_upnp_error_extro') \r
-\r
- dlg = wx.MessageDialog(None, msg, self.utility.lang.get('tribler_warning'), wx.OK|wx.ICON_WARNING)\r
- result = dlg.ShowModal()\r
- dlg.Destroy()\r
-\r
- def onReachable(self,event=None):\r
- """ Called by GUI thread """\r
- if self.firewallStatus is not None:\r
- self.firewallStatus.setToggled(True)\r
- tt = self.firewallStatus.GetToolTip()\r
- if tt is not None:\r
- tt.SetTip(self.utility.lang.get('reachable_tooltip'))\r
-\r
-\r
- def setActivity(self,type,msg=u''):\r
- \r
- if currentThread().getName() != "MainThread":\r
- print >> sys.stderr,"abc: setActivity thread",currentThread().getName(),"is NOT MAIN THREAD"\r
- print_stack()\r
- \r
- if type == ACT_NONE:\r
- prefix = u''\r
- msg = u''\r
- elif type == ACT_UPNP:\r
- prefix = self.utility.lang.get('act_upnp')\r
- elif type == ACT_REACHABLE:\r
- prefix = self.utility.lang.get('act_reachable')\r
- elif type == ACT_GET_EXT_IP_FROM_PEERS:\r
- prefix = self.utility.lang.get('act_get_ext_ip_from_peers')\r
- elif type == ACT_MEET:\r
- prefix = self.utility.lang.get('act_meet')\r
- elif type == ACT_GOT_METADATA:\r
- prefix = self.utility.lang.get('act_got_metadata')\r
- elif type == ACT_RECOMMEND:\r
- prefix = self.utility.lang.get('act_recommend')\r
- elif type == ACT_DISK_FULL:\r
- prefix = self.utility.lang.get('act_disk_full') \r
- elif type == ACT_NEW_VERSION:\r
- prefix = self.utility.lang.get('act_new_version') \r
- if msg == u'':\r
- text = prefix\r
- else:\r
- text = unicode( prefix+u' '+msg)\r
- \r
- if DEBUG:\r
- print >> sys.stderr,"abc: Setting activity",`text`,"EOT"\r
- self.messageField.SetLabel(text)\r
-\r
-\r
-class TorThread(Thread):\r
- \r
- def __init__(self):\r
- Thread.__init__(self)\r
- self.setDaemon(True)\r
- self.setName("TorThread"+self.getName())\r
- self.child_out = None\r
- self.child_in = None\r
- \r
- def run(self):\r
- try:\r
- if DEBUG:\r
- print >>sys.stderr,"TorThread starting",currentThread().getName()\r
- if sys.platform == "win32":\r
- # Not "Nul:" but "nul" is /dev/null on Win32\r
- cmd = 'tor.exe'\r
- sink = 'nul'\r
- elif sys.platform == "darwin":\r
- cmd = 'tor.mac'\r
- sink = '/dev/null'\r
- else:\r
- cmd = 'tor'\r
- sink = '/dev/null'\r
-\r
- (self.child_out,self.child_in) = os.popen2( "%s --log err-err > %s 2>&1" % (cmd,sink), 'b' )\r
- while True:\r
- if DEBUG:\r
- print >>sys.stderr,"TorThread reading",currentThread().getName()\r
-\r
- msg = self.child_in.read()\r
- if DEBUG:\r
- print >>sys.stderr,"TorThread: tor said",msg\r
- if len(msg) == 0:\r
- break\r
- sleep(1)\r
- except:\r
- print_exc()\r
-\r
- def shutdown(self):\r
- if self.child_out is not None:\r
- self.child_out.close()\r
- if self.child_in is not None:\r
- self.child_in.close()\r
- \r
-\r
-##############################################################\r
-#\r
-# Class : ABCApp\r
-#\r
-# Main ABC application class that contains ABCFrame Object\r
-#\r
-##############################################################\r
-class ABCApp(wx.App,FlaglessDelayedInvocation):\r
- def __init__(self, x, params, single_instance_checker, abcpath):\r
- global start_time, start_time2\r
- start_time2 = time()\r
- #print "[StartUpDebug]----------- from ABCApp.__init__ ----------Tribler starts up at", ctime(start_time2), "after", start_time2 - start_time\r
- self.params = params\r
- self.single_instance_checker = single_instance_checker\r
- self.abcpath = abcpath\r
- self.error = None\r
- self.torthread = None\r
- wx.App.__init__(self, x)\r
- \r
- def OnInit(self):\r
- try:\r
- self.utility = Utility(self.abcpath)\r
- # Set locale to determine localisation\r
- locale.setlocale(locale.LC_ALL, '')\r
-\r
- sys.stdout.write('Client Starting Up.\n')\r
- sys.stdout.write('Build: ' + self.utility.lang.get('build') + '\n')\r
- \r
- bm = wx.Bitmap(os.path.join(self.utility.getPath(),'icons','splash.jpg'),wx.BITMAP_TYPE_JPEG)\r
- #s = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN\r
- #s = wx.SIMPLE_BORDER|wx.FRAME_NO_TASKBAR|wx.FRAME_FLOAT_ON_PARENT\r
- self.splash = wx.SplashScreen(bm, wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_TIMEOUT, 1000, None, -1)\r
- \r
- wx.CallAfter(self.PostInit)\r
- return True\r
- \r
- except Exception,e:\r
- print_exc()\r
- self.error = e\r
- self.onError()\r
- return False\r
-\r
-\r
- def PostInit(self):\r
- try:\r
- tribler_init(self.utility.getConfigPath(),self.utility.getPath(),self.db_exception_handler)\r
- self.utility.setTriblerVariables()\r
- self.utility.postAppInit()\r
- \r
- # Singleton for executing tasks that are too long for GUI thread and\r
- # network thread\r
- self.guiserver = GUIServer.getInstance()\r
- self.guiserver.register()\r
- \r
- # Singleton for management of user's mugshots (i.e. icons/display pictures)\r
- self.mm = MugshotManager.getInstance()\r
- self.mm.register(self.utility.getConfigPath(),self.utility.getPath())\r
-\r
- # H4x0r a bit\r
- set_tasteheart_bitmaps(self.utility.getPath())\r
- set_perfBar_bitmaps(self.utility.getPath())\r
- \r
- # Put it here so an error is shown in the startup-error popup\r
- self.serverlistener = ServerListener(self.utility)\r
- \r
- # Check webservice for autostart webservice\r
- #######################################################\r
- WebListener(self.utility)\r
- if self.utility.webconfig.Read("webautostart", "boolean"):\r
- self.utility.webserver.start()\r
- \r
- # Start single instance server listenner\r
- ############################################\r
- self.serverthread = Thread(target = self.serverlistener.start)\r
- self.serverthread.setDaemon(True)\r
- self.serverthread.setName("SingleInstanceServer"+self.serverthread.getName())\r
- self.serverthread.start()\r
- \r
- self.videoplayer = VideoPlayer.getInstance()\r
- self.videoplayer.register(self.utility)\r
- self.videoserver = VideoHTTPServer.getInstance()\r
- self.videoserver.background_serve()\r
-\r
- notification_init( self.utility )\r
-\r
- # Change config when experiment ends, before ABCLaunchMany is created\r
- global EVIL\r
- if EVIL and time() > 1190099288.0:\r
- EVIL = False\r
- end = self.utility.config.Read('lure_ended', "boolean")\r
- if not end:\r
- self.utility.config.Write('lure_ended', 1, "boolean")\r
- self.utility.config.Write('tor_enabled', 0, "boolean")\r
- self.utility.config.Write('ut_pex_max_addrs_from_peer', 16)\r
- \r
- msg = "The Tribler download accelerator using the TOR network has been turned off. For more information visit http://TV.seas.Harvard.edu/"\r
- dlg = wx.MessageDialog(None, msg, "Tribler Warning", wx.OK|wx.ICON_INFORMATION)\r
- result = dlg.ShowModal()\r
- dlg.Destroy()\r
- \r
- enabled = self.utility.config.Read('tor_enabled', "boolean")\r
- if enabled:\r
- self.torthread = TorThread()\r
- self.torthread.start()\r
-\r
- #\r
- # Read and create GUI from .xrc files\r
- #\r
- #self.frame = ABCFrame(-1, self.params, self.utility)\r
- self.guiUtility = GUIUtility.getInstance(self.utility, self.params)\r
- updateXRC.main([os.path.join(self.utility.getPath(),'Tribler','vwxGUI')])\r
- self.res = xrc.XmlResource(os.path.join(self.utility.getPath(),'Tribler','vwxGUI','MyFrame.xrc'))\r
- self.guiUtility.xrcResource = self.res\r
- self.frame = self.res.LoadFrame(None, "MyFrame")\r
- self.guiUtility.frame = self.frame\r
- self.guiUtility.scrollWindow = xrc.XRCCTRL(self.frame, "level0")\r
- self.guiUtility.mainSizer = self.guiUtility.scrollWindow.GetSizer()\r
- self.frame.topBackgroundRight = xrc.XRCCTRL(self.frame, "topBG3")\r
- self.guiUtility.scrollWindow.SetScrollbars(1,1,1024,768)\r
- self.guiUtility.scrollWindow.SetScrollRate(15,15)\r
- self.frame.mainButtonPersons = xrc.XRCCTRL(self.frame, "mainButtonPersons")\r
-\r
-\r
- self.frame.numberPersons = xrc.XRCCTRL(self.frame, "numberPersons")\r
- numperslabel = xrc.XRCCTRL(self.frame, "persons")\r
- self.frame.numberFiles = xrc.XRCCTRL(self.frame, "numberFiles")\r
- numfileslabel = xrc.XRCCTRL(self.frame, "files")\r
- self.frame.messageField = xrc.XRCCTRL(self.frame, "messageField")\r
- self.frame.firewallStatus = xrc.XRCCTRL(self.frame, "firewallStatus")\r
- tt = self.frame.firewallStatus.GetToolTip()\r
- if tt is not None:\r
- tt.SetTip(self.utility.lang.get('unknownreac_tooltip'))\r
- \r
- if sys.platform == "linux2":\r
- self.frame.numberPersons.SetFont(wx.Font(9,FONTFAMILY,FONTWEIGHT,wx.NORMAL,False,FONTFACE))\r
- self.frame.numberFiles.SetFont(wx.Font(9,FONTFAMILY,FONTWEIGHT,wx.NORMAL,False,FONTFACE))\r
- self.frame.messageField.SetFont(wx.Font(9,FONTFAMILY,FONTWEIGHT,wx.NORMAL,False,FONTFACE))\r
- numperslabel.SetFont(wx.Font(9,FONTFAMILY,FONTWEIGHT,wx.NORMAL,False,FONTFACE))\r
- numfileslabel.SetFont(wx.Font(9,FONTFAMILY,FONTWEIGHT,wx.NORMAL,False,FONTFACE))\r
- """\r
- searchfilebut = xrc.XRCCTRL(self.frame, "bt257cC")\r
- searchfilebut.Bind(wx.EVT_LEFT_UP, self.guiUtility.buttonClicked)\r
- searchpersbut = xrc.XRCCTRL(self.frame, "bt258cC")\r
- searchpersbut.Bind(wx.EVT_LEFT_UP, self.guiUtility.buttonClicked) \r
- \r
- self.frame.searchtxtctrl = xrc.XRCCTRL(self.frame, "tx220cCCC")\r
- """\r
- \r
- #self.frame.Refresh()\r
- #self.frame.Layout()\r
- self.frame.Show(True)\r
-#===============================================================================\r
-# global start_time2\r
-# current_time = time()\r
-# print "\n\n[StartUpDebug]-----------------------------------------"\r
-# print "[StartUpDebug]"\r
-# print "[StartUpDebug]----------- from ABCApp.OnInit ----------Tribler frame is shown after", current_time-start_time2\r
-# print "[StartUpDebug]"\r
-# print "[StartUpDebug]-----------------------------------------\n\n"\r
-#===============================================================================\r
- \r
- # GUI start\r
- # - load myFrame \r
- # - load standardGrid\r
- # - gui utility > button mainButtonFiles = clicked\r
- \r
-\r
- self.Bind(wx.EVT_QUERY_END_SESSION, self.frame.OnCloseWindow)\r
- self.Bind(wx.EVT_END_SESSION, self.frame.OnCloseWindow)\r
- \r
- \r
- #asked = self.utility.config.Read('askeduploadbw', 'boolean')\r
- asked = True\r
- if not asked:\r
- dlg = BandwidthSelector(self.frame,self.utility)\r
- result = dlg.ShowModal()\r
- if result == wx.ID_OK:\r
- ulbw = dlg.getUploadBandwidth()\r
- self.utility.config.Write('maxuploadrate',ulbw)\r
- self.utility.config.Write('maxseeduploadrate',ulbw)\r
- self.utility.config.Write('askeduploadbw','1')\r
- dlg.Destroy()\r
-\r
- # Arno, 2007-05-03: wxWidgets 2.8.3.0 and earlier have the MIME-type for .bmp \r
- # files set to 'image/x-bmp' whereas 'image/bmp' is the official one.\r
- try:\r
- bmphand = None\r
- hands = wx.Image.GetHandlers()\r
- for hand in hands:\r
- #print "Handler",hand.GetExtension(),hand.GetType(),hand.GetMimeType()\r
- if hand.GetMimeType() == 'image/x-bmp':\r
- bmphand = hand\r
- break\r
- #wx.Image.AddHandler()\r
- if bmphand is not None:\r
- bmphand.SetMimeType('image/bmp')\r
- except:\r
- # wx < 2.7 don't like wx.Image.GetHandlers()\r
- print_exc()\r
- \r
- # Must be after ABCLaunchMany is created\r
- self.torrentfeed = TorrentFeedThread.getInstance()\r
- self.torrentfeed.register(self.utility)\r
- self.torrentfeed.start()\r
- \r
- #print "DIM",wx.GetDisplaySize()\r
- #print "MM",wx.GetDisplaySizeMM()\r
-\r
- wx.CallAfter(self.startWithRightView) \r
- \r
- except Exception,e:\r
- print_exc()\r
- self.error = e\r
- self.onError()\r
- return False\r
-\r
- return True\r
-\r
- def onError(self,source=None):\r
- # Don't use language independence stuff, self.utility may not be\r
- # valid.\r
- msg = "Unfortunately, Tribler ran into an internal error:\n\n"\r
- if source is not None:\r
- msg += source\r
- msg += str(self.error.__class__)+':'+str(self.error)\r
- msg += '\n'\r
- msg += 'Please see the FAQ on www.tribler.org on how to act.'\r
- dlg = wx.MessageDialog(None, msg, "Tribler Fatal Error", wx.OK|wx.ICON_ERROR)\r
- result = dlg.ShowModal()\r
- print_exc()\r
- dlg.Destroy()\r
-\r
- def MacOpenFile(self,filename):\r
- self.utility.queue.addtorrents.AddTorrentFromFile(filename)\r
-\r
- def OnExit(self):\r
- \r
- self.torrentfeed.shutdown()\r
- if self.torthread is not None:\r
- self.torthread.shutdown()\r
- mainlineDHT.deinit()\r
- \r
- if not ALLOW_MULTIPLE:\r
- del self.single_instance_checker\r
- ClientPassParam("Close Connection")\r
- return 0\r
- \r
- def db_exception_handler(self,e):\r
- if DEBUG:\r
- print >> sys.stderr,"abc: Database Exception handler called",e,"value",e.args,"#"\r
- try:\r
- if e.args[1] == "DB object has been closed":\r
- return # We caused this non-fatal error, don't show.\r
- if self.error is not None and self.error.args[1] == e.args[1]:\r
- return # don't repeat same error\r
- except:\r
- print >> sys.stderr, "abc: db_exception_handler error", e, type(e)\r
- print_exc()\r
- #print_stack()\r
- self.error = e\r
- self.invokeLater(self.onError,[],{'source':"The database layer reported: "})\r
- \r
- def getConfigPath(self):\r
- return self.utility.getConfigPath()\r
-\r
- def startWithRightView(self):\r
- if self.params[0] != "":\r
- self.guiUtility.standardLibraryOverview()\r
- \r
- \r
-class DummySingleInstanceChecker:\r
- \r
- def __init__(self,basename):\r
- pass\r
-\r
- def IsAnotherRunning(self):\r
- "Uses pgrep to find other tribler.py processes"\r
- # If no pgrep available, it will always start tribler\r
- progressInfo = commands.getoutput('pgrep -fl tribler.py | grep -v pgrep')\r
- numProcesses = len(progressInfo.split('\n'))\r
- if DEBUG:\r
- print 'ProgressInfo: %s, num: %d' % (progressInfo, numProcesses)\r
- return numProcesses > 1\r
- \r
- \r
-##############################################################\r
-#\r
-# Main Program Start Here\r
-#\r
-##############################################################\r
-def run(params = None):\r
- global start_time\r
- start_time = time()\r
- if params is None:\r
- params = [""]\r
- \r
- if len(sys.argv) > 1:\r
- params = sys.argv[1:]\r
- \r
- # Create single instance semaphore\r
- # Arno: On Linux and wxPython-2.8.1.1 the SingleInstanceChecker appears\r
- # to mess up stderr, i.e., I get IOErrors when writing to it via print_exc()\r
- #\r
- # TEMPORARILY DISABLED on Linux\r
- if sys.platform != 'linux2':\r
- single_instance_checker = wx.SingleInstanceChecker("tribler-" + wx.GetUserId())\r
- else:\r
- single_instance_checker = DummySingleInstanceChecker("tribler-")\r
-\r
- #print "[StartUpDebug]---------------- 1", time()-start_time\r
- if not ALLOW_MULTIPLE and single_instance_checker.IsAnotherRunning():\r
- #Send torrent info to abc single instance\r
- ClientPassParam(params[0])\r
- #print "[StartUpDebug]---------------- 2", time()-start_time\r
- else:\r
- abcpath = os.path.abspath(os.path.dirname(sys.argv[0]))\r
- # Arno: don't chdir to allow testing as other user from other dir.\r
- #os.chdir(abcpath)\r
-\r
- # Launch first abc single instance\r
- app = ABCApp(0, params, single_instance_checker, abcpath)\r
- configpath = app.getConfigPath()\r
-# print "[StartUpDebug]---------------- 3", time()-start_time\r
- app.MainLoop()\r
-\r
- print "Client shutting down. Sleeping for a few seconds to allow other threads to finish"\r
- sleep(4)\r
-\r
- # This is the right place to close the database, unfortunately Linux has\r
- # a problem, see ABCFrame.OnCloseWindow\r
- #\r
- #if sys.platform != 'linux2':\r
- # tribler_done(configpath)\r
- os._exit(0)\r
-\r
-if __name__ == '__main__':\r
- run()\r
-\r