⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messengercontroller.java

📁 是一个用java实现的
💻 JAVA
字号:
/*
 * MessengerController.java
 *
 * Created on November 25, 2003, 9:03 AM
 */

package gov.nist.applet.phone.ua;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Vector;

import javax.sip.address.URI;
import javax.swing.DefaultListModel;
import javax.swing.JList;

import gov.nist.applet.phone.ua.call.AudioCall;
import gov.nist.applet.phone.ua.call.Call;
import gov.nist.applet.phone.ua.gui.AuthenticationDialog;
import gov.nist.applet.phone.ua.gui.ChatFrame;
import gov.nist.applet.phone.ua.gui.IncomingMessageFrame;
import gov.nist.applet.phone.ua.gui.NISTMessengerApplet;
import gov.nist.applet.phone.ua.gui.NISTMessengerGUI;
import gov.nist.applet.phone.ua.pidf.parser.AddressTag;
import gov.nist.applet.phone.ua.pidf.parser.AtomTag;
import gov.nist.applet.phone.ua.pidf.parser.MSNSubStatusTag;
import gov.nist.applet.phone.ua.pidf.parser.PresenceTag;
import gov.nist.applet.phone.ua.presence.PresentityManager;
import gov.nist.applet.phone.ua.presence.Subscriber;

/**
 * This application has been designed in following the MVC design pattern
 * Thus, this class is part of the Control.
 * when there is a change in the model it updates the view
 * 
 * @author  DERUELLE Jean
 */
public class MessengerController implements java.util.Observer {
    private MessengerManager sipMeetingManager;    
    private NISTMessengerGUI nistMeetingGUI;
    private ChatSessionManager chatSessionManager;
    
    /** Creates a new instance of ControllerMeeting 
     * @param sipMeetingManager - the model of the MVC design pattern used in this application
     * @param sipMeetingGUI - the view of the MVC design pattern used in this application
     */
    public MessengerController(
    							MessengerManager sipMeetingManager,
    							ChatSessionManager chatSessionManager, 
    							NISTMessengerGUI nistMeetingGUI) {
        this.nistMeetingGUI=nistMeetingGUI;
        this.chatSessionManager=chatSessionManager;
        this.sipMeetingManager=sipMeetingManager;
        this.sipMeetingManager.addObserver(this);
    }
    
