From 76aeadc936be4d0e1f6e89eeb217bc6e8c92e680 Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Fri, 14 Oct 2016 19:29:13 +0200
Subject: [PATCH] Add NativeAudioMac as plugin

---
 .../src/de/tobias/playpad/PlayPadMain.java    |   8 +-
 PlayWallNativeMac/.classpath                  |   3 +
 .../de/tobias/playpad}/libNativeAudio.dylib   | Bin
 .../{ => namac}/NativeAudioMacHandler.java    |   3 +-
 .../NativeAudioMacHandlerConnect.java         |   3 +-
 .../playpad/namac/NativeAudioMacPlugin.java   |   7 ++
 .../namac/NativeAudioMacPluginImpl.java       |  81 ++++++++++++++++++
 .../playpad/namac/NativeAudioMacUpdater.java  |  79 +++++++++++++++++
 8 files changed, 180 insertions(+), 4 deletions(-)
 rename PlayWallNativeMac/{ => src/de/tobias/playpad}/libNativeAudio.dylib (100%)
 rename PlayWallNativeMac/src/de/tobias/playpad/{ => namac}/NativeAudioMacHandler.java (97%)
 rename PlayWallNativeMac/src/de/tobias/playpad/{ => namac}/NativeAudioMacHandlerConnect.java (97%)
 create mode 100644 PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacPlugin.java
 create mode 100644 PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacPluginImpl.java
 create mode 100644 PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacUpdater.java

