Skip to content

Commit 64d1080

Browse files
committed
Move send_*_data into net/imap/command_data
Partially implements #10.
1 parent 2a9afa8 commit 64d1080

File tree

2 files changed

+109
-108
lines changed

2 files changed

+109
-108
lines changed

lib/net/imap.rb

-108
Original file line numberDiff line numberDiff line change
@@ -1289,114 +1289,6 @@ def put_string(str)
12891289
end
12901290
end
12911291

1292-
def validate_data(data)
1293-
case data
1294-
when nil
1295-
when String
1296-
when Integer
1297-
NumValidator.ensure_number(data)
1298-
when Array
1299-
if data[0] == 'CHANGEDSINCE'
1300-
NumValidator.ensure_mod_sequence_value(data[1])
1301-
else
1302-
data.each do |i|
1303-
validate_data(i)
1304-
end
1305-
end
1306-
when Time
1307-
when Symbol
1308-
else
1309-
data.validate
1310-
end
1311-
end
1312-
1313-
def send_data(data, tag = nil)
1314-
case data
1315-
when nil
1316-
put_string("NIL")
1317-
when String
1318-
send_string_data(data, tag)
1319-
when Integer
1320-
send_number_data(data)
1321-
when Array
1322-
send_list_data(data, tag)
1323-
when Time
1324-
send_time_data(data)
1325-
when Symbol
1326-
send_symbol_data(data)
1327-
else
1328-
data.send_data(self, tag)
1329-
end
1330-
end
1331-
1332-
def send_string_data(str, tag = nil)
1333-
case str
1334-
when ""
1335-
put_string('""')
1336-
when /[\x80-\xff\r\n]/n
1337-
# literal
1338-
send_literal(str, tag)
1339-
when /[(){ \x00-\x1f\x7f%*"\\]/n
1340-
# quoted string
1341-
send_quoted_string(str)
1342-
else
1343-
put_string(str)
1344-
end
1345-
end
1346-
1347-
def send_quoted_string(str)
1348-
put_string('"' + str.gsub(/["\\]/n, "\\\\\\&") + '"')
1349-
end
1350-
1351-
def send_literal(str, tag = nil)
1352-
synchronize do
1353-
put_string("{" + str.bytesize.to_s + "}" + CRLF)
1354-
@continued_command_tag = tag
1355-
@continuation_request_exception = nil
1356-
begin
1357-
@continuation_request_arrival.wait
1358-
e = @continuation_request_exception || @exception
1359-
raise e if e
1360-
put_string(str)
1361-
ensure
1362-
@continued_command_tag = nil
1363-
@continuation_request_exception = nil
1364-
end
1365-
end
1366-
end
1367-
1368-
def send_number_data(num)
1369-
put_string(num.to_s)
1370-
end
1371-
1372-
def send_list_data(list, tag = nil)
1373-
put_string("(")
1374-
first = true
1375-
list.each do |i|
1376-
if first
1377-
first = false
1378-
else
1379-
put_string(" ")
1380-
end
1381-
send_data(i, tag)
1382-
end
1383-
put_string(")")
1384-
end
1385-
1386-
DATE_MONTH = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
1387-
1388-
def send_time_data(time)
1389-
t = time.dup.gmtime
1390-
s = format('"%2d-%3s-%4d %02d:%02d:%02d +0000"',
1391-
t.day, DATE_MONTH[t.month - 1], t.year,
1392-
t.hour, t.min, t.sec)
1393-
put_string(s)
1394-
end
1395-
1396-
def send_symbol_data(symbol)
1397-
put_string("\\" + symbol.to_s)
1398-
end
1399-
14001292
def search_internal(cmd, keys, charset)
14011293
if keys.instance_of?(String)
14021294
keys = [RawData.new(keys)]

lib/net/imap/command_data.rb

+109
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,115 @@
33
module Net
44
class IMAP < Protocol
55

6+
private
7+
8+
def validate_data(data)
9+
case data
10+
when nil
11+
when String
12+
when Integer
13+
NumValidator.ensure_number(data)
14+
when Array
15+
if data[0] == 'CHANGEDSINCE'
16+
NumValidator.ensure_mod_sequence_value(data[1])
17+
else
18+
data.each do |i|
19+
validate_data(i)
20+
end
21+
end
22+
when Time
23+
when Symbol
24+
else
25+
data.validate
26+
end
27+
end
28+
29+
def send_data(data, tag = nil)
30+
case data
31+
when nil
32+
put_string("NIL")
33+
when String
34+
send_string_data(data, tag)
35+
when Integer
36+
send_number_data(data)
37+
when Array
38+
send_list_data(data, tag)
39+
when Time
40+
send_time_data(data)
41+
when Symbol
42+
send_symbol_data(data)
43+
else
44+
data.send_data(self, tag)
45+
end
46+
end
47+
48+
def send_string_data(str, tag = nil)
49+
case str
50+
when ""
51+
put_string('""')
52+
when /[\x80-\xff\r\n]/n
53+
# literal
54+
send_literal(str, tag)
55+
when /[(){ \x00-\x1f\x7f%*"\\]/n
56+
# quoted string
57+
send_quoted_string(str)
58+
else
59+
put_string(str)
60+
end
61+
end
62+
63+
def send_quoted_string(str)
64+
put_string('"' + str.gsub(/["\\]/n, "\\\\\\&") + '"')
65+
end
66+
67+
def send_literal(str, tag = nil)
68+
synchronize do
69+
put_string("{" + str.bytesize.to_s + "}" + CRLF)
70+
@continued_command_tag = tag
71+
@continuation_request_exception = nil
72+
begin
73+
@continuation_request_arrival.wait
74+
e = @continuation_request_exception || @exception
75+
raise e if e
76+
put_string(str)
77+
ensure
78+
@continued_command_tag = nil
79+
@continuation_request_exception = nil
80+
end
81+
end
82+
end
83+
84+
def send_number_data(num)
85+
put_string(num.to_s)
86+
end
87+
88+
def send_list_data(list, tag = nil)
89+
put_string("(")
90+
first = true
91+
list.each do |i|
92+
if first
93+
first = false
94+
else
95+
put_string(" ")
96+
end
97+
send_data(i, tag)
98+
end
99+
put_string(")")
100+
end
101+
102+
DATE_MONTH = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
103+
104+
def send_time_data(time)
105+
t = time.dup.gmtime
106+
s = format('"%2d-%3s-%4d %02d:%02d:%02d +0000"',
107+
t.day, DATE_MONTH[t.month - 1], t.year,
108+
t.hour, t.min, t.sec)
109+
put_string(s)
110+
end
111+
112+
def send_symbol_data(symbol)
113+
put_string("\\" + symbol.to_s)
114+
end
6115

7116
class RawData # :nodoc:
8117
def send_data(imap, tag)

0 commit comments

Comments
 (0)