/*************************************************************************** * Copyright (C) 2009 by Fabrizio Montesi * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 2 of the * * License, or (at your option) any later version. * * * * This program 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 Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * For details about the authors of this software, see the AUTHORS file. * ***************************************************************************/ package joliex.xmpp; import java.util.HashMap; import java.util.Map; import jolie.runtime.AndJarDeps; import jolie.runtime.FaultException; import jolie.runtime.Identifier; import jolie.runtime.JavaService; import jolie.runtime.Value; import jolie.runtime.embedding.RequestResponse; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Message; /** * * @author Fabrizio Montesi */ @AndJarDeps({"smack.jar", "smackx.jar"}) public class XMPPService extends JavaService { private XMPPConnection connection = null; private final Map< String, Chat > chats = new HashMap< String, Chat >(); private Chat getChat( String userJID ) { Chat chat = chats.get( userJID ); if ( chat == null ) { chat = connection.getChatManager().createChat( userJID, new MessageListener() { public void processMessage( Chat chat, Message message ) { // TODO redirect to embedder } } ); chats.put( userJID, chat ); } return chat; } @Identifier("sendMessage") @RequestResponse public void _sendMessage( Value request ) throws FaultException { Chat chat = getChat( request.getFirstChild( "to" ).strValue() ); try { chat.sendMessage( request.strValue() ); } catch( XMPPException e ) { throw new FaultException( e ); } } @RequestResponse public void connect( Value request ) throws FaultException { if ( connection != null ) { connection.disconnect(); } ConnectionConfiguration config; int port = request.getFirstChild( "port" ).intValue(); if ( request.hasChildren( "host" ) && port > 0 ) { config = new ConnectionConfiguration( request.getFirstChild( "host" ).strValue(), port, request.getFirstChild( "serviceName" ).strValue() ); } else { config = new ConnectionConfiguration( request.getFirstChild( "serviceName" ).strValue() ); } connection = new XMPPConnection( config ); try { connection.connect(); if ( request.hasChildren( "resource" ) ) { connection.login( request.getFirstChild( "username" ).strValue(), request.getFirstChild( "password" ).strValue(), request.getFirstChild( "resource" ).strValue() ); } else { connection.login( request.getFirstChild( "username" ).strValue(), request.getFirstChild( "password" ).strValue(), "Jolie" ); } } catch( XMPPException e ) { throw new FaultException( "XMPPException", e ); } } }