6.4. Chat Interface (chatinterface.rsl)


(****
 *
 * This file defines the objs and ops related to the chatting interface.
 *
 *)

module chatinterface;
export all;

object Chat is
    components: conv:Conversation* and currentConv:integer;
    operations: addConveration;
    description: (*
        This is the class that govers how the conversations 
        are handled.
    *);
end Chat;

object isVisible is boolean;

object Conversation is
    components: mess:Message* and un:UserName* and convId:integer and lc:Lecture;
    operations: addMessage, addUser, displayList;
    description: (*
        This is the list that keeps track of all the messages
        sent in the conversation.
    *);
end Conversation;

object Message is
    components: string and un:UserName; 
    operations: generateMessage, addMessage;
    description: (*
        This is the actual message that an user writes in 
        order to send it out to other users.
    *);
end Message;

operation addConversation is
    inputs: chat:Chat, conv:Conversation; 
    outputs: chat':Chat;
    precondition: ;
    postcondition:
        (*
         * The conversation is added to the conversation list.
         *)
    	(exists(c in chat'.conv) c = conv) 
            and
        (*
         * The new conversation is set as the current conversation.
         *)
	(chat'.currentConv = conv.convId); 
    description: (*
        Adds a new Conversation to the Conversation* that 
        Chat contains, and makes it the current conversation.
    *);
end addConversation;

operation addMessage is
    inputs: mess:Message, conv:Conversation;
    outputs: conv':Conversation;
    precondition: ;
    postcondition:
         (*
          * The message is added to the coversation.
          *)
        (exists(m in conv'.mess) m = mess);     
    description: (*
        The operation adds this Message to the end of the 
        Conversation specified by the pointer.
    *);
end addMessage;

operation addUser is
    inputs: un:UserName, conv: Conversation, chat:Chat;
    outputs: conv':Conversation;
    precondition: ; 
    postcondition:
        (*
         * If the conversation doesnt belong to chat, then a new 
         * conversation is added. 
         *)
	(if( not(conv in chat.conv))
	then (conv in chat.conv))
            and
        (*
         * The user is added to the conversation.
         *)
        (exists(u in conv'.un) u = un); 
    description: (* 
        This operation will add an user to the desired conversation.
        Post-condition creates a conversation if there are none.
    *);
end addUser;

operation deleteUser is
    inputs: un:UserName, conv:Conversation, chat:Chat;
    outputs: conv':Conversation;
    precondition:
        (*
         * The conversation belongs to the chat.
         *)
        conv in chat.conv;
    postcondition:
        (*
         * Only the usernames already in the conversation and different
         * and different from the one to be erased belong in the conversation.
         *)
	(forall (un':UserName)
            (un' in conv'.un) iff ((un' != un) and (un' in conv.un)))
            and
        (*
         * If the number of users in the conversation previous to the deletion 
         * is one, then the conversation is erased.
         *)
        (if(#(conv.un)=1)
            then(not (conv' in chat.conv)));
    description: (*
        This operation will delete an user from a conversation.
        Post-condition deletes conversation if there are no users left.
    *);
end deleteUser;

operation selectCurrent is
    inputs: conv:Conversation and chat:Chat;
    outputs: integer;
    precondition:
        (*
         * The conversation belongs to the chat;
         *)
        conv in chat.conv;
    postcondition:
        (*
         * The conversation is set as the current conversation. 
         *)
	chat.currentConv = conv.convId;
    description: (*
        This operation changes the current conversation on display 
	signaled by currentC to the desired conversation pointed to 
	by convId.
    *);
end selectCurrent;
end chatinterface;








Prev: drawing.rsl | Next: outline-preview.rsl | Up: spec | Top: index