~cbehrens/nova/lp844160-build-works-with-zones

« back to all changes in this revision

Viewing changes to vendor/Twisted-10.0.0/doc/core/examples/pbgtk2.py

  • Committer: Jesse Andrews
  • Date: 2010-05-28 06:05:26 UTC
  • Revision ID: git-v1:bf6e6e718cdc7488e2da87b21e258ccc065fe499
initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (c) 2001-2009 Twisted Matrix Laboratories.
 
2
# See LICENSE for details.
 
3
 
 
4
 
 
5
from __future__ import nested_scopes
 
6
 
 
7
from twisted.internet import gtk2reactor
 
8
gtk2reactor.install()
 
9
 
 
10
import gtk
 
11
from gtk import glade
 
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
 
18
 
 
19
 
 
20
class LoginDialog:
 
21
    def __init__(self, deferred):
 
22
        self.deferredResult = deferred
 
23
 
 
24
        gladefile = util.sibpath(__file__, "pbgtk2login.glade")
 
25
        self.glade = glade.XML(gladefile)
 
26
 
 
27
        self.glade.signal_autoconnect(self)
 
28
 
 
29
        self.setWidgetsFromGladefile()
 
30
        self._loginDialog.show()
 
31
 
 
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))
 
38
 
 
39
        self._statusContext = self._statusBar.get_context_id("Login dialog.")
 
40
 
 
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)()
 
47
 
 
48
    def on_loginDialog_close(self, widget, userdata=None):
 
49
        self.windowClosed()
 
50
 
 
51
    def cancelled(self):
 
52
        if not self.deferredResult.called:
 
53
            self.deferredResult.errback()
 
54
        self._loginDialog.destroy()
 
55
 
 
56
    def windowClosed(self, reason=None):
 
57
         if not self.deferredResult.called:
 
58
            self.deferredResult.errback()
 
59
 
 
60
    def doLogin(self):
 
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()
 
65
 
 
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)
 
70
        
 
71
        self.statusMsg("Contacting server...")
 
72
 
 
73
    def _cbGotPerspective(self, perspective):
 
74
        self.statusMsg("Connected to server.")
 
75
        self.deferredResult.callback(perspective)
 
76
        self._loginDialog.destroy()
 
77
 
 
78
    def _ebFailedLogin(self, reason):
 
79
        if isinstance(reason, failure.Failure):
 
80
            text = str(reason.value)
 
81
        else:
 
82
            text = str(reason)
 
83
            
 
84
        self.statusMsg(text)
 
85
        msg = gtk.MessageDialog(self._loginDialog,
 
86
                                gtk.DIALOG_DESTROY_WITH_PARENT,
 
87
                                gtk.MESSAGE_ERROR,
 
88
                                gtk.BUTTONS_CLOSE,
 
89
                                text)
 
90
        msg.show_all()
 
91
        msg.connect("response", lambda *a: msg.destroy())
 
92
 
 
93
    def statusMsg(self, text):
 
94
        self._statusBar.push(self._statusContext, text)
 
95
 
 
96
 
 
97
class EchoClient:
 
98
    def __init__(self, echoer):
 
99
        self.echoer = 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()
 
103
        w.add(vb)
 
104
        map(vb.add, [b, self.entry, self.outry])
 
105
        b.connect('clicked', self.clicked)
 
106
        w.connect('destroy', self.stop)
 
107
        w.show_all()
 
108
 
 
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)
 
113
 
 
114
    def stop(self, b):
 
115
        reactor.stop()
 
116
 
 
117
d = defer.Deferred()
 
118
LoginDialog(d)
 
119
d.addCallbacks(EchoClient,
 
120
               lambda _: reactor.stop())
 
121
 
 
122
reactor.run()