mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/net/imap.rb (receive_responses): raise exception to
client_thread. Thanks to William Webber. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4310 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
79c0605534
commit
594eb2e0fe
2 changed files with 38 additions and 17 deletions
|
@ -1,3 +1,8 @@
|
|||
Mon Aug 4 10:00:47 2003 Shugo Maeda <shugo@ruby-lang.org>
|
||||
|
||||
* lib/net/imap.rb (receive_responses): raise exception to
|
||||
client_thread. Thanks to William Webber.
|
||||
|
||||
Mon Aug 4 09:22:53 2003 William Webber <wew@williamwebber.com>
|
||||
|
||||
* lib/net/imap.rb: convert RD to RDoc.
|
||||
|
|
|
@ -206,6 +206,9 @@ module Net
|
|||
# Returns all response handlers.
|
||||
attr_reader :response_handlers
|
||||
|
||||
# The thread to receive exceptions.
|
||||
attr_accessor :client_thread
|
||||
|
||||
# Flag indicating a message has been seen
|
||||
SEEN = :Seen
|
||||
|
||||
|
@ -841,29 +844,42 @@ module Net
|
|||
raise ByeResponseError, resp[0]
|
||||
end
|
||||
|
||||
@client_thread = Thread.current
|
||||
@receiver_thread = Thread.start {
|
||||
receive_responses
|
||||
}
|
||||
end
|
||||
|
||||
def receive_responses
|
||||
while resp = get_response
|
||||
synchronize do
|
||||
case resp
|
||||
when TaggedResponse
|
||||
@tagged_responses[resp.tag] = resp
|
||||
@tag_arrival.broadcast
|
||||
when UntaggedResponse
|
||||
record_response(resp.name, resp.data)
|
||||
if resp.data.instance_of?(ResponseText) &&
|
||||
(code = resp.data.code)
|
||||
record_response(code.name, code.data)
|
||||
end
|
||||
end
|
||||
@response_handlers.each do |handler|
|
||||
handler.call(resp)
|
||||
end
|
||||
end
|
||||
while true
|
||||
begin
|
||||
resp = get_response
|
||||
rescue Exception
|
||||
@sock.close
|
||||
@client_thread.raise($!)
|
||||
break
|
||||
end
|
||||
break unless resp
|
||||
begin
|
||||
synchronize do
|
||||
case resp
|
||||
when TaggedResponse
|
||||
@tagged_responses[resp.tag] = resp
|
||||
@tag_arrival.broadcast
|
||||
when UntaggedResponse
|
||||
record_response(resp.name, resp.data)
|
||||
if resp.data.instance_of?(ResponseText) &&
|
||||
(code = resp.data.code)
|
||||
record_response(code.name, code.data)
|
||||
end
|
||||
end
|
||||
@response_handlers.each do |handler|
|
||||
handler.call(resp)
|
||||
end
|
||||
end
|
||||
rescue Exception
|
||||
@client_thread.raise($!)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue