]> git.cworth.org Git - sup/blobdiff - lib/sup/draft.rb
global search and replace: raw_full_message -> raw_message
[sup] / lib / sup / draft.rb
index 12233f383f3982ffc51b96810ecdd0630577aaba..d5d61ee9ea7b6fd401e90fe5ac3a329d8a34b982 100644 (file)
@@ -10,20 +10,24 @@ class DraftManager
     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 @dir; 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, offset, labels
-      Index.add_message m
-      UpdateManager.relay :add, m
+    my_message = nil
+    @source.each do |thisoffset, theselabels|
+      m = Message.new :source => @source, :source_info => thisoffset, :labels => theselabels
+      Index.sync_message m
+      UpdateManager.relay self, :add, m
+      my_message = m if thisoffset == offset
     end
+
+    my_message
   end
 
   def discard mid
@@ -32,29 +36,37 @@ class DraftManager
     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
+    UpdateManager.relay self, :delete, mid
   end
 end
 
-class DraftLoader
-  attr_accessor :dir, :end_offset
-  bool_reader :dirty
+class DraftLoader < Source
+  attr_accessor :dir
+  yaml_properties :cur_offset
 
-  def initialize dir, end_offset=0
+  def initialize cur_offset=0
+    dir = Redwood::DRAFT_DIR
     Dir.mkdir dir unless File.exists? dir
+    super "draft://#{dir}", cur_offset, true, false
     @dir = dir
-    @end_offset = end_offset
-    @dirty = false
   end
 
-  def done?; !File.exists? fn_for_offset(@end_offset); end
-  def usual?; true; end
   def id; DraftManager.source_id; end
   def to_s; DraftManager.source_name; end
-  def is_source_for? x; x == DraftManager.source_name; end
+  def uri; DraftManager.source_name; end
+
+  def each
+    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
-    i = @end_offset
+    i = cur_offset
     while File.exists? fn_for_offset(i)
       i += 1
     end
@@ -77,8 +89,7 @@ class DraftLoader
     end
   end
 
-  ## load the full header text
-  def load_header_text offset
+  def raw_header offset
     ret = ""
     File.open fn_for_offset(offset) do |f|
       until f.eof? || (l = f.gets) =~ /^$/
@@ -88,18 +99,21 @@ class DraftLoader
     ret
   end
 
-  def each
-    while File.exists?(fn = File.join(@dir, @end_offset.to_s))
-      yield @end_offset, [:draft, :inbox]
-      @end_offset += 1
-      @dirty = true
-    end
+  def raw_message offset
+    IO.readlines(fn_for_offset(offset)).join
   end
 
-  def total; Dir[File.join(@dir, "*")].sort.last.to_i; end
-  def reset!; @end_offset = 0; @dirty = true; end
-end
+  def start_offset; 0; end
+  def end_offset
+    ids = get_ids
+    ids.empty? ? 0 : (ids.last + 1)
+  end
 
-Redwood::register_yaml(DraftLoader, %w(dir end_offset))
+private
+
+  def get_ids
+    Dir.entries(@dir).select { |x| x =~ /^\d+$/ }.map { |x| x.to_i }.sort
+  end
+end
 
 end