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.new :source => @source, :source_info => thisoffset, :labels => theselabels
26 UpdateManager.relay self, :added, m
27 my_message = m if thisoffset == offset
34 docid, entry = Index.load_entry_for_id m.id
36 Redwood::log "can't find entry for draft: #{m.id.inspect}. You probably already discarded it."
39 raise ArgumentError, "not a draft: source id #{entry[:source_id].inspect}, should be #{DraftManager.source_id.inspect} for #{m.id.inspect} / docno #{docid}" unless entry[:source_id].to_i == DraftManager.source_id
40 Index.drop_entry docid
41 File.delete @source.fn_for_offset(entry[:source_info])
42 UpdateManager.relay self, :single_message_deleted, m
46 class DraftLoader < Source
48 yaml_properties :cur_offset
50 def initialize cur_offset=0
51 dir = Redwood::DRAFT_DIR
52 Dir.mkdir dir unless File.exists? dir
53 super DraftManager.source_name, cur_offset, true, false
57 def id; DraftManager.source_id; end
58 def to_s; DraftManager.source_name; end
59 def uri; DraftManager.source_name; end
65 self.cur_offset = id + 1
66 yield [id, [:draft, :inbox]]
73 while File.exists? fn_for_offset(i)
79 def fn_for_offset o; File.join(@dir, o.to_s); end
81 def load_header offset
82 File.open fn_for_offset(offset) do |f|
83 return MBox::read_header(f)
87 def load_message offset
88 File.open fn_for_offset(offset) do |f|
89 RMail::Mailbox::MBoxReader.new(f).each_message do |input|
90 return RMail::Parser.read(input)
97 File.open fn_for_offset(offset) do |f|
98 until f.eof? || (l = f.gets) =~ /^$/
105 def each_raw_message_line offset
106 File.open(fn_for_offset(offset)) do |f|
107 yield f.gets until f.eof?
111 def raw_message offset
112 IO.read(fn_for_offset(offset))
115 def start_offset; 0; end
118 ids.empty? ? 0 : (ids.last + 1)
124 Dir.entries(@dir).select { |x| x =~ /^\d+$/ }.map { |x| x.to_i }.sort