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

📄 presentitymanager.java

📁 是一个用java实现的
💻 JAVA
字号:
/*
 * PresentityManager.java
 * 
 * Created on Mar 22, 2004
 *
 */
package gov.nist.applet.phone.ua.presence;

import gov.nist.applet.phone.ua.Configuration;
import gov.nist.applet.phone.ua.MessageListener;
import gov.nist.applet.phone.ua.MessengerManager;
import gov.nist.applet.phone.ua.pidf.parser.XMLpidfParser;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.sip.ClientTransaction;
import javax.sip.Dialog;
import javax.sip.InvalidArgumentException;
import javax.sip.ListeningPoint;
import javax.sip.ServerTransaction;
import javax.sip.SipException;
import javax.sip.address.Address;
import javax.sip.address.AddressFactory;
import javax.sip.address.SipURI;
import javax.sip.header.CSeqHeader;
import javax.sip.header.CallIdHeader;
import javax.sip.header.ContentTypeHeader;
import javax.sip.header.ExpiresHeader;
import javax.sip.header.FromHeader;
import javax.sip.header.Header;
import javax.sip.header.HeaderFactory;
import javax.sip.header.MaxForwardsHeader;
import javax.sip.header.RouteHeader;
import javax.sip.header.ToHeader;
import javax.sip.header.ViaHeader;
import javax.sip.message.MessageFactory;
import javax.sip.message.Request;
import javax.sip.message.Response;

/**
 * This class manage the presence of the application, i.e subscriptions and 
 * notifications
 * 
 * @author Jean Deruelle <jean.deruelle@nist.gov>
 *
 * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
 */
public class PresentityManager {
	private Hashtable subscriberList = null;
	private MessengerManager sipMeetingManager=null;
	private MessageListener messageListener=null;
	private Configuration configuration=null;
	/**
	 * 
	 */
	public PresentityManager(MessengerManager sipMeetingManager) {
		subscriberList=new Hashtable();	
		this.sipMeetingManager=sipMeetingManager;
		this.messageListener=sipMeetingManager.getMessageListener();
		this.configuration=this.messageListener.getConfiguration();
	}

	/**
	 * Retrieve a subscriber by his address
	 * @param subscriberAddress - the subscriber address
	 * @return the subscriber
	 */
	public Subscriber getSubscriber(String subscriberAddress){
		return (Subscriber)subscriberList.get(subscriberAddress);
	}
	
	/**
	 * Add a subscriber to our subscriber list
	 * @param subscriber - subscriber to add
	 */
	public void addSubscriber(Subscriber subscriber){
		Subscriber subscriberFromList=
			(Subscriber)subscriberList.get(subscriber.getAddress());
		if(subscriberFromList==null)
			subscriberList.put(subscriber.getAddress(),subscriber);
		else{
			System.out.println("Already in list put the dialog to"+
				subscriber.getDialog());
			subscriberFromList.setDialog(subscriber.getDialog());			
		}
		System.out.println(subscriber.getAddress()+" has been added to your contacts.");
		System.out.println(subscriber.getDialog());
	}

	/**
	 * Remove a subscriber to our subscriber list
	 * @param subscriber - subscriber to remove
	 */
	public void removeSubscriber(String subscriber){		
		subscriberList.remove(subscriber);
		System.out.println(subscriber+" has been removed from your contacts.");
	}	

	/**
	 * The user has accepted to add the contact to his contact list
	 * So we send an ok
	 * @param subscriber - the subscriber for who we are going to send an ok
	 */
	public void acceptSubscribe(String subscriberAddress){
		Subscriber subscriber=(Subscriber)subscriberList.get(subscriberAddress);
		Dialog dialog=subscriber.getDialog();
		if (!dialog.isServer()) {
			System.out.println("Problem : it's a client transaction");            
		}
		ServerTransaction serverTransaction=
			(ServerTransaction) dialog.getFirstTransaction();
		Request request=serverTransaction.getRequest();
		Response response=null;
		try{
			response=MessageListener.messageFactory.createResponse(Response.OK,request);
			ToHeader toHeader=(ToHeader)response.getHeader(ToHeader.NAME);
			if (toHeader.getTag()==null)
				toHeader.setTag(new Integer((int)(Math.random() * 10000)).toString());
		}
		catch(ParseException pe){
			pe.printStackTrace();
		}
		try{
			serverTransaction.sendResponse(response);
		}
		catch(SipException se){
			se.printStackTrace();
		}
		messageListener.sipMeetingManager.getPresentityManager().
			sendNotifyToSubscriber(
									subscriber,
									"open",
									"online");
	}