    /**
     * @see java.util.Observer#update(java.util.Observable, Object)
     */
    public void update(java.util.Observable o, Object arg) {    	
		if(arg instanceof RegisterStatus){
			RegisterStatus registerStatus=(RegisterStatus)arg;
			String userURI=
				sipMeetingManager.getMessageListener().getConfiguration().userURI;			
			if(sipMeetingManager.getRegisterStatus().equalsIgnoreCase(
			   RegisterStatus.NOT_REGISTERED))
				nistMeetingGUI.getLoggedStatusLabel().setText("Not Logged");
			if(sipMeetingManager.getRegisterStatus().equalsIgnoreCase(
			   RegisterStatus.REGISTRATION_IN_PROGRESS))
				nistMeetingGUI.getLoggedStatusLabel().setText(
					"Trying to log as : "+ userURI);
			if(sipMeetingManager.getRegisterStatus().equalsIgnoreCase(
			   RegisterStatus.PROXY_AUTHENTICATION_REQUIRED)){
				AuthenticationDialog authenticationDialog= 
					new AuthenticationDialog(nistMeetingGUI,"localhost");
				sipMeetingManager.registerWithAuthentication(
					authenticationDialog.getUserName(),
					authenticationDialog.getPassword(),
					"localhost");					       
					
			}					
			if(sipMeetingManager.getRegisterStatus().equalsIgnoreCase(
			   RegisterStatus.REGISTERED)){
					nistMeetingGUI.getLoggedStatusLabel().setText(
									"Logged as : "+userURI+" - (Online)");
					displayAllContact();
			   }
				
		}
		if(arg instanceof Call){
			Call call=(Call)arg;
			String callee=call.getCallee().trim().toLowerCase();
			if(callee.indexOf(";")!=-1)
				callee=callee.substring(0,callee.indexOf(";"));		
			if(callee.indexOf("sip:")!=-1)
				callee=callee.substring("sip:".length());					
			ChatFrame chatFrame=(ChatFrame)chatSessionManager.getChatFrame(callee);			
			String callStatus=call.getStatus();
			System.out.println("callee "+callee+":chatFrame "+chatFrame+":status "+callStatus);
			if(callStatus.equalsIgnoreCase(Call.NOT_IN_A_CALL)){
				/*System.out.println(
					"Updating chatFrame "+
					chatFrame+
					" callee: "+
					callee);*/							
				if(chatFrame!=null)
					chatFrame.disableAudioConversation();				
			}
			else if(callStatus.equalsIgnoreCase(Call.CANCEL)){
				if(chatFrame!=null)
					chatFrame.cancelAudioConversation();
			}
			else if(callStatus.equalsIgnoreCase(Call.IN_A_CALL)){
				chatFrame.enableAudioConversation("sip:"+callee);
			}
			else if(callStatus.equalsIgnoreCase(Call.RINGING)
				    || callStatus.equalsIgnoreCase(Call.TRYING)
				    || callStatus.equals(Call.BUSY)
				    || callStatus.equals(Call.TEMPORARY_UNAVAILABLE)){
				chatFrame.updateAudioStatus(callStatus);
				if(call instanceof AudioCall){
					AudioCall audioCall=(AudioCall)call;
					URI url=audioCall.getURL();
					if(url!=null){
						if(nistMeetingGUI instanceof NISTMessengerApplet){
							NISTMessengerApplet applet=(NISTMessengerApplet)nistMeetingGUI;
							try{
								applet.getAppletContext().showDocument(new URL(url.toString()),"_blank");
							}
							catch (MalformedURLException mue) {
								mue.printStackTrace();
							}
						}
					}
				}				
			}
			else if(callStatus.equalsIgnoreCase(Call.INCOMING_CALL)){																	
				if(chatFrame==null){																
					chatFrame=new ChatFrame(
						nistMeetingGUI,
						callee,
						sipMeetingManager,
						chatSessionManager);
					chatFrame.show();
					chatSessionManager.addChatSession(callee,chatFrame);						
				}						
				IncomingMessageFrame incomingMessageFrame=
					new IncomingMessageFrame(chatFrame,callee);
				chatFrame.setIncomingMessageFrame(incomingMessageFrame);
				incomingMessageFrame.show();																
			}									           
		}
		if(arg instanceof InstantMessage){
			InstantMessage im=(InstantMessage)arg;
			String sender=im.getSender();
			String message=im.getMessage();
			Object frame=chatSessionManager.getChatFrame(sender);
			ChatFrame chatFrame=null;
			if(frame==null){
				chatFrame=new ChatFrame(
						nistMeetingGUI,
						sender,
						sipMeetingManager,
						chatSessionManager);
				chatFrame.show();
				chatSessionManager.addChatSession(sender,chatFrame);
				chatFrame.newMessage(message);
			}
			else{
				chatFrame=(ChatFrame)frame;
				chatFrame.newMessage(message);
			}
		}   
		if(arg instanceof Subscriber){
			Subscriber subscriber=(Subscriber)arg;
			String subscriberAddress=subscriber.getAddress();
			if(!sipMeetingManager.isInContactList(subscriberAddress)){
				int response=javax.swing.JOptionPane.showConfirmDialog(null,
				subscriberAddress+
				" wants to be added to your contacts, do you agree ?",
				"New Contact",
				javax.swing.JOptionPane.YES_NO_OPTION,
				javax.swing.JOptionPane.QUESTION_MESSAGE);       
				if(response==javax.swing.JOptionPane.NO_OPTION)
					declineContact(subscriberAddress);
				else if(response==javax.swing.JOptionPane.YES_OPTION){
					addContact(subscriberAddress);
					acceptContact(subscriberAddress);									
					sipMeetingManager.sendSubscribe(subscriberAddress);							
				}
			}
			else
				acceptContact(subscriberAddress);
		}         
		if(arg instanceof PresenceTag){
			PresenceTag presenceTag=(PresenceTag)arg;
			Vector atomTagList=presenceTag.getAtomTagList();
			AtomTag atomTag=(AtomTag)atomTagList.firstElement();
			AddressTag addressTag=atomTag.getAddressTag();
			MSNSubStatusTag msnSubStatusTag=addressTag.getMSNSubStatusTag();
			this.updateStatusContact(
				presenceTag.getAddress(),
				msnSubStatusTag.getMSNSubStatus());
		}
		nistMeetingGUI.repaint();
    }
            
    /**
     * Accept that the contact be added to our contact list
     * @param subscriberAddress
     */
    private void acceptContact(String subscriberAddress){
    	sipMeetingManager.getPresentityManager().
    		acceptSubscribe(subscriberAddress);
    }
    
