/*
* Copyright (C) 2005 Luca Veltri - University of Parma - Italy
*
* This source code 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 source code 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 source code; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author(s):
* Luca Veltri (luca.veltri@unipr.it)
*/
package local.ua;
import org.zoolu.sip.address.*;
import org.zoolu.sip.provider.*;
import org.zoolu.sip.dialog.*;
import org.zoolu.sip.header.StatusLine;
import org.zoolu.sip.message.*;
import org.zoolu.tools.Log;
import org.zoolu.tools.LogLevel;
import java.io.*;
/** Simple Presence Agent (PA).
* <br/> It allows a user to subscribe for a presentity acting as presence watcher, or
* respond to subscription requests (accepting or refusiong the incoming watcher's
* requests) acting as presentity that watchers can subscribe for.
* <br/> In the latter case, it simply acts as authorization entity for subscription events.
*/
public class PresenceAgent implements /*SipInterfaceListener, */SubscriberDialogListener, NotifierDialogListener
{
/** Event logger. */
protected Log log;
/** UserProfile */
protected UserAgentProfile user_profile;
/** SipProvider */
protected SipProvider sip_provider;
/** SipInterface to message MESSAGE. */
//protected SipInterface sip_interface;
/** SubscriberDialog. */
protected SubscriberDialog subscriber_dialog;
/** NotifierDialog. */
protected NotifierDialog notifier_dialog;
/** Presence listener */
protected PresenceAgentListener listener;
/** Costructs a new PresenceAgent. */
public PresenceAgent(SipProvider sip_provider, UserAgentProfile user_profile, PresenceAgentListener listener)
{ this.sip_provider=sip_provider;
this.log=sip_provider.getLog();
this.listener=listener;
this.user_profile=user_profile;
// if no contact_url and/or from_url has been set, create it now
user_profile.initContactAddress(sip_provider);
notifier_dialog=new NotifierDialog(sip_provider,this);
notifier_dialog.listen();
}
/** Subscribes for a presentity. */
public void subscribe(String presentity, int expires)
{ if (subscriber_dialog==null) subscriber_dialog=new SubscriberDialog(sip_provider,"presence",null,this);
if (expires<0) expires=SipStack.default_expires;
subscriber_dialog.subscribe(presentity,user_profile.from_url,user_profile.contact_url,expires);
}
/** Notify a watcher of "pending" state. */
/*public void pending()
{ notifier_dialog.pending();
}*/
/** Notify a watcher of "active" state. */
public void accept()
{ notifier_dialog.accept(user_profile.expires,user_profile.contact_url);
}
/** Notify a watcher of "active" state. */
public void activate()
{ notifier_dialog.activate();
}
/** Notify a watcher of "terminate" state. */
public void terminate()
{ notifier_dialog.terminate();
}
/** Notify a watcher. */
public void notify(String state, int expires, String content_type, String body)
{ notifier_dialog.notify(state,expires,content_type,body);
}
// ******************* Callback functions implementation ********************
/** When a 2xx successfull final response is received for an SUBSCRIBE transaction. */
public void onDlgSubscriptionSuccess(SubscriberDialog dialog, int code, String reason, Message msg)
{ printLog("onDlgSubscriptionSuccess()",LogLevel.MEDIUM);
listener.onPaSubscriptionSuccess(this,dialog.getRemoteName());
}
/** When a 300-699 response is received for an SUBSCRIBE transaction. */
public void onDlgSubscriptionFailure(SubscriberDialog dialog, int code, String reason, Message msg)
{ printLog("onDlgSubscriptionFailure()",LogLevel.MEDIUM);
listener.onPaSubscriptionTerminated(this,dialog.getRemoteName(),reason);
}
/** When SUBSCRIBE transaction expires without a final response. */
public void onDlgSubscribeTimeout(SubscriberDialog dialog)
{ printLog("onDlgSubscribeTimeout()",LogLevel.MEDIUM);
listener.onPaSubscriptionTerminated(this,dialog.getRemoteName(),"Request Timeout");
}
/** When the dialog is terminated. */
public void onDlgSubscriptionTerminated(SubscriberDialog dialog)
{ printLog("onDlgSubscriptionTerminated()",LogLevel.MEDIUM);
listener.onPaSubscriptionTerminated(this,dialog.getRemoteName(),"Terminated");
}
/** When an incoming NOTIFY is received. */
public void onDlgNotify(SubscriberDialog dialog, NameAddress target, NameAddress notifier, NameAddress contact, String state, String content_type, String body, Message msg)
{ printLog("onDlgNotify()",LogLevel.MEDIUM);
listener.onPaNotificationRequest(this,target,notifier,state,content_type,body);
}
/** When an incoming SUBSCRIBE is received. */
public void onDlgSubscribe(NotifierDialog dialog, NameAddress target, NameAddress subscriber, String event, String id, Message msg)
{ printLog("onDlgSubscribe()",LogLevel.MEDIUM);
notifier_dialog.pending();
listener.onPaSubscriptionRequest(this,target,subscriber);
}
/** When NOTIFY transaction expires without a final response. */
public void onDlgNotifyTimeout(NotifierDialog dialog)
{ printLog("onDlgNotifyTimeout()",LogLevel.MEDIUM);
listener.onPaNotificationFailure(this,dialog.getRemoteName(),"Request Timeout");
}
/** When a 300-699 response is received for a NOTIFY transaction. */
public void onDlgNotificationFailure(NotifierDialog dialog, int code, String reason, Message msg)
{ printLog("onDlgNotificationFailure()",LogLevel.MEDIUM);
listener.onPaNotificationFailure(this,dialog.getRemoteName(),reason);
}
/** When a 2xx successfull final response is received for a NOTIFY transaction. */
public void onDlgNotificationSuccess(NotifierDialog dialog, int code, String reason, Message msg)
{ printLog("onDlgNotificationSuccess()",LogLevel.MEDIUM);
// do nothing
}
//**************************** Logs ****************************/
/** Adds a new string to the default Log */
private void printLog(String str)
{ printLog(str,LogLevel.HIGH);
}
/** Adds a new string to the default Log */
private void printLog(String str, int level)
{ if (log!=null) log.println("PresenceAgent: "+str,level+SipStack.LOG_LEVEL_UA);
//System.out.println("PA: "+str);
}
}