package jnr.posix;

import jnr.constants.platform.Errno;

import java.io.File;
import java.io.InputStream;
import java.io.PrintStream;

/**
 * The POSIXHandler class allows you do implement the runtime-specific behavior you need in
 * such a way that it is insulated from the implementation of the POSIX library.  Implementing
 * each of the methods in this interface should give you are working POSIX implementation. 
 *
 */
public interface POSIXHandler {
    public enum WARNING_ID {
        DUMMY_VALUE_USED("DUMMY_VALUE_USED");
        
        private String messageID;

        WARNING_ID(String messageID) {
            this.messageID = messageID;
        }
    }
    public void error(Errno error, String extraData);
    public void error(Errno error, String methodName, String extraData);
    
    /**
     * Specify that posix method is unimplemented.  In JRuby we generate an
     * exception with this.
     *
     * @param methodName the POSIX method that failed
     */
    public void unimplementedError(String methodName);
    
    public void warn(WARNING_ID id, String message, Object... data);
    
    /**
     * @return should we provide verbose output about POSIX activities
     */
    public boolean isVerbose();

    /**
     * @return current working directory of your runtime.
     */
    public File getCurrentWorkingDirectory();
    
    /**
     * @return current set of environment variables of your runtime.
     */
    public String[] getEnv();
    
    /**
     * @return your runtime's current input stream
     */
    public InputStream getInputStream();
    
    /**
     * @return your runtime's current output stream
     */
    public PrintStream getOutputStream();
    
    /**
     * Get your runtime's process ID.  This is only intended for non-native POSIX support (e.g.
     * environments where JNA cannot load or security restricted environments).  In JRuby we
     * found a number of packages which would rather have some identity for the runtime than
     * nothing.
     * 
     * Note: If you do not want this to work you impl can just call {@link #unimplementedError(String)}.
     *
     * @return your runtime's process ID
     */
    public int getPID();
    
    /**
     * Get your runtime's current ErrorStream
     *
     * @return your runtime's current error stream
     */
    public PrintStream getErrorStream();
}
