summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2001-11-25 15:34:03 +0000
committerMarc Laukien <marc@zeroc.com>2001-11-25 15:34:03 +0000
commit93944cf8efcde3080f79088c78d97ff9ea3e6f15 (patch)
treeed06cf02478b01816796ba27ee216f5b56f81470 /cpp
parentfix (diff)
downloadice-93944cf8efcde3080f79088c78d97ff9ea3e6f15.tar.bz2
ice-93944cf8efcde3080f79088c78d97ff9ea3e6f15.tar.xz
ice-93944cf8efcde3080f79088c78d97ff9ea3e6f15.zip
Blobject
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Ice/Object.h22
-rw-r--r--cpp/include/Ice/Proxy.h4
-rw-r--r--cpp/src/Ice/Incoming.cpp4
-rw-r--r--cpp/src/Ice/Object.cpp22
-rw-r--r--cpp/src/Ice/Proxy.cpp73
-rw-r--r--cpp/src/slice2cpp/Gen.cpp8
6 files changed, 122 insertions, 11 deletions
diff --git a/cpp/include/Ice/Object.h b/cpp/include/Ice/Object.h
index 3d3a5caa545..d5fc29a326a 100644
--- a/cpp/include/Ice/Object.h
+++ b/cpp/include/Ice/Object.h
@@ -63,14 +63,18 @@ public:
bool operator<(const Object&) const;
::Ice::Int ice_hash() const;
- virtual bool ice_isA(const std::string&);
- virtual void ice_ping();
+ static const char* __classIds[];
+ virtual const char** __getClassIds();
+
+ virtual bool ice_isA(const ::std::string&);
::IceInternal::DispatchStatus ___ice_isA(::IceInternal::Incoming&);
+
+ virtual void ice_ping();
::IceInternal::DispatchStatus ___ice_ping(::IceInternal::Incoming&);
- virtual const char** __getClassIds() = 0;
static const char* __all[];
- virtual ::IceInternal::DispatchStatus __dispatch(::IceInternal::Incoming&, const std::string&);
+ virtual ::IceInternal::DispatchStatus __dispatch(::IceInternal::Incoming&, const std::string&, const std::string&,
+ const std::string&);
virtual bool __isMutating(const std::string&);
virtual void __write(::IceInternal::BasicStream*) const;
@@ -88,6 +92,16 @@ private:
JTCMutex _activeFacetMapMutex;
};
+class ICE_API Blobject : virtual public Object
+{
+public:
+
+ virtual void ice_invokeIn(const std::string&, const std::string&, const std::string&,
+ const std::vector< ::Ice::Byte>&) = 0;
+ virtual ::IceInternal::DispatchStatus __dispatch(::IceInternal::Incoming&, const std::string&, const std::string&,
+ const std::string&);
+};
+
}
#endif
diff --git a/cpp/include/Ice/Proxy.h b/cpp/include/Ice/Proxy.h
index e5d3427c821..b535b5a7e00 100644
--- a/cpp/include/Ice/Proxy.h
+++ b/cpp/include/Ice/Proxy.h
@@ -40,6 +40,7 @@ public:
bool ice_isA(const std::string&);
void ice_ping();
+ void ice_invokeIn(const std::string&, bool, const std::vector< ::Ice::Byte>&);
std::string ice_getIdentity() const;
::Ice::ObjectPrx ice_newIdentity(const std::string&) const;
@@ -89,6 +90,7 @@ public:
virtual bool ice_isA(const std::string&) = 0;
virtual void ice_ping() = 0;
+ virtual void ice_invokeIn(const std::string&, const std::vector< ::Ice::Byte>&) = 0;
virtual void ice_flush() = 0;
};
@@ -103,6 +105,7 @@ public:
virtual bool ice_isA(const std::string&);
virtual void ice_ping();
+ virtual void ice_invokeIn(const std::string&, const std::vector< ::Ice::Byte>&);
virtual void ice_flush();
protected:
@@ -127,6 +130,7 @@ public:
virtual bool ice_isA(const std::string&);
virtual void ice_ping();
+ virtual void ice_invokeIn(const std::string&, const std::vector< ::Ice::Byte>&);
virtual void ice_flush();
protected:
diff --git a/cpp/src/Ice/Incoming.cpp b/cpp/src/Ice/Incoming.cpp
index e02c7da9be4..276c93ad5ba 100644
--- a/cpp/src/Ice/Incoming.cpp
+++ b/cpp/src/Ice/Incoming.cpp
@@ -89,7 +89,7 @@ IceInternal::Incoming::invoke()
else
{
_os.write(static_cast<Byte>(DispatchOK));
- DispatchStatus status = facetServant->__dispatch(*this, operation);
+ DispatchStatus status = facetServant->__dispatch(*this, identity, facet, operation);
_is.checkReadEncaps();
*(_os.b.begin() + statusPos) = static_cast<Byte>(status);
}
@@ -97,7 +97,7 @@ IceInternal::Incoming::invoke()
else
{
_os.write(static_cast<Byte>(DispatchOK));
- DispatchStatus status = servant->__dispatch(*this, operation);
+ DispatchStatus status = servant->__dispatch(*this, identity, facet, operation);
_is.checkReadEncaps();
*(_os.b.begin() + statusPos) = static_cast<Byte>(status);
}
diff --git a/cpp/src/Ice/Object.cpp b/cpp/src/Ice/Object.cpp
index 9c8d3e3ebf7..2179b78bb8a 100644
--- a/cpp/src/Ice/Object.cpp
+++ b/cpp/src/Ice/Object.cpp
@@ -51,6 +51,17 @@ Ice::Object::ice_hash() const
return reinterpret_cast<Int>(this);
}
+const char* Ice::Object::__classIds[] =
+{
+ "::Ice::Object"
+};
+
+const char**
+Ice::Object::__getClassIds()
+{
+ return __classIds;
+}
+
bool
Ice::Object::ice_isA(const string& s)
{
@@ -89,7 +100,7 @@ const char* Ice::Object::__all[] =
};
DispatchStatus
-Ice::Object::__dispatch(Incoming& in, const string& s)
+Ice::Object::__dispatch(Incoming& in, const string&, const string&, const string& s)
{
const char** b = __all;
const char** e = __all + sizeof(__all) / sizeof(const char*);
@@ -232,3 +243,12 @@ Ice::Object::ice_findFacet(const string& name)
return 0;
}
}
+
+DispatchStatus
+Ice::Blobject::__dispatch(Incoming& in, const string& identity, const string& facet, const string& operation)
+{
+ vector<Byte> blob;
+ in.is()->read(blob);
+ ice_invokeIn(identity, facet, operation, blob);
+ return ::IceInternal::DispatchOK;
+}
diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp
index b66ebf512b5..82a47527713 100644
--- a/cpp/src/Ice/Proxy.cpp
+++ b/cpp/src/Ice/Proxy.cpp
@@ -150,6 +150,40 @@ IceProxy::Ice::Object::ice_ping()
}
}
+void
+IceProxy::Ice::Object::ice_invokeIn(const string& operation, bool nonmutating, const vector<Byte>& inParams)
+{
+ int __cnt = 0;
+ while (true)
+ {
+ try
+ {
+ Handle< ::IceDelegate::Ice::Object> __del = __getDelegate();
+ __del->ice_invokeIn(operation, inParams);
+ return;
+ }
+ catch (const LocationForward& __ex)
+ {
+ __locationForward(__ex);
+ }
+ catch (const NonRepeatable& __ex)
+ {
+ if (nonmutating)
+ {
+ __handleException(*__ex.get(), __cnt);
+ }
+ else
+ {
+ __rethrowException(*__ex.get());
+ }
+ }
+ catch (const LocalException& __ex)
+ {
+ __handleException(__ex, __cnt);
+ }
+ }
+}
+
std::string
IceProxy::Ice::Object::ice_getIdentity() const
{
@@ -498,6 +532,18 @@ IceDelegateM::Ice::Object::ice_ping()
}
void
+IceDelegateM::Ice::Object::ice_invokeIn(const string& operation, const vector<Byte>& inParams)
+{
+ Outgoing __out(__emitter, __reference, operation.c_str());
+ BasicStream* __os = __out.os();
+ __os->write(inParams);
+ if (!__out.invoke())
+ {
+ throw ::Ice::UnknownUserException(__FILE__, __LINE__);
+ }
+}
+
+void
IceDelegateM::Ice::Object::ice_flush()
{
__emitter->flushBatchRequest();
@@ -571,6 +617,33 @@ IceDelegateD::Ice::Object::ice_ping()
}
void
+IceDelegateD::Ice::Object::ice_invokeIn(const string& operation, const vector<Byte>& inParams)
+{
+ ::IceInternal::Direct __direct(__adapter, __reference, operation.c_str());
+ ::Ice::Blobject* __servant = dynamic_cast< ::Ice::Blobject*>(__direct.facetServant().get());
+ if (!__servant)
+ {
+ throw ::Ice::OperationNotExistException(__FILE__, __LINE__);
+ }
+ try
+ {
+ __servant->ice_invokeIn(__reference->identity, __reference->facet, operation, inParams);
+ }
+ catch (const ::Ice::LocalException&)
+ {
+ throw ::Ice::UnknownLocalException(__FILE__, __LINE__);
+ }
+ catch (const ::Ice::UserException&)
+ {
+ throw ::Ice::UnknownUserException(__FILE__, __LINE__);
+ }
+ catch (...)
+ {
+ throw ::Ice::UnknownException(__FILE__, __LINE__);
+ }
+}
+
+void
IceDelegateD::Ice::Object::ice_flush()
{
// Nothing to do for direct delegates
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index bc17c40d3bd..e73f836d3a6 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -1635,8 +1635,8 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p)
{
H << nl << exp2 << "static const char* __mutating[" << allMutatingOpNames.size() << "];";
}
- H << nl << exp2 << "virtual ::IceInternal::DispatchStatus "
- << "__dispatch(::IceInternal::Incoming&, const ::std::string&);";
+ H << nl << exp2 << "virtual ::IceInternal::DispatchStatus __dispatch(::IceInternal::Incoming&, "
+ << "const ::std::string&, const ::std::string&, const ::std::string&);";
H << nl << exp2 << "virtual bool __isMutating(const ::std::string&);";
C << sp;
C << nl << "const char* " << scoped.substr(2) << "::__all[] =";
@@ -1668,8 +1668,8 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p)
C << eb << ';';
}
C << sp;
- C << nl << "::IceInternal::DispatchStatus" << nl << scoped.substr(2)
- << "::__dispatch(::IceInternal::Incoming& in, const ::std::string& s)";
+ C << nl << "::IceInternal::DispatchStatus" << nl << scoped.substr(2) << "::__dispatch("
+ << "::IceInternal::Incoming& in, const ::std::string&, const ::std::string&, const ::std::string& s)";
C << sb;
C << nl << "const char** b = __all;";
C << nl << "const char** e = __all + " << allOpNames.size() << ';';