class UnorderedPicklableMailbox(parent): UNPICKLABLE = [] def __init__(self, *args, **kwargs): parent.__init__(self, *args, **kwargs) self.editable = editable self.source_map = {} self.is_local = False self._lock = MboxRLock() self._save_to = None self._encryption_key_func = lambda: None self._decryption_key_func = lambda: None self.__init2__(*args, **kwargs) def __init2__(self, *args, **kwargs): pass def __enter__(self, *args, **kwargs): self._lock.acquire() return self def __exit__(self, *args, **kwargs): self._lock.release() def __setstate__(self, data): self.__dict__.update(data) self._lock = MboxRLock() with self._lock: self._save_to = None self._encryption_key_func = lambda: None self._decryption_key_func = lambda: None if not hasattr(self, 'source_map'): self.source_map = {} if (len(self.source_map) > 0 and not hasattr(self, 'is_local') or not self.is_local): self.is_local = True self.update_toc() def __getstate__(self): odict = self.__dict__.copy() # Pickle can't handle function objects. for dk in ['_save_to', '_encryption_key_func', '_decryption_key_func', '_file', '_lock', 'parsed'] + self.UNPICKLABLE: if dk in odict: del odict[dk] return odict def save(self, session=None, to=None, pickler=None): with self._lock: if to and pickler: self._save_to = (pickler, to) if self._save_to and len(self) > 0: pickler, fn = self._save_to if session: session.ui.mark(_('Saving %s state to %s') % (self, fn)) pickler(self, fn) def add_from_source(self, source_id, *args, **kwargs): with self._lock: key = self.add(*args, **kwargs) self.source_map[source_id] = key return key def update_toc(self): self._refresh() def get_msg_ptr(self, mboxid, toc_id): return '%s%s' % (mboxid, quote(toc_id)) def get_file(self, *args, **kwargs): with self._lock: return parent.get_file(self, *args, **kwargs) def get_file_by_ptr(self, msg_ptr): return self.get_file(unquote(msg_ptr[MBX_ID_LEN:])) def get_msg_size(self, toc_id): with self._lock: fd = self.get_file(toc_id) fd.seek(0, 2) return fd.tell() def get_bytes(self, toc_id): with self._lock: return self.get_file(toc_id).read() def get_string(self, *args, **kwargs): with self._lock: return parent.get_string(self, *args, **kwargs) def remove(self, *args, **kwargs): with self._lock: return parent.remove(self, *args, **kwargs) def _get_fd(self, *args, **kwargs): with self._lock: return parent._get_fd(self, *args, **kwargs) def _refresh(self, *args, **kwargs): with self._lock: return parent._refresh(self, *args, **kwargs) def __setitem__(self, *args, **kwargs): with self._lock: return parent.__setitem__(self, *args, **kwargs) def __getitem__(self, *args, **kwargs): with self._lock: return parent.__getitem__(self, *args, **kwargs)
class UnorderedPicklableMailbox(parent): UNPICKLABLE = [] def __init__(self, *args, **kwargs): parent.__init__(self, *args, **kwargs) self.editable = editable self.source_map = {} self.is_local = False self._lock = MboxRLock() self._save_to = None self._encryption_key_func = lambda: None self._decryption_key_func = lambda: None self.__init2__(*args, **kwargs) def __init2__(self, *args, **kwargs): pass def __enter__(self, *args, **kwargs): self._lock.acquire() return self def __exit__(self, *args, **kwargs): self._lock.release() def __setstate__(self, data): self.__dict__.update(data) self._lock = MboxRLock() with self._lock: self._save_to = None self._encryption_key_func = lambda: None self._decryption_key_func = lambda: None if not hasattr(self, "source_map"): self.source_map = {} if len(self.source_map) > 0 and not hasattr(self, "is_local") or not self.is_local: self.is_local = True self.update_toc() def __getstate__(self): odict = self.__dict__.copy() # Pickle can't handle function objects. for dk in [ "_save_to", "_encryption_key_func", "_decryption_key_func", "_file", "_lock", "parsed", ] + self.UNPICKLABLE: if dk in odict: del odict[dk] return odict def save(self, session=None, to=None, pickler=None): with self._lock: if to and pickler: self._save_to = (pickler, to) if self._save_to and len(self) > 0: pickler, fn = self._save_to if session: session.ui.mark(_("Saving %s state to %s") % (self, fn)) pickler(self, fn) def add_from_source(self, source_id, metadata_kws, *args, **kwargs): with self._lock: key = self.add(*args, **kwargs) self.set_metadata_keywords(key, metadata_kws) self.source_map[source_id] = key return key def update_toc(self): self._refresh() def get_msg_ptr(self, mboxid, toc_id): return "%s%s" % (mboxid, quote(toc_id)) def get_file(self, *args, **kwargs): with self._lock: return parent.get_file(self, *args, **kwargs) def get_file_by_ptr(self, msg_ptr): return self.get_file(unquote(msg_ptr[MBX_ID_LEN:])) def remove_by_ptr(self, msg_ptr): return self.remove(unquote(msg_ptr[MBX_ID_LEN:])) def get_msg_size(self, toc_id): with self._lock: fd = self.get_file(toc_id) fd.seek(0, 2) return fd.tell() def get_bytes(self, toc_id, *args): with self._lock: return self.get_file(toc_id).read(*args) def get_string(self, *args, **kwargs): with self._lock: return parent.get_string(self, *args, **kwargs) def get_metadata_keywords(self, toc_id): # Subclasses should translate whatever internal metadata they # have into mailpile keywords describing message metadata return [] def set_metadata_keywords(self, toc_id, kws): pass def remove(self, *args, **kwargs): with self._lock: return parent.remove(self, *args, **kwargs) def _get_fd(self, *args, **kwargs): with self._lock: return parent._get_fd(self, *args, **kwargs) def _refresh(self, *args, **kwargs): with self._lock: return parent._refresh(self, *args, **kwargs) def __setitem__(self, *args, **kwargs): with self._lock: return parent.__setitem__(self, *args, **kwargs) def __getitem__(self, *args, **kwargs): with self._lock: return parent.__getitem__(self, *args, **kwargs)
class UnorderedPicklableMailbox(parent): UNPICKLABLE = [] def __init__(self, *args, **kwargs): parent.__init__(self, *args, **kwargs) self.editable = editable self.source_map = {} self.is_local = False self._last_updated = None self._lock = MboxRLock() self._index = None self._save_to = None self._encryption_key_func = lambda: None self._decryption_key_func = lambda: None self.__init2__(*args, **kwargs) def __init2__(self, *args, **kwargs): pass def __enter__(self, *args, **kwargs): self._lock.acquire() return self def __exit__(self, *args, **kwargs): self._lock.release() def __unicode__(self): return unicode(str(self)) def describe_msg_by_ptr(self, msg_ptr): try: return self._describe_msg_by_ptr(msg_ptr) except KeyError: return _("message not found in mailbox") def _describe_msg_by_ptr(self, msg_ptr): return unicode(msg_ptr) def __setstate__(self, data): self.__dict__.update(data) self._lock = MboxRLock() with self._lock: self._index = None self._save_to = None self._encryption_key_func = lambda: None self._decryption_key_func = lambda: None if not hasattr(self, 'source_map'): self.source_map = {} if (len(self.source_map) > 0 and not hasattr(self, 'is_local') or not self.is_local): self.is_local = True self.update_toc() def __getstate__(self): odict = self.__dict__.copy() # Pickle can't handle function objects. for dk in [ '_save_to', '_index', '_last_updated', '_encryption_key_func', '_decryption_key_func', '_file', '_lock', 'parsed' ] + self.UNPICKLABLE: if dk in odict: del odict[dk] return odict def save(self, session=None, to=None, pickler=None): with self._lock: if to and pickler: self._save_to = (pickler, to) if self._save_to and len(self) > 0: pickler, fn = self._save_to if session: session.ui.mark( _('Saving %s state to %s') % (self, fn)) pickler(self, fn) def add_from_source(self, source_id, metadata_kws, *args, **kwargs): with self._lock: key = self.add(*args, **kwargs) self.set_metadata_keywords(key, metadata_kws) self.source_map[source_id] = key return key def update_toc(self): self._last_updated = time.time() self._refresh() self._last_updated = time.time() def last_updated(self): return self._last_updated def get_msg_ptr(self, mboxid, toc_id): return '%s%s' % (mboxid, quote(toc_id)) def get_file(self, *args, **kwargs): with self._lock: return parent.get_file(self, *args, **kwargs) def get_file_by_ptr(self, msg_ptr): return self.get_file(unquote(msg_ptr[MBX_ID_LEN:])) def remove_by_ptr(self, msg_ptr): self._last_updated = time.time() return self.remove(unquote(msg_ptr[MBX_ID_LEN:])) def get_msg_size(self, toc_id): with self._lock: fd = self.get_file(toc_id) fd.seek(0, 2) return fd.tell() def get_bytes(self, toc_id, *args): with self._lock: return self.get_file(toc_id).read(*args) def get_string(self, *args, **kwargs): with self._lock: return parent.get_string(self, *args, **kwargs) def get_metadata_keywords(self, toc_id): # Subclasses should translate whatever internal metadata they # have into mailpile keywords describing message metadata return [] def set_metadata_keywords(self, toc_id, kws): pass def get_index(self, config, mbx_mid=None): with self._lock: if self._index is None: self._index = MailboxIndex(config, self, mbx_mid=mbx_mid) return self._index def remove(self, *args, **kwargs): with self._lock: self._last_updated = time.time() return parent.remove(self, *args, **kwargs) def _get_fd(self, *args, **kwargs): with self._lock: return parent._get_fd(self, *args, **kwargs) def _refresh(self, *args, **kwargs): with self._lock: return parent._refresh(self, *args, **kwargs) def __setitem__(self, *args, **kwargs): with self._lock: self._last_updated = time.time() return parent.__setitem__(self, *args, **kwargs) def __getitem__(self, *args, **kwargs): with self._lock: return parent.__getitem__(self, *args, **kwargs)
class UnorderedPicklableMailbox(parent): UNPICKLABLE = [] def __init__(self, *args, **kwargs): parent.__init__(self, *args, **kwargs) self.editable = editable self.source_map = {} self.is_local = False self._last_updated = None self._lock = MboxRLock() self._index = None self._save_to = None self._encryption_key_func = lambda: None self._decryption_key_func = lambda: None self.__init2__(*args, **kwargs) def __init2__(self, *args, **kwargs): pass def __enter__(self, *args, **kwargs): self._lock.acquire() return self def __exit__(self, *args, **kwargs): self._lock.release() def __unicode__(self): return unicode(str(self)) def describe_msg_by_ptr(self, msg_ptr): try: return self._describe_msg_by_ptr(msg_ptr) except KeyError: return _("message not found in mailbox") def _describe_msg_by_ptr(self, msg_ptr): return unicode(msg_ptr) def __setstate__(self, data): self.__dict__.update(data) self._lock = MboxRLock() with self._lock: self._index = None self._save_to = None self._encryption_key_func = lambda: None self._decryption_key_func = lambda: None if not hasattr(self, 'source_map'): self.source_map = {} if (len(self.source_map) > 0 and not hasattr(self, 'is_local') or not self.is_local): self.is_local = True self.update_toc() def __getstate__(self): odict = self.__dict__.copy() # Pickle can't handle function objects. for dk in ['_save_to', '_index', '_last_updated', '_encryption_key_func', '_decryption_key_func', '_file', '_lock', 'parsed'] + self.UNPICKLABLE: if dk in odict: del odict[dk] return odict def save(self, session=None, to=None, pickler=None): with self._lock: if to and pickler: self._save_to = (pickler, to) if self._save_to and len(self) > 0: pickler, fn = self._save_to if session: session.ui.mark(_('Saving %s state to %s') % (self, fn)) pickler(self, fn) def add_from_source(self, source_id, metadata_kws, *args, **kwargs): with self._lock: key = self.add(*args, **kwargs) self.set_metadata_keywords(key, metadata_kws) self.source_map[source_id] = key return key def update_toc(self): self._last_updated = time.time() self._refresh() self._last_updated = time.time() def last_updated(self): return self._last_updated def get_msg_ptr(self, mboxid, toc_id): return '%s%s' % (mboxid, quote(toc_id)) def get_file(self, *args, **kwargs): with self._lock: return parent.get_file(self, *args, **kwargs) def get_file_by_ptr(self, msg_ptr): return self.get_file(unquote(msg_ptr[MBX_ID_LEN:])) def remove_by_ptr(self, msg_ptr): self._last_updated = time.time() return self.remove(unquote(msg_ptr[MBX_ID_LEN:])) def get_msg_size(self, toc_id): with self._lock: fd = self.get_file(toc_id) fd.seek(0, 2) return fd.tell() def get_bytes(self, toc_id, *args): with self._lock: return self.get_file(toc_id).read(*args) def get_string(self, *args, **kwargs): with self._lock: return parent.get_string(self, *args, **kwargs) def get_metadata_keywords(self, toc_id): # Subclasses should translate whatever internal metadata they # have into mailpile keywords describing message metadata return [] def set_metadata_keywords(self, toc_id, kws): pass def get_index(self, config, mbx_mid=None): with self._lock: if self._index is None: self._index = MailboxIndex(config, self, mbx_mid=mbx_mid) return self._index def remove(self, *args, **kwargs): with self._lock: self._last_updated = time.time() return parent.remove(self, *args, **kwargs) def _get_fd(self, *args, **kwargs): with self._lock: return parent._get_fd(self, *args, **kwargs) def _refresh(self, *args, **kwargs): with self._lock: return parent._refresh(self, *args, **kwargs) def __setitem__(self, *args, **kwargs): with self._lock: self._last_updated = time.time() return parent.__setitem__(self, *args, **kwargs) def __getitem__(self, *args, **kwargs): with self._lock: return parent.__getitem__(self, *args, **kwargs)