10 self.class.i_am_the_instance self
13 def self.source_name; "sup://drafts"; end
14 def self.source_id; 9999; end
15 def new_source; @source = Recoverable.new DraftLoader.new; end
18 offset = @source.gen_offset
19 fn = @source.fn_for_offset offset
20 File.open(fn, "w") { |f| yield f }
23 @source.each do |thisoffset, theselabels|
24 m = Message.build_from_source @source, thisoffset
25 m.labels = theselabels
27 UpdateManager.relay self, :added, m
28 my_message = m if thisoffset == offset
35 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
37 File.delete @source.fn_for_offset(m.source_info)
38 UpdateManager.relay self, :single_message_deleted, m
42 class DraftLoader < Source
44 yaml_properties :cur_offset
46 def initialize cur_offset=0
47 dir = Redwood::DRAFT_DIR
48 Dir.mkdir dir unless File.exists? dir
49 super DraftManager.source_name, cur_offset, true, false
53 def id; DraftManager.source_id; end
54 def to_s; DraftManager.source_name; end
55 def uri; DraftManager.source_name; end
61 self.cur_offset = id + 1
62 yield [id, [:draft, :inbox]]
69 while File.exists? fn_for_offset(i)
75 def fn_for_offset o; File.join(@dir, o.to_s); end
77 def load_header offset
78 File.open(fn_for_offset(offset)) { |f| parse_raw_email_header f }
81 def load_message offset
82 File.open fn_for_offset(offset) do |f|
83 RMail::Mailbox::MBoxReader.new(f).each_message do |input|
84 return RMail::Parser.read(input)
91 File.open fn_for_offset(offset) do |f|
92 until f.eof? || (l = f.gets) =~ /^$/
99 def each_raw_message_line offset
100 File.open(fn_for_offset(offset)) do |f|
101 yield f.gets until f.eof?
105 def raw_message offset
106 IO.read(fn_for_offset(offset))
109 def start_offset; 0; end
112 ids.empty? ? 0 : (ids.last + 1)
118 Dir.entries(@dir).select { |x| x =~ /^\d+$/ }.map { |x| x.to_i }.sort