diff options
author | Benoit Foucher <benoit@zeroc.com> | 2013-01-23 14:36:10 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2013-01-23 14:36:10 +0100 |
commit | 66bf1a7f2d0d46281ebf3d62caab6b9158eaa8a0 (patch) | |
tree | bd6aca447179f8d2e586c12cb961d683552504be /java/src | |
parent | Minor code style fixes (diff) | |
download | ice-66bf1a7f2d0d46281ebf3d62caab6b9158eaa8a0.tar.bz2 ice-66bf1a7f2d0d46281ebf3d62caab6b9158eaa8a0.tar.xz ice-66bf1a7f2d0d46281ebf3d62caab6b9158eaa8a0.zip |
Fix for ICE-4841 - added no copy option when creating input stream
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/Freeze/ObjectStore.java | 16 | ||||
-rw-r--r-- | java/src/Ice/InputStreamI.java | 31 | ||||
-rw-r--r-- | java/src/Ice/Util.java | 37 | ||||
-rw-r--r-- | java/src/IceInternal/BasicStream.java | 15 | ||||
-rw-r--r-- | java/src/IceInternal/Buffer.java | 13 |
5 files changed, 80 insertions, 32 deletions
diff --git a/java/src/Freeze/ObjectStore.java b/java/src/Freeze/ObjectStore.java index 82ccc40ac55..17c6c35f836 100644 --- a/java/src/Freeze/ObjectStore.java +++ b/java/src/Freeze/ObjectStore.java @@ -310,13 +310,8 @@ class ObjectStore implements IceUtil.Store static Ice.Identity unmarshalKey(byte[] b, Ice.Communicator communicator, Ice.EncodingVersion encoding) { - IceInternal.BasicStream is = - new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, true, false); - is.resize(b.length, true); - IceInternal.Buffer buf = is.getBuffer(); - buf.b.position(0); - buf.b.put(b); - buf.b.position(0); + IceInternal.BasicStream is = + new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, b); Ice.Identity key = new Ice.Identity(); key.__read(is); return key; @@ -349,13 +344,8 @@ class ObjectStore implements IceUtil.Store unmarshalValue(byte[] b, Ice.Communicator communicator, Ice.EncodingVersion encoding, boolean keepStats) { IceInternal.BasicStream is = - new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, true, false); + new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, b); is.sliceObjects(false); - is.resize(b.length, true); - IceInternal.Buffer buf = is.getBuffer(); - buf.b.position(0); - buf.b.put(b); - buf.b.position(0); ObjectRecord rec = new ObjectRecord(); is.startReadEncaps(); if(keepStats) diff --git a/java/src/Ice/InputStreamI.java b/java/src/Ice/InputStreamI.java index 68676199847..2fd21254f57 100644 --- a/java/src/Ice/InputStreamI.java +++ b/java/src/Ice/InputStreamI.java @@ -12,32 +12,37 @@ package Ice; public class InputStreamI implements InputStream { public - InputStreamI(Communicator communicator, byte[] data) + InputStreamI(Communicator communicator, byte[] data, boolean copyData) { _communicator = communicator; IceInternal.Instance instance = IceInternal.Util.getInstance(communicator); - _is = new IceInternal.BasicStream(instance, instance.defaultsAndOverrides().defaultEncoding, true, false); - initialize(data); + initialize(instance, data, instance.defaultsAndOverrides().defaultEncoding, copyData); } public - InputStreamI(Communicator communicator, byte[] data, EncodingVersion v) + InputStreamI(Communicator communicator, byte[] data, EncodingVersion v, boolean copyData) { _communicator = communicator; - IceInternal.Instance instance = IceInternal.Util.getInstance(communicator); - _is = new IceInternal.BasicStream(instance, v, true, false); - initialize(data); + initialize(IceInternal.Util.getInstance(communicator), data, v, copyData); } private void - initialize(byte[] data) + initialize(IceInternal.Instance instance, byte[] data, EncodingVersion v, boolean copyData) { + if(copyData) + { + _is = new IceInternal.BasicStream(instance, v, true, false); + _is.resize(data.length, true); + IceInternal.Buffer buf = _is.getBuffer(); + buf.b.position(0); + buf.b.put(data); + buf.b.position(0); + } + else + { + _is = new IceInternal.BasicStream(instance, v, data); + } _is.closure(this); - _is.resize(data.length, true); - IceInternal.Buffer buf = _is.getBuffer(); - buf.b.position(0); - buf.b.put(data); - buf.b.position(0); } public Communicator diff --git a/java/src/Ice/Util.java b/java/src/Ice/Util.java index 328aee186fa..049d82f0e7f 100644 --- a/java/src/Ice/Util.java +++ b/java/src/Ice/Util.java @@ -440,7 +440,7 @@ public final class Util public static InputStream createInputStream(Communicator communicator, byte[] bytes) { - return new InputStreamI(communicator, bytes); + return createInputStream(communicator, bytes, true); } /** @@ -455,7 +455,40 @@ public final class Util public static InputStream createInputStream(Communicator communicator, byte[] bytes, EncodingVersion v) { - return new InputStreamI(communicator, bytes, v); + return createInputStream(communicator, bytes, v, true); + } + + /** + * Creates an input stream for dynamic invocation and dispatch. The stream uses + * the communicator's default encoding version. + * + * @param communicator The communicator for the stream. + * @param bytes An encoded request or reply. + * @param copyBytes True if the given bytes should be copied, + * false otherwise. + * @return The input stream. + **/ + public static InputStream + createInputStream(Communicator communicator, byte[] bytes, boolean copyBytes) + { + return new InputStreamI(communicator, bytes, copyBytes); + } + + /** + * Creates an input stream for dynamic invocation and dispatch. The stream uses + * the given encoding version. + * + * @param communicator The communicator for the stream. + * @param bytes An encoded request or reply. + * @param v The desired encoding version. + * @param copyBytes True if the given bytes should be copied, + * false otherwise. + * @return The input stream. + **/ + public static InputStream + createInputStream(Communicator communicator, byte[] bytes, EncodingVersion v, boolean copyBytes) + { + return new InputStreamI(communicator, bytes, v, copyBytes); } /** diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java index c8e9f819605..f3d4966b6e8 100644 --- a/java/src/IceInternal/BasicStream.java +++ b/java/src/IceInternal/BasicStream.java @@ -20,20 +20,27 @@ public class BasicStream public BasicStream(Instance instance, Ice.EncodingVersion encoding, boolean unlimited) { - initialize(instance, encoding, unlimited, instance.cacheMessageBuffers() > 1); + this(instance, encoding, unlimited, instance.cacheMessageBuffers() > 1); } public BasicStream(Instance instance, Ice.EncodingVersion encoding, boolean unlimited, boolean direct) { - initialize(instance, encoding, unlimited, direct); + initialize(instance, encoding, unlimited); + _buf = new Buffer(_instance.messageSizeMax(), direct); + } + + public + BasicStream(Instance instance, Ice.EncodingVersion encoding, byte[] data) + { + initialize(instance, encoding, true); + _buf = new Buffer(data); } private void - initialize(Instance instance, Ice.EncodingVersion encoding, boolean unlimited, boolean direct) + initialize(Instance instance, Ice.EncodingVersion encoding, boolean unlimited) { _instance = instance; - _buf = new Buffer(_instance.messageSizeMax(), direct); _closure = null; _encoding = encoding; diff --git a/java/src/IceInternal/Buffer.java b/java/src/IceInternal/Buffer.java index 3f880586719..e2182243785 100644 --- a/java/src/IceInternal/Buffer.java +++ b/java/src/IceInternal/Buffer.java @@ -25,6 +25,17 @@ public class Buffer _direct = direct; } + public + Buffer(byte[] data) + { + b = java.nio.ByteBuffer.wrap(data); + b.order(java.nio.ByteOrder.LITTLE_ENDIAN); + _size = data.length; + _capacity = 0; + _maxCapacity = 0; + _direct = false; + } + public int size() { @@ -64,6 +75,8 @@ public class Buffer public void resize(int n, boolean reading) { + assert(b == _emptyBuffer || _capacity > 0); + if(n == 0) { clear(); |