summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2008-01-09 21:27:15 +0100
committerBenoit Foucher <benoit@zeroc.com>2008-01-09 21:27:15 +0100
commit5b2cdfebdd59ca3f99eb306e0ccf775fc0a81b83 (patch)
tree3414c09ed68bbbda6d446a76c552e065c9e91108 /java/src
parentAdded info on mcpp (diff)
downloadice-5b2cdfebdd59ca3f99eb306e0ccf775fc0a81b83.tar.bz2
ice-5b2cdfebdd59ca3f99eb306e0ccf775fc0a81b83.tar.xz
ice-5b2cdfebdd59ca3f99eb306e0ccf775fc0a81b83.zip
- Fixed bug 1619, part of 2632.
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/AMI_Object_ice_invoke.java1
-rw-r--r--java/src/Ice/Blobject.java7
-rw-r--r--java/src/Ice/BlobjectAsync.java7
-rw-r--r--java/src/Ice/InputStream.java1
-rw-r--r--java/src/Ice/InputStreamI.java6
-rw-r--r--java/src/Ice/ObjectAdapterI.java10
-rw-r--r--java/src/Ice/ObjectImpl.java11
-rw-r--r--java/src/Ice/_ObjectDelM.java58
-rw-r--r--java/src/IceInternal/BasicStream.java50
-rw-r--r--java/src/IceInternal/Incoming.java9
-rw-r--r--java/src/IceInternal/Outgoing.java28
-rw-r--r--java/src/IceInternal/OutgoingAsync.java17
12 files changed, 139 insertions, 66 deletions
diff --git a/java/src/Ice/AMI_Object_ice_invoke.java b/java/src/Ice/AMI_Object_ice_invoke.java
index b891e74375a..7a4f0074c0a 100644
--- a/java/src/Ice/AMI_Object_ice_invoke.java
+++ b/java/src/Ice/AMI_Object_ice_invoke.java
@@ -38,6 +38,7 @@ public abstract class AMI_Object_ice_invoke extends IceInternal.OutgoingAsync
{
int sz = __is.getReadEncapsSize();
outParams = __is.readBlob(sz);
+ __is.endReadEncaps();
}
catch(LocalException ex)
{
diff --git a/java/src/Ice/Blobject.java b/java/src/Ice/Blobject.java
index daadab0654c..c5b348e39ce 100644
--- a/java/src/Ice/Blobject.java
+++ b/java/src/Ice/Blobject.java
@@ -20,8 +20,11 @@ public abstract class Blobject extends Ice.ObjectImpl
{
byte[] inParams;
ByteSeqHolder outParams = new ByteSeqHolder();
- int sz = in.is().getReadEncapsSize();
- inParams = in.is().readBlob(sz);
+ IceInternal.BasicStream is = in.is();
+ is.startReadEncaps();
+ int sz = is.getReadEncapsSize();
+ inParams = is.readBlob(sz);
+ is.endReadEncaps();
boolean ok = ice_invoke(inParams, outParams, current);
if(outParams.value != null)
{
diff --git a/java/src/Ice/BlobjectAsync.java b/java/src/Ice/BlobjectAsync.java
index 50288c12a50..e8679631ef6 100644
--- a/java/src/Ice/BlobjectAsync.java
+++ b/java/src/Ice/BlobjectAsync.java
@@ -18,8 +18,11 @@ public abstract class BlobjectAsync extends Ice.ObjectImpl
__dispatch(IceInternal.Incoming in, Current current)
{
byte[] inParams;
- int sz = in.is().getReadEncapsSize();
- inParams = in.is().readBlob(sz);
+ IceInternal.BasicStream is = in.is();
+ is.startReadEncaps();
+ int sz = is.getReadEncapsSize();
+ inParams = is.readBlob(sz);
+ is.endReadEncaps();
AMD_Object_ice_invoke cb = new _AMD_Object_ice_invoke(in);
try
{
diff --git a/java/src/Ice/InputStream.java b/java/src/Ice/InputStream.java
index 60d7aab5615..8d882fec59f 100644
--- a/java/src/Ice/InputStream.java
+++ b/java/src/Ice/InputStream.java
@@ -54,6 +54,7 @@ public interface InputStream
void skipSlice();
void startEncapsulation();
+ void skipEncapsulation();
void endEncapsulation();
void readPendingObjects();
diff --git a/java/src/Ice/InputStreamI.java b/java/src/Ice/InputStreamI.java
index eaa75550cf9..2024c8c99bc 100644
--- a/java/src/Ice/InputStreamI.java
+++ b/java/src/Ice/InputStreamI.java
@@ -211,6 +211,12 @@ public class InputStreamI implements InputStream
}
public void
+ skipEncapsulation()
+ {
+ _is.skipEncaps();
+ }
+
+ public void
endEncapsulation()
{
_is.endReadEncaps();
diff --git a/java/src/Ice/ObjectAdapterI.java b/java/src/Ice/ObjectAdapterI.java
index 7ca631d61d5..38bcab3e208 100644
--- a/java/src/Ice/ObjectAdapterI.java
+++ b/java/src/Ice/ObjectAdapterI.java
@@ -680,10 +680,14 @@ public final class ObjectAdapterI implements ObjectAdapter
{
for(int i = 0; i < endpoints.length; ++i)
{
- // _routerEndpoints is sorted.
- if(java.util.Collections.binarySearch(_routerEndpoints, endpoints[i]) >= 0)
+ java.util.Iterator p;
+ p = _routerEndpoints.iterator();
+ while(p.hasNext())
{
- return true;
+ if(endpoints[i].equivalent((IceInternal.EndpointI)p.next()))
+ {
+ return true;
+ }
}
}
}
diff --git a/java/src/Ice/ObjectImpl.java b/java/src/Ice/ObjectImpl.java
index dfca5d6b3f3..af589d40da7 100644
--- a/java/src/Ice/ObjectImpl.java
+++ b/java/src/Ice/ObjectImpl.java
@@ -58,9 +58,11 @@ public abstract class ObjectImpl implements Object, java.lang.Cloneable
___ice_isA(Ice.Object __obj, IceInternal.Incoming __inS, Current __current)
{
IceInternal.BasicStream __is = __inS.is();
- IceInternal.BasicStream __os = __inS.os();
+ __is.startReadEncaps();
String __id = __is.readString();
+ __is.endReadEncaps();
boolean __ret = __obj.ice_isA(__id, __current);
+ IceInternal.BasicStream __os = __inS.os();
__os.writeBool(__ret);
return DispatchStatus.DispatchOK;
}
@@ -80,6 +82,7 @@ public abstract class ObjectImpl implements Object, java.lang.Cloneable
public static DispatchStatus
___ice_ping(Ice.Object __obj, IceInternal.Incoming __inS, Current __current)
{
+ __inS.is().skipEmptyEncaps();
__obj.ice_ping(__current);
return DispatchStatus.DispatchOK;
}
@@ -99,8 +102,9 @@ public abstract class ObjectImpl implements Object, java.lang.Cloneable
public static DispatchStatus
___ice_ids(Ice.Object __obj, IceInternal.Incoming __inS, Current __current)
{
- IceInternal.BasicStream __os = __inS.os();
+ __inS.is().skipEmptyEncaps();
String[] __ret = __obj.ice_ids(__current);
+ IceInternal.BasicStream __os = __inS.os();
__os.writeStringSeq(__ret);
return DispatchStatus.DispatchOK;
}
@@ -120,8 +124,9 @@ public abstract class ObjectImpl implements Object, java.lang.Cloneable
public static DispatchStatus
___ice_id(Ice.Object __obj, IceInternal.Incoming __inS, Current __current)
{
- IceInternal.BasicStream __os = __inS.os();
+ __inS.is().skipEmptyEncaps();
String __ret = __obj.ice_id(__current);
+ IceInternal.BasicStream __os = __inS.os();
__os.writeString(__ret);
return DispatchStatus.DispatchOK;
}
diff --git a/java/src/Ice/_ObjectDelM.java b/java/src/Ice/_ObjectDelM.java
index a060df4fae3..297cfd8ac63 100644
--- a/java/src/Ice/_ObjectDelM.java
+++ b/java/src/Ice/_ObjectDelM.java
@@ -30,19 +30,22 @@ public class _ObjectDelM implements _ObjectDel
boolean __ok = __og.invoke();
try
{
- IceInternal.BasicStream __is = __og.is();
if(!__ok)
{
try
{
- __is.throwException();
+ __og.throwUserException();
}
catch(UserException __ex)
{
throw new UnknownUserException(__ex.ice_name());
}
}
- return __is.readBool();
+ IceInternal.BasicStream __is = __og.is();
+ __is.startReadEncaps();
+ boolean __ret = __is.readBool();
+ __is.endReadEncaps();
+ return __ret;
}
catch(LocalException __ex)
{
@@ -63,24 +66,27 @@ public class _ObjectDelM implements _ObjectDel
try
{
boolean __ok = __og.invoke();
- try
+ if(!__og.is().isEmpty())
{
- IceInternal.BasicStream __is = __og.is();
- if(!__ok)
+ try
{
- try
- {
- __is.throwException();
- }
- catch(UserException __ex)
+ if(!__ok)
{
- throw new UnknownUserException(__ex.ice_name());
+ try
+ {
+ __og.throwUserException();
+ }
+ catch(UserException __ex)
+ {
+ throw new UnknownUserException(__ex.ice_name());
+ }
}
+ __og.is().skipEmptyEncaps();
+ }
+ catch(LocalException __ex)
+ {
+ throw new IceInternal.LocalExceptionWrapper(__ex, false);
}
- }
- catch(LocalException __ex)
- {
- throw new IceInternal.LocalExceptionWrapper(__ex, false);
}
}
finally
@@ -99,19 +105,22 @@ public class _ObjectDelM implements _ObjectDel
boolean __ok = __og.invoke();
try
{
- IceInternal.BasicStream __is = __og.is();
if(!__ok)
{
try
{
- __is.throwException();
+ __og.throwUserException();
}
catch(UserException __ex)
{
throw new UnknownUserException(__ex.ice_name());
}
}
- return __is.readStringSeq();
+ IceInternal.BasicStream __is = __og.is();
+ __is.startReadEncaps();
+ String[] __ret = __is.readStringSeq();
+ __is.endReadEncaps();
+ return __ret;
}
catch(LocalException __ex)
{
@@ -134,19 +143,22 @@ public class _ObjectDelM implements _ObjectDel
boolean __ok = __og.invoke();
try
{
- IceInternal.BasicStream __is = __og.is();
if(!__ok)
{
try
{
- __is.throwException();
+ __og.throwUserException();
}
catch(UserException __ex)
{
throw new UnknownUserException(__ex.ice_name());
}
}
- return __is.readString();
+ IceInternal.BasicStream __is = __og.is();
+ __is.startReadEncaps();
+ String __ret = __is.readString();
+ __is.endReadEncaps();
+ return __ret;
}
catch(LocalException __ex)
{
@@ -184,11 +196,13 @@ public class _ObjectDelM implements _ObjectDel
try
{
IceInternal.BasicStream __is = __og.is();
+ __is.startReadEncaps();
int sz = __is.getReadEncapsSize();
if(outParams != null)
{
outParams.value = __is.readBlob(sz);
}
+ __is.endReadEncaps();
}
catch(LocalException __ex)
{
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java
index 16409506b80..f55c45b7669 100644
--- a/java/src/IceInternal/BasicStream.java
+++ b/java/src/IceInternal/BasicStream.java
@@ -422,15 +422,27 @@ public class BasicStream
endReadEncaps()
{
assert(_readEncapsStack != null);
- int start = _readEncapsStack.start;
- int sz = _readEncapsStack.sz;
- try
- {
- _buf.b.position(start + sz);
- }
- catch(IllegalArgumentException ex)
+ if(_buf.b.position() != _readEncapsStack.start + _readEncapsStack.sz)
{
- throw new Ice.UnmarshalOutOfBoundsException();
+ if(_buf.b.position() + 1 != _readEncapsStack.start + _readEncapsStack.sz)
+ {
+ throw new Ice.EncapsulationException();
+ }
+
+ //
+ // Ice version < 3.3 had a bug where user exceptions with
+ // class members could be encoded with a trailing byte
+ // when dispatched with AMD. So we tolerate an extra byte
+ // in the encapsulation.
+ //
+ try
+ {
+ _buf.b.get();
+ }
+ catch(java.nio.BufferUnderflowException ex)
+ {
+ throw new Ice.UnmarshalOutOfBoundsException();
+ }
}
ReadEncaps curr = _readEncapsStack;
@@ -441,15 +453,27 @@ public class BasicStream
}
public void
- checkReadEncaps()
+ skipEmptyEncaps()
{
- assert(_readEncapsStack != null);
- int start = _readEncapsStack.start;
- int sz = _readEncapsStack.sz;
- if(_buf.b.position() != start + sz)
+ int sz = readInt();
+ if(sz < 0)
+ {
+ throw new Ice.NegativeSizeException();
+ }
+
+ if(sz != 6)
{
throw new Ice.EncapsulationException();
}
+
+ try
+ {
+ _buf.b.position(_buf.b.position() + 2);
+ }
+ catch(IllegalArgumentException ex)
+ {
+ throw new Ice.UnmarshalOutOfBoundsException();
+ }
}
public int
diff --git a/java/src/IceInternal/Incoming.java b/java/src/IceInternal/Incoming.java
index f55af36735b..30b149fa707 100644
--- a/java/src/IceInternal/Incoming.java
+++ b/java/src/IceInternal/Incoming.java
@@ -103,8 +103,6 @@ final public class Incoming extends IncomingBase implements Ice.Request
_current.ctx.put(first, second);
}
- _is.startReadEncaps();
-
if(_response)
{
assert(_os.size() == Protocol.headerSize + 4); // Reply status position.
@@ -197,7 +195,6 @@ final public class Incoming extends IncomingBase implements Ice.Request
}
catch(java.lang.Exception ex)
{
- _is.endReadEncaps();
__handleException(ex);
return;
}
@@ -208,8 +205,6 @@ final public class Incoming extends IncomingBase implements Ice.Request
// the caller of this operation.
//
- _is.endReadEncaps();
-
//
// DispatchAsync is "pseudo dispatch status", used internally
// only to indicate async dispatch.
@@ -306,7 +301,7 @@ final public class Incoming extends IncomingBase implements Ice.Request
//
// That's the first startOver, so almost nothing to do
//
- _inParamPos = _is.pos() - 6; // 6 bytes for the start of the encaps
+ _inParamPos = _is.pos();
}
else
{
@@ -315,9 +310,7 @@ final public class Incoming extends IncomingBase implements Ice.Request
//
// Let's rewind _is and clean-up _os
//
- _is.endReadEncaps();
_is.pos(_inParamPos);
- _is.startReadEncaps();
if(_response)
{
diff --git a/java/src/IceInternal/Outgoing.java b/java/src/IceInternal/Outgoing.java
index d5288310ebe..97a00eb0597 100644
--- a/java/src/IceInternal/Outgoing.java
+++ b/java/src/IceInternal/Outgoing.java
@@ -292,24 +292,12 @@ public final class Outgoing implements OutgoingMessageCallback
{
case ReplyStatus.replyOK:
{
- //
- // Input and output parameters are always sent in an
- // encapsulation, which makes it possible to forward
- // oneway requests as blobs.
- //
- _is.startReadEncaps();
_state = StateOK; // The state must be set last, in case there is an exception.
break;
}
case ReplyStatus.replyUserException:
{
- //
- // Input and output parameters are always sent in an
- // encapsulation, which makes it possible to forward
- // oneway requests as blobs.
- //
- _is.startReadEncaps();
_state = StateUserException; // The state must be set last, in case there is an exception.
break;
}
@@ -444,6 +432,22 @@ public final class Outgoing implements OutgoingMessageCallback
return _os;
}
+ public void
+ throwUserException()
+ throws Ice.UserException
+ {
+ try
+ {
+ _is.startReadEncaps();
+ _is.throwException();
+ }
+ catch(Ice.UserException ex)
+ {
+ _is.endReadEncaps();
+ throw ex;
+ }
+ }
+
private void
writeHeader(String operation, Ice.OperationMode mode, java.util.Map context)
throws LocalExceptionWrapper
diff --git a/java/src/IceInternal/OutgoingAsync.java b/java/src/IceInternal/OutgoingAsync.java
index 29ce96039af..6d354f23885 100644
--- a/java/src/IceInternal/OutgoingAsync.java
+++ b/java/src/IceInternal/OutgoingAsync.java
@@ -79,7 +79,6 @@ public abstract class OutgoingAsync extends OutgoingAsyncMessageCallback
case ReplyStatus.replyOK:
case ReplyStatus.replyUserException:
{
- __is.startReadEncaps();
break;
}
@@ -368,6 +367,22 @@ public abstract class OutgoingAsync extends OutgoingAsyncMessageCallback
protected abstract void __response(boolean ok);
+ protected void
+ __throwUserException()
+ throws Ice.UserException
+ {
+ try
+ {
+ __is.startReadEncaps();
+ __is.throwException();
+ }
+ catch(Ice.UserException ex)
+ {
+ __is.endReadEncaps();
+ throw ex;
+ }
+ }
+
private void
handleException(LocalExceptionWrapper ex)
{