📄 presencemanager.java
字号:
/* * SubscriberController.java * * Created on September 26, 2002, 6:00 PM */package gov.nist.examples.bps.reader.presence;import javax.sip.*;import javax.sip.message.*; import javax.sip.header.*;import javax.sip.address.*;import java.util.*;import gov.nist.examples.bps.reader.*;/** * * @author deruelle * @version 1.0 */public class PresenceManager { protected int expiresTime; private SubscriberList subscriberList; private BaseReader baseReader; /** Creates new SubscriberController */ public PresenceManager(BaseReader baseReader) { expiresTime=3600; this.baseReader=baseReader; subscriberList=new SubscriberList(); } public int getExpiresTime(){ return expiresTime; } public Vector getAllSubscribers() { return subscriberList.getAllSubscribers(); } public Subscriber getSubscriber(String subscriberName) { return subscriberList.getSubscriber(subscriberName); } public boolean hasSubscriber(String subscriberName) { return subscriberList.hasSubscriber(subscriberName); } public void addSubscriber(String subscriberName,Response okSent,Dialog dialog) { Subscriber subscriber=new Subscriber(subscriberName,okSent); subscriber.setDialog(dialog); subscriberList.addSubscriber(subscriber); } public void removeSubscriber(String subscriberName) { subscriberList.removeSubscriber(subscriberName); } public void sendNotifyToAllSubscribers(String xmlBody) { try{ // We have to get all our subscribers and send them a NOTIFY! Vector subscribersList=getAllSubscribers(); BaseReaderDebug.println("PresenceManager, sendNotifyToAllSuscribers(),"+ " we have to notify all the subscribers: "+subscribersList.size()); for (int i=0;i<subscribersList.size();i++) { Subscriber subscriber=(Subscriber)subscribersList.elementAt(i); String subscriberName=subscriber.getSubscriberName(); Dialog dialog=subscriber.getDialog(); if (dialog==null) { BaseReaderDebug.println("PresenceManager, ERROR, sendNotifyToAllSubscribers(), PB to "+ "retrieve the dialog, NOTIFY not sent!"); return; } sendNotify(xmlBody,dialog); } } catch (Exception ex) { ex.printStackTrace(); } } public void sendNotify(String xmlBody,Dialog dialog) { try{ HeaderFactory headerFactory=baseReader.getHeaderFactory(); AddressFactory addressFactory=baseReader.getAddressFactory(); MessageFactory messageFactory=baseReader.getMessageFactory(); SipProvider sipProvider=baseReader.getSipProvider(); Configuration configuration=baseReader.getConfiguration(); String presenceServerAddress=baseReader.getPresenceServerAddress(); int presenceServerPort=baseReader.getPresenceServerPort(); SipURI requestURI=null; if (presenceServerAddress!=null) { requestURI=addressFactory.createSipURI(null,presenceServerAddress); requestURI.setPort(presenceServerPort); requestURI.setTransportParam("UDP"); } else { BaseReaderDebug.println("PresenceManager, sendNotify(), cannot send the NOTIFY, "+ "the presence server address does not exist."); 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(); // Via header ViaHeader viaHeader=baseReader.createStackViaHeader(); Vector viaList=new Vector(); viaList.addElement(viaHeader); // MaxForwards header: MaxForwardsHeader maxForwardsHeader=headerFactory.createMaxForwardsHeader(70); Request request=null; ClientTransaction clientTransaction=null; if (xmlBody==null || xmlBody.trim().equals("") ) { request=messageFactory.createRequest(requestURI,"NOTIFY", callIdHeader,cseqHeader,fromHeader,toHeader,viaList,maxForwardsHeader); } else { xmlBody=xmlBody+"\r\n"; // Content-Type: ContentTypeHeader contentTypeHeader=headerFactory.createContentTypeHeader( "application","nist-sip-xml"); request=messageFactory.createRequest(requestURI,"NOTIFY", callIdHeader,cseqHeader,fromHeader,toHeader,viaList,maxForwardsHeader ,contentTypeHeader,xmlBody); } // We have to add a new Header: "Subscription-State" BaseReaderDebug.println("PresenceManager, sendNotify(), We add the Subscription-State"+ " header to therequest"); Header header=headerFactory.createHeader("Subscription-State","active"); request.setHeader(header); // We have to add a new Header: "Event" BaseReaderDebug.println("PresenceManager, sendNotify(), We add the Event"+ " header to the request"); header=headerFactory.createHeader("Event","presence"); request.setHeader(header); // Create a BaseReader header to differentiate from the others REGISTER Header baseReaderHeader=headerFactory.createHeader("Base-reader", configuration.baseReaderIdentifier); request.setHeader(baseReaderHeader); // Contact header: ContactHeader contactHeader=baseReader.createStackContactHeader(); request.setHeader(contactHeader); clientTransaction=sipProvider.getNewClientTransaction(request); dialog.sendRequest(clientTransaction); BaseReaderDebug.println("PresenceManager, sendNotify(),"+ " NOTIFY sent:\n" ); BaseReaderDebug.println(request.toString()); } catch(Exception e) { e.printStackTrace(); } } public void processSubscribe(SipProvider sipProvider,Request request, ServerTransaction serverTransaction) { try { MessageFactory messageFactory=baseReader.getMessageFactory(); HeaderFactory headerFactory=baseReader.getHeaderFactory(); AddressFactory addressFactory=baseReader.getAddressFactory(); /************************ OK for the SUBSCRIBE **********************/ String subscriberURI=BaseReaderUtils.getKey(request,"From"); // Send an OK Response response=messageFactory.createResponse (Response.OK,request); // Tag: ToHeader toHeader=(ToHeader)response.getHeader(ToHeader.NAME); if (toHeader.getTag()==null) toHeader.setTag(new Integer((int)(Math.random() * 10000)).toString()); if (serverTransaction!=null) serverTransaction.sendResponse(response); else sipProvider.sendResponse(response); BaseReaderDebug.println("PresenceManager, processSubscribe(), "+ " Response 200 OK sent."); // We have to create or update the subscriber! if (serverTransaction!=null) { Dialog dialog=serverTransaction.getDialog(); if (dialog!=null) { addSubscriber(subscriberURI,response,dialog); BaseReaderNotificationImpl notifier=baseReader.getNotifier(); if (notifier==null) { BaseReaderDebug.println("PresenceManager, processSubscribe(),"+ " unable to connect to the base!!! No subscriber added...."); return; } String xmlBody=notifier.getActiveBadgesXMLBody(); sendNotifyToAllSubscribers(xmlBody); } else { BaseReaderDebug.println("PresenceManager, processSubscribe(), the"+ " dialog for the SUBSCRIBE we received is null!!! No subscriber added...."); return; } } else { BaseReaderDebug.println("PresenceManager, processSubscribe(), the"+ " dialog for the SUBSCRIBE we received is null!!! No subscriber added...."); return; } } catch (Exception ex) { ex.printStackTrace(); } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -