lib/net/imap/idle.rb in imap_processor-1.2 vs lib/net/imap/idle.rb in imap_processor-1.3
- old
+ new
@@ -4,36 +4,45 @@
##
# Sends an IDLE command that waits for notifications of new or expunged
# messages. Yields responses from the server during the IDLE.
#
- # Use +break+ in the response handler to leave IDLE.
+ # Use #idle_done to leave IDLE.
def idle(&response_handler)
raise LocalJumpError, "no block given" unless response_handler
response = nil
synchronize do
tag = Thread.current[:net_imap_tag] = generate_tag
put_string "#{tag} IDLE#{CRLF}"
- add_response_handler response_handler
-
begin
- response = get_tagged_response tag
- rescue LocalJumpError # can't break cross-threads or something
- ensure
- unless response then
- put_string "DONE#{CRLF}"
- response = get_tagged_response tag
- end
+ add_response_handler response_handler
+ @idle_done_cond = new_cond
+ @idle_done_cond.wait
+ @idle_done_cond = nil
+ ensure
remove_response_handler response_handler
+ put_string "DONE#{CRLF}"
+ response = get_tagged_response tag
end
end
response
end
-end
+ ##
+ # Leaves IDLE
+
+ def idle_done
+ raise Net::IMAP::Error, 'not during idle' unless @idle_done_cond
+
+ synchronize do
+ @idle_done_cond.signal
+ end
+ end
+
+end unless Net::IMAP.method_defined? :idle