diff --git a/PlayWall/src/de/tobias/playpad/PlayPadMain.java b/PlayWall/src/de/tobias/playpad/PlayPadMain.java
index ecb8676f..9a472114 100644
--- a/PlayWall/src/de/tobias/playpad/PlayPadMain.java
+++ b/PlayWall/src/de/tobias/playpad/PlayPadMain.java
@@ -124,11 +124,15 @@ public class PlayPadMain extends Application implements LocalizationDelegate {
 			// Load Plugin Path
 			Path pluginFolder;
 			if (getParameters().getNamed().containsKey("plugin")) {
-				pluginFolder = Paths.get(getParameters().getNamed().get("plugin"));
+				String pluginParam = getParameters().getNamed().get("plugin");
+				for (String part : pluginParam.split(":")) {
+					pluginFolder = Paths.get(part);
+					setupPlugins(pluginFolder);
+				}
 			} else {
 				pluginFolder = ApplicationUtils.getApplication().getPath(PathType.LIBRARY);
+				setupPlugins(pluginFolder);
 			}
-			setupPlugins(pluginFolder);
 
 			/*
 			 * Load Data
diff --git a/PlayWallNativeMac/.classpath b/PlayWallNativeMac/.classpath
index 7d032884..8c57eb32 100644
--- a/PlayWallNativeMac/.classpath
+++ b/PlayWallNativeMac/.classpath
@@ -3,7 +3,10 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="src" path="test"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/YML"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/PlayWallCore"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/libUtils"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Plugins"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/Updater"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/PlayWallNativeMac/libNativeAudio.dylib b/PlayWallNativeMac/src/de/tobias/playpad/libNativeAudio.dylib
similarity index 100%
rename from PlayWallNativeMac/libNativeAudio.dylib
rename to PlayWallNativeMac/src/de/tobias/playpad/libNativeAudio.dylib
diff --git a/PlayWallNativeMac/src/de/tobias/playpad/NativeAudioMacHandler.java b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacHandler.java
similarity index 97%
rename from PlayWallNativeMac/src/de/tobias/playpad/NativeAudioMacHandler.java
rename to PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacHandler.java
index 066831de..85e2368f 100644
--- a/PlayWallNativeMac/src/de/tobias/playpad/NativeAudioMacHandler.java
+++ b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacHandler.java
@@ -1,7 +1,8 @@
-package de.tobias.playpad;
+package de.tobias.playpad.namac;
 
 import java.nio.file.Path;
 
+import de.tobias.playpad.NativeAudio;
 import de.tobias.playpad.audio.AudioHandler;
 import de.tobias.playpad.audio.Peakable;
 import de.tobias.playpad.pad.PadStatus;
diff --git a/PlayWallNativeMac/src/de/tobias/playpad/NativeAudioMacHandlerConnect.java b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacHandlerConnect.java
similarity index 97%
rename from PlayWallNativeMac/src/de/tobias/playpad/NativeAudioMacHandlerConnect.java
rename to PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacHandlerConnect.java
index 66245637..1f70f758 100644
--- a/PlayWallNativeMac/src/de/tobias/playpad/NativeAudioMacHandlerConnect.java
+++ b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacHandlerConnect.java
@@ -1,7 +1,8 @@
-package de.tobias.playpad;
+package de.tobias.playpad.namac;
 
 import java.util.HashMap;
 
+import de.tobias.playpad.NativeAudio;
 import de.tobias.playpad.NativeAudio.NativeAudioDelegate;
 import de.tobias.playpad.audio.AudioCapability;
 import de.tobias.playpad.audio.AudioHandler;
diff --git a/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacPlugin.java b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacPlugin.java
new file mode 100644
index 00000000..c17700df
--- /dev/null
+++ b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacPlugin.java
@@ -0,0 +1,7 @@
+package de.tobias.playpad.namac;
+
+import de.tobias.playpad.plugin.AdvancedPlugin;
+
+public interface NativeAudioMacPlugin extends AdvancedPlugin {
+
+}
diff --git a/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacPluginImpl.java b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacPluginImpl.java
new file mode 100644
index 00000000..f7ad651a
--- /dev/null
+++ b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacPluginImpl.java
@@ -0,0 +1,81 @@
+package de.tobias.playpad.namac;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import de.tobias.playpad.PlayPadPlugin;
+import de.tobias.playpad.audio.AudioRegistry;
+import de.tobias.playpad.plugin.Module;
+import de.tobias.updater.client.Updatable;
+import de.tobias.utils.application.App;
+import de.tobias.utils.application.ApplicationUtils;
+import de.tobias.utils.application.container.PathType;
+import de.tobias.utils.util.IOUtils;
+import de.tobias.utils.util.OS;
+import net.xeoh.plugins.base.annotations.PluginImplementation;
+import net.xeoh.plugins.base.annotations.events.PluginLoaded;
+import net.xeoh.plugins.base.annotations.events.Shutdown;
+
+@PluginImplementation
+public class NativeAudioMacPluginImpl implements NativeAudioMacPlugin {
+
+	private static final String ASSETS = "de/tobias/playpad/";
+
+	private static final String NAME = "NativeAudioMac";
+	private static final String IDENTIFIER = "de.tobias.playpad.namac.NativeAudioMacPluginImpl";
+
+	private Module module;
+	private Updatable updatable;
+
+	@PluginLoaded
+	public void onLoaded(NativeAudioMacPlugin plugin) {
+		module = new Module(NAME, IDENTIFIER);
+		updatable = new NativeAudioMacUpdater();
+
+		try {
+			prepareBridging();
+
+			if (OS.isMacOS()) {
+				AudioRegistry registry = PlayPadPlugin.getRegistryCollection().getAudioHandlers();
+				registry.registerComponent(new NativeAudioMacHandlerConnect(), "NativeMac", module);
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private void prepareBridging() throws IOException {
+		App app = ApplicationUtils.getApplication();
+		Path resourceFolder = app.getPath(PathType.LIBRARY, "namac");
+		if (Files.notExists(resourceFolder)) {
+			Files.createDirectories(resourceFolder);
+		}
+
+		Path dest = copyResource(resourceFolder, ASSETS, "libNativeAudio.dylib");
+		System.load(dest.toString());
+	}
+
+	private Path copyResource(Path resourceFolder, String packageName, String file) throws IOException {
+		Path dest = resourceFolder.resolve(file);
+		IOUtils.copy(getClass().getClassLoader().getResourceAsStream(packageName + file), dest);
+		System.out.println("Copied: " + file);
+		return dest;
+	}
+
+	@Shutdown
+	public void onShutdown() {
+
+	}
+
+	@Override
+	public Module getModule() {
+		return module;
+	}
+
+	@Override
+	public Updatable getUpdatable() {
+		return updatable;
+	}
+
+}
diff --git a/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacUpdater.java b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacUpdater.java
new file mode 100644
index 00000000..487b700f
--- /dev/null
+++ b/PlayWallNativeMac/src/de/tobias/playpad/namac/NativeAudioMacUpdater.java
@@ -0,0 +1,79 @@
+package de.tobias.playpad.namac;
+
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Path;
+
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+
+import de.tobias.updater.client.Updatable;
+import de.tobias.updater.client.UpdateChannel;
+import de.tobias.utils.application.App;
+import de.tobias.utils.application.ApplicationUtils;
+import de.tobias.utils.application.container.PathType;
+
+public class NativeAudioMacUpdater implements Updatable {
+
+	private int newBuild;
+	private String newVersion;
+	private URL remotePath;
+
+	private String localFileName;
+	private String name;
+
+	@Override
+	public int getCurrentBuild() {
+		return 1;
+	}
+
+	@Override
+	public String getCurrentVersion() {
+		return "1.0";
+	}
+
+	@Override
+	public int getNewBuild() {
+		return newBuild;
+	}
+
+	@Override
+	public String getNewVersion() {
+		return newVersion;
+	}
+
+	@Override
+	public void loadInformation(UpdateChannel channel) throws IOException {
+		App app = ApplicationUtils.getMainApplication();
+		URL url = new URL(app.getInfo().getUpdateURL() + "/" + channel + "/plugins.yml");
+		FileConfiguration config = YamlConfiguration.loadConfiguration(url.openStream());
+
+		newBuild = config.getInt("plugins.namac.build");
+		newVersion = config.getString("plugins.namac.version");
+		remotePath = new URL(config.getString("plugins.namac.url"));
+		localFileName = config.getString("plugins.namac.filename");
+		name = config.getString("plugins.namac.name");
+
+	}
+
+	@Override
+	public boolean isUpdateAvailable() {
+		return getCurrentBuild() < getNewBuild();
+	}
+
+	@Override
+	public URL getDownloadPath() {
+		return remotePath;
+	}
+
+	@Override
+	public Path getLocalPath() {
+		return ApplicationUtils.getApplication().getPath(PathType.LIBRARY, localFileName);
+	}
+
+	@Override
+	public String name() {
+		return name;
+	}
+
+}
-- 
GitLab