Fabio Vitale wrote:
This is the structure of class MRKMessage:
Message data (36 bytes per message):
- Filename (23 bytes including terminating NUL character)
- Flags (1 byte bitmask)
- UID (4 byte unsigned integer)
- Message size (4 byte unsigned integer)
- Date (4 byte time_t value)
Flags mask is 1:Recent, 2:Draft, 4:Deleted, 8:Flagged, 16:Answered,
32:Seen.
Now 3 major questions:
Q 1: what type must I declare for Filename in the class MRKMessage?
Q 2: what type must I declare for Flags in the class MRKMessage?
Q 3: what type must I declare for Date in the class MRKMessage?
...and 2 minor ones :-))
Q 4: How to decode Flags?
Q 5: How to decode Date?
BIG BIG THANKS TO ALL!
------------
require 'bit-struct'
class MRKHeader < BitStruct
unsigned :version, 32, "Version", :endian => :native
unsigned :uid_Validity, 32, "UIDValidity", :endian => :native
unsigned :uid_next, 32, "UIDNext", :endian => :native
unsigned :last_write_counter, 32, "LastWriteCounter", :endian =>
:native
rest :unused, "Unused"
def MRKHeader.bit_length
super
36*8
end
end
class MRKMessage < BitStruct
char :filename, 184, "FileName", :endian => :native
unsigned :flags, 8, "Flags", :endian => :native
unsigned :uid, 32, "UID", :endian => :native
unsigned :msg_size, 32, "MsgSize", :endian => :native
unsigned :date, 32, "Date", :endian => :native
def MRKMessage.bit_length
super
36*8
end
end
File.open("imap.mrk", "rb") {|f|
head_string = f.read(MRKHeader.round_byte_length)
raise "No header!" unless head_string
mrk_header = MRKHeader.new(head_string)
puts mrk_header.inspect
while msg_string = f.read(MRKMessage.round_byte_length) do
puts MRKMessage.new(msg_string).inspect
end
}
This now generates:
>ruby b.rb
#<MRKHeader version=1, uid_Validity=1106138982, uid_next=5825,
last_write_counter=9872, unused="">
#<MRKMessage
filename="\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\nmd5",
flags=48, uid=808464432, msg_size=942814256, date=1936535094>
#<MRKMessage
filename="g\000\000\000\000\000\00006\020\000\000\374P\000\000k\353\246Cmd5",
flags=48, uid=808464432, msg_size=858993712, date=1936535091>
#<MRKMessage filename="g\000\000\000\000\000\000
e\020\000\000\334\226\003\000X\373\253Cmd5", flags=48, uid=808464432,
msg_size=858993712, date=1936535092>
--
Posted via http://www.ruby-forum.com/.