From 67ef2bd8e5d9beab0f5dcf0a54567590350ad26c Mon Sep 17 00:00:00 2001 From: Simon Schampijer Date: Fri, 31 Aug 2007 08:14:17 +0000 Subject: first work on using json for the hole model --- diff --git a/browser.py b/browser.py index aa3a8a0..828e783 100644 --- a/browser.py +++ b/browser.py @@ -53,8 +53,8 @@ class Browser(WebView): def get_session(self): return sessionstore.get_session(self) - def set_session(self, session_data): - return sessionstore.set_session(self, session_data) + def set_session(self, data): + return sessionstore.set_session(self, data) class WindowCreator: _com_interfaces_ = interfaces.nsIWindowCreator diff --git a/model.py b/model.py index 284cb7f..6bdb94e 100644 --- a/model.py +++ b/model.py @@ -16,163 +16,37 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -import libxml2 import os import logging import base64 +import json +from xpcom import components +from xpcom.components import interfaces _logger = logging.getLogger('model') - class Model(object): - ''' The model of the activity. Contains methods to read and write - the configuration for a browser session to and from xml. + ''' The model of the activity which uses json to serialize its data + to a file and deserelize from it. ''' - def __init__(self, dtdpath): - self.links = [] + def __init__(self): 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() - if( elem.name == 'link' ): - for attribute in attributes: - if(attribute.name == 'hash'): - hash = attribute.content - elif(attribute.name == 'url'): - url = attribute.content - elif(attribute.name == 'title'): - title = attribute.content - elif(attribute.name == 'thumb'): - thumb = base64.b64decode(attribute.content) - elif(attribute.name == 'owner'): - owner = attribute.content - elif(attribute.name == 'color'): - color = attribute.content - elif(attribute.name == 'deleted'): - deleted = int(attribute.content) - - self.links.append( {'hash':hash, 'url':url, 'title':title, 'thumb':thumb, - 'owner':owner, 'color':color, 'deleted':deleted} ) - - 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 + self.links = [] - 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 link in self.links: - elem = root.newChild(None, "link", None) - elem.setProp("hash", link['hash']) - elem.setProp("url", link['url']) - elem.setProp("title", link['title']) - elem.setProp("thumb", base64.b64encode(link['thumb'])) - elem.setProp("owner", link['owner']) - elem.setProp("color", link['color']) - elem.setProp("deleted", str(link['deleted'])) - - 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 + def serialize(self): + self.get_session() + return json.write(self.data) + def deserialize(self, data): + self.data = json.read(data) + self.links = self.data + def get_links_ids(self): ids = [] for link in self.links: ids.append(link['hash']) ids.append('') return ids - - -if __name__ == '__main__': - model = Model(os.path.dirname(__file__)) - - filepath = 'sports.png' - - target = os.open(filepath, os.O_RDONLY) - filelen = os.stat(filepath).st_size - data = os.read(target, filelen) - os.close(target) - - ''' - import sha - url = 'www.sport.de' - title = 'sports' - hash = sha.new(url) - model.links.append({'hash':hash.hexdigest(), 'url':url, 'title':title}) - - url = 'www.jazz.de' - title = 'more on jazz' - hash = sha.new(url) - model.links.append({'hash':hash.hexdigest(), 'url':url, 'title':title}) - - url = 'www.taz.de' - title = 'die zeitung' - hash = sha.new(url) - model.links.append({'hash':hash.hexdigest(), 'url':url, 'title':title}) - - model.write('/tmp/test.bwr') - ''' - - model.read('/tmp/test.bwr') - - model.links.remove(model.links[1]) - print model.links diff --git a/sessionstore.py b/sessionstore.py index 73251ff..0847976 100644 --- a/sessionstore.py +++ b/sessionstore.py @@ -24,23 +24,20 @@ from xpcom.components import interfaces import json + def get_session(browser): session_history = browser.web_navigation.sessionHistory - + if session_history.count == 0: return '' - - session_data = {} - session_data['history'] = _get_history(session_history) - logging.debug('%r' % session_data) - return json.write(session_data) - -def set_session(browser, session_str): - session_data = json.read(session_str) - _set_history(browser.web_navigation.sessionHistory, session_data['history']) - - if session_data['history']: - browser.web_navigation.gotoIndex(len(session_data['history']) - 1) + + return _get_history(session_history) + +def set_session(browser, data): + _set_history(browser.web_navigation.sessionHistory, data) + + if data: + browser.web_navigation.gotoIndex(len(data) - 1) else: browser.load_uri('about:blank') diff --git a/webactivity.py b/webactivity.py index d76967d..67c5995 100755 --- a/webactivity.py +++ b/webactivity.py @@ -90,7 +90,7 @@ class WebActivity(activity.Activity): self.toolbar._add_link.connect('clicked', self._add_link_button_cb) self._browser.connect("notify::title", self._title_changed_cb) - self.model = Model(os.path.dirname(__file__)) + self.model = Model() self._main_view = gtk.VBox() self.set_canvas(self._main_view) @@ -260,7 +260,7 @@ class WebActivity(activity.Activity): def read_file(self, file_path): if self.metadata['mime_type'] == 'text/plain': - self.model.read(file_path) + self.model.deserialize(file_path) i=0 for link in self.model.links: _logger.debug('read: url=%s title=%s d=%s' % (link['url'], link['title'], link['color'])) @@ -268,8 +268,8 @@ class WebActivity(activity.Activity): self.linkbar._add_link(link['url'], link['thumb'], link['color'], link['title'], link['owner'], i) i+=1 - if self.model.session_data is not '': - self._browser.set_session(self.model.session_data) + if self.model.data['history'] is not '': + self._browser.set_session(self.model.data['history']) else: self._browser.load_uri(file_path) _sugarext.set_prgname(self.sname) -- cgit v0.9.1