// 
// Decompiled by Procyon v0.6.0
// 

package com.github.luben.zstd.util;

import java.io.InputStream;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.File;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.concurrent.atomic.AtomicBoolean;

public enum Native
{
    private static final String nativePathOverride = "ZstdNativePath";
    private static final String tempFolderOverride = "ZstdTempFolder";
    private static final String libnameShort = "zstd-jni-1.5.7-6";
    private static final String libname = "libzstd-jni-1.5.7-6";
    private static final String errorMsg;
    private static AtomicBoolean loaded;
    
    private static String osName() {
        final String replace = System.getProperty("os.name").toLowerCase().replace(' ', '_');
        if (replace.startsWith("win")) {
            return "win";
        }
        if (replace.startsWith("mac")) {
            return "darwin";
        }
        return replace;
    }
    
    private static String libExtension() {
        if (osName().contains("os_x") || osName().contains("darwin")) {
            return "dylib";
        }
        if (osName().contains("win")) {
            return "dll";
        }
        return "so";
    }
    
    private static String resourceName() {
        final String osName = osName();
        String property = System.getProperty("os.arch");
        if (osName.equals("darwin") && property.equals("amd64")) {
            property = "x86_64";
        }
        return "/" + osName + "/" + property + "/" + "libzstd-jni-1.5.7-6" + "." + libExtension();
    }
    
    public static synchronized void assumeLoaded() {
        Native.loaded.set(true);
    }
    
    public static synchronized boolean isLoaded() {
        return Native.loaded.get();
    }
    
    private static void loadLibrary(final String s) {
        AccessController.doPrivileged((PrivilegedAction<Object>)new PrivilegedAction<Void>() {
            @Override
            public Void run() {
                System.loadLibrary(s);
                return null;
            }
        });
    }
    
    private static void loadLibraryFile(final String s) {
        AccessController.doPrivileged((PrivilegedAction<Object>)new PrivilegedAction<Void>() {
            @Override
            public Void run() {
                System.load(s);
                return null;
            }
        });
    }
    
    public static synchronized void load() {
        final String property = System.getProperty("ZstdTempFolder");
        if (property == null) {
            load(null);
        }
        else {
            load(new File(property));
        }
    }
    
    public static synchronized void load(final File directory) {
        if (Native.loaded.get()) {
            return;
        }
        final String resourceName = resourceName();
        final String property = System.getProperty("ZstdNativePath");
        if (property != null) {
            loadLibraryFile(property);
            Native.loaded.set(true);
            return;
        }
        try {
            Class.forName("org.osgi.framework.BundleEvent");
            loadLibrary("libzstd-jni-1.5.7-6");
            Native.loaded.set(true);
        }
        catch (final Throwable t) {
            final InputStream resourceAsStream = Native.class.getResourceAsStream(resourceName);
            if (resourceAsStream == null) {
                try {
                    loadLibrary("zstd-jni-1.5.7-6");
                    Native.loaded.set(true);
                    return;
                }
                catch (final UnsatisfiedLinkError unsatisfiedLinkError) {
                    final UnsatisfiedLinkError unsatisfiedLinkError2 = new UnsatisfiedLinkError(unsatisfiedLinkError.getMessage() + "\n" + Native.errorMsg);
                    unsatisfiedLinkError2.setStackTrace(unsatisfiedLinkError.getStackTrace());
                    throw unsatisfiedLinkError2;
                }
            }
            File tempFile = null;
            FileOutputStream fileOutputStream = null;
            try {
                tempFile = File.createTempFile("libzstd-jni-1.5.7-6", "." + libExtension(), directory);
                tempFile.deleteOnExit();
                fileOutputStream = new FileOutputStream(tempFile);
                final byte[] array = new byte[4096];
                while (true) {
                    final int read = resourceAsStream.read(array);
                    if (read == -1) {
                        break;
                    }
                    fileOutputStream.write(array, 0, read);
                }
                try {
                    fileOutputStream.flush();
                    fileOutputStream.close();
                    fileOutputStream = null;
                }
                catch (final IOException ex) {}
                try {
                    loadLibraryFile(tempFile.getAbsolutePath());
                }
                catch (final UnsatisfiedLinkError unsatisfiedLinkError3) {
                    try {
                        loadLibrary("zstd-jni-1.5.7-6");
                    }
                    catch (final UnsatisfiedLinkError unsatisfiedLinkError4) {
                        final UnsatisfiedLinkError unsatisfiedLinkError5 = new UnsatisfiedLinkError(unsatisfiedLinkError3.getMessage() + "\n" + unsatisfiedLinkError4.getMessage() + "\n" + Native.errorMsg);
                        unsatisfiedLinkError5.setStackTrace(unsatisfiedLinkError4.getStackTrace());
                        throw unsatisfiedLinkError5;
                    }
                }
                Native.loaded.set(true);
            }
            catch (final IOException ex2) {
                final ExceptionInInitializerError exceptionInInitializerError = new ExceptionInInitializerError("Cannot unpack libzstd-jni-1.5.7-6: " + ex2.getMessage());
                exceptionInInitializerError.setStackTrace(ex2.getStackTrace());
                throw exceptionInInitializerError;
            }
            finally {
                try {
                    resourceAsStream.close();
                    if (fileOutputStream != null) {
                        fileOutputStream.close();
                    }
                    if (tempFile != null && tempFile.exists()) {
                        tempFile.delete();
                    }
                }
                catch (final IOException ex3) {}
            }
        }
    }
    
    static {
        errorMsg = "Unsupported OS/arch, cannot find " + resourceName() + " or load " + "zstd-jni-1.5.7-6" + " from system libraries. Please try building from source the jar or providing " + "libzstd-jni-1.5.7-6" + " in your system.";
        Native.loaded = new AtomicBoolean(false);
    }
}
