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

package org.jline.terminal.spi;

import java.util.Properties;
import org.jline.terminal.Size;
import org.jline.terminal.Attributes;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.IOException;
import org.jline.terminal.Terminal;
import java.nio.charset.Charset;

public interface TerminalProvider
{
    String name();
    
    @Deprecated
    default Terminal sysTerminal(final String name, final String type, final boolean ansiPassThrough, final Charset encoding, final boolean nativeSignals, final Terminal.SignalHandler signalHandler, final boolean paused, final SystemStream systemStream) throws IOException {
        return this.sysTerminal(name, type, ansiPassThrough, encoding, encoding, encoding, encoding, nativeSignals, signalHandler, paused, systemStream);
    }
    
    default Terminal sysTerminal(final String name, final String type, final boolean ansiPassThrough, final Charset encoding, final Charset inputEncoding, final Charset outputEncoding, final boolean nativeSignals, final Terminal.SignalHandler signalHandler, final boolean paused, final SystemStream systemStream) throws IOException {
        return this.sysTerminal(name, type, ansiPassThrough, encoding, inputEncoding, outputEncoding, outputEncoding, nativeSignals, signalHandler, paused, systemStream);
    }
    
    @Deprecated
    Terminal sysTerminal(final String p0, final String p1, final boolean p2, final Charset p3, final Charset p4, final Charset p5, final Charset p6, final boolean p7, final Terminal.SignalHandler p8, final boolean p9, final SystemStream p10) throws IOException;
    
    @Deprecated
    default Terminal newTerminal(final String name, final String type, final InputStream masterInput, final OutputStream masterOutput, final Charset encoding, final Terminal.SignalHandler signalHandler, final boolean paused, final Attributes attributes, final Size size) throws IOException {
        return this.newTerminal(name, type, masterInput, masterOutput, encoding, encoding, encoding, encoding, signalHandler, paused, attributes, size);
    }
    
    default Terminal newTerminal(final String name, final String type, final InputStream masterInput, final OutputStream masterOutput, final Charset encoding, final Charset inputEncoding, final Charset outputEncoding, final Terminal.SignalHandler signalHandler, final boolean paused, final Attributes attributes, final Size size) throws IOException {
        return this.newTerminal(name, type, masterInput, masterOutput, encoding, inputEncoding, outputEncoding, outputEncoding, signalHandler, paused, attributes, size);
    }
    
    @Deprecated
    Terminal newTerminal(final String p0, final String p1, final InputStream p2, final OutputStream p3, final Charset p4, final Charset p5, final Charset p6, final Charset p7, final Terminal.SignalHandler p8, final boolean p9, final Attributes p10, final Size p11) throws IOException;
    
    boolean isSystemStream(final SystemStream p0);
    
    String systemStreamName(final SystemStream p0);
    
    int systemStreamWidth(final SystemStream p0);
    
    default TerminalProvider load(final String name) throws IOException {
        ClassLoader cl = Thread.currentThread().getContextClassLoader();
        if (cl == null) {
            cl = TerminalProvider.class.getClassLoader();
        }
        final InputStream is = cl.getResourceAsStream("META-INF/services/org/jline/terminal/provider/" + name);
        if (is != null) {
            final Properties props = new Properties();
            try {
                props.load(is);
                final String className = props.getProperty("class");
                if (className == null) {
                    throw new IOException("No class defined in terminal provider file " + name);
                }
                final Class<?> clazz = cl.loadClass(className);
                return (TerminalProvider)clazz.getConstructor((Class<?>[])new Class[0]).newInstance(new Object[0]);
            }
            catch (final Exception e) {
                throw new IOException("Unable to load terminal provider " + name + ": " + e.getMessage(), e);
            }
        }
        throw new IOException("Unable to find terminal provider " + name);
    }
}
