def load(self, filename=None): pub.sendMessage('taskfile.aboutToRead', taskFile=self) self.__loading = True if filename: self.setFilename(filename) try: if self.exists(): fd = self._openForRead() tasks, categories, globalcategories, notes, syncMLConfig, changes, guid = self._read( fd) fd.close() else: tasks = [] categories = [] notes = [] changes = dict() guid = generate() syncMLConfig = createDefaultSyncConfig(guid) self.clear() self.__monitor.reset() self.__changes = changes self.__changes[self.__monitor.guid()] = self.__monitor self.categories().extend(categories) self.tasks().extend(tasks) self.notes().extend(notes) def registerOtherObjects(objects): for obj in objects: if isinstance(obj, base.CompositeObject): registerOtherObjects(obj.children()) if isinstance(obj, note.NoteOwner): registerOtherObjects(obj.notes()) if isinstance(obj, attachment.AttachmentOwner): registerOtherObjects(obj.attachments()) if isinstance(obj, task.Task): registerOtherObjects(obj.efforts()) if isinstance(obj, note.Note) or \ isinstance(obj, attachment.Attachment) or \ isinstance(obj, effort.Effort): self.__monitor.setChanges(obj.id(), set()) registerOtherObjects(self.categories().rootItems()) registerOtherObjects(self.tasks().rootItems()) registerOtherObjects(self.notes().rootItems()) self.__monitor.resetAllChanges() self.__syncMLConfig = syncMLConfig self.__guid = guid if os.path.exists(self.filename()): # We need to reset the changes on disk because we're up to date. xml.ChangesXMLWriter(file(self.filename() + '.delta', 'wb')).write(self.__changes) except: self.setFilename('') raise finally: self.__loading = False self.markClean() self.__changedOnDisk = False pub.sendMessage('taskfile.justRead', taskFile=self)
def close(self): if os.path.exists(self.filename()): changes = xml.ChangesXMLReader(self.filename() + '.delta').read() del changes[self.__monitor.guid()] xml.ChangesXMLWriter(file(self.filename() + '.delta', 'wb')).write(changes) self.setFilename('') self.__guid = generate() self.clear() self.__monitor.reset() self.markClean() self.__changedOnDisk = False
def mergeDiskChanges(self): self.__loading = True try: if os.path.exists( self.__filename ): # Not using self.exists() because DummyFile.exists returns True # Instead of writing the content of memory, merge changes # with the on-disk version and save the result. self.__monitor.freeze() try: fd = self._openForRead() tasks, categories, globalcategories, notes, syncMLConfig, allChanges, guid = self._read( fd) fd.close() self.__changes = allChanges if self.__saving: for devGUID, changes in self.__changes.items(): if devGUID != self.__monitor.guid(): changes.merge(self.__monitor) sync = ChangeSynchronizer(self.__monitor, allChanges) sync.sync([(self.categories(), category.CategoryList(categories)), (self.tasks(), task.TaskList(tasks)), (self.notes(), note.NoteContainer(notes))]) self.__changes[self.__monitor.guid()] = self.__monitor finally: self.__monitor.thaw() else: self.__changes = {self.__monitor.guid(): self.__monitor} self.__monitor.resetAllChanges() name, fd = self._openForWrite() xml.ChangesXMLWriter(fd).write(self.changes()) fd.close() if os.path.exists(self.__filename + '.delta'): os.remove(self.__filename + '.delta') if name is not None: # Unit tests (AutoSaver) os.rename(name, self.__filename + '.delta') self.__changedOnDisk = False finally: self.__loading = False