blob: b827016a60d488c960e0025d484282b62b26fa73 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.harmony.xnet.provider.jsse;
import java.nio.ByteBuffer;
import javax.net.ssl.SSLException;
/**
* This class is used to retrieve the application data
* arrived for the SSLEngine.
*/
public class SSLEngineAppData implements org.apache.harmony.xnet.provider.jsse.Appendable {
/**
* Buffer containing received application data.
*/
byte[] buffer;
/**
* Constructor
*/
protected SSLEngineAppData() {}
/**
* Stores received data. The source data is not cloned,
* just the array reference is remembered into the buffer field.
*/
public void append(byte[] src) {
if (buffer != null) {
throw new AlertException(
AlertProtocol.INTERNAL_ERROR,
new SSLException("Attempt to override the data"));
}
buffer = src;
}
/**
* Places the data from the buffer into the array of destination
* ByteBuffer objects.
*/
protected int placeTo(ByteBuffer[] dsts, int offset, int length) {
if (buffer == null) {
return 0;
}
int pos = 0;
int len = buffer.length;
int rem;
// write data to the buffers
for (int i=offset; i<offset+length; i++) {
rem = dsts[i].remaining();
// TODO: optimization work - use hasArray, array(), arraycopy
if (len - pos < rem) {
// can fully write remaining data into buffer
dsts[i].put(buffer, pos, len - pos);
pos = len;
// data was written, exit
break;
}
// write chunk of data
dsts[i].put(buffer, pos, rem);
pos += rem;
}
if (pos != len) {
// The data did not feet into the buffers,
// it should not happen, because the destination buffers
// had been checked for the space before record unwrapping.
// But if it so, we should allert about internal error.
throw new AlertException(
AlertProtocol.INTERNAL_ERROR,
new SSLException(
"The received application data could not be fully written"
+ "into the destination buffers"));
}
buffer = null;
return len;
}
}