]> git.cworth.org Git - sup/blob - lib/sup/source.rb
4dc2077bbfa6cec564320fa33768766a6a50e3dc
[sup] / lib / sup / source.rb
1 module Redwood
2
3 class SourceError < StandardError; end
4
5 class Source
6   ## dirty? described whether cur_offset has changed, which means the
7   ## source needs to be re-saved to disk.
8   ##
9   ## broken? means no message can be loaded (e.g. IMAP server is
10   ## down), so don't even bother.
11   bool_reader :usual, :archived, :dirty, :broken
12   attr_reader :cur_offset
13   attr_accessor :id
14
15   ## You should implement:
16   ##
17   ## start_offset
18   ## end_offset
19   ## load_header(offset)
20   ## load_message(offset)
21   ## raw_header(offset)
22   ## raw_full_message(offset)
23   ## next
24
25   def initialize uri, initial_offset=nil, usual=true, archived=false, id=nil
26     @uri = uri
27     @cur_offset = initial_offset || start_offset
28     @usual = usual
29     @archived = archived
30     @id = id
31     @dirty = false
32     @broken = false
33   end
34
35   def to_s; @uri; end
36   def seek_to! o; self.cur_offset = o; end
37   def reset!; seek_to! start_offset; end
38   def == o; o.to_s == to_s; end
39   def done?; cur_offset >= end_offset; end 
40   def is_source_for? s; to_s == s; end
41
42   def each
43     until done?
44       n, labels = self.next
45       raise "no message" unless n
46       labels += [:inbox] unless archived?
47       yield n, labels
48     end
49   end
50
51 protected
52
53   def cur_offset= o
54     @cur_offset = o
55     @dirty = true
56   end
57   
58   attr_writer :broken
59 end
60
61 Redwood::register_yaml(Source, %w(uri cur_offset usual archived id))
62
63 end