/* Copyright (C) 2005-2007 Michel de Boer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** * @file * Instant message session. * SIP does not have a concept of message sessions. It's up to the * user interface to create the illusion of a session by grouping * messages between 2 users. */ #ifndef _MSG_SESSION_H #define _MSG_SESSION_H #include #include #include "id_object.h" #include "exceptions.h" #include "user.h" #include "sockets/url.h" #include "patterns/observer.h" using namespace std; namespace im { /** Message direction. */ enum t_direction { MSG_DIR_IN, /**< Incoming. */ MSG_DIR_OUT /**< Outgoing. */ }; /** Text format. */ enum t_text_format { TXT_PLAIN, /**< Plain */ TXT_HTML, /**< HTML */ }; /** Single message with meta information. */ class t_msg : public t_id_object { public: string message; /**< The message. */ t_direction direction; /**< Direction of the message. */ time_t timestamp; /**< Timestamp of the message. */ t_text_format format; /**< Text format. */ /** Constructor. */ t_msg(); /** * Constructor. * Sets the timestamp to the current time. * @param msg [in] The message. * @param dir [in] Direction of the message. * @param fmt [in] Text format of the message. */ t_msg(const string &msg, t_direction dir, t_text_format fmt); }; /** * Message session. * It's up to the user interface to create a message session and store * all messages in it. The session is just a container to store a * collection of page-mode messages. */ class t_msg_session : public patterns::t_subject { private: t_user *user_config; /**< User profile of the local user. */ t_display_url remote_party; /**< Remote party. */ list messages; /**< Messages sent/received. */ bool error_recvd; /**< Indicates that an error has been received. */ string error_msg; /**< Received error message. */ public: /** * Constructor. * @param u [in] User profile of the local user. */ t_msg_session(t_user *u); /** * Constructor. * @param u [in] User profile of the local user. * @param _remote_party [in] URL of remote party. */ t_msg_session(t_user *u, t_display_url _remote_party); /** @name getters */ //@{ t_user *get_user(void) const; t_display_url get_remote_party(void) const; const list &get_messages(void) const; //@} /** @name setters */ //@{ void set_user(t_user *u); void set_remote_party(const t_display_url &du); //@} /** * Get the last message of the session. * @return The last message. * @throws empty_list_exception There are no messages. */ t_msg get_last_message(void); /** * Set the display name of the remote party if it is not yet set. * @param display [in] The display name to set. */ void set_display_if_empty(const string &display); /** * Add a received message to the session. * @param message [in] The message. * @param format [in] Text format of the message. */ void recv_msg(const string &message, t_text_format format); /** * Send a message to the remote party. * The message will be added to the list of messages. * @param message [in] Message to be sent. * @param format [in] Text format of the message. */ void send_msg(const string &message, t_text_format format); /** * Set the error message of the session. * @param message [in] Error message. * @post @ref error_msg == message * @post @ref error_recvd == true */ void set_error(const string &message); /** * Check if an error has been received. * @return true, if an error has been received. * @return false, otherwise */ bool error_received(void) const; /** * Take the error message from the session. * @return Error message. * @pre @ref error_received() == true * @post @ref error_received() == false */ string take_error(void); /** * Check if the session matches with a particular user and * remote party. * @param user [in] The user * @param remote_party [in] URL of the remote party * @return true, if there is a match * @return false, otherwise */ bool match(t_user *user, t_url _remote_party); }; }; // end namespace #endif