/* * ==================================================================== * 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.io.svn.sasl; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import javax.security.sasl.SaslClient; /** * @version 1.3 * @author TMate Software Ltd. */ public class SaslInputStream extends InputStream { private InputStream mySource; private SaslClient myClient; private byte[] myReadBuffer; private ByteBuffer myByteBuffer; public SaslInputStream(SaslClient client, int bufferSize, InputStream in) { mySource = in; myReadBuffer = new byte[bufferSize*2]; myClient = client; } public void close() throws IOException { mySource.close(); } public int read() throws IOException { byte[] b = new byte[1]; int r = read(b, 0, 1); if (r != 1) { return -1; } return b[0]; } public int read(byte[] b) throws IOException { return read(b, 0, b.length); } public int read(byte[] b, int off, int len) throws IOException { int read = 0; while(true) { if (myByteBuffer == null) { fetchDecodedBuffer(); } int toCopy = Math.min(len, myByteBuffer.remaining()); myByteBuffer.get(b, off, toCopy); len -= toCopy; off += toCopy; read += toCopy; if (len == 0 || myByteBuffer.remaining() == 0) { if (myByteBuffer.remaining() == 0) { myByteBuffer = null; } return read; } } } public long skip(long n) throws IOException { return 0; } private void fetchDecodedBuffer() throws IOException { DataInputStream dis = new DataInputStream(mySource); int encodedLength = dis.readInt(); if (myReadBuffer.length < encodedLength) { myReadBuffer = new byte[(encodedLength * 3) / 2]; } dis.readFully(myReadBuffer, 0, encodedLength); myByteBuffer = ByteBuffer.wrap(myClient.unwrap(myReadBuffer, 0, encodedLength)); } }