diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Ice/BasicStream.h | 33 | ||||
-rw-r--r-- | cpp/include/Ice/Ice.h | 1 | ||||
-rw-r--r-- | cpp/include/Ice/SlicedData.h | 5 | ||||
-rw-r--r-- | cpp/include/Ice/SlicedDataF.h | 4 | ||||
-rwxr-xr-x | cpp/src/Ice/BasicStream.cpp | 33 | ||||
-rw-r--r-- | cpp/src/Ice/Exception.cpp | 11 | ||||
-rw-r--r-- | cpp/src/Ice/SlicedData.cpp | 1 | ||||
-rw-r--r-- | cpp/test/Ice/slicing/objects/AllTests.cpp | 10 | ||||
-rw-r--r-- | cpp/test/Ice/slicing/objects/Test.ice | 1 | ||||
-rw-r--r-- | cpp/test/Ice/slicing/objects/TestAMD.ice | 1 | ||||
-rw-r--r-- | cpp/test/Ice/slicing/objects/TestAMDI.cpp | 18 | ||||
-rw-r--r-- | cpp/test/Ice/slicing/objects/TestAMDI.h | 2 | ||||
-rw-r--r-- | cpp/test/Ice/slicing/objects/TestI.cpp | 15 | ||||
-rw-r--r-- | cpp/test/Ice/slicing/objects/TestI.h | 1 |
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&); |