def initialize dir
@dir = dir
@source = nil
- self.class.i_am_the_instance self
end
- def self.source_name; "drafts://"; end
+ def self.source_name; "sup://drafts"; end
def self.source_id; 9999; end
- def new_source; @source = DraftLoader.new; end
+ def new_source; @source = Recoverable.new DraftLoader.new; end
def write_draft
offset = @source.gen_offset
fn = @source.fn_for_offset offset
File.open(fn, "w") { |f| yield f }
- @source.each do |offset, labels|
- m = Message.new :source => @source, :source_info => offset, :labels => labels
- Index.add_message m
- UpdateManager.relay :add, m
+ my_message = nil
+ PollManager.each_message_from(@source) do |m|
+ PollManager.add_new_message m
+ my_message = m
end
+
+ my_message
end
- def discard mid
- docid, entry = Index.load_entry_for_id mid
- raise ArgumentError, "can't find entry for draft: #{mid.inspect}" unless entry
- raise ArgumentError, "not a draft: source id #{entry[:source_id].inspect}, should be #{DraftManager.source_id.inspect} for #{mid.inspect} / docno #{docid}" unless entry[:source_id].to_i == DraftManager.source_id
- Index.drop_entry docid
- File.delete @source.fn_for_offset(entry[:source_info])
- UpdateManager.relay :delete, mid
+ def discard m
+ raise ArgumentError, "not a draft: source id #{m.source.id.inspect}, should be #{DraftManager.source_id.inspect} for #{m.id.inspect}" unless m.source.id.to_i == DraftManager.source_id
+ Index.delete m.id
+ File.delete @source.fn_for_offset(m.source_info)
+ UpdateManager.relay self, :single_message_deleted, m
end
end
class DraftLoader < Source
attr_accessor :dir
+ yaml_properties :cur_offset
def initialize cur_offset=0
dir = Redwood::DRAFT_DIR
Dir.mkdir dir unless File.exists? dir
- super "draft://#{dir}", cur_offset, true, false
+ super DraftManager.source_name, cur_offset, true, false
@dir = dir
end
def id; DraftManager.source_id; end
def to_s; DraftManager.source_name; end
+ def uri; DraftManager.source_name; end
def each
- Dir.entries(@dir).select { |x| x =~ /^\d+$/ }.sort_by { |x| x.to_i }.each { |id| yield [id, [:draft]] }
+ ids = get_ids
+ ids.each do |id|
+ if id >= cur_offset
+ self.cur_offset = id + 1
+ yield [id, [:draft, :inbox]]
+ end
+ end
end
def gen_offset
def fn_for_offset o; File.join(@dir, o.to_s); end
def load_header offset
- File.open fn_for_offset(offset) do |f|
- return MBox::read_header(f)
- end
+ File.open(fn_for_offset(offset)) { |f| parse_raw_email_header f }
end
def load_message offset
ret
end
- def raw_full_message offset
- ret = ""
- File.open fn_for_offset(offset) do |f|
- ret += l until f.eof?
+ def each_raw_message_line offset
+ File.open(fn_for_offset(offset)) do |f|
+ yield f.gets until f.eof?
end
- ret
+ end
+
+ def raw_message offset
+ IO.read(fn_for_offset(offset))
end
def start_offset; 0; end
- def end_offset; Dir.new(@dir).entries.sort.last.to_i; end
-end
+ def end_offset
+ ids = get_ids
+ ids.empty? ? 0 : (ids.last + 1)
+ end
-Redwood::register_yaml(DraftLoader, %w(cur_offset))
+private
+
+ def get_ids
+ Dir.entries(@dir).select { |x| x =~ /^\d+$/ }.map { |x| x.to_i }.sort
+ end
+end
end