blob: e209dd143eab2600bc28d5a63e810d091a073755 [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;
/**
* This class provides the DataStream functionality
* implemented over the array of ByteBuffer instances.
* Among with the data chunks read functionality
* it provides the info about amount of consumed data.
* The source ByteBuffer objects can be replaced by other.
* So one instance of this wrapper can be reused for several
* data sources.
*/
public class SSLEngineDataStream implements DataStream {
private ByteBuffer[] srcs;
private int offset;
private int limit;
private int available;
private int consumed;
protected SSLEngineDataStream() {}
protected void setSourceBuffers(ByteBuffer[] srcs, int offset, int length) {
this.srcs = srcs;
this.offset = offset;
this.limit = offset+length;
this.consumed = 0;
this.available = 0;
for (int i=offset; i<limit; i++) {
if (srcs[i] == null) {
throw new IllegalStateException(
"Some of the input parameters are null");
}
available += srcs[i].remaining();
}
}
public int available() {
return available;
}
public boolean hasData() {
return available > 0;
}
public byte[] getData(int length) {
// TODO: optimization work:
// use ByteBuffer.get(byte[],int,int)
// and ByteBuffer.hasArray() methods
int len = (length < available) ? length : available;
available -= len;
consumed += len;
byte[] res = new byte[len];
int pos = 0;
loop:
for (; offset<limit; offset++) {
while (srcs[offset].hasRemaining()) {
res[pos++] = srcs[offset].get();
len --;
if (len == 0) {
break loop;
}
}
}
return res;
}
protected int consumed() {
return consumed;
}
}