/*
* Created on 12-Sep-2005
* Created by Paul Gardner
* Copyright (C) 2005, 2006 Aelitis, All Rights Reserved.
*
* This program 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 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 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.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.pluginsimpl.local.launch;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import org.gudy.azureus2.core3.util.SystemProperties;
import org.gudy.azureus2.plugins.PluginManagerArgumentHandler;
import org.gudy.azureus2.plugins.logging.LoggerChannel;
import org.gudy.azureus2.plugins.logging.LoggerChannelListener;
public class
PluginSingleInstanceHandler
{
private static boolean active;
private static int port;
private static PluginManagerArgumentHandler handler;
public static void
initialise(
int _port,
PluginManagerArgumentHandler _handler )
{
port = _port;
handler = _handler;
String multi_instance = System.getProperty( "MULTI_INSTANCE");
if ( multi_instance != null && multi_instance.equalsIgnoreCase( "true" )){
return;
}
active = true;
}
protected static boolean
process(
LoggerChannelListener log,
String[] args )
{
if ( active ){
if ( startListener( log )){
return( false );
}else{
sendArguments( log, args );
return( true );
}
}else{
return( false );
}
}
protected static boolean
startListener(
final LoggerChannelListener log )
{
try{
final ServerSocket server_socket = new ServerSocket( port, 50, InetAddress.getByName("127.0.0.1"));
log.messageLogged(
LoggerChannel.LT_INFORMATION,
"SingleInstanceHandler: listening on 127.0.0.1:" + port + " for passed arguments");
Thread t =
new Thread("Single Instance Handler")
{
public void
run()
{
while ( true ){
Socket socket = null;
ObjectInputStream ois = null;
try{
socket = server_socket.accept();
String address = socket.getInetAddress().getHostAddress();
if ( !( address.equals("localhost") || address.equals("127.0.0.1"))){
socket.close();
continue;
}
ois = new ObjectInputStream( socket.getInputStream());
ois.readInt(); // version
String header = (String)ois.readObject();
if ( !header.equals( getHeader())){
log.messageLogged(
LoggerChannel.LT_ERROR,
"SingleInstanceHandler: invalid header - " + header );
continue;
}
String[] args = (String[])ois.readObject();
handler.processArguments( args );
}catch( Throwable e ){
log.messageLogged( "SingleInstanceHandler: receive error", e );
}finally{
if ( ois != null ){
try{
ois.close();
}catch( Throwable e ){
}
}
if ( socket != null ){
try{
socket.close();
}catch( Throwable e ){
}
}
}
}
}
};
t.setDaemon( true );
t.start();
return( true );
}catch( Throwable e ){
return( false );
}
}
protected static void
sendArguments(
LoggerChannelListener log,
String[] args )
{
Socket socket = null;
try{
socket = new Socket( "127.0.0.1", port );
ObjectOutputStream oos = new ObjectOutputStream( socket.getOutputStream());
oos.writeInt( 0 );
oos.writeObject( getHeader());
oos.writeObject( args );
log.messageLogged( LoggerChannel.LT_INFORMATION, "SingleInstanceHandler: arguments passed to existing process" );
}catch( Throwable e ){
log.messageLogged( "SingleInstanceHandler: send error", e );
}finally{
if ( socket != null ){
try{
socket.close();
}catch( Throwable e ){
}
}
}
}
protected static String
getHeader()
{
return( SystemProperties.getApplicationName() + " Single Instance Handler" );
}
}