FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
jruby/src/org/jruby/util/IOChannel.java at parallel_boot · MSNexploder/jruby · GitHub
MSNexploder
/
jruby
Public
forked from
jruby/jruby
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
jruby
/
src
/
org
/
jruby
/
util
/
IOChannel.java
Copy path
More file actions
More file actions
Latest commit
History
History
History
149 lines (132 loc) · 5.82 KB
Breadcrumbs
jruby
/
src
/
org
/
jruby
/
util
/
IOChannel.java
Copy path
File metadata and controls
149 lines (132 loc) · 5.82 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/***** BEGIN LICENSE BLOCK *****
* Version: EPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Eclipse Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/epl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2009 Sun Microsystems, Inc
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the EPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the EPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
package
org
.
jruby
.
util
;
import
java
.
io
.
IOException
;
import
java
.
nio
.
ByteBuffer
;
import
java
.
nio
.
channels
.
Channel
;
import
java
.
nio
.
channels
.
ReadableByteChannel
;
import
java
.
nio
.
channels
.
WritableByteChannel
;
import
org
.
jruby
.
RubyString
;
import
org
.
jruby
.
runtime
.
CallSite
;
import
org
.
jruby
.
runtime
.
builtin
.
IRubyObject
;
import
org
.
jruby
.
runtime
.
MethodIndex
;
/**
* This class wraps a IRubyObject in an OutputStream. Depending on which messages
* the IRubyObject answers to, it will have different functionality.
*
* The point is that the IRubyObject could exhibit duck typing, in the style of IO versus StringIO, for example.
*
* At the moment, the only functionality supported is writing, and the only requirement on the io-object is
* that it responds to write() and close() like IO.
*
* @author <a href="mailto:Ola.Bini@ki.se">Ola Bini</a>
*/
public
abstract
class
IOChannel
implements
Channel
{
private
final
IRubyObject
io
;
private
final
CallSite
closeAdapter
=
MethodIndex
.
getFunctionalCallSite
(
"close"
);
/**
* Creates a new OutputStream with the object provided.
*
* @param io the ruby object
*/
protected
IOChannel
(
final
IRubyObject
io
) {
this
.
io
=
io
;
}
public
void
close
()
throws
IOException
{
if
(
io
.
respondsTo
(
"close"
))
closeAdapter
.
call
(
io
.
getRuntime
().
getCurrentContext
(),
io
,
io
);
}
public
boolean
isOpen
() {
throw
new
UnsupportedOperationException
(
"Not supported yet."
);
}
protected
int
read
(
CallSite
read
,
ByteBuffer
dst
)
throws
IOException
{
IRubyObject
readValue
=
read
.
call
(
io
.
getRuntime
().
getCurrentContext
(),
io
,
io
,
io
.
getRuntime
().
newFixnum
(
dst
.
remaining
()));
int
returnValue
= -
1
;
if
(!
readValue
.
isNil
()) {
ByteList
str
= ((
RubyString
)
readValue
).
getByteList
();
dst
.
put
(
str
.
getUnsafeBytes
(),
str
.
getBegin
(),
str
.
getRealSize
());
returnValue
=
str
.
getRealSize
();
}
return
returnValue
;
}
protected
int
write
(
CallSite
write
,
ByteBuffer
src
)
throws
IOException
{
ByteList
buffer
=
new
ByteList
(
src
.
array
(),
src
.
position
(),
src
.
remaining
(),
false
);
IRubyObject
written
=
write
.
call
(
io
.
getRuntime
().
getCurrentContext
(),
io
,
io
,
RubyString
.
newStringLight
(
io
.
getRuntime
(),
buffer
));
return
(
int
)
written
.
convertToInteger
().
getLongValue
();
}
protected
CallSite
initReadSite
() {
if
(
io
.
respondsTo
(
"read"
)) {
return
MethodIndex
.
getFunctionalCallSite
(
"read"
);
}
else
{
throw
new
IllegalArgumentException
(
io
.
getMetaClass
() +
"not coercible to "
+
getClass
().
getSimpleName
() +
": no `read' method"
);
}
}
protected
CallSite
initWriteSite
() {
if
(
io
.
respondsTo
(
"write"
)) {
return
MethodIndex
.
getFunctionalCallSite
(
"write"
);
}
else
if
(
io
.
respondsTo
(
"<<"
)) {
return
MethodIndex
.
getFunctionalCallSite
(
"<<"
);
}
else
{
throw
new
IllegalArgumentException
(
io
.
getMetaClass
() +
"not coercible to "
+
getClass
().
getSimpleName
() +
": no `write' method"
);
}
}
public
static
class
IOReadableByteChannel
extends
IOChannel
implements
ReadableByteChannel
{
private
final
CallSite
read
;
public
IOReadableByteChannel
(
final
IRubyObject
io
) {
super
(
io
);
read
=
initReadSite
();
}
public
int
read
(
ByteBuffer
dst
)
throws
IOException
{
return
read
(
read
,
dst
);
}
}
public
static
class
IOWritableByteChannel
extends
IOChannel
implements
WritableByteChannel
{
private
final
CallSite
write
;
public
IOWritableByteChannel
(
final
IRubyObject
io
) {
super
(
io
);
write
=
initWriteSite
();
}
public
int
write
(
ByteBuffer
src
)
throws
IOException
{
return
write
(
write
,
src
);
}
}
public
static
class
IOReadableWritableByteChannel
extends
IOChannel
implements
ReadableByteChannel
,
WritableByteChannel
{
private
final
CallSite
write
;
private
final
CallSite
read
;
public
IOReadableWritableByteChannel
(
final
IRubyObject
io
) {
super
(
io
);
read
=
initReadSite
();
write
=
initWriteSite
();
}
public
int
read
(
ByteBuffer
dst
)
throws
IOException
{
return
read
(
read
,
dst
);
}
public
int
write
(
ByteBuffer
src
)
throws
IOException
{
return
write
(
write
,
src
);
}
}
}
Back
|
FazBrowse Home
|
New Git URL