www.pudn.com > fanccMSNr.src.rar > ChatterModel.hpp


#pragma once 
#include  
#include  
#include  
#include  
#include  
using namespace std; 
 
#include "MessageDispatcher.hpp" 
#include "ChatterListener.hpp" 
#include "User.hpp" 
#include "FileTransferModel.hpp" 
#include "InvitationMessage.hpp" 
 
namespace poral { 
	class MessengerModel; 
 
	/** 
	* Manages connection with switchboard server. 
	* Handles only one-to-one chatting for now. 
	*/ 
	class ChatterModel:  
		public MessageListener			// interface 
	{ 
		// Type and property definitions  ///////////////////// 
	public: 
		typedef enum { 
			/** Not yet connected with switchboard server. */ 
			NOT_CONNECTED, 
			/** Companion has leaved from the chatting room. */ 
			CONNECTED_ALONE, 
			/** Attempting to connect to accept the invitation from the companion. */ 
			ACCEPTING_THE_INVITATION, 
			/** Attempting to connect to invite the companion. */ 
			ATTEMPTING_TO_CONNECT, 
			/** Invited the companion, but not yet participated. */ 
			WAITING_FOR_COMPANION, 
			/** A companion participated. */ 
			ONE_TO_ONE_CHAT, 
			/** NOT YET IMPLEMENTED. The companions more than two participated. */ 
			MANY_TO_MANY_CHAT, 
		} Status; 
		/** Supports only single transfer with a companion. */ 
		FileTransferModel fileTransferModel; 
 
	protected: 
		Status status; 
		/** Should refrenced by getTransactionID() */ 
		int transactionID; 
 
		MessengerModel *messengerModel; 
		MessageDispatcher *messageDispatcher; 
		list listeners; 
		/** 
		* A companion to talk to. 
		* Valid only id and screenName fields. 
		*/ 
		User companion; 
 
		// These values needed for accept invitation 
		string initHash; 
		string initSessionID; 
		string screenName; 
 
		/**  
		* Indicates whether view has been requested.  
		* Used when invited to switchboard. 
		*/ 
		bool viewRequested; 
 
		/** Message buffer to send.	*/ 
		queue > messageBuffer; 
 
		string serverIP; 
 
		/**  
		* filename to store incoming data.  
		*/ 
		string filename; 
 
	public: 
		// Constructors and destructors ///////////////////// 
		ChatterModel(); 
		virtual ~ChatterModel(void); 
 
		// Getter and setters ///////////////////// 
		Status getStatus() const { 
			return status; 
		} 
		int getTransactionID() { 
			return transactionID++; 
		} 
		const User &getCompanion() const { 
			return companion; 
		} 
		MessengerModel &getMessengerModel() { 
			return *messengerModel; 
		} 
		void addChatterListener(ChatterListener &listener); 
		void removeChatterListener(const ChatterListener &listener); 
 
		// Operators ///////////////////// 
		/** 
		* Connect to switchboard server to accept invitation. 
		* 
		* @param RNGMessage Invitaiton message from notification server. 
		*/ 
		void connect(MessengerModel &messengerModel, const Message &RNGMessage); 
		/** 
		* Connect to switchboard server to invite the companion. 
		*/ 
		void connect(MessengerModel &messengerModel, const Message &XFRMessage, const string &companionId); 
 
		void sendMessage(const string &message); 
		 
		// file transfer related methods 
		void acceptFileTransfer(const string &cookie, const string &filename); 
		void rejectFileTransfer(const string &cookie); 
		void inviteFileTransfer(const string &filename); 
 
		/** 
		* Compare by refrence-equality. 
		* Implemented for find() algorithm with list in MessengerModel 
		*/ 
		bool operator==(const ChatterModel &model) { 
			if(this==&model) { 
				return true; 
			} 
			return false; 
		} 
 
		// Implementation of MessageListener. ///////////////////// 
		// Shoud not call these mehtods. 
		virtual void connected(); 
		virtual void messageArrived(const Message &message); 
		virtual void failed(); 
 
	protected: 
		/** Reconnect to switchboard. */ 
		void reconnect(); 
		void callCompanion(const string &companionID); 
		/** Fires MessengerModel::fireChatterViewRequested if it has not yet requested */ 
		void fireChatterViewRequested(); 
		// these methods fire ChatterListener. 
		void fireFileTransferInvited(const string &filename, size_t size, const string &cookie); 
		void fireFileTransferRejected(const string &cookie); 
		void fireTyping(const string &user); 
		void fireChatterUpdate(ChatterListener::Event event); 
		void fireMessageArrived(const ChatMessage &inMessage); 
 
		/** Sends a message not via messageBuffer */ 
		void sendMessageNow(const string &message); 
		/** Sends all messages in messageBuffer */ 
		void sendBufferedMessages(); 
 
		void setStatus(Status status); 
		/**  
		* Change model status to disconnected.  
		* 
		* @param closed Indicates messageDispatcher has been closed. 
		*               disconnect() does not call messageDispatcher->close(); 
		*				when this variable set to true. 
		*/ 
		void disconnect(ChatterListener::Event event, bool closed=false); 
 
		void sendInvitationMessage(const InvitationMessage &invMessage); 
 
	private: 
		/** Used privately in messageArrived() */ 
		void MIMEMessageArrived(const MIMEMessage &message); 
 
		friend class FileTransferModel; 
	}; 
}