summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/BasicStream.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/IceInternal/BasicStream.java')
-rw-r--r--java/src/IceInternal/BasicStream.java166
1 files changed, 126 insertions, 40 deletions
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java
index d7e525387f9..f8df5d93a44 100644
--- a/java/src/IceInternal/BasicStream.java
+++ b/java/src/IceInternal/BasicStream.java
@@ -12,27 +12,28 @@ package IceInternal;
public class BasicStream
{
public
- BasicStream(Instance instance)
+ BasicStream(Instance instance, Ice.EncodingVersion encoding)
{
- this(instance, false);
+ this(instance, encoding, false);
}
public
- BasicStream(Instance instance, boolean unlimited)
+ BasicStream(Instance instance, Ice.EncodingVersion encoding, boolean unlimited)
{
- initialize(instance, unlimited, instance.cacheMessageBuffers() > 1);
+ initialize(instance, encoding, unlimited, instance.cacheMessageBuffers() > 1);
}
public
- BasicStream(Instance instance, boolean unlimited, boolean direct)
+ BasicStream(Instance instance, Ice.EncodingVersion encoding, boolean unlimited, boolean direct)
{
- initialize(instance, unlimited, direct);
+ initialize(instance, encoding, unlimited, direct);
}
private void
- initialize(Instance instance, boolean unlimited, boolean direct)
+ initialize(Instance instance, Ice.EncodingVersion encoding, boolean unlimited, boolean direct)
{
_instance = instance;
+ _encoding = encoding;
_buf = new Buffer(_instance.messageSizeMax(), direct);
_closure = null;
_unlimited = unlimited;
@@ -197,16 +198,30 @@ public class BasicStream
return _buf;
}
- final private static byte[] _encapsBlob =
+ public void
+ startWriteEncaps()
{
- 0, 0, 0, 0, // Placeholder for the encapsulation length.
- Protocol.encodingMajor,
- Protocol.encodingMinor
- };
+ //
+ // If no encoding version is specified, use the current write
+ // encapsulation encoding version if there's a current write
+ // encapsulation, otherwise, use the stream encoding version.
+ //
+
+ if(_writeEncapsStack != null)
+ {
+ startWriteEncaps(_writeEncapsStack.encoding);
+ }
+ else
+ {
+ startWriteEncaps(_encoding);
+ }
+ }
public void
- startWriteEncaps()
+ startWriteEncaps(Ice.EncodingVersion encoding)
{
+ Protocol.checkSupportedEncoding(encoding);
+
{
WriteEncaps curr = _writeEncapsCache;
if(curr != null)
@@ -221,9 +236,11 @@ public class BasicStream
curr.next = _writeEncapsStack;
_writeEncapsStack = curr;
}
-
+ _writeEncapsStack.encoding = encoding;
_writeEncapsStack.start = _buf.size();
- writeBlob(_encapsBlob);
+
+ writeInt(0); // Placeholder for the encapsulation length.
+ _writeEncapsStack.encoding.__write(this);
}
public void
@@ -253,6 +270,31 @@ public class BasicStream
}
public void
+ writeEmptyEncaps(Ice.EncodingVersion encoding)
+ {
+ Protocol.checkSupportedEncoding(encoding);
+ writeInt(6); // Size
+ encoding.__write(this);
+ }
+
+ public void
+ writeEncaps(byte[] v)
+ {
+ if(v.length < 6)
+ {
+ throw new Ice.EncapsulationException();
+ }
+ expand(v.length);
+ _buf.b.put(v);
+ }
+
+ public Ice.EncodingVersion
+ getWriteEncoding()
+ {
+ return _writeEncapsStack != null ? _writeEncapsStack.encoding : _encoding;
+ }
+
+ public Ice.EncodingVersion
startReadEncaps()
{
{
@@ -291,19 +333,10 @@ public class BasicStream
}
_readEncapsStack.sz = sz;
- byte eMajor = readByte();
- byte eMinor = readByte();
- if(eMajor != Protocol.encodingMajor || eMinor > Protocol.encodingMinor)
- {
- Ice.UnsupportedEncodingException e = new Ice.UnsupportedEncodingException();
- e.badMajor = eMajor < 0 ? eMajor + 256 : eMajor;
- e.badMinor = eMinor < 0 ? eMinor + 256 : eMinor;
- e.major = Protocol.encodingMajor;
- e.minor = Protocol.encodingMinor;
- throw e;
- }
- // _readEncapsStack.encodingMajor = eMajor; // Currently unused
- // _readEncapsStack.encodingMinor = eMinor; // Currently unused
+ _readEncapsStack.encoding.__read(this);
+ Protocol.checkSupportedEncoding(_readEncapsStack.encoding); // Make sure the encoding is supported.
+
+ return _readEncapsStack.encoding;
}
public void
@@ -341,7 +374,7 @@ public class BasicStream
}
public void
- skipEmptyEncaps()
+ skipEmptyEncaps(Ice.EncodingVersion encoding)
{
int sz = readInt();
if(sz < 6)
@@ -354,13 +387,13 @@ public class BasicStream
throw new Ice.EncapsulationException();
}
- try
+ if(encoding != null)
{
- _buf.b.position(_buf.b.position() + 2);
+ encoding.__read(this);
}
- catch(IllegalArgumentException ex)
+ else
{
- throw new Ice.UnmarshalOutOfBoundsException();
+ _buf.b.position(_buf.b.position() + 2);
}
}
@@ -375,6 +408,48 @@ public class BasicStream
endReadEncaps();
}
+ public byte[]
+ readEncaps(Ice.EncodingVersion encoding)
+ {
+ int sz = readInt();
+ if(sz < 6)
+ {
+ throw new Ice.UnmarshalOutOfBoundsException();
+ }
+
+ if(sz - 4 > _buf.b.remaining())
+ {
+ throw new Ice.UnmarshalOutOfBoundsException();
+ }
+
+ if(encoding != null)
+ {
+ encoding.__read(this);
+ _buf.b.position(_buf.b.position() - 6);
+ }
+ else
+ {
+ _buf.b.position(_buf.b.position() - 4);
+ }
+
+ byte[] v = new byte[sz];
+ try
+ {
+ _buf.b.get(v);
+ return v;
+ }
+ catch(java.nio.BufferUnderflowException ex)
+ {
+ throw new Ice.UnmarshalOutOfBoundsException();
+ }
+ }
+
+ public Ice.EncodingVersion
+ getReadEncoding()
+ {
+ return _readEncapsStack != null ? _readEncapsStack.encoding : _encoding;
+ }
+
public int
getReadEncapsSize()
{
@@ -382,7 +457,7 @@ public class BasicStream
return _readEncapsStack.sz - 6;
}
- public void
+ public Ice.EncodingVersion
skipEncaps()
{
int sz = readInt();
@@ -390,6 +465,8 @@ public class BasicStream
{
throw new Ice.UnmarshalOutOfBoundsException();
}
+ Ice.EncodingVersion encoding = new Ice.EncodingVersion();
+ encoding.__read(this);
try
{
_buf.b.position(_buf.b.position() + sz - 4);
@@ -398,6 +475,7 @@ public class BasicStream
{
throw new Ice.UnmarshalOutOfBoundsException();
}
+ return encoding;
}
public void
@@ -407,13 +485,15 @@ public class BasicStream
_writeSlice = _buf.size();
}
- public void endWriteSlice()
+ public void
+ endWriteSlice()
{
final int sz = _buf.size() - _writeSlice + 4;
_buf.b.putInt(_writeSlice - 4, sz);
}
- public void startReadSlice()
+ public void
+ startReadSlice()
{
int sz = readInt();
if(sz < 4)
@@ -423,11 +503,13 @@ public class BasicStream
_readSlice = _buf.b.position();
}
- public void endReadSlice()
+ public void
+ endReadSlice()
{
}
- public void skipSlice()
+ public void
+ skipSlice()
{
int sz = readInt();
if(sz < 4)
@@ -1932,7 +2014,7 @@ public class BasicStream
return null;
}
- BasicStream cstream = new BasicStream(_instance);
+ BasicStream cstream = new BasicStream(_instance, _encoding);
cstream.resize(headerSize + 4 + compressedLen, false);
cstream.pos(0);
@@ -1991,7 +2073,7 @@ public class BasicStream
_buf.b.get(compressed);
}
- BasicStream ucStream = new BasicStream(_instance);
+ BasicStream ucStream = new BasicStream(_instance, _encoding);
ucStream.resize(uncompressedSize, false);
try
@@ -2341,6 +2423,7 @@ public class BasicStream
java.util.TreeMap<Integer, Ice.Object> unmarshaledMap;
int typeIdIndex;
java.util.TreeMap<Integer, String> typeIdMap;
+ Ice.EncodingVersion encoding;
ReadEncaps next;
void
@@ -2365,6 +2448,7 @@ public class BasicStream
java.util.IdentityHashMap<Ice.Object, Integer> marshaledMap;
int typeIdIndex;
java.util.TreeMap<String, Integer> typeIdMap;
+ Ice.EncodingVersion encoding;
WriteEncaps next;
void
@@ -2381,6 +2465,8 @@ public class BasicStream
}
}
+ private Ice.EncodingVersion _encoding;
+
private ReadEncaps _readEncapsStack;
private WriteEncaps _writeEncapsStack;
private ReadEncaps _readEncapsCache;