summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-06-20 10:42:48 +0200
committerBenoit Foucher <benoit@zeroc.com>2012-06-20 10:42:48 +0200
commiteddcd80c0a9c29bc7c807db3ccf0e1e3484ac43f (patch)
tree1e4575ae28d98639018bdd23c38a6702d162e6a2 /cpp
parent* Grammar fixes (diff)
downloadice-eddcd80c0a9c29bc7c807db3ccf0e1e3484ac43f.tar.bz2
ice-eddcd80c0a9c29bc7c807db3ccf0e1e3484ac43f.tar.xz
ice-eddcd80c0a9c29bc7c807db3ccf0e1e3484ac43f.zip
Don't write optionals with 1.0 encoding, added UnknownSlicedObject test, fixed exception un-marhsalling to raise UnkownUserException for unknown exceptions.
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Ice/BasicStream.h33
-rw-r--r--cpp/include/Ice/Ice.h1
-rw-r--r--cpp/include/Ice/SlicedData.h5
-rw-r--r--cpp/include/Ice/SlicedDataF.h4
-rwxr-xr-xcpp/src/Ice/BasicStream.cpp33
-rw-r--r--cpp/src/Ice/Exception.cpp11
-rw-r--r--cpp/src/Ice/SlicedData.cpp1
-rw-r--r--cpp/test/Ice/slicing/objects/AllTests.cpp10
-rw-r--r--cpp/test/Ice/slicing/objects/Test.ice1
-rw-r--r--cpp/test/Ice/slicing/objects/TestAMD.ice1
-rw-r--r--cpp/test/Ice/slicing/objects/TestAMDI.cpp18
-rw-r--r--cpp/test/Ice/slicing/objects/TestAMDI.h2
-rw-r--r--cpp/test/Ice/slicing/objects/TestI.cpp15
-rw-r--r--cpp/test/Ice/slicing/objects/TestI.h1
14 files changed, 109 insertions, 27 deletions
diff --git a/cpp/include/Ice/BasicStream.h b/cpp/include/Ice/BasicStream.h
index da2f4228a05..595b8895aa4 100644
--- a/cpp/include/Ice/BasicStream.h
+++ b/cpp/include/Ice/BasicStream.h
@@ -499,11 +499,15 @@ public:
template<typename T> void write(Ice::Int tag, const IceUtil::Optional<T>& v)
{
- if(v)
+ if(!v)
+ {
+ return; // Optional not set
+ }
+
+ if(writeOpt(tag, Ice::StreamOptionalHelper<T,
+ Ice::StreamTrait<T>::type,
+ Ice::StreamTrait<T>::optionalType>::optionalType))
{
- writeOpt(tag, Ice::StreamOptionalHelper<T,
- Ice::StreamTrait<T>::type,
- Ice::StreamTrait<T>::optionalType>::optionalType);
Ice::StreamOptionalHelper<T, Ice::StreamTrait<T>::type, Ice::StreamTrait<T>::optionalType>::write(this, *v);
}
}
@@ -546,16 +550,16 @@ public:
}
// Read/write type and tag for optionals
- void writeOpt(Ice::Int tag, Ice::OptionalType type)
+ bool writeOpt(Ice::Int tag, Ice::OptionalType type)
{
assert(_currentWriteEncaps);
if(_currentWriteEncaps->encoder)
{
- _currentWriteEncaps->encoder->writeOpt(tag, type);
+ return _currentWriteEncaps->encoder->writeOpt(tag, type);
}
else
{
- writeOptImpl(tag, type);
+ return writeOptImpl(tag, type);
}
}
bool readOpt(Ice::Int tag, Ice::OptionalType expectedType)
@@ -801,7 +805,7 @@ public:
// Read/write/skip optionals
bool readOptImpl(Ice::Int, Ice::OptionalType);
- void writeOptImpl(Ice::Int, Ice::OptionalType);
+ bool writeOptImpl(Ice::Int, Ice::OptionalType);
bool skipOpt(Ice::OptionalType);
bool skipOpts();
@@ -980,7 +984,7 @@ private:
void startSlice(const std::string&, bool);
void endSlice();
- void writeOpt(Ice::Int tag, Ice::OptionalType type)
+ bool writeOpt(Ice::Int tag, Ice::OptionalType type)
{
if(_sliceType == NoSlice)
{
@@ -988,8 +992,15 @@ private:
}
else
{
- _sliceFlags |= FLAG_HAS_OPTIONAL_MEMBERS;
- return _stream->writeOptImpl(tag, type);
+ if(_stream->writeOptImpl(tag, type))
+ {
+ _sliceFlags |= FLAG_HAS_OPTIONAL_MEMBERS;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
}
}
diff --git a/cpp/include/Ice/Ice.h b/cpp/include/Ice/Ice.h
index c421c9d7a27..c17fc42565a 100644
--- a/cpp/include/Ice/Ice.h
+++ b/cpp/include/Ice/Ice.h
@@ -23,6 +23,7 @@
#include <Ice/ServantLocator.h>
#include <Ice/Proxy.h>
#include <Ice/Object.h>
+#include <Ice/SlicedData.h>
#include <Ice/OutgoingAsync.h>
#include <Ice/IncomingAsync.h>
#include <Ice/Process.h>
diff --git a/cpp/include/Ice/SlicedData.h b/cpp/include/Ice/SlicedData.h
index 9fae788d674..b056d9296c0 100644
--- a/cpp/include/Ice/SlicedData.h
+++ b/cpp/include/Ice/SlicedData.h
@@ -40,6 +40,11 @@ struct ICE_API SliceInfo : public ::IceUtil::Shared
// Whether or not the slice contains optional members.
//
bool hasOptionalMembers;
+
+ //
+ // Whether or not this is the last slice.
+ //
+ bool isLastSlice;
};
//
diff --git a/cpp/include/Ice/SlicedDataF.h b/cpp/include/Ice/SlicedDataF.h
index 30c4ca4365c..41d23f79219 100644
--- a/cpp/include/Ice/SlicedDataF.h
+++ b/cpp/include/Ice/SlicedDataF.h
@@ -25,6 +25,10 @@ class SlicedData;
ICE_API IceUtil::Shared* upCast(SlicedData*);
typedef IceInternal::Handle<SlicedData> SlicedDataPtr;
+class UnknownSlicedObject;
+ICE_API IceUtil::Shared* upCast(UnknownSlicedObject*);
+typedef IceInternal::Handle<UnknownSlicedObject> UnknownSlicedObjectPtr;
+
}
#endif
diff --git a/cpp/src/Ice/BasicStream.cpp b/cpp/src/Ice/BasicStream.cpp
index f2f3bccbfce..4636813d40a 100755
--- a/cpp/src/Ice/BasicStream.cpp
+++ b/cpp/src/Ice/BasicStream.cpp
@@ -1582,6 +1582,11 @@ IceInternal::BasicStream::sliceObjects(bool doSlice)
bool
IceInternal::BasicStream::readOptImpl(Int readTag, OptionalType expectedType)
{
+ if(getReadEncoding() == Encoding_1_0)
+ {
+ return false; // Optional members aren't supported with the 1.0 encoding.
+ }
+
Int tag = 0;
OptionalType type;
do
@@ -1627,9 +1632,14 @@ IceInternal::BasicStream::readOptImpl(Int readTag, OptionalType expectedType)
return true;
}
-void
+bool
IceInternal::BasicStream::writeOptImpl(Int tag, OptionalType type)
{
+ if(getWriteEncoding() == Encoding_1_0)
+ {
+ return false; // Optional members aren't supported with the 1.0 encoding.
+ }
+
Byte v = static_cast<Byte>(type);
if(tag < 31)
{
@@ -1642,6 +1652,7 @@ IceInternal::BasicStream::writeOptImpl(Int tag, OptionalType type)
write(v);
writeSize(tag);
}
+ return true;
}
bool
@@ -1975,6 +1986,7 @@ IceInternal::BasicStream::EncapsEncoder::endSlice()
//
if(_sliceFlags & FLAG_HAS_OPTIONAL_MEMBERS)
{
+ assert(_encaps->encoding != Encoding_1_0);
_stream->write(static_cast<Byte>(OptionalTypeEndMarker));
}
@@ -1993,6 +2005,7 @@ IceInternal::BasicStream::EncapsEncoder::endSlice()
//
if(!_indirectionTable.empty())
{
+ assert(_encaps->encoding != Encoding_1_0);
assert(_format == SlicedFormat);
_sliceFlags |= FLAG_HAS_INDIRECTION_TABLE;
@@ -2006,7 +2019,8 @@ IceInternal::BasicStream::EncapsEncoder::endSlice()
}
//
- // Finally, update the slice flags.
+ // Finally, update the slice flags (or the object slice has index
+ // type ID boolean for the 1.0 encoding)
//
if(_encaps->encoding == Encoding_1_0)
{
@@ -2119,7 +2133,7 @@ IceInternal::BasicStream::EncapsEncoder::writeSlicedData(const SlicedDataPtr& sl
for(SliceInfoSeq::const_iterator p = slicedData->slices.begin(); p != slicedData->slices.end(); ++p)
{
- startSlice((*p)->typeId, false); // last = false, sliced data never contains the last slice.
+ startSlice((*p)->typeId, (*p)->isLastSlice);
//
// Write the bytes associated with this slice.
@@ -2322,8 +2336,14 @@ IceInternal::BasicStream::EncapsDecoder::throwException(const UserExceptionFacto
//
if(_sliceFlags & FLAG_IS_LAST_SLICE)
{
- throw NoExceptionFactoryException(__FILE__, __LINE__, "unknown exception type `" + mostDerivedId + "'",
- mostDerivedId);
+ if(mostDerivedId.length() > 2 && mostDerivedId[0] == ':' && mostDerivedId[1] == ':')
+ {
+ throw UnknownUserException(__FILE__, __LINE__, mostDerivedId.substr(2));
+ }
+ else
+ {
+ throw UnknownUserException(__FILE__, __LINE__, mostDerivedId);
+ }
}
try
@@ -2856,10 +2876,13 @@ IceInternal::BasicStream::EncapsDecoder::skipSlice()
SliceInfoPtr info = new SliceInfo;
info->typeId = _typeId;
info->hasOptionalMembers = _sliceFlags & FLAG_HAS_OPTIONAL_MEMBERS;
+ info->isLastSlice = _sliceFlags & FLAG_IS_LAST_SLICE;
if(info->hasOptionalMembers)
{
+ //
// Don't include the optional member end marker. It will be re-written by
// endSlice when the sliced data is re-written.
+ //
vector<Byte>(start, _stream->i - 1).swap(info->bytes);
}
else
diff --git a/cpp/src/Ice/Exception.cpp b/cpp/src/Ice/Exception.cpp
index a205af22a78..6753c597353 100644
--- a/cpp/src/Ice/Exception.cpp
+++ b/cpp/src/Ice/Exception.cpp
@@ -603,17 +603,6 @@ Ice::NoObjectFactoryException::ice_print(ostream& out) const
}
void
-Ice::NoExceptionFactoryException::ice_print(ostream& out) const
-{
- Exception::ice_print(out);
- out << ":\nprotocol error: no suitable exception factory found for `" << type << "'";
- if(!reason.empty())
- {
- out << ":\n" << reason;
- }
-}
-
-void
Ice::UnexpectedObjectException::ice_print(ostream& out) const
{
Exception::ice_print(out);
diff --git a/cpp/src/Ice/SlicedData.cpp b/cpp/src/Ice/SlicedData.cpp
index 568c55a7585..9b2e88b609c 100644
--- a/cpp/src/Ice/SlicedData.cpp
+++ b/cpp/src/Ice/SlicedData.cpp
@@ -16,6 +16,7 @@ using namespace Ice;
IceUtil::Shared* Ice::upCast(SliceInfo* p) { return p; }
IceUtil::Shared* Ice::upCast(SlicedData* p) { return p; }
+IceUtil::Shared* Ice::upCast(UnknownSlicedObject* p) { return p; }
Ice::SlicedData::SlicedData(const SliceInfoSeq& seq) :
slices(seq)
diff --git a/cpp/test/Ice/slicing/objects/AllTests.cpp b/cpp/test/Ice/slicing/objects/AllTests.cpp
index df60d9c967e..c67033d0887 100644
--- a/cpp/test/Ice/slicing/objects/AllTests.cpp
+++ b/cpp/test/Ice/slicing/objects/AllTests.cpp
@@ -126,6 +126,8 @@ public:
void
response_SUnknownAsObject11(const Ice::ObjectPtr& o)
{
+ test(Ice::UnknownSlicedObjectPtr::dynamicCast(o));
+ test(Ice::UnknownSlicedObjectPtr::dynamicCast(o)->getUnknownTypeId() == "::Test::SUnknown");
called();
}
@@ -544,11 +546,19 @@ testUOO(const TestIntfPrx& test)
{
o = test->SUnknownAsObject();
test(test->ice_getEncodingVersion() != Ice::Encoding_1_0);
+ test(Ice::UnknownSlicedObjectPtr::dynamicCast(o));
+ test(Ice::UnknownSlicedObjectPtr::dynamicCast(o)->getUnknownTypeId() == "::Test::SUnknown");
+ test->checkSUnknown(o);
}
catch(const Ice::NoObjectFactoryException&)
{
test(test->ice_getEncodingVersion() == Ice::Encoding_1_0);
}
+ catch(const std::exception& ex)
+ {
+ cout << ex.what() << endl;
+ test(false);
+ }
catch(...)
{
test(false);
diff --git a/cpp/test/Ice/slicing/objects/Test.ice b/cpp/test/Ice/slicing/objects/Test.ice
index 030b4f83100..0c221367c86 100644
--- a/cpp/test/Ice/slicing/objects/Test.ice
+++ b/cpp/test/Ice/slicing/objects/Test.ice
@@ -110,6 +110,7 @@ interface TestIntf
["format:compact"] SBase SBSUnknownDerivedAsSBaseCompact();
Object SUnknownAsObject();
+ void checkSUnknown(Object o);
B oneElementCycle();
B twoElementCycle();
diff --git a/cpp/test/Ice/slicing/objects/TestAMD.ice b/cpp/test/Ice/slicing/objects/TestAMD.ice
index f1ed8ac1832..c023f59d638 100644
--- a/cpp/test/Ice/slicing/objects/TestAMD.ice
+++ b/cpp/test/Ice/slicing/objects/TestAMD.ice
@@ -110,6 +110,7 @@ interface TestIntf
["format:compact"] SBase SBSUnknownDerivedAsSBaseCompact();
Object SUnknownAsObject();
+ void checkSUnknown(Object o);
B oneElementCycle();
B twoElementCycle();
diff --git a/cpp/test/Ice/slicing/objects/TestAMDI.cpp b/cpp/test/Ice/slicing/objects/TestAMDI.cpp
index b8ce7b87b22..6c4582bf053 100644
--- a/cpp/test/Ice/slicing/objects/TestAMDI.cpp
+++ b/cpp/test/Ice/slicing/objects/TestAMDI.cpp
@@ -80,6 +80,24 @@ TestI::SUnknownAsObject_async(const AMD_TestIntf_SUnknownAsObjectPtr& cb, const
}
void
+TestI::checkSUnknown_async(const AMD_TestIntf_checkSUnknownPtr& cb,
+ const Ice::ObjectPtr& obj,
+ const ::Ice::Current& current)
+{
+ SUnknownPtr su = SUnknownPtr::dynamicCast(obj);
+ if(current.encoding == Ice::Encoding_1_0)
+ {
+ test(!su);
+ }
+ else
+ {
+ test(su);
+ test(su->su == "SUnknown.su");
+ }
+ cb->ice_response();
+}
+
+void
TestI::oneElementCycle_async(const AMD_TestIntf_oneElementCyclePtr& cb, const ::Ice::Current&)
{
BPtr b = new B;
diff --git a/cpp/test/Ice/slicing/objects/TestAMDI.h b/cpp/test/Ice/slicing/objects/TestAMDI.h
index 3879695d08a..5539e56fb1f 100644
--- a/cpp/test/Ice/slicing/objects/TestAMDI.h
+++ b/cpp/test/Ice/slicing/objects/TestAMDI.h
@@ -33,6 +33,8 @@ public:
const ::Ice::Current&);
virtual void SUnknownAsObject_async(const ::Test::AMD_TestIntf_SUnknownAsObjectPtr&, const ::Ice::Current&);
+ virtual void checkSUnknown_async(const ::Test::AMD_TestIntf_checkSUnknownPtr&, const Ice::ObjectPtr&,
+ const ::Ice::Current&);
virtual void oneElementCycle_async(const ::Test::AMD_TestIntf_oneElementCyclePtr&, const ::Ice::Current&);
virtual void twoElementCycle_async(const ::Test::AMD_TestIntf_twoElementCyclePtr&, const ::Ice::Current&);
diff --git a/cpp/test/Ice/slicing/objects/TestI.cpp b/cpp/test/Ice/slicing/objects/TestI.cpp
index 86396340843..dc2e807eb41 100644
--- a/cpp/test/Ice/slicing/objects/TestI.cpp
+++ b/cpp/test/Ice/slicing/objects/TestI.cpp
@@ -77,6 +77,21 @@ TestI::SUnknownAsObject(const ::Ice::Current&)
return su;
}
+void
+TestI::checkSUnknown(const Ice::ObjectPtr& obj, const ::Ice::Current& current)
+{
+ SUnknownPtr su = SUnknownPtr::dynamicCast(obj);
+ if(current.encoding == Ice::Encoding_1_0)
+ {
+ test(!su);
+ }
+ else
+ {
+ test(su);
+ test(su->su == "SUnknown.su");
+ }
+}
+
BPtr
TestI::oneElementCycle(const ::Ice::Current&)
{
diff --git a/cpp/test/Ice/slicing/objects/TestI.h b/cpp/test/Ice/slicing/objects/TestI.h
index 55dd4bab1ec..5c111ab44d4 100644
--- a/cpp/test/Ice/slicing/objects/TestI.h
+++ b/cpp/test/Ice/slicing/objects/TestI.h
@@ -29,6 +29,7 @@ public:
virtual ::Test::SBasePtr SBSUnknownDerivedAsSBaseCompact(const ::Ice::Current&);
virtual ::Ice::ObjectPtr SUnknownAsObject(const ::Ice::Current&);
+ virtual void checkSUnknown(const Ice::ObjectPtr& object, const ::Ice::Current&);
virtual ::Test::BPtr oneElementCycle(const ::Ice::Current&);
virtual ::Test::BPtr twoElementCycle(const ::Ice::Current&);