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