summaryrefslogtreecommitdiff
path: root/TAO/tao/ClientRequestInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/ClientRequestInfo.cpp')
-rw-r--r--TAO/tao/ClientRequestInfo.cpp302
1 files changed, 236 insertions, 66 deletions
diff --git a/TAO/tao/ClientRequestInfo.cpp b/TAO/tao/ClientRequestInfo.cpp
index 8913835bbe5..f6ef408dafb 100644
--- a/TAO/tao/ClientRequestInfo.cpp
+++ b/TAO/tao/ClientRequestInfo.cpp
@@ -3,18 +3,28 @@
// $Id$
#include "ClientRequestInfo.h"
+#include "Stub.h"
+#include "Tagged_Components.h"
-ACE_RCSID(tao, ClientRequestInfo, "$Id$")
+ACE_RCSID (tao, ClientRequestInfo, "$Id$")
+
+#if TAO_HAS_INTERCEPTORS == 1
+
+# if !defined (__ACE_INLINE__)
+# include "ClientRequestInfo.inl"
+# endif /* !__ACE_INLINE__ */
-#if (TAO_HAS_INTERCEPTORS == 1)
TAO_ClientRequestInfo::TAO_ClientRequestInfo (const char * operation,
IOP::ServiceContextList
- &service_context_list,
+ &service_context_list,
CORBA::Object_ptr target)
: operation_ (operation),
service_context_list_ (service_context_list),
- target_ (CORBA_Object::_duplicate (target))
+ target_ (CORBA::Object::_duplicate (target)),
+ caught_exception_ (0),
+ response_expected_ (1),
+ reply_status_ (-1)
{
}
@@ -22,6 +32,15 @@ CORBA::Object_ptr
TAO_ClientRequestInfo::target (CORBA::Environment &)
ACE_THROW_SPEC ((CORBA::SystemException))
{
+// if (this->reply_status_ ==
+// PortableInterceptor::LOCATION_FORWARD_PERMANENT)
+// {
+// // TAO_GIOP_Invocation::forward_reference() already duplicates
+// // the reference before returning it so there is no need to
+// // duplicate it here.
+// return this->invocation_->forward_reference ();
+// }
+
return CORBA::Object::_duplicate (this->target_.in ());
}
@@ -29,27 +48,72 @@ CORBA::Object_ptr
TAO_ClientRequestInfo::effective_target (CORBA::Environment &)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return CORBA::Object::_nil ();
+// if (this->reply_status_ == PortableInterceptor::LOCATION_FORWARD
+// || this->reply_status_ ==
+// PortableInterceptor::LOCATION_FORWARD_PERMANENT)
+// {
+// // TAO_GIOP_Invocation::forward_reference() already duplicates
+// // the reference before returning it so there is no need to
+// // duplicate it here.
+// return this->invocation_->forward_reference ();
+// }
+
+ return CORBA::Object::_duplicate (this->target_.in ());
}
IOP::TaggedProfile *
-TAO_ClientRequestInfo::effective_profile (CORBA::Environment &)
+TAO_ClientRequestInfo::effective_profile (CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return 0;
+ IOP::TaggedProfile *tagged_profile = 0;
+ ACE_NEW_THROW_EX (tagged_profile,
+ IOP::TaggedProfile,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ IOP::TaggedProfile_var safe_tagged_profile = tagged_profile;
+
+ IOP::TaggedProfile &ep =
+ this->target_->_stubobj ()->profile_in_use ()->create_tagged_profile ();
+
+ tagged_profile->tag = ep.tag;
+ tagged_profile->profile_data = ep.profile_data; // Deep copy
+
+ return safe_tagged_profile._retn ();
}
// Use at own risk. There is no way currently of extracting an
// exception from an Any. This method is in place just to be compliant
// with the spec.
CORBA::Any *
-TAO_ClientRequestInfo::received_exception (CORBA::Environment &)
+TAO_ClientRequestInfo::received_exception (CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- // The spec says that if it is a user exception which can't be inserted
- // then the UNKNOWN exception needs to be thrown with minor code TBD_U.
- this->any_exception_ <<= *this->caught_exception_;
- return &this->any_exception_;
+ // The spec says that if it is a user exception which can't be
+ // inserted then the UNKNOWN exception needs to be thrown with minor
+ // code TBD_U.
+
+ CORBA::Any * temp = 0;
+
+ ACE_NEW_THROW_EX (temp,
+ CORBA::Any,
+ CORBA::NO_MEMORY (
+ CORBA_SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Any_var caught_exception = temp;
+
+ if (this->caught_exception_ != 0)
+ *temp <<= *(this->caught_exception_);
+
+ return caught_exception._retn ();
}
// = TAO specific method done since there currently is no simple way
@@ -69,11 +133,37 @@ TAO_ClientRequestInfo::received_exception_id (CORBA::Environment &)
}
IOP::TaggedComponent *
-TAO_ClientRequestInfo::get_effective_component (IOP::ComponentId,
- CORBA::Environment &)
+TAO_ClientRequestInfo::get_effective_component (
+ IOP::ComponentId id,
+ CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return 0;
+ IOP::TaggedComponent *tagged_component = 0;
+ ACE_NEW_THROW_EX (tagged_component,
+ IOP::TaggedComponent,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ IOP::TaggedComponent_var safe_tagged_component = tagged_component;
+
+ const TAO_Tagged_Components &ecs =
+ this->target_->_stubobj ()->profile_in_use ()->tagged_components ();
+
+ tagged_component->tag = id;
+
+ if (!ecs.get_component (*tagged_component))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL), // @@ Need minor code from PI spec!
+ CORBA::COMPLETED_NO),
+ 0);
+
+ return safe_tagged_component._retn ();
}
CORBA::Policy_ptr
@@ -81,6 +171,7 @@ TAO_ClientRequestInfo::get_request_policy (CORBA::PolicyType type,
CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
+ // @@ Do we need to look anywhere else for the request policies?
return this->target_->_get_policy (type,
ACE_TRY_ENV);
}
@@ -88,15 +179,34 @@ TAO_ClientRequestInfo::get_request_policy (CORBA::PolicyType type,
void
TAO_ClientRequestInfo::add_request_service_context (
const IOP::ServiceContext & service_context,
- CORBA::Boolean,
- CORBA::Environment &)
+ CORBA::Boolean replace,
+ CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Copy the service context into the list.
- CORBA::ULong length = this->service_context_list_.length ();
- this->service_context_list_.length (length + 1);
-
- this->service_context_list_[length] = service_context;
+ CORBA::ULong len = this->service_context_list_.length ();
+
+ // First check if a service context with the same ID exists.
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ if (this->service_context_list_[i].context_id ==
+ service_context.context_id)
+ {
+ if (replace)
+ {
+ this->service_context_list_[i] = service_context;
+ return;
+ }
+ else
+ // @@ Need the minor code once it becomes available.
+ ACE_THROW (CORBA::BAD_INV_ORDER ());
+ }
+ }
+
+ // No service context with the given ID exists so add one.
+ this->service_context_list_.length (len + 1);
+
+ this->service_context_list_[len] = service_context;
}
CORBA::ULong
@@ -108,17 +218,16 @@ TAO_ClientRequestInfo::request_id (CORBA::Environment &)
char *
TAO_ClientRequestInfo::operation (CORBA::Environment &)
- ACE_THROW_SPEC ((CORBA::SystemException))
+ ACE_THROW_SPEC ((CORBA::SystemException))
{
return CORBA::string_dup (this->operation_);
-
}
Dynamic::ParameterList *
TAO_ClientRequestInfo::arguments (CORBA::Environment &)
- ACE_THROW_SPEC ((CORBA::SystemException))
+ ACE_THROW_SPEC ((CORBA::SystemException))
{
- return &this->parameter_list_;
+ return &this->parameter_list_;
}
Dynamic::ExceptionList *
@@ -132,14 +241,14 @@ Dynamic::ContextList *
TAO_ClientRequestInfo::contexts (CORBA::Environment &)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return &this->context_list_;
+ return &this->context_list_;
}
Dynamic::RequestContext *
TAO_ClientRequestInfo::operation_context (CORBA::Environment &)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return &this->request_context_;
+ return &this->request_context_;
}
CORBA::Any *
@@ -153,85 +262,146 @@ CORBA::Boolean
TAO_ClientRequestInfo::response_expected (CORBA::Environment &)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return 0;
+ return this->response_expected_;
}
-# if (TAO_HAS_CORBA_MESSAGING == 1)
+# if TAO_HAS_CORBA_MESSAGING == 1
CORBA::Short
TAO_ClientRequestInfo::sync_scope (CORBA::Environment &)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return 0;
+// TAO_GIOP_Oneway_Invocation *inv =
+// ACE_dynamic_cast (TAO_GIOP_Oneway_Invocation *,
+// this->invocation_);
+
+// // The response_expected_ check is a precautionary measure for
+// // platforms that do not support RTTI, i.e. where the dynamic_cast
+// // above would incorrectly work. If the response_expected flag is
+// // not equal to zero then it is fairly safe to assume that the
+// // invocation is not a one-way, meaning that the sync_scope() method
+// // is not available.
+// if (inv != 0 && this->response_expected_ == 0)
+// return inv->sync_scope ();
+
+// ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (), -1);
+
+ return 0;
}
-#endif /* TAO_HAS_CORBA_MESSAGING */
+#endif /* TAO_HAS_CORBA_MESSAGING == 1 */
PortableInterceptor::ReplyStatus
-TAO_ClientRequestInfo::reply_status (CORBA::Environment &)
+TAO_ClientRequestInfo::reply_status (CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return 0;
+ if (this->reply_status_ == -1)
+ // A reply hasn't been received yet.
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (), -1);
+
+ return this->reply_status_;
}
CORBA::Object_ptr
-TAO_ClientRequestInfo::forward_reference (CORBA::Environment &)
+TAO_ClientRequestInfo::forward_reference (CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- return 0;
+ if (this->reply_status_ != PortableInterceptor::LOCATION_FORWARD
+ || this->reply_status_ !=
+ PortableInterceptor::LOCATION_FORWARD_PERMANENT)
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (),
+ CORBA::Object::_nil ());
+
+// // TAO_GIOP_Invocation::forward_reference() already duplicates the
+// // reference before returning it so there is no need to duplicate it
+// // here.
+// return this->invocation_->forward_reference ();
+
+ return CORBA::Object::_nil ();
}
CORBA::Any *
TAO_ClientRequestInfo::get_slot (PortableInterceptor::SlotId,
- CORBA::Environment &)
+ CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException,
PortableInterceptor::InvalidSlot))
{
- return 0;
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOTSUP),
+ CORBA::COMPLETED_NO),
+ 0);
}
IOP::ServiceContext *
-TAO_ClientRequestInfo::get_request_service_context (IOP::ServiceId id,
- CORBA::Environment &)
+TAO_ClientRequestInfo::get_request_service_context (
+ IOP::ServiceId id,
+ CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- for (CORBA::ULong size = 0;
- size < this->service_context_list_.length ();
- ++size)
- if (this->service_context_list_[size].context_id == id)
+ CORBA::ULong len = this->service_context_list_.length ();
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ if (this->service_context_list_[i].context_id == id)
{
- return &(this->service_context_list_[size]);
+ IOP::ServiceContext *service_context = 0;
+ ACE_NEW_THROW_EX (service_context,
+ IOP::ServiceContext,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ IOP::ServiceContext_var safe_service_context = service_context;
+
+ (*service_context) = this->service_context_list_[i];
+
+ return safe_service_context._retn ();
}
- return 0;
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL), // @@ Need minor code from PI spec!
+ CORBA::COMPLETED_NO),
+ 0);
}
IOP::ServiceContext *
-TAO_ClientRequestInfo::get_reply_service_context (IOP::ServiceId id,
- CORBA::Environment &)
+TAO_ClientRequestInfo::get_reply_service_context (
+ IOP::ServiceId id,
+ CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- for (CORBA::ULong size = 0;
- size < this->service_context_list_.length ();
- ++size)
- if (this->service_context_list_[size].context_id == id)
+ CORBA::ULong len = this->service_context_list_.length ();
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ if (this->service_context_list_[i].context_id == id)
{
- // Will it will get safely destroyed at the
- // TAO_Client side when the service context gets back.
- return &this->service_context_list_[size];
- }
+ IOP::ServiceContext *service_context = 0;
+ ACE_NEW_THROW_EX (service_context,
+ IOP::ServiceContext,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
- return 0;
-}
+ IOP::ServiceContext_var safe_service_context = service_context;
-void
-TAO_ClientRequestInfo::exception (CORBA::Exception *exception)
-{
- this->caught_exception_ = exception;
-}
+ (*service_context) = this->service_context_list_[i];
-void
-TAO_ClientRequestInfo::request_id (CORBA::ULong request_id)
-{
- this->request_id_ = request_id;
+ return safe_service_context._retn ();
+ }
+
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ EINVAL), // @@ Need minor code from PI spec!
+ CORBA::COMPLETED_NO),
+ 0);
}
#endif /* TAO_HAS_INTERCEPTORS == 1 */