/*
* ====================================================================
* 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.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import javax.security.sasl.SaslClient;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public class SaslOutputStream extends OutputStream {
private OutputStream myOut;
private SaslClient myClient;
private byte[] myLengthBuffer = new byte[4];
private ByteBuffer myBuffer;
public SaslOutputStream(SaslClient client, int bufferSize, OutputStream out) {
myOut = out;
myClient = client;
myBuffer = ByteBuffer.allocate(bufferSize);
}
public void write(int b) throws IOException {
write(new byte[] {(byte) (b & 0xFF)});
}
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
public void write(byte[] b, int off, int len) throws IOException {
// write to buffer, then flush if necessary.
while(len > 0) {
int toPut = Math.min(myBuffer.remaining(), len);
myBuffer.put(b, off, toPut);
off += toPut;
len -= toPut;
if (myBuffer.remaining() == 0) {
flush();
}
}
}
public void close() throws IOException {
flush();
myOut.close();
}
public void flush() throws IOException {
byte[] bytes = myBuffer.array();
int off = myBuffer.arrayOffset();
int len = myBuffer.position();
if (len == 0) {
return;
}
byte[] encoded = myClient.wrap(bytes, off, len);
myLengthBuffer[0] = (byte) ((encoded.length & 0xFF000000) >> 24);
myLengthBuffer[1] = (byte) ((encoded.length & 0x00FF0000) >> 16);
myLengthBuffer[2] = (byte) ((encoded.length & 0x0000FF00) >> 8);
myLengthBuffer[3] = (byte) ((encoded.length & 0x000000FF));
myOut.write(myLengthBuffer, 0, myLengthBuffer.length);
myOut.write(encoded, 0, encoded.length);
myOut.flush();
myBuffer.clear();
}
}