diff options
author | Justin Lewis <jtl1728@rit.edu> | 2010-01-12 21:57:55 (GMT) |
---|---|---|
committer | Justin Lewis <jtl1728@rit.edu> | 2010-01-12 21:57:55 (GMT) |
commit | 494db1554b59a43c1e886fa4eca1da73dc6372b2 (patch) | |
tree | 88e013082f3f1bd244036ed80dd121aa662e440a | |
parent | 537cb64fa14b682bea94d949ee6b4db7866c6631 (diff) |
Fixed hang when server is offline.
Initialize gui sooner, then added signal to interrupt the network
connection when the server is not responding after 10 seconds.
-rw-r--r-- | FileShare.activity/FileShareActivity.py | 51 | ||||
-rw-r--r-- | FileShare.activity/GuiView.py | 15 | ||||
-rw-r--r-- | FileShare.activity/MyExceptions.py | 1 |
3 files changed, 42 insertions, 25 deletions
diff --git a/FileShare.activity/FileShareActivity.py b/FileShare.activity/FileShareActivity.py index dd83102..68bbb6f 100644 --- a/FileShare.activity/FileShareActivity.py +++ b/FileShare.activity/FileShareActivity.py @@ -33,14 +33,14 @@ from sugar import network from sugar import profile from GuiView import GuiView -from MyExceptions import InShareException, FileUploadFailure, ServerRequestFailure, NoFreeTubes +from MyExceptions import InShareException, FileUploadFailure, ServerRequestFailure, NoFreeTubes, TimeOut from TubeSpeak import TubeSpeak import FileInfo from hashlib import sha1 import urllib, urllib2, MultipartPostHandler, httplib -import threading +import threading, signal import logging _logger = logging.getLogger('fileshare-activity') @@ -106,6 +106,18 @@ class FileShareActivity(Activity): self._user_nick = profile.get_nick_name() self._user_permissions = 0 + # INITIALIZE GUI + ################ + self.set_title('File Share') + + # Create Toolbox + toolbox = ActivityToolbox(self) + self.set_toolbox(toolbox) + toolbox.show() + + # Set gui display object + self.disp = GuiView(self) + jabber_serv = None #Need to check if on 82 or higher if hasattr(prof, 'jabber_server'): @@ -121,13 +133,12 @@ class FileShareActivity(Activity): self.server_port= 14623 self.s_version = 0 + + self.disp.guiHandler.show_throbber(True, _("Please Wait... Searching for Server")) if self.isServer and self.check_for_server() and self._server_mode(): self._mode = "SERVER" self.isServer = False - # Build and display gui - self._buildGui() - if self._mode == 'P2P': # Connect to shared and join calls self.connect('shared', self._shared_cb) @@ -153,12 +164,25 @@ class FileShareActivity(Activity): self.disp.guiHandler.show_throbber(True, _("Please Wait... Requesting file list from server")) threading.Thread(target=call).start() + # Build table and display the gui + self.disp.build_table() + self.set_canvas(self.disp) + self.show_all() + def check_for_server(self): + + def raise_timeout(signum, frame): + raise TimeOut("Timeout!") + + signal.signal(signal.SIGALRM, raise_timeout) + s_version = None try: + signal.alarm(10) # raise alarm in 10 seconds conn = httplib.HTTPConnection( self.server_ip, self.server_port) conn.request("GET", "/version") r1 = conn.getresponse() + signal.alarm(0) if r1.status == 200: s_version= r1.read() conn.close() @@ -181,10 +205,13 @@ class FileShareActivity(Activity): # Older version didn't have permissions, set 1 as default (upload/remove) self._user_permissions = 1 self.s_version = s_version + signal.alarm(0) # disable alarm return True else: + signal.alarm(0) # disable alarm return False except: + signal.alarm(0) # disable alarm return False def get_server_user_list(self): @@ -333,20 +360,6 @@ class FileShareActivity(Activity): else: return False - - def _buildGui(self): - self.set_title('File Share') - - # Create Toolbox - ################ - toolbox = ActivityToolbox(self) - self.set_toolbox(toolbox) - toolbox.show() - - self.disp = GuiView(self) - self.set_canvas(self.disp) - self.show_all() - def _shared_cb(self, activity): _logger.debug('Activity is now shared') self.initiating = True diff --git a/FileShare.activity/GuiView.py b/FileShare.activity/GuiView.py index 528df49..49199ad 100644 --- a/FileShare.activity/GuiView.py +++ b/FileShare.activity/GuiView.py @@ -159,7 +159,7 @@ class GuiHandler(): - def show_throbber(self, show, mesg=""): + def show_throbber(self, show, mesg="", addon=None): if show: #Build Throbber throbber = gtk.VBox() @@ -168,6 +168,9 @@ class GuiHandler(): throbber.pack_start(img) throbber.pack_start(gtk.Label(mesg)) + if addon: + throbber.pack_start( addon ) + self.activity.set_canvas(throbber) self.activity.show_all() else: @@ -269,14 +272,14 @@ class GuiView(gtk.Table): self.activity = activity self.treeview = gtk.TreeView(gtk.TreeStore(str,object)) self.guiHandler = GuiHandler( activity, self.treeview ) - self.build_table(activity) + #self.build_table(activity) - def build_table(self, activity): + def build_table(self): # Create button bar ################### hbbox = gtk.HButtonBox() - if activity.isServer: + if self.activity.isServer: addFileButton = gtk.Button(_("Add File")) addFileButton.connect("clicked", self.guiHandler.requestAddFile, None) hbbox.add(addFileButton) @@ -290,7 +293,7 @@ class GuiView(gtk.Table): hbbox.add(remFileButton) else: - if activity._mode == 'SERVER' and activity._user_permissions != 0: + if self.activity._mode == 'SERVER' and self.activity._user_permissions != 0: addFileButton = gtk.Button(_("Upload A File")) addFileButton.connect("clicked", self.guiHandler.requestAddFile, {'upload':True}) hbbox.add(addFileButton) @@ -299,7 +302,7 @@ class GuiView(gtk.Table): remFileButton.connect("clicked", self.guiHandler.requestRemFile, {'remove':True}) hbbox.add(remFileButton) - if activity._user_permissions == 2: + if self.activity._user_permissions == 2: adminButton = gtk.Button(_("Server Settings")) adminButton.connect("clicked", self.guiHandler.showAdmin, None) hbbox.add(adminButton) diff --git a/FileShare.activity/MyExceptions.py b/FileShare.activity/MyExceptions.py index 8f9b022..9753227 100644 --- a/FileShare.activity/MyExceptions.py +++ b/FileShare.activity/MyExceptions.py @@ -2,3 +2,4 @@ class InShareException(Exception): pass class FileUploadFailure(Exception): pass class ServerRequestFailure(Exception): pass class NoFreeTubes(Exception): pass +class TimeOut(Exception): pass |