CaRMtl/eric/JUniqueInstance.java

139 lines
4.0 KiB
Java

/*
Copyright 2006 Eric Hakenholz
This file is part of C.a.R. software.
C.a.R. is a 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, version 3 of the License.
C.a.R. 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, see <http://www.gnu.org/licenses/>.
*/
package eric;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
public class JUniqueInstance {
private final int port;
private final String message;
public JUniqueInstance(final int port, final String message) {
assert port>0&&port<1<<16 : "Le port doit être entre 1 et 65535";
this.port=port;
this.message=message;
}
public JUniqueInstance(final int port) {
this(port, null);
}
public boolean launch() {
boolean unique;
try {
final ServerSocket server=new ServerSocket(port);
unique=true;
final Thread portListenerThread=new Thread() {
@Override
public void run() {
while (true) {
try {
final Socket socket=server.accept();
new Thread() {
@Override
public void run() {
receive(socket);
}
}.start();
} catch (final IOException e) {
Logger.getLogger("UniqueProgInstance").warning(
"Attente de connexion échouée.");
}
}
}
};
portListenerThread.setDaemon(true);
portListenerThread.start();
} catch (final IOException e) {
unique=false;
// javax.swing.JOptionPane.showMessageDialog(null,
// "launch()->send()");
send();
}
return unique;
}
public void send() {
PrintWriter pw=null;
try {
final Socket socket=new Socket("localhost", port);
pw=new PrintWriter(socket.getOutputStream());
pw.write(message);
} catch (final IOException e) {
Logger.getLogger("UniqueProgInstance").warning(
"Écriture de sortie échoué.");
} finally {
if (pw!=null) {
pw.close();
}
}
}
public synchronized void launchFiles(final String f) {
if (!f.equals("")) {
final String[] files=f.split(System.getProperty("path.separator"));
for (final String filename : files) {
if (FileTools.isStartup()) {
FileTools.addStartupFile(filename);
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
FileTools.open(filename);
}
});
}
}
}
}
private synchronized void receive(final Socket socket) {
Scanner sc=null;
try {
socket.setSoTimeout(5000);
sc=new Scanner(socket.getInputStream());
final String filename=sc.nextLine();
launchFiles(filename);
} catch (final Exception e) {
// javax.swing.JOptionPane.showMessageDialog(null,
// "receive()->error");
} finally {
if (sc!=null) {
sc.close();
}
}
}
}