001 /**
002 *
003 * Copyright 2006 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package javax.mail.util;
019
020 import java.io.ByteArrayInputStream;
021 import java.io.IOException;
022 import java.io.InputStream;
023
024 import javax.mail.internet.SharedInputStream;
025
026 public class SharedByteArrayInputStream extends ByteArrayInputStream implements SharedInputStream {
027
028 /**
029 * Position within shared buffer that this stream starts at.
030 */
031 protected int start;
032
033 /**
034 * Create a SharedByteArrayInputStream that shares the entire
035 * buffer.
036 *
037 * @param buf The input data.
038 */
039 public SharedByteArrayInputStream(byte[] buf) {
040 this(buf, 0, buf.length);
041 }
042
043
044 /**
045 * Create a SharedByteArrayInputStream using a subset of the
046 * array data.
047 *
048 * @param buf The source data array.
049 * @param offset The starting offset within the array.
050 * @param length The length of data to use.
051 */
052 public SharedByteArrayInputStream(byte[] buf, int offset, int length) {
053 super(buf, offset, length);
054 start = offset;
055 }
056
057
058 /**
059 * Get the position within the output stream, adjusted by the
060 * starting offset.
061 *
062 * @return The adjusted position within the stream.
063 */
064 public long getPosition() {
065 return pos - start;
066 }
067
068
069 /**
070 * Create a new input stream from this input stream, accessing
071 * a subset of the data. Think of it as a substring operation
072 * for a stream.
073 *
074 * The starting offset must be non-negative. The end offset can
075 * by -1, which means use the remainder of the stream.
076 *
077 * @param offset The starting offset.
078 * @param end The end offset (which can be -1).
079 *
080 * @return An InputStream configured to access the indicated data subrange.
081 */
082 public InputStream newStream(long offset, long end) {
083 if (offset < 0) {
084 throw new IllegalArgumentException("Starting position must be non-negative");
085 }
086 if (end == -1) {
087 end = count - start;
088 }
089 return new SharedByteArrayInputStream(buf, start + (int)offset, (int)(end - offset));
090 }
091 }