	/**
	 * The user has declined to add the contact to his contact list
	 * So we send a DECLINE
	 * @param subscriber - the subscriber for who we are going to send an DECLINE
	 */    
	public void declineSubscribe(String subscriberAddress){
		Subscriber subscriber=(Subscriber)subscriberList.get(subscriberAddress);
		Dialog dialog=subscriber.getDialog();
		if (!dialog.isServer()) {
			System.out.println("Problem : it's a client transaction");            
		}
		ServerTransaction serverTransaction=
			(ServerTransaction) dialog.getFirstTransaction();
		Request request=serverTransaction.getRequest();
		Response response=null;
		try{
			response=MessageListener.messageFactory.createResponse(Response.DECLINE,request);
		}
		catch(ParseException pe){
			pe.printStackTrace();
		}
		try{
			serverTransaction.sendResponse(response);
		}
		catch(SipException se){
			se.printStackTrace();
		}
		subscriberList.remove(subscriber.getAddress());
	}

	/**
	 * Send a notification of the presence status of the application to all 
	 * subscribers
	 * @param status - status of the presence
	 * @param subStatus - subStatus of the presence
	 */
	public void sendNotifyToAllSubscribers(String status,String subStatus) {
		try{
			 // We have to get all our subscribers and send them a NOTIFY!
			 System.out.println("DEBUG, IMNotifyProcessing, sendNotifyToAllSuscribers(),"+
			 " we have to notify our SUBSCRIBERS: let's send a NOTIFY for each one "+
			 "of them (subscribersList: "+subscriberList.size()+")!!!");
			Enumeration e=subscriberList.elements();
			while(e.hasMoreElements()) {
				Subscriber subscriber=(Subscriber)e.nextElement();                
				String subscriberName=subscriber.getAddress();
            
				String contactAddress= configuration.contactIPAddress+":"+
					configuration.listeningPort;
				String xmlBody=null;
				if (!status.equals("closed") )                
					xmlBody=XMLpidfParser.createXMLBody(status,subStatus,subscriberName,
					contactAddress);
            
				Dialog dialog=subscriber.getDialog();
				if (dialog==null) {
					System.out.println("ERROR, sendNotifyToAllSubscribers(), Pb to "+
					"retrieve the dialog, NOTIFY not sent!");
				}
				else
					sendNotify(xmlBody,dialog);
			 }
		}
		catch (Exception ex) {
			ex.printStackTrace();
		} 
	}

	/**
	 * Send a notification of the presence status of the application to a 
	 * subscriber
	 * @param subscriber - the subscriber to notify
	 * @param status - the new presence status of the application
	 * @param subStatus - the new presence substatus of the application
	 */
	public void sendNotifyToSubscriber(Subscriber subscriber,String status,String subStatus){
		String subscriberName=subscriber.getAddress();
            
		String contactAddress= configuration.contactIPAddress+":"+
			configuration.listeningPort;
		String xmlBody=null;
		if (!status.equals("closed") )                
			xmlBody=XMLpidfParser.createXMLBody(status,subStatus,subscriberName,
			contactAddress);

		Dialog dialog=subscriber.getDialog();
		if (dialog==null) {
			System.out.println("ERROR, sendNotifyToAllSubscribers(), PB to "+
			"retrieve the dialog, NOTIFY not sent!");
		}
		else
			sendNotify(xmlBody,dialog);
	}

