summaryrefslogtreecommitdiff
path: root/py/modules/IcePy/Operation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'py/modules/IcePy/Operation.cpp')
-rw-r--r--py/modules/IcePy/Operation.cpp122
1 files changed, 77 insertions, 45 deletions
diff --git a/py/modules/IcePy/Operation.cpp b/py/modules/IcePy/Operation.cpp
index 177d3e25557..1808fdc96fa 100644
--- a/py/modules/IcePy/Operation.cpp
+++ b/py/modules/IcePy/Operation.cpp
@@ -38,6 +38,7 @@ public:
virtual void unmarshaled(PyObject*, PyObject*, void*);
+ Ice::StringSeq metaData;
TypeInfoPtr type;
};
typedef IceUtil::Handle<ParamInfo> ParamInfoPtr;
@@ -47,7 +48,7 @@ class OperationI : public Operation
{
public:
- OperationI(const char*, PyObject*, PyObject*, int, PyObject*, PyObject*, PyObject*, PyObject*);
+ OperationI(const char*, PyObject*, PyObject*, int, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*);
virtual PyObject* invoke(const Ice::ObjectPrx&, PyObject*, PyObject*);
virtual PyObject* invokeAsync(const Ice::ObjectPrx&, PyObject*, PyObject*, PyObject*);
@@ -69,6 +70,7 @@ private:
Ice::OperationMode _mode;
Ice::OperationMode _sendMode;
bool _amd;
+ Ice::StringSeq _metaData;
ParamInfoList _inParams;
ParamInfoList _outParams;
ParamInfoPtr _returnType;
@@ -83,6 +85,7 @@ private:
PyObject* unmarshalException(const vector<Ice::Byte>&, const Ice::CommunicatorPtr&);
bool validateException(PyObject*) const;
void checkTwowayOnly(const Ice::ObjectPrx&) const;
+ static void convertParams(PyObject*, ParamInfoList&, bool&);
};
typedef IceUtil::Handle<OperationI> OperationIPtr;
@@ -149,17 +152,19 @@ operationInit(OperationObject* self, PyObject* args, PyObject* /*kwds*/)
PyObject* mode;
PyObject* sendMode;
int amd;
+ PyObject* meta;
PyObject* inParams;
PyObject* outParams;
PyObject* returnType;
PyObject* exceptions;
- if(!PyArg_ParseTuple(args, STRCAST("sO!O!iO!O!OO!"), &name, modeType, &mode, modeType, &sendMode, &amd,
- &PyTuple_Type, &inParams, &PyTuple_Type, &outParams, &returnType, &PyTuple_Type, &exceptions))
+ if(!PyArg_ParseTuple(args, STRCAST("sO!O!iO!O!O!OO!"), &name, modeType, &mode, modeType, &sendMode, &amd,
+ &PyTuple_Type, &meta, &PyTuple_Type, &inParams, &PyTuple_Type, &outParams, &returnType,
+ &PyTuple_Type, &exceptions))
{
return -1;
}
- OperationIPtr op = new OperationI(name, mode, sendMode, amd, inParams, outParams, returnType, exceptions);
+ OperationIPtr op = new OperationI(name, mode, sendMode, amd, meta, inParams, outParams, returnType, exceptions);
self->op = new OperationPtr(op);
return 0;
@@ -394,19 +399,10 @@ IcePy::AMICallback::ice_exception(const Ice::Exception& ex)
//
// OperationI implementation.
//
-IcePy::OperationI::OperationI(const char* name, PyObject* mode, PyObject* sendMode, int amd, PyObject* inParams,
- PyObject* outParams, PyObject* returnType, PyObject* exceptions)
+IcePy::OperationI::OperationI(const char* name, PyObject* mode, PyObject* sendMode, int amd, PyObject* meta,
+ PyObject* inParams, PyObject* outParams, PyObject* returnType, PyObject* exceptions)
{
_name = name;
- _amd = amd ? true : false;
- if(_amd)
- {
- _dispatchName = fixIdent(_name) + "_async";
- }
- else
- {
- _dispatchName = fixIdent(_name);
- }
//
// mode
@@ -422,39 +418,39 @@ IcePy::OperationI::OperationI(const char* name, PyObject* mode, PyObject* sendMo
assert(PyInt_Check(sendModeValue.get()));
_sendMode = (Ice::OperationMode)static_cast<int>(PyInt_AS_LONG(sendModeValue.get()));
+ //
+ // amd
+ //
+ _amd = amd ? true : false;
+ if(_amd)
+ {
+ _dispatchName = fixIdent(_name) + "_async";
+ }
+ else
+ {
+ _dispatchName = fixIdent(_name);
+ }
+
+ //
+ // metaData
+ //
+#ifndef NDEBUG
+ bool b =
+#endif
+ tupleToStringSeq(meta, _metaData);
+ assert(b);
+
int i, sz;
//
// inParams
//
- _sendsClasses = false;
- sz = PyTuple_GET_SIZE(inParams);
- for(i = 0; i < sz; ++i)
- {
- ParamInfoPtr param = new ParamInfo;
- param->type = getType(PyTuple_GET_ITEM(inParams, i));
- _inParams.push_back(param);
- if(!_sendsClasses)
- {
- _sendsClasses = param->type->usesClasses();
- }
- }
+ convertParams(inParams, _inParams, _sendsClasses);
//
// outParams
//
- _returnsClasses = false;
- sz = PyTuple_GET_SIZE(outParams);
- for(i = 0; i < sz; ++i)
- {
- ParamInfoPtr param = new ParamInfo;
- param->type = getType(PyTuple_GET_ITEM(outParams, i));
- _outParams.push_back(param);
- if(!_returnsClasses)
- {
- _returnsClasses = param->type->usesClasses();
- }
- }
+ convertParams(outParams, _outParams, _returnsClasses);
//
// returnType
@@ -708,7 +704,7 @@ IcePy::OperationI::dispatch(PyObject* servant, const Ice::AMD_Object_ice_invokeP
for(ParamInfoList::iterator p = _inParams.begin(); p != _inParams.end(); ++p, ++i)
{
void* closure = reinterpret_cast<void*>(i);
- (*p)->type->unmarshal(is, *p, args.get(), closure);
+ (*p)->type->unmarshal(is, *p, args.get(), closure, &(*p)->metaData);
}
if(_sendsClasses)
{
@@ -923,7 +919,7 @@ IcePy::OperationI::sendResponse(const Ice::AMD_Object_ice_invokePtr& cb, PyObjec
PyErr_Warn(PyExc_RuntimeWarning, const_cast<char*>(str.c_str()));
throw Ice::MarshalException(__FILE__, __LINE__);
}
- (*p)->type->marshal(arg, os, &objectMap);
+ (*p)->type->marshal(arg, os, &objectMap, &(*p)->metaData);
}
if(_returnType)
@@ -946,7 +942,7 @@ IcePy::OperationI::sendResponse(const Ice::AMD_Object_ice_invokePtr& cb, PyObjec
PyErr_Warn(PyExc_RuntimeWarning, const_cast<char*>(str.c_str()));
throw Ice::MarshalException(__FILE__, __LINE__);
}
- _returnType->type->marshal(res, os, &objectMap);
+ _returnType->type->marshal(res, os, &objectMap, &_metaData);
}
if(_returnsClasses)
@@ -1072,7 +1068,7 @@ IcePy::OperationI::prepareRequest(const Ice::CommunicatorPtr& communicator, PyOb
async ? i + 2 : i + 1, const_cast<char*>(opName.c_str()));
return false;
}
- (*p)->type->marshal(arg, os, &objectMap);
+ (*p)->type->marshal(arg, os, &objectMap, &(*p)->metaData);
}
if(_sendsClasses)
@@ -1113,12 +1109,12 @@ IcePy::OperationI::unmarshalResults(const vector<Ice::Byte>& bytes, const Ice::C
for(ParamInfoList::iterator p = _outParams.begin(); p != _outParams.end(); ++p, ++i)
{
void* closure = reinterpret_cast<void*>(i);
- (*p)->type->unmarshal(is, *p, results.get(), closure);
+ (*p)->type->unmarshal(is, *p, results.get(), closure, &(*p)->metaData);
}
if(_returnType)
{
- _returnType->type->unmarshal(is, _returnType, results.get(), 0);
+ _returnType->type->unmarshal(is, _returnType, results.get(), 0, &_metaData);
}
if(_returnsClasses)
@@ -1200,6 +1196,42 @@ IcePy::OperationI::checkTwowayOnly(const Ice::ObjectPrx& proxy) const
}
}
+void
+IcePy::OperationI::convertParams(PyObject* p, ParamInfoList& params, bool& usesClasses)
+{
+ usesClasses = false;
+ int sz = PyTuple_GET_SIZE(p);
+ for(int i = 0; i < sz; ++i)
+ {
+ PyObject* item = PyTuple_GET_ITEM(p, i);
+ assert(PyTuple_Check(item));
+ assert(PyTuple_GET_SIZE(item) == 2);
+
+ ParamInfoPtr param = new ParamInfo;
+
+ //
+ // metaData
+ //
+ PyObject* meta = PyTuple_GET_ITEM(item, 0);
+ assert(PyTuple_Check(meta));
+#ifndef NDEBUG
+ bool b =
+#endif
+ tupleToStringSeq(meta, param->metaData);
+ assert(b);
+
+ //
+ // type
+ //
+ param->type = getType(PyTuple_GET_ITEM(item, 1));
+ params.push_back(param);
+ if(!usesClasses)
+ {
+ usesClasses = param->type->usesClasses();
+ }
+ }
+}
+
static PyMethodDef OperationMethods[] =
{
{ STRCAST("invoke"), (PyCFunction)operationInvoke, METH_VARARGS,