+ def next
+ returned_offset = nil
+ next_offset = cur_offset
+
+ begin
+ @mutex.synchronize do
+ @f.seek cur_offset
+
+ ## cur_offset could be at one of two places here:
+
+ ## 1. before a \n and a mbox separator, if it was previously at
+ ## EOF and a new message was added; or,
+ ## 2. at the beginning of an mbox separator (in all other
+ ## cases).
+
+ l = @f.gets or return nil
+ if l =~ /^\s*$/ # case 1
+ returned_offset = @f.tell
+ @f.gets # now we're at a BREAK_RE, so skip past it
+ else # case 2
+ returned_offset = cur_offset
+ ## we've already skipped past the BREAK_RE, so just go
+ end
+
+ while(line = @f.gets)
+ break if MBox::is_break_line? line
+ next_offset = @f.tell
+ end
+ end
+ rescue SystemCallError, IOError => e
+ raise FatalSourceError, "Error reading #{@f.path}: #{e.message}"