/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.wc.admin; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.Map; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.wc.IOExceptionWrapper; import org.tmatesoft.svn.core.internal.wc.SVNSubstitutor; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNTranslatorInputStream extends InputStream { private InputStream mySource; private ByteBuffer myTranslatedBuffer; private SVNSubstitutor mySubstitutor; private byte[] mySourceBuffer; public SVNTranslatorInputStream(InputStream source, byte[] eols, boolean repair, Map keywords, boolean expand) { mySource = source; mySubstitutor = new SVNSubstitutor(eols, repair, keywords, expand); myTranslatedBuffer = ByteBuffer.allocate(2048); mySourceBuffer = new byte[2048]; } public int read() throws IOException { byte[] b = new byte[1]; int r = read(b); if (r <= 0) { return -1; } return b[0] & 0xFF; } public int read(byte[] b) throws IOException { return read(b, 0, b.length); } public int read(byte[] b, int off, int len) throws IOException { boolean isEOF = false; int available = myTranslatedBuffer.position(); while(available < len) { int read = mySource.read(mySourceBuffer, 0, mySourceBuffer.length); if (read < 0) { isEOF = true; try { myTranslatedBuffer = mySubstitutor.translateChunk(null, myTranslatedBuffer); } catch (SVNException svne) { IOExceptionWrapper wrappedException = new IOExceptionWrapper(svne); throw wrappedException; } break; } try { myTranslatedBuffer = mySubstitutor.translateChunk(ByteBuffer.wrap(mySourceBuffer, 0, read), myTranslatedBuffer); } catch (SVNException svne) { IOExceptionWrapper wrappedException = new IOExceptionWrapper(svne); throw wrappedException; } available = myTranslatedBuffer.position(); } myTranslatedBuffer.flip(); len = Math.min(myTranslatedBuffer.remaining(), len); myTranslatedBuffer.get(b, off, len); myTranslatedBuffer.compact(); if (isEOF && len == 0) { return -1; } return len; } public void close() throws IOException { mySource.close(); } }