summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Glacier2/Blobject.cpp14
-rw-r--r--cpp/src/Glacier2/Blobject.h2
-rw-r--r--cpp/src/Glacier2/ClientBlobject.cpp2
-rw-r--r--cpp/src/Glacier2/ClientBlobject.h2
-rw-r--r--cpp/src/Glacier2/RequestQueue.cpp51
-rw-r--r--cpp/src/Glacier2/RequestQueue.h10
-rw-r--r--cpp/src/Glacier2/ServerBlobject.cpp2
-rw-r--r--cpp/src/Glacier2/ServerBlobject.h2
-rw-r--r--cpp/src/Ice/IncomingAsync.cpp41
-rw-r--r--cpp/src/Ice/Object.cpp2
-rw-r--r--cpp/src/Ice/OutgoingAsync.cpp43
-rw-r--r--cpp/src/Ice/Proxy.cpp16
-rw-r--r--cpp/src/Slice/CPlusPlusUtil.cpp41
-rw-r--r--cpp/src/slice2cpp/Gen.cpp27
14 files changed, 192 insertions, 63 deletions
diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp
index 044ab52f9d5..3e7fa8ba5f1 100644
--- a/cpp/src/Glacier2/Blobject.cpp
+++ b/cpp/src/Glacier2/Blobject.cpp
@@ -101,7 +101,7 @@ Glacier2::Blobject::destroy()
}
void
-Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amdCB,
+Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePtr& amdCB,
const std::pair<const Ice::Byte*, const Ice::Byte*>& inParams, const Current& current)
{
//
@@ -300,7 +300,17 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amd
ok = proxy->ice_invoke(current.operation, current.mode, inParams, outParams);
}
- amdCB->ice_response(ok, outParams);
+ pair<const Byte*, const Byte*> outPair;
+ if(outParams.size() == 0)
+ {
+ outPair.first = outPair.second = 0;
+ }
+ else
+ {
+ outPair.first = &outParams[0];
+ outPair.second = outPair.first + outParams.size();
+ }
+ amdCB->ice_response(ok, outPair);
}
catch(const LocalException& ex)
{
diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h
index adf9cd086da..6031fc940f1 100644
--- a/cpp/src/Glacier2/Blobject.h
+++ b/cpp/src/Glacier2/Blobject.h
@@ -27,7 +27,7 @@ public:
protected:
- void invoke(Ice::ObjectPrx&, const Ice::AMD_Object_ice_invokePtr&,
+ void invoke(Ice::ObjectPrx&, const Ice::AMD_Array_Object_ice_invokePtr&,
const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&);
const Ice::CommunicatorPtr _communicator;
diff --git a/cpp/src/Glacier2/ClientBlobject.cpp b/cpp/src/Glacier2/ClientBlobject.cpp
index d02864882ac..62d0ad63b26 100644
--- a/cpp/src/Glacier2/ClientBlobject.cpp
+++ b/cpp/src/Glacier2/ClientBlobject.cpp
@@ -38,7 +38,7 @@ Glacier2::ClientBlobject::destroy()
}
void
-Glacier2::ClientBlobject::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& amdCB,
+Glacier2::ClientBlobject::ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr& amdCB,
const std::pair<const Byte*, const Byte*>& inParams,
const Current& current)
{
diff --git a/cpp/src/Glacier2/ClientBlobject.h b/cpp/src/Glacier2/ClientBlobject.h
index d4afcdc5f71..4d5ca99b69e 100644
--- a/cpp/src/Glacier2/ClientBlobject.h
+++ b/cpp/src/Glacier2/ClientBlobject.h
@@ -28,7 +28,7 @@ public:
virtual void destroy();
- virtual void ice_invoke_async(const Ice::AMD_Object_ice_invokePtr&,
+ virtual void ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr&,
const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&);
private:
diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp
index 96ee3c3ac32..1b2cc9c005b 100644
--- a/cpp/src/Glacier2/RequestQueue.cpp
+++ b/cpp/src/Glacier2/RequestQueue.cpp
@@ -25,11 +25,11 @@ namespace Glacier2
// responsible for sending back the response. It's necessary because
// sending back the response might block.
//
-class AMI_Object_ice_invokeI : public AMI_Object_ice_invoke
+class AMI_Array_Object_ice_invokeI : public AMI_Array_Object_ice_invoke
{
public:
- AMI_Object_ice_invokeI(const RequestQueuePtr& requestQueue, const AMD_Object_ice_invokePtr& amdCB) :
+ AMI_Array_Object_ice_invokeI(const RequestQueuePtr& requestQueue, const AMD_Array_Object_ice_invokePtr& amdCB) :
_requestQueue(requestQueue),
_amdCB(amdCB)
{
@@ -37,7 +37,7 @@ public:
}
virtual void
- ice_response(bool ok, const std::vector<Byte>& outParams)
+ ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
{
_requestQueue->addResponse(new Response(_amdCB, ok, outParams));
}
@@ -51,13 +51,13 @@ public:
private:
const RequestQueuePtr _requestQueue;
- const AMD_Object_ice_invokePtr _amdCB;
+ const AMD_Array_Object_ice_invokePtr _amdCB;
};
}
Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, const Byte*>& inParams,
- const Current& current, bool forwardContext, const AMD_Object_ice_invokePtr& amdCB) :
+ const Current& current, bool forwardContext, const AMD_Array_Object_ice_invokePtr& amdCB) :
_proxy(proxy),
_inParams(inParams.first, inParams.second),
_current(current),
@@ -71,7 +71,7 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*,
if(!_proxy->ice_isTwoway())
{
bool ok = true;
- ByteSeq outParams;
+ pair<const Byte*, const Byte*> outParams(0, 0);
_amdCB->ice_response(ok, outParams);
}
@@ -86,16 +86,26 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*,
bool
Glacier2::Request::invoke(const RequestQueuePtr& requestQueue)
{
+ pair<const Byte*, const Byte*> inPair;
+ if(_inParams.size() == 0)
+ {
+ inPair.first = inPair.second = 0;
+ }
+ else
+ {
+ inPair.first = &_inParams[0];
+ inPair.second = inPair.first + _inParams.size();
+ }
if(_proxy->ice_isTwoway())
{
- AMI_Object_ice_invokePtr cb = new AMI_Object_ice_invokeI(requestQueue, _amdCB);
+ AMI_Array_Object_ice_invokePtr cb = new AMI_Array_Object_ice_invokeI(requestQueue, _amdCB);
if(_forwardContext)
{
- _proxy->ice_invoke_async(cb, _current.operation, _current.mode, _inParams, _current.ctx);
+ _proxy->ice_invoke_async(cb, _current.operation, _current.mode, inPair, _current.ctx);
}
else
{
- _proxy->ice_invoke_async(cb, _current.operation, _current.mode, _inParams);
+ _proxy->ice_invoke_async(cb, _current.operation, _current.mode, inPair);
}
return true; // A twoway method is being dispatched.
}
@@ -106,11 +116,11 @@ Glacier2::Request::invoke(const RequestQueuePtr& requestQueue)
ByteSeq outParams;
if(_forwardContext)
{
- _proxy->ice_invoke(_current.operation, _current.mode, _inParams, outParams, _current.ctx);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, _current.ctx);
}
else
{
- _proxy->ice_invoke(_current.operation, _current.mode, _inParams, outParams);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams);
}
}
catch(const LocalException&)
@@ -163,14 +173,15 @@ Glacier2::Request::getConnection() const
return _proxy->ice_connection();
}
-Glacier2::Response::Response(const AMD_Object_ice_invokePtr& amdCB, bool ok, const ByteSeq& outParams) :
+Glacier2::Response::Response(const AMD_Array_Object_ice_invokePtr& amdCB, bool ok,
+ const pair<const Byte*, const Byte*>& outParams) :
_amdCB(amdCB),
_ok(ok),
- _outParams(outParams)
+ _outParams(outParams.first, outParams.second)
{
}
-Glacier2::Response::Response(const AMD_Object_ice_invokePtr& amdCB, const Exception& ex) :
+Glacier2::Response::Response(const AMD_Array_Object_ice_invokePtr& amdCB, const Exception& ex) :
_amdCB(amdCB),
_ok(false),
_exception(ex.ice_clone())
@@ -186,7 +197,17 @@ Glacier2::Response::invoke()
}
else
{
- _amdCB->ice_response(_ok, _outParams);
+ pair<const Byte*, const Byte*> outPair;
+ if(_outParams.size() == 0)
+ {
+ outPair.first = outPair.second = 0;
+ }
+ else
+ {
+ outPair.first = &_outParams[0];
+ outPair.second = outPair.first + _outParams.size();
+ }
+ _amdCB->ice_response(_ok, outPair);
}
}
diff --git a/cpp/src/Glacier2/RequestQueue.h b/cpp/src/Glacier2/RequestQueue.h
index 68e32ae95ec..2404ef61689 100644
--- a/cpp/src/Glacier2/RequestQueue.h
+++ b/cpp/src/Glacier2/RequestQueue.h
@@ -28,7 +28,7 @@ class Request : public IceUtil::Shared
public:
Request(const Ice::ObjectPrx&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&, bool,
- const Ice::AMD_Object_ice_invokePtr&);
+ const Ice::AMD_Array_Object_ice_invokePtr&);
bool invoke(const RequestQueuePtr&);
bool override(const RequestPtr&) const;
@@ -42,21 +42,21 @@ private:
const Ice::Current _current;
const bool _forwardContext;
const std::string _override;
- const Ice::AMD_Object_ice_invokePtr _amdCB;
+ const Ice::AMD_Array_Object_ice_invokePtr _amdCB;
};
class Response : public IceUtil::Shared
{
public:
- Response(const Ice::AMD_Object_ice_invokePtr&, bool, const Ice::ByteSeq&);
- Response(const Ice::AMD_Object_ice_invokePtr&, const Ice::Exception&);
+ Response(const Ice::AMD_Array_Object_ice_invokePtr&, bool, const std::pair<const Ice::Byte*, const Ice::Byte*>&);
+ Response(const Ice::AMD_Array_Object_ice_invokePtr&, const Ice::Exception&);
void invoke();
private:
- const Ice::AMD_Object_ice_invokePtr _amdCB;
+ const Ice::AMD_Array_Object_ice_invokePtr _amdCB;
const bool _ok;
const Ice::ByteSeq _outParams;
const std::auto_ptr<Ice::Exception> _exception;
diff --git a/cpp/src/Glacier2/ServerBlobject.cpp b/cpp/src/Glacier2/ServerBlobject.cpp
index 9a90f6822f5..9ab9dd0e61a 100644
--- a/cpp/src/Glacier2/ServerBlobject.cpp
+++ b/cpp/src/Glacier2/ServerBlobject.cpp
@@ -33,7 +33,7 @@ Glacier2::ServerBlobject::destroy()
}
void
-Glacier2::ServerBlobject::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& amdCB,
+Glacier2::ServerBlobject::ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr& amdCB,
const std::pair<const Byte*, const Byte*>& inParams,
const Current& current)
{
diff --git a/cpp/src/Glacier2/ServerBlobject.h b/cpp/src/Glacier2/ServerBlobject.h
index 3f8e175a4af..9f6fe6b656a 100644
--- a/cpp/src/Glacier2/ServerBlobject.h
+++ b/cpp/src/Glacier2/ServerBlobject.h
@@ -27,7 +27,7 @@ public:
virtual void destroy();
- virtual void ice_invoke_async(const Ice::AMD_Object_ice_invokePtr&,
+ virtual void ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr&,
const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&);
private:
diff --git a/cpp/src/Ice/IncomingAsync.cpp b/cpp/src/Ice/IncomingAsync.cpp
index 42d8cb9cf54..1874e71bd57 100644
--- a/cpp/src/Ice/IncomingAsync.cpp
+++ b/cpp/src/Ice/IncomingAsync.cpp
@@ -26,6 +26,9 @@ void IceInternal::decRef(IncomingAsync* p) { p->__decRef(); }
void IceInternal::incRef(AMD_Object_ice_invoke* p) { p->__incRef(); }
void IceInternal::decRef(AMD_Object_ice_invoke* p) { p->__decRef(); }
+void IceInternal::incRef(AMD_Array_Object_ice_invoke* p) { p->__incRef(); }
+void IceInternal::decRef(AMD_Array_Object_ice_invoke* p) { p->__decRef(); }
+
IceInternal::IncomingAsync::IncomingAsync(Incoming& in) :
IncomingBase(in),
_instanceCopy(_os.instance()),
@@ -428,3 +431,41 @@ IceAsync::Ice::AMD_Object_ice_invoke::ice_exception()
{
__exception();
}
+
+IceAsync::Ice::AMD_Array_Object_ice_invoke::AMD_Array_Object_ice_invoke(Incoming& in) :
+ IncomingAsync(in)
+{
+}
+
+void
+IceAsync::Ice::AMD_Array_Object_ice_invoke::ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
+{
+ try
+ {
+ __os()->writeBlob(outParams.first, static_cast<Int>(outParams.second - outParams.first));
+ }
+ catch(const LocalException& ex)
+ {
+ __exception(ex);
+ return;
+ }
+ __response(ok);
+}
+
+void
+IceAsync::Ice::AMD_Array_Object_ice_invoke::ice_exception(const Exception& ex)
+{
+ __exception(ex);
+}
+
+void
+IceAsync::Ice::AMD_Array_Object_ice_invoke::ice_exception(const std::exception& ex)
+{
+ __exception(ex);
+}
+
+void
+IceAsync::Ice::AMD_Array_Object_ice_invoke::ice_exception()
+{
+ __exception();
+}
diff --git a/cpp/src/Ice/Object.cpp b/cpp/src/Ice/Object.cpp
index 0b5ce8a9ff2..29b178d352d 100644
--- a/cpp/src/Ice/Object.cpp
+++ b/cpp/src/Ice/Object.cpp
@@ -351,7 +351,7 @@ Ice::BlobjectArrayAsync::__dispatch(Incoming& in, const Current& current)
Int sz = in.is()->getReadEncapsSize();
in.is()->readBlob(inParams.first, sz);
inParams.second = inParams.first + sz;
- AMD_Object_ice_invokePtr cb = new ::IceAsync::Ice::AMD_Object_ice_invoke(in);
+ AMD_Array_Object_ice_invokePtr cb = new ::IceAsync::Ice::AMD_Array_Object_ice_invoke(in);
try
{
ice_invoke_async(cb, inParams, current);
diff --git a/cpp/src/Ice/OutgoingAsync.cpp b/cpp/src/Ice/OutgoingAsync.cpp
index 784cc6ca356..024c1f13764 100644
--- a/cpp/src/Ice/OutgoingAsync.cpp
+++ b/cpp/src/Ice/OutgoingAsync.cpp
@@ -31,6 +31,9 @@ void IceInternal::decRef(OutgoingAsync* p) { p->__decRef(); }
void IceInternal::incRef(AMI_Object_ice_invoke* p) { p->__incRef(); }
void IceInternal::decRef(AMI_Object_ice_invoke* p) { p->__decRef(); }
+void IceInternal::incRef(AMI_Array_Object_ice_invoke* p) { p->__incRef(); }
+void IceInternal::decRef(AMI_Array_Object_ice_invoke* p) { p->__decRef(); }
+
IceInternal::OutgoingAsync::OutgoingAsync() :
__is(0),
__os(0)
@@ -417,12 +420,12 @@ IceInternal::OutgoingAsync::cleanup()
void
Ice::AMI_Object_ice_invoke::__invoke(const ObjectPrx& prx, const string& operation, OperationMode mode,
- const pair<const Byte*, const Byte*>& inParams, const Context& context)
+ const vector<Byte>& inParams, const Context& context)
{
try
{
__prepare(prx, operation, mode, context);
- __os->writeBlob(inParams.first, static_cast<Int>(inParams.second - inParams.first));
+ __os->writeBlob(inParams);
__os->endWriteEncaps();
}
catch(const LocalException& ex)
@@ -449,3 +452,39 @@ Ice::AMI_Object_ice_invoke::__response(bool ok) // ok == true means no user exce
}
ice_response(ok, outParams);
}
+
+void
+Ice::AMI_Array_Object_ice_invoke::__invoke(const ObjectPrx& prx, const string& operation, OperationMode mode,
+ const pair<const Byte*, const Byte*>& inParams, const Context& context)
+{
+ try
+ {
+ __prepare(prx, operation, mode, context);
+ __os->writeBlob(inParams.first, static_cast<Int>(inParams.second - inParams.first));
+ __os->endWriteEncaps();
+ }
+ catch(const LocalException& ex)
+ {
+ __finished(ex);
+ return;
+ }
+ __send();
+}
+
+void
+Ice::AMI_Array_Object_ice_invoke::__response(bool ok) // ok == true means no user exception.
+{
+ pair<const Byte*, const Byte*> outParams;
+ try
+ {
+ Int sz = __is->getReadEncapsSize();
+ __is->readBlob(outParams.first, sz);
+ outParams.second = outParams.first + sz;
+ }
+ catch(const LocalException& ex)
+ {
+ __finished(ex);
+ return;
+ }
+ ice_response(ok, outParams);
+}
diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp
index 37951c6a898..571058bc2dc 100644
--- a/cpp/src/Ice/Proxy.cpp
+++ b/cpp/src/Ice/Proxy.cpp
@@ -349,21 +349,11 @@ IceProxy::Ice::Object::ice_invoke_async(const AMI_Object_ice_invokePtr& cb,
const vector<Byte>& inParams,
const Context& context)
{
- pair<const Byte*, const Byte*> inPair;
- if(inParams.size() == 0)
- {
- inPair.first = inPair.second = 0;
- }
- else
- {
- inPair.first = &inParams[0];
- inPair.second = inPair.first + inParams.size();
- }
- ice_invoke_async(cb, operation, mode, inPair, context);
+ cb->__invoke(this, operation, mode, inParams, context);
}
void
-IceProxy::Ice::Object::ice_invoke_async(const AMI_Object_ice_invokePtr& cb,
+IceProxy::Ice::Object::ice_invoke_async(const AMI_Array_Object_ice_invokePtr& cb,
const string& operation,
OperationMode mode,
const pair<const Byte*, const Byte*>& inParams)
@@ -372,7 +362,7 @@ IceProxy::Ice::Object::ice_invoke_async(const AMI_Object_ice_invokePtr& cb,
}
void
-IceProxy::Ice::Object::ice_invoke_async(const AMI_Object_ice_invokePtr& cb,
+IceProxy::Ice::Object::ice_invoke_async(const AMI_Array_Object_ice_invokePtr& cb,
const string& operation,
OperationMode mode,
const pair<const Byte*, const Byte*>& inParams,
diff --git a/cpp/src/Slice/CPlusPlusUtil.cpp b/cpp/src/Slice/CPlusPlusUtil.cpp
index 66cead140c3..d3f368c6817 100644
--- a/cpp/src/Slice/CPlusPlusUtil.cpp
+++ b/cpp/src/Slice/CPlusPlusUtil.cpp
@@ -236,7 +236,7 @@ Slice::returnTypeToString(const TypePtr& type, const StringList& metaData)
}
string
-Slice::inputTypeToString(const TypePtr& type, const StringList& metaData)
+Slice::inputTypeToString(const TypePtr& type, const StringList& metaData, bool allowArray)
{
static const char* inputBuiltinTable[] =
{
@@ -283,28 +283,43 @@ Slice::inputTypeToString(const TypePtr& type, const StringList& metaData)
string seqType = findMetaData(metaData, true);
if(!seqType.empty())
{
+
if(seqType == "array" || seqType == "range:array")
{
- TypePtr elemType = seq->type();
- string s = typeToString(elemType);
- return "const ::std::pair<const " + s + "*, const " + s + "*>&";
+ if(allowArray)
+ {
+ TypePtr elemType = seq->type();
+ string s = typeToString(elemType);
+ return "const ::std::pair<const " + s + "*, const " + s + "*>&";
+ }
+ else
+ {
+ return "const " + fixKwd(seq->scoped()) + "&";
+ }
}
else if(seqType.find("range") == 0)
{
- string s;
- if(seqType.find("range:") == 0)
+ if(allowArray)
{
- s = seqType.substr(strlen("range:"));
+ string s;
+ if(seqType.find("range:") == 0)
+ {
+ s = seqType.substr(strlen("range:"));
+ }
+ else
+ {
+ s = fixKwd(seq->scoped());
+ }
+ if(s[0] == ':')
+ {
+ s = " " + s;
+ }
+ return "const ::std::pair<" + s + "::const_iterator, " + s + "::const_iterator>&";
}
else
{
- s = fixKwd(seq->scoped());
- }
- if(s[0] == ':')
- {
- s = " " + s;
+ return "const " + fixKwd(seq->scoped()) + "&";
}
- return "const ::std::pair<" + s + "::const_iterator, " + s + "::const_iterator>&";
}
else
{
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index d4a7f5394e7..2b7ea158304 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -4327,6 +4327,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
string proxyName = classScope + className + "Prx";
vector<string> params;
+ vector<string> paramsAMD;
vector<string> paramsDecl;
vector<string> args;
@@ -4342,6 +4343,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
if(ret)
{
params.push_back(retS);
+ paramsAMD.push_back(inputTypeToString(ret, p->getMetaData(), false));
paramsDecl.push_back(retS + " __ret");
args.push_back("__ret");
}
@@ -4358,6 +4360,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
if((*q)->isOutParam())
{
params.push_back(typeString);
+ paramsAMD.push_back(inputTypeToString(type, (*q)->getMetaData(), false));
paramsDecl.push_back(typeString + ' ' + paramName);
args.push_back(paramName);
@@ -4425,7 +4428,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
C << sp << nl << "void" << nl << classScopedAMI.substr(2) << '_' << name << "::__response(bool __ok)";
C << sb;
- writeAllocateCode(C, outParams, ret, p->getMetaData());
+ writeAllocateCode(C, outParams, ret, p->getMetaData(), true);
C << nl << "try";
C << sb;
C << nl << "if(!__ok)";
@@ -4461,7 +4464,11 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
C << eb;
C << eb;
- writeUnmarshalCode(C, outParams, ret, p->getMetaData());
+ writeUnmarshalCode(C, outParams, 0, StringList(), true);
+ if(ret)
+ {
+ writeMarshalUnmarshalCode(C, ret, "__ret", false, "", true, p->getMetaData(), true);
+ }
if(p->returnsClasses())
{
C << nl << "__is->readPendingObjects();";
@@ -4485,7 +4492,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
H << nl << "public:";
H.inc();
H << sp;
- H << nl << "virtual void ice_response" << spar << params << epar << " = 0;";
+ H << nl << "virtual void ice_response" << spar << paramsAMD << epar << " = 0;";
H << nl << "virtual void ice_exception(const ::Ice::Exception&) = 0;";
H << nl << "virtual void ice_exception(const ::std::exception&) = 0;";
H << nl << "virtual void ice_exception() = 0;";
@@ -4578,7 +4585,7 @@ Slice::Gen::AsyncImplVisitor::visitOperation(const OperationPtr& p)
#endif
TypePtr ret = p->returnType();
- string retS = inputTypeToString(ret, p->getMetaData());
+ string retS = inputTypeToString(ret, p->getMetaData(), false);
if(ret)
{
@@ -4597,7 +4604,7 @@ Slice::Gen::AsyncImplVisitor::visitOperation(const OperationPtr& p)
{
string paramName = fixKwd((*q)->name());
TypePtr type = (*q)->type();
- string typeString = inputTypeToString(type, (*q)->getMetaData());
+ string typeString = inputTypeToString(type, (*q)->getMetaData(), false);
if(ret || !outParams.empty())
{
@@ -4800,6 +4807,12 @@ Slice::Gen::MetaDataVisitor::visitStructEnd(const StructPtr&)
void
Slice::Gen::MetaDataVisitor::visitOperation(const OperationPtr& p)
{
+ bool ami = false;
+ ClassDefPtr cl = ClassDefPtr::dynamicCast(p->container());
+ if(cl->hasMetaData("ami") || p->hasMetaData("ami"))
+ {
+ ami = true;
+ }
StringList metaData = p->getMetaData();
TypePtr returnType = p->returnType();
if(!metaData.empty())
@@ -4818,7 +4831,7 @@ Slice::Gen::MetaDataVisitor::visitOperation(const OperationPtr& p)
}
else
{
- validate(returnType, metaData, p->definitionContext()->filename(), p->line(), false);
+ validate(returnType, metaData, p->definitionContext()->filename(), p->line(), ami);
}
}
@@ -4826,7 +4839,7 @@ Slice::Gen::MetaDataVisitor::visitOperation(const OperationPtr& p)
for(ParamDeclList::iterator q = params.begin(); q != params.end(); ++q)
{
validate((*q)->type(), (*q)->getMetaData(), p->definitionContext()->filename(), (*q)->line(),
- !(*q)->isOutParam());
+ ami || !(*q)->isOutParam());
}
}