]> git.cworth.org Git - sup/blobdiff - lib/sup/draft.rb
Merge branch 'xapian-updates'
[sup] / lib / sup / draft.rb
index 712274bb8db9212ab60aef12e130eb9e801ec52a..5ea2935f2180f3cb8a94ac996a50ce97dcc6d1ac 100644 (file)
@@ -7,50 +7,57 @@ class DraftManager
   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
@@ -64,9 +71,7 @@ class DraftLoader < Source
   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
@@ -87,18 +92,27 @@ class DraftLoader < Source
     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