Package org.gudy.azureus2.pluginsimpl.local.launch

Source Code of org.gudy.azureus2.pluginsimpl.local.launch.PluginSingleInstanceHandler

/*
* 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" );
  }
}
TOP

Related Classes of org.gudy.azureus2.pluginsimpl.local.launch.PluginSingleInstanceHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.