blob: 46e3e28b921f58f6085f7c193d51171396c02f4b [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2001-2002 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.nio.ch;
27
28import java.io.*;
29import java.nio.*;
30import java.nio.channels.*;
31import java.nio.channels.spi.*;
32
33
34/**
35 * This class is defined here rather than in java.nio.channels.Channels
36 * so that code can be shared with SocketAdaptor.
37 *
38 * @author Mike McCloskey
39 * @author Mark Reinhold
40 * @since 1.4
41 */
42
43public class ChannelInputStream
44 extends InputStream
45{
46
47 public static int read(ReadableByteChannel ch, ByteBuffer bb,
48 boolean block)
49 throws IOException
50 {
51 if (ch instanceof SelectableChannel) {
52 SelectableChannel sc = (SelectableChannel)ch;
53 synchronized (sc.blockingLock()) {
54 boolean bm = sc.isBlocking();
55 if (!bm)
56 throw new IllegalBlockingModeException();
57 if (bm != block)
58 sc.configureBlocking(block);
59 int n = ch.read(bb);
60 if (bm != block)
61 sc.configureBlocking(bm);
62 return n;
63 }
64 } else {
65 return ch.read(bb);
66 }
67 }
68
69 protected final ReadableByteChannel ch;
70 private ByteBuffer bb = null;
71 private byte[] bs = null; // Invoker's previous array
72 private byte[] b1 = null;
73
74 public ChannelInputStream(ReadableByteChannel ch) {
75 this.ch = ch;
76 }
77
78 public synchronized int read() throws IOException {
79 if (b1 == null)
80 b1 = new byte[1];
81 int n = this.read(b1);
82 if (n == 1)
83 return b1[0] & 0xff;
84 return -1;
85 }
86
87 public synchronized int read(byte[] bs, int off, int len)
88 throws IOException
89 {
90 if ((off < 0) || (off > bs.length) || (len < 0) ||
91 ((off + len) > bs.length) || ((off + len) < 0)) {
92 throw new IndexOutOfBoundsException();
93 } else if (len == 0)
94 return 0;
95
96 ByteBuffer bb = ((this.bs == bs)
97 ? this.bb
98 : ByteBuffer.wrap(bs));
99 bb.limit(Math.min(off + len, bb.capacity()));
100 bb.position(off);
101 this.bb = bb;
102 this.bs = bs;
103 return read(bb);
104 }
105
106 protected int read(ByteBuffer bb)
107 throws IOException
108 {
109 return ChannelInputStream.read(ch, bb, true);
110 }
111
112 public void close() throws IOException {
113 ch.close();
114 }
115
116}