1 28 package org.jruby.util; 29 30 import java.io.InputStream ; 31 import java.io.IOException ; 32 33 import org.jruby.RubyFixnum; 34 import org.jruby.RubyString; 35 import org.jruby.runtime.builtin.IRubyObject; 36 37 46 public class IOInputStream extends InputStream { 47 private IRubyObject io; 48 private final IRubyObject numOne; 49 50 55 public IOInputStream(IRubyObject io) { 56 if (!io.respondsTo("read")) { 57 throw new IllegalArgumentException ("Object: " + io + " is not a legal argument to this wrapper, cause it doesn't respond to \"read\"."); 58 } 59 this.io = io; 60 this.numOne = RubyFixnum.one(this.io.getRuntime()); 61 } 62 63 public int read() throws IOException { 64 IRubyObject readValue = io.callMethod(io.getRuntime().getCurrentContext(), "read", numOne); 65 int returnValue = -1; 66 if (!readValue.isNil()) { 67 returnValue = readValue.toString().charAt(0); 68 } 69 return returnValue; 70 } 71 72 public int read(byte[] b) throws IOException { 73 IRubyObject readValue = io.callMethod(io.getRuntime().getCurrentContext(), "read", this.io.getRuntime().newFixnum(b.length)); 74 int returnValue = -1; 75 if (!readValue.isNil()) { 76 ByteList str = ((RubyString)readValue).getByteList(); 77 System.arraycopy(str.bytes,0,b,0,str.realSize); 78 returnValue = str.realSize; 79 } 80 return returnValue; 81 } 82 83 public int read(byte[] b, int off, int len) throws IOException { 84 IRubyObject readValue = io.callMethod(io.getRuntime().getCurrentContext(), "read", io.getRuntime().newFixnum(len)); 85 int returnValue = -1; 86 if (!readValue.isNil()) { 87 ByteList str = ((RubyString)readValue).getByteList(); 88 System.arraycopy(str.bytes,0,b,off,str.realSize); 89 returnValue = str.realSize; 90 } 91 return returnValue; 92 } 93 } 94 | Popular Tags |