app = App(basedir)
return app.run()
+ABORT_EVENT_ID = wx.NewId()
+
+class AbortEvent(wx.PyEvent):
+ def __init__(self, failure):
+ wx.PyEvent.__init__(self)
+ self.SetEventType(ABORT_EVENT_ID)
+ self.failure = failure
+
+class MacGuiClient(client.Client):
+ def __init__(self, basedir, app):
+ self.app = app
+ client.Client.__init__(self, basedir)
+
+ def _abort_process(self, failure):
+ event = AbortEvent(failure)
+ wx.PostEvent(self.app.guiapp.frame, event)
+
class App(object):
def __init__(self, basedir):
self.basedir = basedir
self.start_reactor()
try:
- guiapp = MacGuiApp(app=self)
- guiapp.MainLoop()
+ self.guiapp = MacGuiApp(app=self)
+ self.guiapp.MainLoop()
log.msg('gui mainloop exited')
except:
log.err()
def launch_reactor(self):
# run the node itself
- c = client.Client(self.basedir)
+ #c = client.Client(self.basedir)
+ c = MacGuiClient(self.basedir, self)
reactor.callLater(0, c.startService) # after reactor startup
reactor.run(installSignalHandlers=False)
self.reactor_shutdown.set()
MOUNT_ID = wx.NewId()
class SplashFrame(wx.Frame):
- def __init__(self):
+ def __init__(self, app):
wx.Frame.__init__(self, None, -1, 'Allmydata Tahoe')
+ self.app = app
self.SetSizeHints(100, 100, 600, 800)
self.SetIcon(amdicon.getIcon())
self.Fit()
self.Layout()
+ # plumb up event handler for abort
+ self.Connect(-1, -1, ABORT_EVENT_ID, self.wx_abort)
+
def on_close(self, event):
self.Show(False)
+ def wx_abort(self, event):
+ wx.MessageBox(event.failure.getTraceback(), 'Fatal Error in Node startup')
+ self.app.ExitMainLoop()
+
class SplashPanel(wx.Panel):
def __init__(self, parent, on_close):
wx.Panel.__init__(self, parent, -1)
def OnInit(self):
try:
- self.frame = SplashFrame()
+ self.frame = SplashFrame(self)
self.frame.Show(True)
self.SetTopWindow(self.frame)
print "Node._startService failed, aborting"
print failure
#reactor.stop() # for unknown reasons, reactor.stop() isn't working. [ ] TODO
- self.log('calling os.abort()')
- print "calling os.abort()"
- os.abort()
+ self._abort_process(failure)
d.addErrback(_die)
+ def _abort_process(self, failure):
+ self.log('calling os.abort()')
+ log('calling os.abort()')
+ print "calling os.abort()"
+ os.abort()
+
def stopService(self):
self.log("Node.stopService")
d = self._tub_ready_observerlist.when_fired()