History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/security/ssl/ByteBufferInputStream.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/security/ssl/ByteBufferInputStream.java+177−0
@@ -0,0 +1,177 @@
1+/*
2+ * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
3+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+ *
5+ * This code is free software; you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 2 only, as
7+ * published by the Free Software Foundation. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle in the LICENSE file that accompanied this code.
10+ *
11+ * This code is distributed in the hope that it will be useful, but WITHOUT
12+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+ * version 2 for more details (a copy is included in the LICENSE file that
15+ * accompanied this code).
16+ *
17+ * You should have received a copy of the GNU General Public License version
18+ * 2 along with this work; if not, write to the Free Software Foundation,
19+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+ *
21+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+
26+package sun.security.ssl;
27+
28+import java.io.*;
29+import java.nio.*;
30+
31+/**
32+ * A simple InputStream which uses ByteBuffers as it's backing store.
33+ * <P>
34+ * The only IOException should come if the InputStream has been closed.
35+ * All other IOException should not occur because all the data is local.
36+ * Data reads on an exhausted ByteBuffer returns a -1.
37+ *
38+ * @author Brad Wetmore
39+ */
40+class ByteBufferInputStream extends InputStream {
41+
42+ ByteBuffer bb;
43+
44+ ByteBufferInputStream(ByteBuffer bb) {
45+ this.bb = bb;
46+ }
47+
48+ /**
49+ * Returns a byte from the ByteBuffer.
50+ *
51+ * Increments position().
52+ */
53+ public int read() throws IOException {
54+
55+ if (bb == null) {
56+ throw new IOException("read on a closed InputStream");
57+ }
58+
59+ if (bb.remaining() == 0) {
60+ return -1;
61+ }
62+ return bb.get();
63+ }
64+
65+ /**
66+ * Returns a byte array from the ByteBuffer.
67+ *
68+ * Increments position().
69+ */
70+ public int read(byte b[]) throws IOException {
71+
72+ if (bb == null) {
73+ throw new IOException("read on a closed InputStream");
74+ }
75+
76+ return read(b, 0, b.length);
77+ }
78+
79+ /**
80+ * Returns a byte array from the ByteBuffer.
81+ *
82+ * Increments position().
83+ */
84+ public int read(byte b[], int off, int len) throws IOException {
85+
86+ if (bb == null) {
87+ throw new IOException("read on a closed InputStream");
88+ }
89+
90+ if (b == null) {
91+ throw new NullPointerException();
92+ } else if (off < 0 || len < 0 || len > b.length - off) {
93+ throw new IndexOutOfBoundsException();
94+ } else if (len == 0) {
95+ return 0;
96+ }
97+
98+ int length = Math.min(bb.remaining(), len);
99+ if (length == 0) {
100+ return -1;
101+ }
102+
103+ bb.get(b, off, length);
104+ return length;
105+ }
106+
107+ /**
108+ * Skips over and discards <code>n</code> bytes of data from this input
109+ * stream.
110+ */
111+ public long skip(long n) throws IOException {
112+
113+ if (bb == null) {
114+ throw new IOException("skip on a closed InputStream");
115+ }
116+
117+ if (n <= 0) {
118+ return 0;
119+ }
120+
121+ /*
122+ * ByteBuffers have at most an int, so lose the upper bits.
123+ * The contract allows this.
124+ */
125+ int nInt = (int) n;
126+ int skip = Math.min(bb.remaining(), nInt);
127+
128+ bb.position(bb.position() + skip);
129+
130+ return nInt;
131+ }
132+
133+ /**
134+ * Returns the number of bytes that can be read (or skipped over)
135+ * from this input stream without blocking by the next caller of a
136+ * method for this input stream.
137+ */
138+ public int available() throws IOException {
139+
140+ if (bb == null) {
141+ throw new IOException("available on a closed InputStream");
142+ }
143+
144+ return bb.remaining();
145+ }
146+
147+ /**
148+ * Closes this input stream and releases any system resources associated
149+ * with the stream.
150+ *
151+ * @exception IOException if an I/O error occurs.
152+ */
153+ public void close() throws IOException {
154+ bb = null;
155+ }
156+
157+ /**
158+ * Marks the current position in this input stream.
159+ */
160+ public synchronized void mark(int readlimit) {}
161+
162+ /**
163+ * Repositions this stream to the position at the time the
164+ * <code>mark</code> method was last called on this input stream.
165+ */
166+ public synchronized void reset() throws IOException {
167+ throw new IOException("mark/reset not supported");
168+ }
169+
170+ /**
171+ * Tests if this input stream supports the <code>mark</code> and
172+ * <code>reset</code> methods.
173+ */
174+ public boolean markSupported() {
175+ return false;
176+ }
177+}