1
# Copyright (c) 2001-2009 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())