| /* |
| * 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; |
| } |
| } |
| |