    /**
     * Decline that the contact be added to our contact list
     * @param subscriberAddress
     */
    private void declineContact(String subscriberAddress){
		sipMeetingManager.getPresentityManager().
			declineSubscribe(subscriberAddress);
		sipMeetingManager.getPresentityManager().
    		removeSubscriber(subscriberAddress);		
    }
	/**
	 * Remove a contact from the contact list
	 */
    public void removeContact(){
		JList jList1=nistMeetingGUI.getContactList();
		DefaultListModel listModel=(DefaultListModel)jList1.getModel();
		//Add your handling code here:
		int index = jList1.getSelectedIndex();
		String contactAddress=(String)listModel.get(index);
		/*listModel.remove(index);
		
		int size = listModel.getSize();
		if (size == 0) { //Nobody's left, disable firing.
			nistMeetingGUI.getRemoveContactButton().setEnabled(false);
		} 
		else { //Select an index.
			if (index == listModel.getSize()) {
				//removed item in last position
			 	index--;
		 	}
			jList1.setSelectedIndex(index);
			jList1.ensureIndexIsVisible(index);
		}*/
		sipMeetingManager.removeContact(contactAddress);
		displayAllContact();
    }
    
	/**
	 * Add a contact in the contact list
	 * @param contactAddress - the contact to add
	 */
	public void addContact(String contactAddress){
		/*Subscriber subscriber=
				sipMeetingManager.getPresentityManager().getSubscriber(contactAddress);
		JList jList1=nistMeetingGUI.getContactList();
		DefaultListModel listModel=(DefaultListModel)jList1.getModel();
		listModel.addElement(contactAddress+" ("+subscriber.getStatus()+")");
		int size= listModel.getSize(); //get selected index
		//Select the new item and make it visible.
		jList1.setSelectedIndex(size-1);
		jList1.ensureIndexIsVisible(size-1);
		if (size > 0) { //Nobody's left, disable firing.
			nistMeetingGUI.getRemoveContactButton().setEnabled(true);
		}*/ 
		sipMeetingManager.addContact(contactAddress);
		displayAllContact();
	}
	/**
	 *
	 */
	public void displayAllContact(){
		Vector contactList=sipMeetingManager.getContactList();
		PresentityManager presentityManager=
			sipMeetingManager.getPresentityManager();
		JList jList1=nistMeetingGUI.getContactList();
		DefaultListModel listModel=(DefaultListModel)jList1.getModel();
		listModel.removeAllElements();
		for(int i=0;i<contactList.size();i++){
			String contactAddress=(String)contactList.get(i);
			Subscriber subscriber=
				presentityManager.getSubscriber(contactAddress);
			if(sipMeetingManager.presenceAllowed)
				listModel.addElement(contactAddress+" ("+subscriber.getStatus()+")");
			else
				listModel.addElement(contactAddress);
		}
		if(nistMeetingGUI instanceof NISTMessengerApplet){			
			if( ((NISTMessengerApplet)nistMeetingGUI).useResponder() )
				return;
		}
	
		if(contactList.size()>0)
			nistMeetingGUI.getRemoveContactButton().setEnabled(true);
		else
			nistMeetingGUI.getRemoveContactButton().setEnabled(false);	
	}
	
	/**
	 *
	 */
	public void undisplayAllContact(){
		JList jList1=nistMeetingGUI.getContactList();
		DefaultListModel listModel=(DefaultListModel)jList1.getModel();		
		listModel.removeAllElements();
		nistMeetingGUI.getRemoveContactButton().setEnabled(false);
	}
	
	/**
	 * Add a contact in the contact list
	 * @param contactAddress - the contact to add
	 */
	public void updateStatusContact(String contactAddress,String status){
		JList jList1=nistMeetingGUI.getContactList();
		DefaultListModel listModel=(DefaultListModel)jList1.getModel();
		Enumeration e =listModel.elements();
		int i=0;
		while(e.hasMoreElements()){
			String contact=(String)e.nextElement();
			if(contact.indexOf(contactAddress)!=-1){
				listModel.removeElementAt(i);
				if(i==0){
					listModel.addElement(
						contactAddress+" ("+status+")");
					jList1.ensureIndexIsVisible(i);
				}
				else{
					listModel.add(
						i-1,contactAddress+" ("+status+")");
					jList1.ensureIndexIsVisible(i-1);
				}
				break;
			}
			i++;
		}
			}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -