diff options
Diffstat (limited to 'cpp/include/Ice/BasicStream.h')
-rw-r--r-- | cpp/include/Ice/BasicStream.h | 33 |
1 files changed, 22 insertions, 11 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; + } } } |