class EventMachine::IMAP::Formatter

Constants

DATE_MONTH

Public Class Methods

format(data, &block) click to toggle source

Format the data to be sent into strings and literals, and call the block for each token to be sent.

@param data The data to format, @param &block The callback, which will be called with a number of strings and

EM::IMAP::Formatter::Literal instances.

NOTE: The block is responsible for handling any network-level concerns, such as sending literals only with permission.

# File lib/em-imap/formatter.rb, line 18
def self.format(data, &block)
  new(&block).send_data(data)
end
new(&block) click to toggle source
# File lib/em-imap/formatter.rb, line 22
def initialize(&block)
  @block = block
end

Public Instance Methods

put_string(str) click to toggle source
# File lib/em-imap/formatter.rb, line 26
def put_string(str)
  @block.call str
end
send_command(cmd) click to toggle source
# File lib/em-imap/formatter.rb, line 57
def send_command(cmd)
  put_string cmd.tag
  put_string " "
  put_string cmd.cmd
  cmd.args.each do |i|
    put_string " "
    send_data(i)
  end
  put_string "\r\n"
end
send_data(data) click to toggle source

The remainder of the code in this file is directly from Net::IMAP. Copyright © 2000 Shugo Maeda <shugo@ruby-lang.org>

# File lib/em-imap/formatter.rb, line 36
def send_data(data)
  case data
  when nil
    put_string("NIL")
  when String
    send_string_data(data)
  when Integer
    send_number_data(data)
  when Array
    send_list_data(data)
  when Time
    send_time_data(data)
  when Symbol
    send_symbol_data(data)
  when EM::IMAP::Command
    send_command(data)
  else
    data.send_data(self)
  end
end
send_list_data(list) click to toggle source
# File lib/em-imap/formatter.rb, line 94
def send_list_data(list)
  put_string("(")
  first = true
  list.each do |i|
    if first
      first = false
    else
      put_string(" ")
    end
    send_data(i)
  end
  put_string(")")
end
send_literal(str) click to toggle source
# File lib/em-imap/formatter.rb, line 30
def send_literal(str)
  @block.call Literal.new(str)
end
send_number_data(num) click to toggle source
# File lib/em-imap/formatter.rb, line 87
def send_number_data(num)
  if num < 0 || num >= 4294967296
    raise Net::IMAP::DataFormatError, num.to_s
  end
  put_string(num.to_s)
end
send_quoted_string(str) click to toggle source
# File lib/em-imap/formatter.rb, line 83
def send_quoted_string(str)
  put_string('"' + str.gsub(/["\\]/n, "\\\\\\&") + '"')
end
send_string_data(str) click to toggle source
# File lib/em-imap/formatter.rb, line 68
def send_string_data(str)
  case str
  when ""
    put_string('""')
  when /[\x80-\xff\r\n]/n
    # literal
    send_literal(str)
  when /[(){ \x00-\x1f\x7f%*"\\]/n
    # quoted string
    send_quoted_string(str)
  else
    put_string(str)
  end
end
send_symbol_data(symbol) click to toggle source
# File lib/em-imap/formatter.rb, line 118
def send_symbol_data(symbol)
  put_string("\\" + symbol.to_s)
end
send_time_data(time) click to toggle source
# File lib/em-imap/formatter.rb, line 110
def send_time_data(time)
  t = time.dup.gmtime
  s = format('"%2d-%3s-%4d %02d:%02d:%02d +0000"',
             t.day, DATE_MONTH[t.month - 1], t.year,
             t.hour, t.min, t.sec)
  put_string(s)
end