Handle status request responses to trap errors.
[embrace.git] / lib / embrace / imap.rb
index f0ae8a5538b32b5155322365372a81b37cb2a38b..0c545e32a3ada166341bfe36b0ae52561613bc9c 100644 (file)
@@ -37,21 +37,22 @@ module Embrace::IMAP
        class Session
                attr_reader :connection
 
-               def initialize(server_info, mboxes)
-                       @server_info = server_info
+               def initialize(config)
+                       @login = config[:server][:login]
+                       @password = config[:server][:password]
 
-                       flags = 2
-                       flags |= 16 if @server_info.use_ssl
+                       flags = 3
+                       flags |= 16 if config[:server][:use_ssl]
 
                        @connection = Ecore::Con::Server.new(flags,
-                                                            @server_info[:host],
-                                                            @server_info[:port])
+                                                            config[:server][:host],
+                                                            config[:server][:port])
                        @buffer = ""
 
                        @tag_id = 0
                        @requests = []
 
-                       @mboxes = mboxes.dup
+                       @mboxes = config[:mailboxes].dup
                        @state = :disconnected
 
                        @handlers = [
@@ -122,7 +123,7 @@ end
                        handle_response(Response.deserialize(line))
 
                        if @state == :connected
-                               login(@server_info[:login], @server_info[:password])
+                               login(@login, @password)
                        end
                end
 
@@ -137,15 +138,23 @@ end
                end
 
                def handle_tagged_response(resp, req)
-                       return unless req.is_a?(LoginRequest)
-
-                       case resp.status
-                       when :ok
-                               @state = :logged_in
-
-                               @mboxes.each { |mb| query_status(mb) }
-                       else
-                               raise(LoginError, "cannot login - #{resp.data}")
+                       case req
+                       when LoginRequest
+                               case resp.status
+                               when :ok
+                                       @state = :logged_in
+
+                                       @mboxes.each { |mb| query_status(mb) }
+                               else
+                                       raise(LoginError, "cannot login - #{resp.data}")
+                               end
+                       when StatusRequest
+                               @mboxes.delete(req.mailbox)
+
+                               if @mboxes.empty?
+                                       @status = :done
+                                       logout
+                               end
                        end
                end
 
@@ -160,12 +169,6 @@ end
                        name, count = md.captures.first, md.captures.last.to_i
 
                        MailboxStatusEvent.raise(name, count)
-                       @mboxes.delete(name)
-
-                       if @mboxes.empty?
-                               @status = :done
-                               logout
-                       end
                end
        end
 
@@ -201,16 +204,14 @@ end
        end
 
        class LogoutRequest < Request
-               def initialize(session)
-                       super
-               end
-
                def serialize
                        "LOGOUT"
                end
        end
 
        class StatusRequest < Request
+               attr_reader :mailbox
+
                def initialize(session, mailbox)
                        super(session)