#ifndef __Session_h__
#define __Session_h__

#include "TCPSocket.h"
//#include "TCPServerSocket.h"
#include "SessionFilter.h"

namespace core {
  
	class TCPServerSocket;
 
   ///
   /// Session
   ///
   /// Session defines the nature of the interaction with the client
   /// and stores persistent data for a defined session. BMASession objects
   /// are not sockets but instead provide a communications control 
   /// mechanism. Protocol conversations are provided through extensions
   /// from this object.  
   /// 
   
   class Session : public TCPSocket {
      
    public:
      Session(EPoll &ePoll, TCPServerSocket &server);
      ~Session(); 
      
      virtual void init();
      
      virtual void output(Session *session);
      
      /// 
      /// The send method is used to output the contents of the out stream
      /// to the session containing the stream.
      ///
      
      void send();
      
      ///
      /// Use this sendToAll method to output the contents of the out stream
      /// to all the connections on the server excluding the sender session. 
      ///
      
      void sendToAll();
      
      ///
      /// Use this sendToAll method to output the contents of the out stream
      /// to all the connections on the server excluding the sender session
      /// and the entries identified by the passed in filter object.
      ///
      
      void sendToAll(SessionFilter *filter);
      
      std::stringstream out;
      
      TCPServerSocket &getServer();
      TCPServerSocket &server;
      
 	 protected:
	 		
      void onDataReceived(std::string data) override; 
      void onConnected() override;    
		
		///
		/// Override the protocol method to manage and control the session communications
		/// in your inherited session. If you do not override this method then the Session
		/// default will process the 'commands' added to the server object using the 
		/// processRequest method on the session input.
		///
		
      virtual void protocol(std::string data); 
      
    private:
      
   };
   
}

#endif
