зеркало из https://github.com/github/ruby.git
[ruby/net-imap] Move send_*_data into net/imap/command_data
Partially implements #10. https://github.com/ruby/net-imap/commit/64d1080d63
This commit is contained in:
Родитель
deae61e939
Коммит
b0de2e7fe9
108
lib/net/imap.rb
108
lib/net/imap.rb
|
@ -1289,114 +1289,6 @@ module Net
|
|||
end
|
||||
end
|
||||
|
||||
def validate_data(data)
|
||||
case data
|
||||
when nil
|
||||
when String
|
||||
when Integer
|
||||
NumValidator.ensure_number(data)
|
||||
when Array
|
||||
if data[0] == 'CHANGEDSINCE'
|
||||
NumValidator.ensure_mod_sequence_value(data[1])
|
||||
else
|
||||
data.each do |i|
|
||||
validate_data(i)
|
||||
end
|
||||
end
|
||||
when Time
|
||||
when Symbol
|
||||
else
|
||||
data.validate
|
||||
end
|
||||
end
|
||||
|
||||
def send_data(data, tag = nil)
|
||||
case data
|
||||
when nil
|
||||
put_string("NIL")
|
||||
when String
|
||||
send_string_data(data, tag)
|
||||
when Integer
|
||||
send_number_data(data)
|
||||
when Array
|
||||
send_list_data(data, tag)
|
||||
when Time
|
||||
send_time_data(data)
|
||||
when Symbol
|
||||
send_symbol_data(data)
|
||||
else
|
||||
data.send_data(self, tag)
|
||||
end
|
||||
end
|
||||
|
||||
def send_string_data(str, tag = nil)
|
||||
case str
|
||||
when ""
|
||||
put_string('""')
|
||||
when /[\x80-\xff\r\n]/n
|
||||
# literal
|
||||
send_literal(str, tag)
|
||||
when /[(){ \x00-\x1f\x7f%*"\\]/n
|
||||
# quoted string
|
||||
send_quoted_string(str)
|
||||
else
|
||||
put_string(str)
|
||||
end
|
||||
end
|
||||
|
||||
def send_quoted_string(str)
|
||||
put_string('"' + str.gsub(/["\\]/n, "\\\\\\&") + '"')
|
||||
end
|
||||
|
||||
def send_literal(str, tag = nil)
|
||||
synchronize do
|
||||
put_string("{" + str.bytesize.to_s + "}" + CRLF)
|
||||
@continued_command_tag = tag
|
||||
@continuation_request_exception = nil
|
||||
begin
|
||||
@continuation_request_arrival.wait
|
||||
e = @continuation_request_exception || @exception
|
||||
raise e if e
|
||||
put_string(str)
|
||||
ensure
|
||||
@continued_command_tag = nil
|
||||
@continuation_request_exception = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def send_number_data(num)
|
||||
put_string(num.to_s)
|
||||
end
|
||||
|
||||
def send_list_data(list, tag = nil)
|
||||
put_string("(")
|
||||
first = true
|
||||
list.each do |i|
|
||||
if first
|
||||
first = false
|
||||
else
|
||||
put_string(" ")
|
||||
end
|
||||
send_data(i, tag)
|
||||
end
|
||||
put_string(")")
|
||||
end
|
||||
|
||||
DATE_MONTH = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
|
||||
|
||||
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
|
||||
|
||||
def send_symbol_data(symbol)
|
||||
put_string("\\" + symbol.to_s)
|
||||
end
|
||||
|
||||
def search_internal(cmd, keys, charset)
|
||||
if keys.instance_of?(String)
|
||||
keys = [RawData.new(keys)]
|
||||
|
|
|
@ -3,6 +3,115 @@
|
|||
module Net
|
||||
class IMAP < Protocol
|
||||
|
||||
private
|
||||
|
||||
def validate_data(data)
|
||||
case data
|
||||
when nil
|
||||
when String
|
||||
when Integer
|
||||
NumValidator.ensure_number(data)
|
||||
when Array
|
||||
if data[0] == 'CHANGEDSINCE'
|
||||
NumValidator.ensure_mod_sequence_value(data[1])
|
||||
else
|
||||
data.each do |i|
|
||||
validate_data(i)
|
||||
end
|
||||
end
|
||||
when Time
|
||||
when Symbol
|
||||
else
|
||||
data.validate
|
||||
end
|
||||
end
|
||||
|
||||
def send_data(data, tag = nil)
|
||||
case data
|
||||
when nil
|
||||
put_string("NIL")
|
||||
when String
|
||||
send_string_data(data, tag)
|
||||
when Integer
|
||||
send_number_data(data)
|
||||
when Array
|
||||
send_list_data(data, tag)
|
||||
when Time
|
||||
send_time_data(data)
|
||||
when Symbol
|
||||
send_symbol_data(data)
|
||||
else
|
||||
data.send_data(self, tag)
|
||||
end
|
||||
end
|
||||
|
||||
def send_string_data(str, tag = nil)
|
||||
case str
|
||||
when ""
|
||||
put_string('""')
|
||||
when /[\x80-\xff\r\n]/n
|
||||
# literal
|
||||
send_literal(str, tag)
|
||||
when /[(){ \x00-\x1f\x7f%*"\\]/n
|
||||
# quoted string
|
||||
send_quoted_string(str)
|
||||
else
|
||||
put_string(str)
|
||||
end
|
||||
end
|
||||
|
||||
def send_quoted_string(str)
|
||||
put_string('"' + str.gsub(/["\\]/n, "\\\\\\&") + '"')
|
||||
end
|
||||
|
||||
def send_literal(str, tag = nil)
|
||||
synchronize do
|
||||
put_string("{" + str.bytesize.to_s + "}" + CRLF)
|
||||
@continued_command_tag = tag
|
||||
@continuation_request_exception = nil
|
||||
begin
|
||||
@continuation_request_arrival.wait
|
||||
e = @continuation_request_exception || @exception
|
||||
raise e if e
|
||||
put_string(str)
|
||||
ensure
|
||||
@continued_command_tag = nil
|
||||
@continuation_request_exception = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def send_number_data(num)
|
||||
put_string(num.to_s)
|
||||
end
|
||||
|
||||
def send_list_data(list, tag = nil)
|
||||
put_string("(")
|
||||
first = true
|
||||
list.each do |i|
|
||||
if first
|
||||
first = false
|
||||
else
|
||||
put_string(" ")
|
||||
end
|
||||
send_data(i, tag)
|
||||
end
|
||||
put_string(")")
|
||||
end
|
||||
|
||||
DATE_MONTH = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
|
||||
|
||||
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
|
||||
|
||||
def send_symbol_data(symbol)
|
||||
put_string("\\" + symbol.to_s)
|
||||
end
|
||||
|
||||
class RawData # :nodoc:
|
||||
def send_data(imap, tag)
|
||||
|
|
Загрузка…
Ссылка в новой задаче