gnome-games r8559 - trunk/glchess/src/lib
- From: rancell svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-games r8559 - trunk/glchess/src/lib
- Date: Mon, 12 Jan 2009 11:28:25 +0000 (UTC)
Author: rancell
Date: Mon Jan 12 11:28:24 2009
New Revision: 8559
URL: http://svn.gnome.org/viewvc/gnome-games?rev=8559&view=rev
Log:
Made GGZConfig class able to write out configuration (preparation for bug #564515)
Modified:
trunk/glchess/src/lib/main.py
trunk/glchess/src/lib/network.py
Modified: trunk/glchess/src/lib/main.py
==============================================================================
--- trunk/glchess/src/lib/main.py (original)
+++ trunk/glchess/src/lib/main.py Mon Jan 12 11:28:24 2009
@@ -339,7 +339,7 @@
self.ggzConfig = network.GGZConfig()
dialog = network.GGZNetworkDialog(self)
self.networkDialog = dialog.controller = self.controller.addNetworkDialog(dialog)
- for server in self.ggzConfig.servers:
+ for server in self.ggzConfig.getServers():
dialog.controller.addProfile(server, server.name)
def onAnimate(self, timeStep):
Modified: trunk/glchess/src/lib/network.py
==============================================================================
--- trunk/glchess/src/lib/network.py (original)
+++ trunk/glchess/src/lib/network.py Mon Jan 12 11:28:24 2009
@@ -13,7 +13,51 @@
_ = gettext.gettext
class GGZServer:
- pass
+ def __init__(self, name):
+ self.name = name
+
+class GGZLine:
+ TYPE_BLANK = 'BLANK'
+ TYPE_COMMENT = 'COMMENT'
+ TYPE_SECTION = 'SECTION'
+ TYPE_FIELD = 'FIELD'
+ TYPE_INVALID = 'INVALID'
+
+ def __init__(self, text):
+ self.text = text
+ self.section = None
+ try:
+ self.decode(text)
+ except ValueError, e:
+ self.type = GGZLine.TYPE_INVALID
+ print e
+
+ def decode(self, text):
+ content = text.strip()
+ if len(content) == 0:
+ self.type = GGZLine.TYPE_BLANK
+ elif content[0] == '#':
+ self.type = GGZLine.TYPE_COMMENT
+ elif content[0] == '[':
+ self.type = GGZLine.TYPE_SECTION
+ if content[-1] != ']':
+ raise ValueError('Invalid section line: %s' % repr(content))
+ self.name = content[1:-1].strip()
+ self.value = None
+ else:
+ self.type = GGZLine.TYPE_FIELD
+ try:
+ (name, value) = content.split('=', 1)
+ except ValueError:
+ raise ValueError('Invalid field line: %s' % repr(content))
+ else:
+ self.name = name.strip()
+ self.value = value.strip()
+
+ def setValue(self, value):
+ assert(self.type is GGZLine.TYPE_FIELD)
+ self.value = value
+ self.text = '%s=%s' % (self.name, value)
class GGZConfig:
@@ -23,66 +67,99 @@
def __init__(self):
try:
- lines = file(GGZ_CONFIG_FILE).readlines()
+ f = file(GGZ_CONFIG_FILE)
+ lines = f.readlines()
except IOError:
- print 'Failed to load GGZ config'
+ print 'Failed to load GGZ config: %s' % e.message
lines = []
- fields = {}
- section = None
- for l in lines:
- l = l.strip()
-
- # Skip empty lines or comments
- if len(l) == 0 or l[0] == '#':
- continue
- # Look for section headers
- if l[0] == '[':
- if l[-1] != ']':
- print 'Invalid section line: %s' % repr(l)
- continue
- section = l[1:-1]
- if not fields.has_key(section):
- fields[section] = {}
+ self.lines = []
+
+ section = None
+ for text in lines:
+ line = GGZLine(text)
+ self.lines.append(line)
+
+ if line.type is GGZLine.TYPE_SECTION:
+ section = line.name
+ line.section = section
+ else:
+ line.section = section
+
+ def getField(self, section, name):
+ for line in self.lines:
+ if line.section != section or line.type is not GGZLine.TYPE_FIELD:
continue
-
+ if line.name == name:
+ return line.value
+ raise KeyError('No field %s in section %s' % (name, section))
+
+ def setField(self, section, name, value):
+ wasInSection = False
+ inSection = False
+ for (index, line) in enumerate(self.lines):
+ wasInSection = inSection
+ if line.section == section:
+ inSection = True
+ if line.type is GGZLine.TYPE_FIELD and line.name == name:
+ line.setValue(value)
+ return
+ elif wasInSection and not inSection:
+ self.lines.insert(index, GGZLine('%s=%s' % (name, value), section))
+ return
+
+ def removeSection(self, name):
+ keptLines = []
+ for line in self.lines:
+ if line.section != name:
+ keptLines.append(line)
+ self.lines = keptLines
+
+ def getServers(self):
+ try:
+ value = self.getField('Servers', 'ProfileList')
+ except KeyError, e:
+ return []
+
+ servers = []
+ for n in value.replace('\\ ', '\x00').split(' '):
+ name = n.replace('\x00', ' ')
try:
- (name, value) = l.split('=', 1)
- except ValueError:
- print 'Invalid field line: %s' % repr(l)
+ server = self.getServer(name)
+ except KeyError, e:
+ print e
else:
- fields[section][name.strip()] = value.strip()
+ servers.append(server)
+ return servers
+
+ def getServer(self, name):
+ server = GGZServer(name)
- self.servers = []
try:
- value = fields['Servers']['ProfileList']
+ server.host = self.getField(name, 'Host')
+ server.port = int(self.getField(name, 'Port'))
+ server.login = self.getField(name, 'Login')
+ server.loginType = int(self.getField(name, 'Type'))
+ except (KeyError, ValueError):
+ raise KeyError('Missing/invalid basic configuration for server %s' % repr(server.name))
+
+ try:
+ server.password = self.getField(name, 'Password')
except KeyError:
- pass
- else:
- for n in value.replace('\\ ', '\x00').split(' '):
- server = GGZServer()
- server.name = n.replace('\x00', ' ')
-
- if not fields.has_key(server.name):
- print 'Missing server section %s' % repr(server.name)
- continue
-
- try:
- server.host = fields[server.name]['Host']
- server.port = int(fields[server.name]['Port'])
- server.login = fields[server.name]['Login']
- server.loginType = int(fields[server.name]['Type'])
- except (KeyError, ValueError):
- print 'Missing/invalid basic configuration for server %s' % repr(server.name)
- continue
-
- try:
- server.password = fields[server.name]['Password']
- except KeyError:
- server.password = None
+ server.password = None
- self.servers.append(server)
+ return server
+ def save(self):
+ lines = []
+ for line in self.lines:
+ lines.append(line.text)
+ try:
+ f = file(GGZ_CONFIG_FILE, 'w')
+ f.writelines(lines)
+ except IOError, e:
+ print 'Failed to save GGZ config: %s' % e.message
+
class GGZChannel(ggz.Channel):
def __init__(self, ui, feedback):
self.buffer = ''
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]