1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
5 from __future__ import nested_scopes
7 from twisted.internet import gtk2reactor
12 from twisted import copyright
13 from twisted.internet import reactor, defer
14 from twisted.python import failure, log, util
15 from twisted.spread import pb
16 from twisted.cred.credentials import UsernamePassword
17 from twisted.internet import error as netError
21 def __init__(self, deferred):
22 self.deferredResult = deferred
24 gladefile = util.sibpath(__file__, "pbgtk2login.glade")
25 self.glade = glade.XML(gladefile)
27 self.glade.signal_autoconnect(self)
29 self.setWidgetsFromGladefile()
30 self._loginDialog.show()
32 def setWidgetsFromGladefile(self):
33 widgets = ("hostEntry", "portEntry", "userNameEntry", "passwordEntry",
34 "statusBar", "loginDialog")
35 gw = self.glade.get_widget
36 for widgetName in widgets:
37 setattr(self, "_" + widgetName, gw(widgetName))
39 self._statusContext = self._statusBar.get_context_id("Login dialog.")
41 def on_loginDialog_response(self, widget, response):
42 handlers = {gtk.RESPONSE_NONE: self.windowClosed,
43 gtk.RESPONSE_DELETE_EVENT: self.windowClosed,
44 gtk.RESPONSE_OK: self.doLogin,
45 gtk.RESPONSE_CANCEL: self.cancelled}
46 handlers.get(response)()
48 def on_loginDialog_close(self, widget, userdata=None):
52 if not self.deferredResult.called:
53 self.deferredResult.errback()
54 self._loginDialog.destroy()
56 def windowClosed(self, reason=None):
57 if not self.deferredResult.called:
58 self.deferredResult.errback()
61 host = self._hostEntry.get_text()
62 port = int(self._portEntry.get_text())
63 userName = self._userNameEntry.get_text()
64 password = self._passwordEntry.get_text()
66 client_factory = pb.PBClientFactory()
67 reactor.connectTCP(host, port, client_factory)
68 creds = UsernamePassword(userName, password)
69 client_factory.login(creds).addCallbacks(self._cbGotPerspective, self._ebFailedLogin)
71 self.statusMsg("Contacting server...")
73 def _cbGotPerspective(self, perspective):
74 self.statusMsg("Connected to server.")
75 self.deferredResult.callback(perspective)
76 self._loginDialog.destroy()
78 def _ebFailedLogin(self, reason):
79 if isinstance(reason, failure.Failure):
80 text = str(reason.value)
85 msg = gtk.MessageDialog(self._loginDialog,
86 gtk.DIALOG_DESTROY_WITH_PARENT,
91 msg.connect("response", lambda *a: msg.destroy())
93 def statusMsg(self, text):
94 self._statusBar.push(self._statusContext, text)
98 def __init__(self, echoer):
100 w = gtk.Window(gtk.WINDOW_TOPLEVEL)
101 vb = gtk.VBox(); b = gtk.Button("Echo:")
102 self.entry = gtk.Entry(); self.outry = gtk.Entry()
104 map(vb.add, [b, self.entry, self.outry])
105 b.connect('clicked', self.clicked)
106 w.connect('destroy', self.stop)
109 def clicked(self, b):
110 txt = self.entry.get_text()
111 self.entry.set_text("")
112 self.echoer.callRemote('echo',txt).addCallback(self.outry.set_text)
119 d.addCallbacks(EchoClient,
120 lambda _: reactor.stop())