/* * Copyright (C) 2010-2016 JPEXS * * 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 3 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, see <http://www.gnu.org/licenses/>. */ package com.jpexs.decompiler.flash.gui.pipes; import com.jpexs.decompiler.flash.ApplicationInfo; import com.jpexs.decompiler.flash.gui.Main; import com.sun.jna.Platform; import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.WinError; import com.sun.jna.platform.win32.WinNT; import java.awt.Window; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.List; /** * * @author JPEXS */ public class FirstInstance { private static final String MUTEX_NAME = "FFDEC_MUTEX"; private static WinNT.HANDLE mutex; public static final int PIPE_MAJOR = 1; public static final int PIPE_MINOR = 0; public static final String PIPE_NAME = "ffdec"; public static final String PIPE_APP_CODE = "ffdec"; private static boolean isRunning() { if (Platform.isWindows()) { mutex = Kernel32.INSTANCE.CreateMutex(null, false, MUTEX_NAME); if (mutex == null) { return false; } int er = Kernel32.INSTANCE.GetLastError(); if (er == WinError.ERROR_ALREADY_EXISTS) { return true; } new Thread("OtherInstanceCommunicator") { @Override public void run() { while (true) { try (PipeInputStream pis = new PipeInputStream(PIPE_NAME, true)) { ObjectInputStream ois = new ObjectInputStream(pis); String app = ois.readUTF(); if (app.equals(PIPE_APP_CODE)) { int major = ois.readInt(); int minor = ois.readInt(); int release = ois.readInt(); int build = ois.readInt(); int pipeMajor = ois.readInt(); int pipeMinor = ois.readInt(); if (pipeMajor == PIPE_MAJOR) { String command = ois.readUTF(); switch (command) { case "open": int cnt = ois.readInt(); for (int i = 0; i < cnt; i++) { Main.openFile(ois.readUTF(), null); } //no break - focus too case "focus": java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { Window wnd = Main.getMainFrame().getWindow(); wnd.setAlwaysOnTop(true); wnd.toFront(); wnd.requestFocus(); wnd.setAlwaysOnTop(false); wnd.repaint(); } }); break; } } } } catch (IOException ex) { //ignore } } } }.start(); } return false; } private static ObjectOutputStream startCommand(String command) throws IOException { PipeOutputStream pos = new PipeOutputStream(PIPE_NAME, false); ObjectOutputStream oos = new ObjectOutputStream(pos); oos.writeUTF(PIPE_APP_CODE); oos.writeInt(ApplicationInfo.version_major); oos.writeInt(ApplicationInfo.version_minor); oos.writeInt(ApplicationInfo.version_release); oos.writeInt(ApplicationInfo.version_build); oos.writeInt(PIPE_MAJOR); oos.writeInt(PIPE_MINOR); oos.writeUTF(command); return oos; } public static boolean focus() { if (!isRunning()) { return false; } try { ObjectOutputStream oos = startCommand("focus"); oos.close(); return true; } catch (IOException ex) { return false; } } public static boolean openFiles(List<String> files) { try { ObjectOutputStream oos = startCommand("open"); oos.writeInt(files.size()); for (String s : files) { oos.writeUTF(s); } oos.close(); return true; } catch (IOException ex) { return false; } } }