791
import xml.sax.saxutils;
799
parser = ConfigParser.SafeConfigParser()
800
parser.read(os.path.expanduser('~/.ggz/ggz-gtk.rc'))
802
value = parser.get('Servers', 'profilelist')
805
for n in value.replace('\\ ', '\x00').split(' '):
807
server.name = n.replace('\x00', ' ')
808
server.host = parser.get(server.name, 'Host')
809
server.port = parser.getint(server.name, 'Port')
810
server.login = parser.get(server.name, 'Login')
812
self.servers.append(server)
814
print (server.name, server.host, server.port, server.login)
793
816
class GGZConnection:
849
872
def onOutgoingData(self, data):
850
873
print 'tx: %s' % repr(data)
851
self.dialog.socket.send(data)
874
self.dialog.send(data)
853
876
def onChat(self, chatType, sender, text):
854
877
self.dialog.controller.addText('%s: %s\n' % (sender, text), 'chat')
864
887
self.protocol = ggz.Chess(self)
865
888
self.decoder = ggz.Channel(self.protocol)
890
self.isConnected = False
867
892
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
893
self.socket.setblocking(False)
868
894
ui.application.ioHandlers[self.socket.fileno()] = self
869
895
ui.controller.watchFileDescriptor(self.socket.fileno())
870
self.socket.connect(('gnome.ggzgamingzone.org', 5688))
897
self.socket.connect(('localhost', 5688))
899
# FIXME: Abort/retry if error
900
if e.args[0] == errno.EINPROGRESS:
901
print 'connecting...'
872
905
self.send("<?xml version='1.0' encoding='UTF-8'?>\n<SESSION>\n<CHANNEL ID='glchess-test' /></SESSION>")
874
907
def send(self, data):
875
908
print 'tx-channel: %s' % repr(data)
876
self.socket.send(data);
909
origLength = len(self.buffer)
912
# FIXME: g_io_watch() doesn't seem to work for both read and write
914
# self.ui.controller.writeFileDescriptor(self.socket.fileno())
918
nWritten = self.socket.send(self.buffer)
919
print 'wrote %d octets' % nWritten
920
self.buffer = self.buffer[nWritten:]
921
return len(self.buffer) > 0
879
(data, address) = self.socket.recvfrom(65535)
883
print 'rx-channel: %s' % repr(data)
884
self.decoder.feed(data)
925
(data, address) = self.socket.recvfrom(65535)
927
print 'Error reading from channel'
932
print 'rx-channel: %s' % repr(data)
933
self.decoder.feed(data)
887
936
def onSeat(self, seatNum, version):
942
991
def __init__(self, ui):
997
def send(self, data):
1000
nSent = self.socket.send(self.buffer)
1001
except socket.error:
1003
self.buffer = self.buffer[nSent:]
1007
(data, address) = self.socket.recvfrom(65535)
1008
except socket.error:
1012
print 'disconnected'
1014
self.decoder.registerIncomingData(data)
1017
def setProfile(self, profile):
1022
print 'Profile=%s' % name
1024
if self.socket is not None:
1025
# FIXME: Unregister fd events
1029
self.profile = profile
1033
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1034
self.socket.setblocking(False)
1035
self.ui.application.ioHandlers[self.socket.fileno()] = self
1036
self.ui.controller.watchFileDescriptor(self.socket.fileno())
1038
self.socket.connect((profile.host, profile.port))
1039
except socket.error, e:
1040
# FIXME: Abort/retry if error
1041
if e.args[0] == errno.EINPROGRESS:
1042
print 'connecting...'
945
1046
self.decoder = GGZConnection(self)
947
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
948
ui.application.ioHandlers[self.socket.fileno()] = self
949
ui.controller.watchFileDescriptor(self.socket.fileno())
950
self.socket.connect(('gnome.ggzgamingzone.org', 5688))
955
(data, address) = self.socket.recvfrom(65535)
956
self.decoder.registerIncomingData(data)
1047
self.decoder.start(profile.login)
959
1049
def joinRoom(self, room):
960
1050
self.decoder.client.joinRoom(room)
966
1056
def startTable(self):
967
1057
self.channel = GGZChannel(self.ui)
968
self.decoder.client.startTable('30', 'glChess test game (do not join!)', 'glchess-test')
1058
self.decoder.client.startTable(self.decoder.room.game.id, 'glChess test game (do not join!)', 'glchess-test')
970
1060
def sendChat(self, text):
971
1061
self.decoder.client.sendChat(text)
985
1075
self.controller = gtkui.GtkUI(self)
986
1076
self.application = application
1077
self.ggzConfig = GGZConfig()
988
1079
self.splashscreen = Splashscreen(self)
989
1080
self.splashscreen.controller = self.controller.setDefaultView(self.splashscreen)
1004
1095
self.application.ioHandlers.pop(fd)
1098
def onWriteFileDescriptor(self, fd):
1099
"""Called by ui.UIFeedback"""
1101
handler = self.application.ioHandlers[fd]
1105
result = handler.write()
1107
self.application.ioHandlers.pop(fd)
1007
1110
def onGameStart(self, game):
1008
1111
"""Called by ui.UIFeedback"""
1009
1112
if game.white.type == '':
1039
1142
"""Called by ui.UIFeedback"""
1040
1143
dialog = GGZNetworkDialog(self)
1041
1144
dialog.controller = self.controller.addNetworkDialog(dialog)
1145
for server in self.ggzConfig.servers:
1146
dialog.controller.addProfile(server, server.name)
1043
1148
def onQuit(self):
1044
1149
"""Called by ui.UIFeedback"""
1110
1215
fd = player.fileno()
1111
1216
if fd is not None:
1112
1217
self.ioHandlers.pop(fd)
1219
def addNetworkGame(self, name):
1220
g = ChessGame(self, name)
1221
self.__games.append(g)
1114
1224
def addGame(self, name, whiteName, whiteType, blackName, blackType):
1115
1225
"""Add a chess game into glChess.