1 /* PipeImpl.java -- 2 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 3 4 This file is part of GNU Classpath. 5 6 GNU Classpath is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 GNU Classpath is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GNU Classpath; see the file COPYING. If not, write to the 18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19 02110-1301 USA. 20 21 Linking this library statically or dynamically with other modules is 22 making a combined work based on this library. Thus, the terms and 23 conditions of the GNU General Public License cover the whole 24 combination. 25 26 As a special exception, the copyright holders of this library give you 27 permission to link this library with independent modules to produce an 28 executable, regardless of the license terms of these independent 29 modules, and to copy and distribute the resulting executable under 30 terms of your choice, provided that you also meet, for each linked 31 independent module, the terms and conditions of the license of that 32 module. An independent module is a module which is not derived from 33 or based on this library. If you modify this library, you may extend 34 this exception to your version of the library, but you are not 35 obligated to do so. If you do not wish to do so, delete this 36 exception statement from your version. */ 37 38 package gnu.java.nio; 39 40 41 import java.io.IOException; 42 import java.nio.ByteBuffer; 43 import java.nio.channels.Pipe; 44 import java.nio.channels.spi.SelectorProvider; 45 46 class PipeImpl extends Pipe 47 { 48 public static final class SourceChannelImpl extends Pipe.SourceChannel 49 implements VMChannelOwner 50 { 51 private VMChannel vmch; 52 SourceChannelImpl(SelectorProvider selectorProvider, VMChannel channel)53 public SourceChannelImpl (SelectorProvider selectorProvider, 54 VMChannel channel) 55 { 56 super (selectorProvider); 57 vmch = channel; 58 } 59 implCloseSelectableChannel()60 protected final void implCloseSelectableChannel() 61 throws IOException 62 { 63 vmch.close(); 64 } 65 implConfigureBlocking(boolean blocking)66 protected void implConfigureBlocking (boolean blocking) 67 throws IOException 68 { 69 vmch.setBlocking(blocking); 70 } 71 read(ByteBuffer src)72 public final int read (ByteBuffer src) 73 throws IOException 74 { 75 return vmch.read(src); 76 } 77 read(ByteBuffer[] srcs)78 public final long read (ByteBuffer[] srcs) 79 throws IOException 80 { 81 return vmch.readScattering(srcs, 0, srcs.length); 82 } 83 read(ByteBuffer[] srcs, int offset, int len)84 public final synchronized long read (ByteBuffer[] srcs, int offset, 85 int len) 86 throws IOException 87 { 88 if (offset < 0 89 || offset > srcs.length 90 || len < 0 91 || len > srcs.length - offset) 92 throw new IndexOutOfBoundsException(); 93 94 return vmch.readScattering(srcs, offset, len); 95 } 96 getVMChannel()97 public VMChannel getVMChannel() 98 { 99 return vmch; 100 } 101 } 102 103 public static final class SinkChannelImpl extends Pipe.SinkChannel 104 implements VMChannelOwner 105 { 106 private VMChannel vmch; 107 SinkChannelImpl(SelectorProvider selectorProvider, VMChannel channel)108 public SinkChannelImpl (SelectorProvider selectorProvider, 109 VMChannel channel) 110 { 111 super (selectorProvider); 112 vmch = channel; 113 } 114 implCloseSelectableChannel()115 protected final void implCloseSelectableChannel() 116 throws IOException 117 { 118 vmch.close(); 119 } 120 implConfigureBlocking(boolean blocking)121 protected final void implConfigureBlocking (boolean blocking) 122 throws IOException 123 { 124 vmch.setBlocking(blocking); 125 } 126 write(ByteBuffer dst)127 public final int write (ByteBuffer dst) 128 throws IOException 129 { 130 return vmch.write(dst); 131 } 132 write(ByteBuffer[] srcs)133 public final long write (ByteBuffer[] srcs) 134 throws IOException 135 { 136 return vmch.writeGathering(srcs, 0, srcs.length); 137 } 138 write(ByteBuffer[] srcs, int offset, int len)139 public final synchronized long write (ByteBuffer[] srcs, int offset, int len) 140 throws IOException 141 { 142 if (offset < 0 143 || offset > srcs.length 144 || len < 0 145 || len > srcs.length - offset) 146 throw new IndexOutOfBoundsException(); 147 148 return vmch.writeGathering(srcs, offset, len); 149 } 150 getVMChannel()151 public VMChannel getVMChannel() 152 { 153 return vmch; 154 } 155 } 156 157 private SinkChannelImpl sink; 158 private SourceChannelImpl source; 159 PipeImpl(SelectorProvider provider)160 public PipeImpl (SelectorProvider provider) 161 throws IOException 162 { 163 super(); 164 VMChannel[] pipe = VMPipe.pipe(); 165 sink = new SinkChannelImpl(provider, pipe[0]); 166 source = new SourceChannelImpl(provider, pipe[1]); 167 } 168 sink()169 public Pipe.SinkChannel sink() 170 { 171 return sink; 172 } 173 source()174 public Pipe.SourceChannel source() 175 { 176 return source; 177 } 178 } 179