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