class Mournmail::Summary

Constants

DUMPABLE_VARIABLES
LOCK_OPERATIONS

Attributes

items[R]
last_uid[R]
mailbox[R]
uidvalidity[RW]

Public Class Methods

cache_lock_path(mailbox) click to toggle source
# File lib/mournmail/summary.rb, line 27
def self.cache_lock_path(mailbox)
  cache_path(mailbox) + ".lock"
end
cache_old_path(mailbox) click to toggle source
# File lib/mournmail/summary.rb, line 35
def self.cache_old_path(mailbox)
  cache_path(mailbox) + ".old"
end
cache_path(mailbox) click to toggle source
# File lib/mournmail/summary.rb, line 23
def self.cache_path(mailbox)
  File.join(Mournmail.mailbox_cache_path(mailbox), ".summary")
end
cache_tmp_path(mailbox) click to toggle source
# File lib/mournmail/summary.rb, line 31
def self.cache_tmp_path(mailbox)
  cache_path(mailbox) + ".tmp"
end
load(mailbox) click to toggle source
# File lib/mournmail/summary.rb, line 39
def self.load(mailbox)
  lock_cache(mailbox, :shared) do
    File.open(cache_path(mailbox)) do |f|
      Marshal.load(f)
    end
  end
end
load_or_new(mailbox) click to toggle source
# File lib/mournmail/summary.rb, line 47
def self.load_or_new(mailbox)
  load(mailbox)
rescue Errno::ENOENT
  new(mailbox)
end
lock_cache(mailbox, mode) { || ... } click to toggle source
# File lib/mournmail/summary.rb, line 16
def self.lock_cache(mailbox, mode)
  File.open(Summary.cache_lock_path(mailbox), "w", 0600) do |f|
    f.flock(LOCK_OPERATIONS[mode])
    yield
  end
end
new(mailbox) click to toggle source
Calls superclass method
# File lib/mournmail/summary.rb, line 53
def initialize(mailbox)
  super()
  @mailbox = mailbox
  @items = []
  @message_id_table = {}
  @uid_table = {}
  @last_uid = nil
  @uidvalidity = nil
end

Public Instance Methods

[](uid) click to toggle source
# File lib/mournmail/summary.rb, line 116
def [](uid)
  synchronize do
    @uid_table[uid]
  end
end
add_item(item, message_id, in_reply_to) click to toggle source
# File lib/mournmail/summary.rb, line 85
    def add_item(item, message_id, in_reply_to)
      synchronize do
# Disable threads
#        parent = @message_id_table[in_reply_to]
#        if parent
#          parent.add_reply(item)
#        else
#          @items.push(item)
#        end
        @items.push(item)
        if message_id
          @message_id_table[message_id] = item
        end
        @uid_table[item.uid] = item
        @last_uid = item.uid
      end
    end
delete_item_if() { |item| ... } click to toggle source
# File lib/mournmail/summary.rb, line 103
def delete_item_if(&block)
  synchronize do
    @items = @items.flat_map { |item|
      item.delete_reply_if(&block)
      if yield(item)
        item.replies
      else
        [item]
      end
    }
  end
end
marshal_dump() click to toggle source
# File lib/mournmail/summary.rb, line 72
def marshal_dump
  DUMPABLE_VARIABLES.each_with_object({}) { |var, h|
    h[var] = instance_variable_get(var)
  }
end
marshal_load(data) click to toggle source
# File lib/mournmail/summary.rb, line 78
def marshal_load(data)
  mon_initialize
  data.each do |var, val|
    instance_variable_set(var, val)
  end
end
read_mail(uid) click to toggle source
# File lib/mournmail/summary.rb, line 128
def read_mail(uid)
  synchronize do
    item = @uid_table[uid]
    if item.cache_id
      File.open(Mournmail.mail_cache_path(item.cache_id)) do |f|
        [Mournmail.parse_mail(f.read), false]
      end
    else
      Mournmail.imap_connect do |imap|
        imap.select(@mailbox)
        data = imap.uid_fetch(uid, "BODY[]")
        if data.nil? || data.empty?
          raise EditorError, "No such mail: #{uid}"
        end
        s = data[0].attr["BODY[]"]
        mail = Mournmail.parse_mail(s)
        spam_mailbox = Mournmail.account_config[:spam_mailbox]
        if @mailbox != Net::IMAP.encode_utf7(spam_mailbox)
          item.cache_id = Mournmail.write_mail_cache(s)
          Mournmail.index_mail(item.cache_id, mail)
        end
        [mail, true]
      end
    end
  end
end
save() click to toggle source
# File lib/mournmail/summary.rb, line 155
def save
  synchronize do
    path = Summary.cache_path(@mailbox)
    FileUtils.mkdir_p(File.dirname(path))
    Summary.lock_cache(@mailbox, :exclusive) do
      cache_path = Summary.cache_path(@mailbox)
      tmp_path = Summary.cache_tmp_path(@mailbox)
      old_path = Summary.cache_old_path(@mailbox)
      File.open(tmp_path, "w", 0600) do |f|
        Marshal.dump(self, f)
      end
      begin
        File.rename(cache_path, old_path)
      rescue Errno::ENOENT
      end
      File.rename(tmp_path, cache_path)
    end
  end
end
to_s() click to toggle source
# File lib/mournmail/summary.rb, line 175
def to_s
  synchronize do
    items.each_with_object(+"") do |item, s|
      s << item.to_s
    end
  end
end
uids() click to toggle source
# File lib/mournmail/summary.rb, line 122
def uids
  synchronize do
    @uid_table.keys
  end
end