Initial import to Tizen
[profile/ivi/python-twisted.git] / doc / core / examples / pbgtk2.py
1 # Copyright (c) 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()