From: Damjan Rems Date: 2007-03-16T18:36:25+09:00 Subject: Exchange calendar to Ruby object. Please comment the code. I have written this peace of code to extract data from Exchange calendar folder and fill it into ruby object, so it can be accesed later like: puts calendar.vevent.dtstart puts calendar.vevent.dtend puts calendar.vevent.attendee puts calendar.vevent.description Since I am still lerning Ruby I am interested what do you old Rubyists think of the code. Could it be done any better. Translating this to Hash or even XML should be trivial. by TheR ############################################################################# # # Read message from Exchange calendar folder with IMAP and create object # filled with values from message. # # Written by Damjan Rems 16.03.2007 # ############################################################################# require 'net/imap' ExchangeCalendar def addVar(var, val) var.gsub!('-','_') # - is not allowed as variable name if instance_variable_get("@#{var}") == nil # if not already set instance_variable_set("@#{var}", val) # set it eval("def #{var}; @#{var}; end") # define method for retrive else # if already defined than it should be array of values if instance_variable_get("@#{var}").class != 'Array' # second value a = Array.new # create array a << instance_variable_get("@#{var}") # add old value to first element instance_variable_set("@#{var}", a) # set variable to array else a = instance_variable_get("@#{var}") end a << val # add new element to array end end end ############################################################################# def msg2calendar(msg) ar = Array.new ix = 0 ar[ix] = ExchangeCalendar.new # msg.gsub!("\r\n ",'') # Remove line breaks in data msg.each_line do |l| l.chomp! # remove whitespace dc = l.index(':') # Some keywords are delimited with colon (:) i=if (ds = l.index(';')) == nil # some with semicolon (;) dc elsif dc==nil ds else ds < dc ? ds : dc end key = l[0,i].downcase # get keyword and lowercase it val = l[i+1,l.length] # get value if key == 'begin' # Create new level if begin if val != 'VCALENDAR' # First level is already prepared ix += 1 ar[ix] = ExchangeCalendar.new ar[ix-1].addVar(val.downcase, ar[ix]) end elsif key == 'end' # Step one level back ix -= 1 else ar[ix].addVar(key,val) # add new variable end end ar[0] end imap = Net::IMAP.new('mail.domain.com') imap.login('user', 'pwd') imap.select('Public Folders/Any calendar') imap.search(["SINCE", "10-Mar-2007"]).each do |message_id| calendar = msg2calendar(imap.fetch(message_id, "BODY[2]")[0].attr["BODY[2]"]) puts calendar.vevent.dtstart puts calendar.vevent.dtend puts calendar.vevent.attendee puts calendar.vevent.description end -- Posted via http://www.ruby-forum.com/.