7 class Error < StandardError; end
11 bool_reader :usual, :archived, :read, :dirty
12 attr_accessor :id, :labels
14 ## end_offset is the last offsets within the file which we've read.
15 ## everything after that is considered new messages that haven't
17 def initialize filename, end_offset=0, usual=true, archived=false, id=nil
18 @filename = filename.gsub(%r(^mbox://), "")
19 @end_offset = end_offset
25 @f = File.open @filename
28 archived ? nil : :inbox,
30 if File.dirname(filename) =~ /\b(var|usr|spool)\b/
33 [File.basename(filename).intern]
37 def reset!; @end_offset = 0; @dirty = true; end
38 def == o; o.is_a?(Loader) && o.filename == filename; end
39 def to_s; "mbox://#{@filename}"; end
42 @filename == s || self.to_s == s
45 def load_header offset=nil
48 @f.seek offset if offset
49 header = MBox::read_header @f
54 def load_message offset
58 RMail::Mailbox::MBoxReader.new(@f).each_message do |input|
59 return RMail::Parser.read(input)
64 ## load the full header text
65 def load_header_text offset
69 until @f.eof? || (l = @f.gets) =~ /^$/
79 next_end_offset = @end_offset
84 @f.gets # skip the From separator
85 next_end_offset = @f.tell
87 break if line =~ BREAK_RE
88 next_end_offset = @f.tell + 1
92 start_offset = @end_offset
93 @end_offset = next_end_offset
99 until @end_offset >= File.size(@f)
101 yield(n, labels) if n
106 each { |offset, labels| yield offset, labels, load_header(offset) }
109 def done?; @end_offset >= File.size(@f); end
110 def total; File.size @f; end
113 Redwood::register_yaml(Loader, %w(filename end_offset usual archived id))