10 self.class.i_am_the_instance self
13 def self.source_name; "drafts"; end
14 def self.source_id; 9999; end
15 def new_source; @source = DraftLoader.new @dir; end
18 offset = @source.gen_offset
19 fn = @source.fn_for_offset offset
20 File.open(fn, "w") { |f| yield f }
22 @source.each do |offset, labels|
23 m = Message.new @source, offset, labels
25 UpdateManager.relay :add, m
30 docid, entry = Index.load_entry_for_id mid
31 raise ArgumentError, "can't find entry for draft: #{mid.inspect}" unless entry
32 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
33 Index.drop_entry docid
34 File.delete @source.fn_for_offset(entry[:source_info])
35 UpdateManager.relay :delete, mid
40 attr_accessor :dir, :end_offset
43 def initialize dir, end_offset=0
44 Dir.mkdir dir unless File.exists? dir
46 @end_offset = end_offset
50 def done?; !File.exists? fn_for_offset(@end_offset); end
52 def id; DraftManager.source_id; end
53 def to_s; DraftManager.source_name; end
54 def is_source_for? x; x == DraftManager.source_name; end
58 while File.exists? fn_for_offset(i)
64 def fn_for_offset o; File.join(@dir, o.to_s); end
66 def load_header offset
67 File.open fn_for_offset(offset) do |f|
68 return MBox::read_header(f)
72 def load_message offset
73 File.open fn_for_offset(offset) do |f|
74 RMail::Mailbox::MBoxReader.new(f).each_message do |input|
75 return RMail::Parser.read(input)
80 ## load the full header text
81 def load_header_text offset
83 File.open fn_for_offset(offset) do |f|
84 until f.eof? || (l = f.gets) =~ /^$/
92 while File.exists?(fn = File.join(@dir, @end_offset.to_s))
93 yield @end_offset, [:draft, :inbox]
99 def total; Dir[File.join(@dir, "*")].sort.last.to_i; end
100 def reset!; @end_offset = 0; @dirty = true; end
103 Redwood::register_yaml(DraftLoader, %w(dir end_offset))