	/**
	 * Send a notify from a dialog
	 * @param body -  the body of the notify
	 * @param dialog - the dialog form which the notify will be created
	 */
	public void sendNotify(String body,Dialog dialog) {
		try{
			// We send the NOTIFY!!!
        
			// we create the Request-URI: the one of the proxy
			HeaderFactory headerFactory=MessageListener.headerFactory;
			AddressFactory addressFactory=MessageListener.addressFactory;
			MessageFactory messageFactory=MessageListener.messageFactory;
			//SipProvider sipProvider=imUA.getSipProvider();
        
			String transport=configuration.signalingTransport;
			String proxyAddress=configuration.outboundProxy;
			int proxyPort=configuration.proxyPort;
        
			SipURI requestURI=null;
			if (proxyAddress!=null) {
				 requestURI=addressFactory.createSipURI(null,proxyAddress);
				 requestURI.setPort(proxyPort);
				 requestURI.setTransportParam(transport);
			}
			else {
				System.out.println("DEBUG, IMNotifyProcessing, sendNotify(), request-uri is null");
				return;
			}
        
       
			Address localAddress=dialog.getLocalParty();
			Address remoteAddress=dialog.getRemoteParty();  
                  
			FromHeader fromHeader=headerFactory.createFromHeader(localAddress,dialog.getLocalTag());
			ToHeader toHeader=headerFactory.createToHeader(remoteAddress,dialog.getRemoteTag());
        
			int cseq=dialog.getLocalSequenceNumber();
			CSeqHeader cseqHeader=headerFactory.createCSeqHeader(cseq,"NOTIFY");
            
			CallIdHeader callIdHeader=dialog.getCallId();
			//Listening Point
			ListeningPoint listeningPoint = messageListener.sipProvider.getListeningPoint();    
			  
			//ViaHeader
			ArrayList viaHeaders = null;        
			viaHeaders = new ArrayList();
			try {
				ViaHeader viaHeader = MessageListener.headerFactory.createViaHeader(
					configuration.contactIPAddress,
					listeningPoint.getPort(),
					listeningPoint.getTransport(),
					null
					);
				viaHeaders.add(viaHeader);
			}
			catch (ParseException ex) {
				//Shouldn't happen
				ex.printStackTrace();
			}
			catch (InvalidArgumentException ex) {
				//Should never happen
				System.out.println("The application is corrupt");                
			}
        
			// MaxForwards header:
			MaxForwardsHeader maxForwardsHeader=headerFactory.createMaxForwardsHeader(70);
        
			Request request=null;
			ClientTransaction clientTransaction=null;
			if (body==null) {
            
				request=messageFactory.createRequest(requestURI,"NOTIFY",
				callIdHeader,cseqHeader,fromHeader,toHeader,viaHeaders,maxForwardsHeader);
           
				// We have to add an Expires-Header of 0!!!
				ExpiresHeader expiresHeader=headerFactory.createExpiresHeader(0);
				request.setHeader(expiresHeader);
            
			}
			else {
				body=body+"\r\n";
				// Content-Type:
				ContentTypeHeader contentTypeHeader=headerFactory.createContentTypeHeader(
				"application","xpidf+xml");
            
				request=messageFactory.createRequest(requestURI,"NOTIFY",
				callIdHeader,cseqHeader,fromHeader,toHeader,viaHeaders,maxForwardsHeader
				,contentTypeHeader,body);
               
			}         
			//Route Header
			SipURI routeURI=null;
			try{
				routeURI=MessageListener.addressFactory.createSipURI(
					  null,
					  configuration.outboundProxy);
			}
			catch(ParseException pe){
				pe.printStackTrace();
			}
			routeURI.setPort(configuration.proxyPort);
			try {
				routeURI.setTransportParam(configuration.signalingTransport);
			}
			catch(ParseException pe){
				pe.printStackTrace();
			}
			RouteHeader routeHeader = MessageListener.headerFactory.createRouteHeader(
				MessageListener.addressFactory.createAddress(routeURI));			           
			request.addHeader(routeHeader);
		
			// WE have to add a new Header: "Subscription-State"
			System.out.println("DEBUG, sendNotify(), We add the Subscription-State"+
			" header to the request");
			Header header=headerFactory.createHeader("Subscription-State","active");
			request.setHeader(header);
        
			// WE have to add a new Header: "Event"
			header=headerFactory.createHeader("Event","presence");
			request.setHeader(header);
        
			// ProxyAuthorization header if not null:
			//ProxyAuthorizationHeader proxyAuthHeader=imUA.getProxyAuthorizationHeader();
			//if (proxyAuthHeader!=null) 
				//request.setHeader(proxyAuthHeader);
        
			clientTransaction=messageListener.sipProvider.getNewClientTransaction(request);
			dialog.sendRequest(clientTransaction);
        
			System.out.println("DEBUG, sendNotify(),"+
			" NOTIFY sent:\n" );
			System.out.println(request.toString());
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}                	    
}

⌨️ 快捷键说明

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