#ifndef __IMAPServer_h__
# define __IMAPServer_h__

# include "TCPServer.h"
# include "Exception.h"
# include "MailFileSystem.h"
# include "__IMAP_APPEND.h"
# include "__IMAP_AUTHENTICATE.h"
# include "__IMAP_CHECK.h"
# include "__IMAP_CLOSE.h"
# include "__IMAP_COPY.h"
# include "__IMAP_CREATE.h"
# include "__IMAP_DELETE.h"
# include "__IMAP_EXAMINE.h"
# include "__IMAP_EXPUNGE.h"
# include "__IMAP_FETCH.h"
# include "__IMAP_LIST.h"
# include "__IMAP_LOGIN.h"
# include "__IMAP_LSUB.h"
# include "__IMAP_RENAME.h"
# include "__IMAP_SEARCH.h"
# include "__IMAP_SELECT.h"
# include "__IMAP_STARTTLS.h"
# include "__IMAP_STATUS.h"
# include "__IMAP_STORE.h"
# include "__IMAP_SUBSCRIBE.h"
# include "__IMAP_UID.h"
# include "__IMAP_UNSUBSCRIBE.h"

namespace mail {
   
   class IMAPServer : public core::TCPServer {

    public:
      IMAPServer(core::EPoll &epoll, std::string hostName, MailFileSystem &mailFileSystem, core::IPAddress ipAddress)
	: TCPServer(epoll, ipAddress, " ", 10, "IMAP Server"), mailFileSystem(mailFileSystem), hostName(hostName) {	   
         commands.add(_imap_append, "APPEND");
         commands.add(_imap_authenticate, "AUTHENTCATE");
         commands.add(_imap_check, "CHECK");
         commands.add(_imap_close, "CLOSE");
         commands.add(_imap_copy, "COPY");
         commands.add(_imap_create, "CREATE");
         commands.add(_imap_delete, "DELETE");
         commands.add(_imap_examine, "EXAAMINE");
         commands.add(_imap_expunge, "EXPUNGE");
         commands.add(_imap_fetch, "FETCH");
         commands.add(_imap_list, "LIST");
         commands.add(_imap_login, "LOGIN");
         commands.add(_imap_lsub, "LSUB");
         commands.add(_imap_rename, "RENAME");
         commands.add(_imap_search, "SEARCH");
         commands.add(_imap_select, "SELECT");
         commands.add(_imap_starttls, "STARTTLS");
         commands.add(_imap_status, "STATUS");
         commands.add(_imap_store, "STORE");
         commands.add(_imap_subscribe, "SUBSCRIBE");
         commands.add(_imap_uid, "UID");
         commands.add(_imap_unsubscribe, "UNSUBSCRIBE");
      }      

      MailFileSystem &mailFileSystem;
      std::string hostName;
      
    private:
      __IMAP_APPEND _imap_append;
      __IMAP_AUTHENTICATE _imap_authenticate;
      __IMAP_CHECK _imap_check;
      __IMAP_CLOSE _imap_close;
      __IMAP_COPY _imap_copy;
      __IMAP_CREATE _imap_create;
      __IMAP_DELETE _imap_delete;
      __IMAP_EXAMINE _imap_examine;
      __IMAP_EXPUNGE _imap_expunge;
      __IMAP_FETCH _imap_fetch;
      __IMAP_LIST _imap_list;
      __IMAP_LOGIN _imap_login;
      __IMAP_LSUB _imap_lsub;
      __IMAP_RENAME _imap_rename;
      __IMAP_SEARCH _imap_search;
      __IMAP_SELECT _imap_select;
      __IMAP_STARTTLS _imap_starttls;
      __IMAP_STATUS _imap_status;
      __IMAP_STORE _imap_store;
      __IMAP_SUBSCRIBE _imap_subscribe;
      __IMAP_UID _imap_uid;
      __IMAP_UNSUBSCRIBE _imap_unsubscribe;
      
   };

}

#endif
