diff options
Diffstat (limited to 'rb/src/IceRuby/Operation.cpp')
-rw-r--r-- | rb/src/IceRuby/Operation.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/rb/src/IceRuby/Operation.cpp b/rb/src/IceRuby/Operation.cpp index 6cebeea2f55..f4e16f7c683 100644 --- a/rb/src/IceRuby/Operation.cpp +++ b/rb/src/IceRuby/Operation.cpp @@ -65,9 +65,11 @@ private: ParamInfoPtr _returnType; ExceptionInfoList _exceptions; string _dispatchName; + bool _sendsClasses; + bool _returnsClasses; string _deprecateMessage; - void convertParams(VALUE, ParamInfoList&, int); + void convertParams(VALUE, ParamInfoList&, int, bool&); ParamInfoPtr convertParam(VALUE, int); void prepareRequest(const Ice::ObjectPrx&, VALUE, vector<Ice::Byte>&); VALUE unmarshalResults(const vector<Ice::Byte>&, const Ice::CommunicatorPtr&); @@ -220,20 +222,26 @@ IceRuby::OperationI::OperationI(VALUE name, VALUE mode, VALUE sendMode, VALUE am // // returnType // + _returnsClasses = false; if(!NIL_P(returnType)) { _returnType = convertParam(returnType, 0); + if(!_returnType->optional) + { + _returnsClasses = _returnType->type->usesClasses(); + } } // // inParams // - convertParams(inParams, _inParams, 0); + _sendsClasses = false; + convertParams(inParams, _inParams, 0, _sendsClasses); // // outParams // - convertParams(outParams, _outParams, NIL_P(returnType) ? 0 : 1); + convertParams(outParams, _outParams, NIL_P(returnType) ? 0 : 1, _returnsClasses); class SortFn { @@ -368,7 +376,7 @@ IceRuby::OperationI::deprecate(const string& msg) } void -IceRuby::OperationI::convertParams(VALUE v, ParamInfoList& params, int posOffset) +IceRuby::OperationI::convertParams(VALUE v, ParamInfoList& params, int posOffset, bool& usesClasses) { assert(TYPE(v) == T_ARRAY); @@ -376,6 +384,10 @@ IceRuby::OperationI::convertParams(VALUE v, ParamInfoList& params, int posOffset { ParamInfoPtr param = convertParam(RARRAY_PTR(v)[i], i + posOffset); params.push_back(param); + if(!param->optional && !usesClasses) + { + usesClasses = param->type->usesClasses(); + } } } @@ -457,6 +469,11 @@ IceRuby::OperationI::prepareRequest(const Ice::ObjectPrx& proxy, VALUE args, vec } } + if(_sendsClasses) + { + os->writePendingObjects(); + } + os->endEncapsulation(); os->finished(bytes); } @@ -532,6 +549,11 @@ IceRuby::OperationI::unmarshalResults(const vector<Ice::Byte>& bytes, const Ice: } } + if(_returnsClasses) + { + is->readPendingObjects(); + } + is->endEncapsulation(); util.update(); |