From 749e3e69e4f49249c4d89a157f345b0142d123c6 Mon Sep 17 00:00:00 2001 From: erich koslovsky Date: Thu, 16 Aug 2007 10:33:50 +0000 Subject: Got untracked files. This is no the initial version of the shared browser. --- (limited to 'xmlio.py') diff --git a/xmlio.py b/xmlio.py new file mode 100644 index 0000000..fe1b4d8 --- /dev/null +++ b/xmlio.py @@ -0,0 +1,127 @@ +# +# Copyright (C) 2006, 2007, One Laptop Per Child +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# + +import libxml2 +import os +import logging +import base64 + + +_logger = logging.getLogger('xmlio') + + +class Xmlio(object): + ''' The xmlio of the activity. Contains methods to read and write + the configuration for a browser session to and from xml. + ''' + + def __init__(self, dtdpath, linkbar): + self.linkbar = linkbar + self.data = {} + self.dtdpath = dtdpath + self.data['name'] = 'first' + self.session_data = '' + + try: + self.dtd = libxml2.parseDTD(None, os.path.join(self.dtdpath, 'browser.dtd')) + except libxml2.parserError, e: + _logger.error('Init: no browser.dtd found ' +str(e)) + self.dtd = None + self.ctxt = libxml2.newValidCtxt() + + def read(self, filepath): + ''' reads the configuration from an xml file ''' + + try: + doc = libxml2.parseFile(filepath) + if doc.validateDtd(self.ctxt, self.dtd): + + # get the requested nodes + xpa = doc.xpathNewContext() + res = xpa.xpathEval("//*") + + # write their content to the data structure + for elem in res: + attributes = elem.get_properties() + thumb = '' + link_name = '' + id = None + if( elem.name == 'link' ): + for attribute in attributes: + if(attribute.name == 'id'): + id = int(attribute.content) + elif(attribute.name == 'name'): + link_name = attribute.content + elif(attribute.name == 'thumb'): + thumb = attribute.content + self.linkbar._add_link(link_name, base64.b64decode(thumb), id) + + elif( elem.name == 'session' ): + for attribute in attributes: + if(attribute.name == 'data'): + self.session_data = attribute.content + + elif( elem.name == 'browser' ): + for attribute in attributes: + if(attribute.name == 'name'): + self.data['name'] = attribute.content + + xpa.xpathFreeContext() + else: + _logger.error('Read: Error in validation of the file') + doc.freeDoc() + return 1 + doc.freeDoc() + return 0 + except libxml2.parserError, e: + _logger.error('Read: Error parsing file ' +str(e)) + return 2 + + + def write(self, filepath): + ''' writes the configuration to an xml file ''' + doc = libxml2.newDoc("1.0") + root = doc.newChild(None, "browser", None) + + if(self.data.get('name', None) != None): + root.setProp("name", self.data['name']) + else: + _logger.error('Write: No name is specified. Can not write session.') + return 1 + + elem = root.newChild(None, "session", None) + elem.setProp("data", self.session_data) + + for child in self.linkbar.get_children(): + elem = root.newChild(None, "link", None) + elem.setProp("id", str(self.linkbar.get_item_index(child))) + elem.setProp("name", child.link_name) + elem.setProp("thumb", base64.b64encode(child.buf)) + + + if doc.validateDtd(self.ctxt, self.dtd): + doc.saveFormatFile(filepath, 1) + else: + _logger.error('Write: Error in validation of the file') + doc.freeDoc() + return 2 + doc.freeDoc() + return 0 + + + -- cgit v0.9.1