package app.navigps.utils; import app.config.GUIConfiguration; import app.config.MainConfiguration; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.LinkedList; /** * * @author Grzegorz (vara) Warywoda */ public class BridgeForVerboseMode extends OutputVerboseStreamAdapter{ /** * @return the instance */ public static BridgeForVerboseMode getInstance() { return instance; } private final LinkedList<OutputVerboseStream> updateComponents = new LinkedList<OutputVerboseStream>(); private PrintWriter out = new PrintWriter(new MyOutputStream(false),false); private PrintWriter err = new PrintWriter(new MyOutputStream(true),false); private PrintStream sout ; private PrintStream serr ; public static final Console console = new Console(); private static BridgeForVerboseMode instance = new BridgeForVerboseMode(); /** * */ public BridgeForVerboseMode(){ try { String encode = GUIConfiguration.getDefaultGuiCharsEncoding(); sout = new PrintStream(new MyOutputStream(false), false, encode); serr = new PrintStream(new MyOutputStream(true),false,encode); } catch (UnsupportedEncodingException ex) {} if(MainConfiguration.getMode()) addComponentsWithOutputStream(console); } /** * * @param text */ @Override public void outputVerboseStream(String text){ synchronized(updateComponents){ for (OutputVerboseStream ucomp : updateComponents) { ucomp.outputVerboseStream(text); } } } public void addComponentsWithOutputStream(OutputVerboseStream l){ if(l!=null){ synchronized(updateComponents){ updateComponents.add(l); } } } public boolean removeComponentFromOutputStream(OutputVerboseStream l){ if(l!=null){ synchronized(updateComponents){ return updateComponents.remove(l); } }return false; } /** * * @param text */ @Override public void outputErrorVerboseStream(String text) { synchronized(updateComponents){ for (OutputVerboseStream ucomp : updateComponents) { ucomp.outputErrorVerboseStream(text); } } } /** * * @return */ @Override public PrintWriter getOutputWriter() { return out; } /** * * @return */ @Override public PrintWriter getErrOutputWriter() { return err; } /** * * @return */ @Override public PrintStream getOutputStream() { return sout; } /** * * @return */ @Override public PrintStream getErrOutputStream() { return serr; } private class MyOutputStream extends OutputStream { protected char buf[] = new char[512]; protected int count=0; //private int lsep; private boolean err; MyOutputStream(boolean err){ //lsep = System.getProperty("line.separator").getBytes()[0]; this.err = err; } @Override public void write(int b) throws IOException { if(b!=10 && b!=13){ //FIXED !!! bug. with '\n' 10 Linux 13 Winshit addToBuffer(b); //Console.out.print(Integer.toHexString(b)+" "); } else flush(); } @Override public void flush(){ if(count!=0){ if (err) { outputErrorVerboseStream(new String(buf, 0, count)); } else { outputVerboseStream(new String(buf, 0, count)); } reset(); } } @Override public void close() throws IOException { reset(); } protected void addToBuffer(int val){ buf[count++]=(char) val; if(count==buf.length){ resizeArray(-1); } } private void resizeArray(int expand){ if(expand==-1) buf = Utils.resizeArray(buf, buf.length); else buf = Utils.resizeArray(buf, expand); } public void reset(){ count = 0; } } }