Author: mturk Date: Fri Aug 19 10:36:49 2011 New Revision: 1159584 URL: http://svn.apache.org/viewvc?rev=1159584&view=rev Log: Add position and flip methods
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/MemoryStream.java commons/sandbox/runtime/trunk/src/main/native/shared/memstream.c Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/MemoryStream.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/MemoryStream.java?rev=1159584&r1=1159583&r2=1159584&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/MemoryStream.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/MemoryStream.java Fri Aug 19 10:36:49 2011 @@ -23,14 +23,15 @@ import java.io.SyncFailedException; import java.nio.ByteBuffer; import org.apache.commons.runtime.InvalidArgumentException; import org.apache.commons.runtime.Pointer; +import org.apache.commons.runtime.OverflowException; import org.apache.commons.runtime.util.Utils; /** * Bidirectional Memory Stream. * <p> * This class uses native heap memory for internal data buffer and its - * capacity is limited to {@code Integer.MAX_VALUE} bytes. Stream dynamically - * allocates and extends the memory and as needed. + * capacity is limited to {@code Integer.MAX_VALUE - 65536} bytes. + * Stream dynamically allocates and extends the memory as needed. * </p> */ public final class MemoryStream extends Stream @@ -47,7 +48,9 @@ public final class MemoryStream extends private static native void flush0(long sb); private static native void finish0(long sb); private static native boolean finished0(long sb); - private static native int length0(long sb); + private static native int length0(long sb) + throws OverflowException; + private static native int setpos0(long sb, int pos); private static native int read0(long sb, int pos); private static native int read1(long sb, int pos, byte[] buf, int off, int len) @@ -71,6 +74,12 @@ public final class MemoryStream extends private static native long write5(long sb, ByteBuffer[] buf, int off, int len) throws IOException; + + private static native Pointer pointer0(long sb, int off) + throws InvalidRangeException; + private static native Pointer pointer1(long sb, int off) + throws InvalidRangeException; + /** * Creates a new memory stream instance with default buffer size. */ @@ -99,6 +108,7 @@ public final class MemoryStream extends * @throws IOException * if an error occurs in this stream. */ + @Override public synchronized int available() throws IOException { @@ -114,6 +124,7 @@ public final class MemoryStream extends * @throws IOException * if any error occurs when closing the object. */ + @Override public synchronized void close() throws IOException { @@ -136,6 +147,7 @@ public final class MemoryStream extends * @throws SyncFailedException when the object cannot be flushed. * @throws IOException if an I/O error occurs. */ + @Override public void flush() throws SyncFailedException, IOException { @@ -158,6 +170,7 @@ public final class MemoryStream extends * @throws SyncFailedException when the object cannot be flushed. * @throws IOException if an I/O error occurs. */ + @Override public void sync() throws SyncFailedException, IOException { @@ -179,6 +192,7 @@ public final class MemoryStream extends * open file, socket, or other I/O object; {@code false} otherwse. * */ + @Override public synchronized boolean valid() { return sb != 0L; @@ -193,6 +207,7 @@ public final class MemoryStream extends * * @throws IOException if an I/O error occurs. */ + @Override public boolean isBlocking() throws IOException { @@ -222,6 +237,7 @@ public final class MemoryStream extends * @throws IOException * If some other I/O error occurs. */ + @Override public synchronized long skip(long count) throws IOException { @@ -367,4 +383,46 @@ public final class MemoryStream extends return write5(sb, array, offset, count); } + /** + * Return this stream's read position. + */ + public synchronized final int position() + { + return rdpos; + } + + /** + * Sets this stream's read position. + */ + public synchronized final MemoryStream position(int newPos) + throws IllegalArgumentException, IOException + { + if (closed()) + throw new ClosedDescriptorException(); + if (newPos < 0 || newPos > length0(sb)) + throw new IllegalArgumentException(); + rdpos = newPos; + return this; + } + + /** + * Rewinds this stream read position. + */ + public synchronized final void rewind() + { + rdpos = 0; + } + + /** + * Flips this stream. + */ + public synchronized final MemoryStream flip() + { + if (valid()) { + setpos0(sb, rdpos); + rdpos = 0; + } + return this; + } + } Modified: commons/sandbox/runtime/trunk/src/main/native/shared/memstream.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/memstream.c?rev=1159584&r1=1159583&r2=1159584&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/shared/memstream.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/shared/memstream.c Fri Aug 19 10:36:49 2011 @@ -40,16 +40,48 @@ ACR_IO_EXPORT(void, MemoryStream, clear0 AcrSbClear(sb); } -ACR_IO_EXPORT(jlong, MemoryStream, detach0)(JNI_STDARGS, jlong sh) +ACR_IO_EXPORT(jlong, MemoryStream, data0)(JNI_STDARGS, jlong sh) { acr_sb_t *sb = J2P(sh, acr_sb_t *); - return P2J(AcrSbDetach(sb)); + return P2J(AcrSbData(sb)); } -ACR_IO_EXPORT(jlong, MemoryStream, data0)(JNI_STDARGS, jlong sh) +ACR_IO_EXPORT(jobject, MemoryStream, pointer0)(JNI_STDARGS, jlong sh, jint pos) { + char *buf; + int len; acr_sb_t *sb = J2P(sh, acr_sb_t *); - return P2J(AcrSbData(sb)); + + len = AcrSbLen(sb); + if (pos >= len) { + ACR_THROW(ACR_EX_ERANGE, 0); + return 0; + } + buf = AcrSbDetach(sb); + AcrSbInit(sb, 0, 32, 0); + sb->s_flags |= ACR_SB_DYNSTRUCT; + return AcrNewHeapPointer(env, buf + pos, len - pos); +} + +ACR_IO_EXPORT(jobject, MemoryStream, pointer1)(JNI_STDARGS, jlong sh, jint pos) +{ + char *buf; + int len; + acr_sb_t *sb = J2P(sh, acr_sb_t *); + + len = AcrSbLen(sb); + buf = AcrSbData(sb); + if (pos >= len) { + ACR_THROW(ACR_EX_ERANGE, 0); + return 0; + } + return AcrNewConstPointer(env, buf + pos, len - pos); +} + +ACR_IO_EXPORT(jlong, MemoryStream, detach0)(JNI_STDARGS, jlong sh) +{ + acr_sb_t *sb = J2P(sh, acr_sb_t *); + return P2J(AcrSbDetach(sb)); } ACR_IO_EXPORT(jlong, MemoryStream, detach1)(JNI_STDARGS, jlong sh, jint len) @@ -64,8 +96,12 @@ ACR_IO_EXPORT(jlong, MemoryStream, detac ACR_IO_EXPORT(jint, MemoryStream, length0)(JNI_STDARGS, jlong sh) { + int len; acr_sb_t *sb = J2P(sh, acr_sb_t *); - return AcrSbLen(sb); + + if ((len = AcrSbLen(sb)) == -1) + ACR_THROW(ACR_EX_EOVERFLOW, 0); + return len; } ACR_IO_EXPORT(jint, MemoryStream, capacity0)(JNI_STDARGS, jlong sh) @@ -138,8 +174,10 @@ ACR_IO_EXPORT(jint, MemoryStream, read1) else rd = -1; } - else + else { rc = ACR_EINVAL; + rd = -1; + } RELEASE_CRITICAL(buf, bb); if (rc != 0) { rd = -1; @@ -204,7 +242,7 @@ ACR_IO_EXPORT(jint, MemoryStream, write0 int wr = 1; acr_sb_t *sb = J2P(sh, acr_sb_t *); - rc = AcrSbPutc(sb, b); + rc = AcrSbPutb(sb, b); if (rc != 0) { wr = -1; ACR_THROW_EIO_ERROR(rc);