/*
* 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.transaction.*;
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 Message Agent (MA).
* It allows a user to send and receive short messages.
*/
//public class MessageAgent implements SipProviderListener, TransactionClientListener
public class MessageAgent implements SipInterfaceListener, TransactionClientListener
{
/** Event logger. */
protected Log log;
/** UserProfile */
protected UserAgentProfile user_profile;
/** SipProvider */
protected SipProvider sip_provider;
/** SipInterface to message MESSAGE. */
protected SipInterface sip_interface;
/** Message listener */
protected MessageAgentListener listener;
/** Costructs a new MessageAgent. */
public MessageAgent(SipProvider sip_provider, UserAgentProfile user_profile, MessageAgentListener listener)
{ this.sip_provider=sip_provider;
this.log=sip_provider.getLog();
this.sip_interface=null;
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);
}
/** Sends a new text message. */
public void send(String recipient, String subject, String content)
{ send(recipient,subject,"application/text",content);
}
/** Sends a new message. */
public void send(String recipient, String subject, String content_type, String content)
{ NameAddress to_url=new NameAddress(recipient);
NameAddress from_url=new NameAddress(user_profile.from_url);
Message req=MessageFactory.createMessageRequest(sip_provider,to_url,from_url,subject,content_type,content);
TransactionClient t=new TransactionClient(sip_provider,req,this);
t.request();
}
/** Waits for incoming message. */
public void receive()
{ //sip_provider.addSipProviderListener(new MethodIdentifier(SipMethods.MESSAGE),this);
sip_interface=new SipInterface(sip_provider,new MethodIdentifier(SipMethods.MESSAGE),this);
}
/** Stops receiving messages. */
public void halt()
{ //sip_provider.removeSipProviderListener(new MethodIdentifier(SipMethods.MESSAGE));
sip_interface.close();
}
// ******************* Callback functions implementation ********************
/** When a new Message is received by the SipProvider. */
/*public void onReceivedMessage(SipProvider provider, Message msg)
{ //printLog("Message received: "+msg.getFirstLine().substring(0,msg.toString().indexOf('\r')));
if (msg.isRequest() && msg.isMessage())
{ (new TransactionServer(sip_provider,msg,null)).respondWith(MessageFactory.createResponse(msg,200,"OK",null,""));
NameAddress sender=msg.getFromHeader().getNameAddress();
NameAddress recipient=msg.getToHeader().getNameAddress();
String subject=null;
if (msg.hasSubjectHeader()) subject=msg.getSubjectHeader().getSubject();
String content_type=msg.getContentTypeHeader().getContentType();
String content=msg.getBody();
if (listener!=null) listener.onMaReceivedMessage(this,sender,recipient,subject,content_type,content);
}
}*/
/** When a new Message is received by the SipInterface. */
public void onReceivedMessage(SipInterface sip, Message msg)
{ //printLog("Message received: "+msg.getFirstLine().substring(0,msg.toString().indexOf('\r')));
if (msg.isRequest())
{ (new TransactionServer(sip_provider,msg,null)).respondWith(MessageFactory.createResponse(msg,200,SipResponses.reasonOf(200),null));
NameAddress sender=msg.getFromHeader().getNameAddress();
NameAddress recipient=msg.getToHeader().getNameAddress();
String subject=null;
if (msg.hasSubjectHeader()) subject=msg.getSubjectHeader().getSubject();
String content_type=msg.getContentTypeHeader().getContentType();
String content=msg.getBody();
if (listener!=null) listener.onMaReceivedMessage(this,sender,recipient,subject,content_type,content);
}
}
/** When the TransactionClient goes into the "Completed" state receiving a 2xx response */
public void onTransSuccessResponse(TransactionClient tc, Message resp)
{ onDeliverySuccess(tc,resp.getStatusLine().getReason());
}
/** When the TransactionClient goes into the "Completed" state receiving a 300-699 response */
public void onTransFailureResponse(TransactionClient tc, Message resp)
{ onDeliveryFailure(tc,resp.getStatusLine().getReason());
}
/** When the TransactionClient is (or goes) in "Proceeding" state and receives a new 1xx provisional response */
public void onTransProvisionalResponse(TransactionClient tc, Message resp)
{ // do nothing.
}
/** When the TransactionClient goes into the "Terminated" state, caused by transaction timeout */
public void onTransTimeout(TransactionClient tc)
{ onDeliveryFailure(tc,"Timeout");
}
/** When the delivery successes. */
private void onDeliverySuccess(TransactionClient tc, String result)
{ printLog("Message successfully delivered ("+result+").");
Message req=tc.getRequestMessage();
NameAddress recipient=req.getToHeader().getNameAddress();
String subject=null;
if (req.hasSubjectHeader()) subject=req.getSubjectHeader().getSubject();
if (listener!=null) listener.onMaDeliverySuccess(this,recipient,subject,result);
}
/** When the delivery fails. */
private void onDeliveryFailure(TransactionClient tc, String result)
{ printLog("Message delivery failed ("+result+").");
Message req=tc.getRequestMessage();
NameAddress recipient=req.getToHeader().getNameAddress();
String subject=null;
if (req.hasSubjectHeader()) subject=req.getSubjectHeader().getSubject();
if (listener!=null) listener.onMaDeliveryFailure(this,recipient,subject,result);
}
//**************************** Logs ****************************/
/** Starting log level for this class */
//private static final int LOG_OFFSET=SipStack.LOG_LEVEL_UA;
/** 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("MessageAgent: "+str,level+SipStack.LOG_LEVEL_UA);
//System.out.println("MA: "+str);
}
}