Oops
[zanchey/dispense2.git] / virtualvend / vvend.py
1 #!/usr/bin/env python
2
3 import sys
4 import socket
5
6 try:
7   import pygtk
8   #tell pyGTK, if possible, that we want GTKv2
9   pygtk.require("2.0")
10 except:
11   #Some distributions come with GTK2, but not pyGTK
12   pass
13
14 try:
15   import gtk
16   import gtk.glade
17 except:
18   print "You need to install pyGTK or GTKv2 ",
19   print "or set your PYTHONPATH correctly."
20   print "try: export PYTHONPATH=",
21   print "/usr/local/lib/python2.2/site-packages/"
22   sys.exit(1)
23
24 #now we have both gtk and gtk.glade imported
25 #Also, we know we are running GTK v2
26
27 class appgui:
28   def __init__(self):
29     """
30     In this init we are going to display the main
31     serverinfo window
32     """
33     gladefile="vvend.glade"
34     windowname="vvend"
35     self.wTree=gtk.glade.XML (gladefile,windowname)
36     # we only have two callbacks to register, but
37     # you could register any number, or use a
38     # special class that automatically
39     # registers all callbacks. If you wanted to pass
40     # an argument, you would use a tuple like this:
41     # dic = { "on button1_clicked" : 
42     #         (self.button1_clicked, arg1,arg2) , ...
43     
44     dic = { 
45         "on_button1_clicked" : self.keypad_clicked,
46         "on_button2_clicked" : self.keypad_clicked,
47         "on_button3_clicked" : self.keypad_clicked,
48         "on_button4_clicked" : self.keypad_clicked,
49         "on_button5_clicked" : self.keypad_clicked,
50         "on_button6_clicked" : self.keypad_clicked,
51         "on_button7_clicked" : self.keypad_clicked,
52         "on_button8_clicked" : self.keypad_clicked,
53         "on_button9_clicked" : self.keypad_clicked,
54         "on_button10_clicked" : self.keypad_clicked,
55         "on_button11_clicked" : self.keypad_clicked,
56         "on_vvend_destroy_event" : self.quit,
57         "on_vvend_delete_event" : self.quit }
58     self.wTree.signal_autoconnect (dic)
59     display = self.wTree.get_widget("label1")
60     display.set_text("*5N4CK0RZ*")
61
62     self.messageid = None
63
64     #s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
65     #s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
66 #
67 #    listenhost=""
68 #    listenport=5150
69 #    s.bind((listenhost, listenport))
70 #    # only one connection
71 #    s.listen(1)
72 #    s.setblocking(1)
73 #    #GDK->gtk.gdk in GTK V 2.0
74 #    id=gtk.input_add(s, gtk.gdk.INPUT_READ, self.handleNewConnection)
75
76     self.server()
77
78
79     return
80   
81 #####CALLBACKS
82   def keypad_clicked(self,widget):
83     print "button clicked"
84     print widget.get_label()
85     self.do_send(widget.get_label())
86     sys.stdout.write("\a")
87
88   def handleNewConnection(self,source,condition):
89     #source is a socket in GTK v 1 and a fd in version 2
90     conn, addr = source.accept()
91     sys.stdout.write(conn.recv(1))
92     conn.send("bing\n")
93     return gtk.TRUE
94
95 # from http://www.pythonbrasil.com.br/moin.cgi/MonitorandoSocketsComPygtk
96
97
98   def send(self, data=None, widget=None):
99      text = self.entry.get_text()
100      self.do_send(text)
101      self.entry.set_text('')
102
103      #
104
105   def do_send(self, data):
106
107      # envia ''data'' para todos os clientes conectados
108
109      for addr, (conn, tag) in self.clients.iteritems():
110             conn.send(data)
111
112   def server(self):
113
114      # inicializa o servidor
115
116      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
117      self.sock.bind(('localhost', 5051))
118      self.sock.listen(0)
119
120      # 
121      #
122
123      self.server_tag = gtk.input_add(self.sock, gtk.gdk.INPUT_READ, self.accept)
124
125      # mantemos uma lista dos clientes conectados
126
127      self.clients = {}
128
129   def accept(self, source, condition):
130
131      #
132      # esperando para ser aceito
133
134      conn, addr = source.accept()
135      self.insert("%s:%s conectado\n" % addr)
136
137      # insere o cliente na lista e registra o método self.write como 
138      # callback para quando existirem dados esperando para serem lidos
139
140      self.clients[addr] = (conn, gtk.input_add(conn, gtk.gdk.INPUT_READ, self.write))
141
142   def write(self, source, condition):
143
144      # método chamado quando um cliente envia dados 
145
146      data = source.recv(1024)
147      if data.strip() == 'bye' or not len(data):
148
149             # se o cliente enviar um ''bye'', desconecte-o :)
150
151             source.close()
152             for addr, (conn, tag) in self.clients.iteritems():
153                 if source is conn:
154                     gtk.input_remove(tag)
155                     self.insert('%s:%s desconectado\n' % addr)
156                     del self.clients[addr]
157                     
158                     self.server_tag = gtk.input_add(self.sock, gtk.gdk.INPUT_READ, self.accept)
159                     break
160      elif data.strip() == 'quit':
161         self.quit()
162      else:
163             for (addr, port), (conn, tag) in self.clients.iteritems():
164                 if source is conn:
165                     self.insert('%s:%s >>> %s\n'%(addr, port, data.strip()))
166                     break
167      
168      return gtk.TRUE
169
170   def insert(self, data):
171      statusbar = self.wTree.get_widget("statusbar1")
172      if self.messageid:
173         statusbar.remove(1, self.messageid)
174      self.messageid=statusbar.push(1,data)
175
176   def quit(self, *args):
177      sys.stdout.write("quiting...\n")
178      gtk.input_remove(self.server_tag)
179      for addr, (conn, tag) in self.clients.iteritems():
180             gtk.input_remove(tag)
181             conn.close()
182      self.sock.close()
183
184      gtk.mainquit()
185      sys.stdout.write("quit!\n")
186
187 # we start the app like this...
188 app=appgui()
189 gtk.mainloop()
190
191
192 # notes
193 # http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq20.011.htp

UCC git Repository :: git.ucc.asn.au