serverrequestinfo.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 515 行 · 第 1/2 页
CPP
515 行
#include "ServerRequestInfo.h"
#if (TAO_HAS_INTERCEPTORS == 1)
ACE_RCSID (TAO_PortableServer,
ServerRequestInfo,
"ServerRequestInfo.cpp,v 1.29 2003/11/04 05:21:37 dhinton Exp")
#include "POA.h"
#include "POA_Policy_Set.h"
#include "tao/TAO_Server_Request.h"
#include "tao/ORB_Core.h"
#include "tao/PolicyC.h"
#include "tao/ORB_Core.h"
# if !defined (__ACE_INLINE__)
# include "ServerRequestInfo.inl"
# endif /* !__ACE_INLINE__ */
TAO_ServerRequestInfo::TAO_ServerRequestInfo (
TAO_ServerRequest &server_request,
TAO_Object_Adapter::Servant_Upcall *servant_upcall)
: server_request_ (server_request),
servant_upcall_ (servant_upcall),
caught_exception_ (0),
reply_status_ (-1)
{
}
CORBA::ULong
TAO_ServerRequestInfo::request_id (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// The request ID returned by this method need not correspond to the
// GIOP request ID sent with the client request. The request ID
// must be unique across all outstanding requests. To avoid locking
// overhead, the address of the TAO_ServerRequest object is used as
// the request ID. This guarantees that the request ID is unique.
//
// For 64-bit platforms, only the lower 32 bits are used. Hopefully
// that will be enough to ensure uniqueness.
// This is basically the same trick used in
// TAO_GIOP_Invocation::generate_request_id(). However, no right
// shifting of 64 bit addresses is performed since the
// TAO_ServerRequest object is not large enough to allow that trick.
CORBA::ULong id = 0;
// Note that we reinterpret_cast to an "unsigned long" instead of
// CORBA::ULong since we need to first cast to an integer large
// enough to hold an address to avoid compile-time warnings on some
// 64-bit platforms.
if (sizeof (this) == 4) // 32 bit address
id = ACE_static_cast (CORBA::ULong,
ACE_reinterpret_cast (ptrdiff_t,
&(this->server_request_)));
else if (sizeof (this) == 8) // 64 bit address -- use lower 32 bits
id = ACE_static_cast (CORBA::ULong,
ACE_reinterpret_cast (ptrdiff_t,
&(this->server_request_)) & 0xFFFFFFFFu);
else
// @@ Rather than fallback on the GIOP request ID, we should use
// an atomically incremented variable specific to the ORB, or
// perhaps specific to the process.
id = this->server_request_.request_id (); // Fallback
return id;
}
char *
TAO_ServerRequestInfo::operation (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
return CORBA::string_dup (this->server_request_.operation ());
}
Dynamic::ParameterList *
TAO_ServerRequestInfo::arguments (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
CORBA::COMPLETED_NO),
0);
}
Dynamic::ExceptionList *
TAO_ServerRequestInfo::exceptions (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
CORBA::COMPLETED_NO),
0);
}
Dynamic::ContextList *
TAO_ServerRequestInfo::contexts (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
CORBA::COMPLETED_NO),
0);
}
Dynamic::RequestContext *
TAO_ServerRequestInfo::operation_context (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
CORBA::COMPLETED_NO),
0);
}
CORBA::Any *
TAO_ServerRequestInfo::result (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
CORBA::COMPLETED_NO),
0);
}
CORBA::Boolean
TAO_ServerRequestInfo::response_expected (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
return this->server_request_.response_expected ();
}
Messaging::SyncScope
TAO_ServerRequestInfo::sync_scope (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
if (this->server_request_.sync_with_server ())
return Messaging::SYNC_WITH_SERVER;
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
CORBA::COMPLETED_NO),
-1);
}
PortableInterceptor::ReplyStatus
TAO_ServerRequestInfo::reply_status (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
if (this->reply_status_ == -1)
// A reply hasn't been received yet.
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
CORBA::COMPLETED_NO),
-1);
return this->reply_status_;
}
CORBA::Object_ptr
TAO_ServerRequestInfo::forward_reference (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
if (this->reply_status_ != PortableInterceptor::LOCATION_FORWARD)
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
CORBA::COMPLETED_NO),
CORBA::Object::_nil ());
// TAO_ServerRequest::forward_location() already duplicates the
// object reference. There is no need to duplicate it here.
return this->server_request_.forward_location ();
}
CORBA::Any *
TAO_ServerRequestInfo::get_slot (PortableInterceptor::SlotId id
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
PortableInterceptor::InvalidSlot))
{
// Retrieve the total number of assigned slots from the PICurrent.
// No TSS access is incurred.
TAO_PICurrent *pi_current =
this->server_request_.orb_core ()->pi_current ();
if (pi_current == 0)
ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
pi_current->check_validity (id ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Retrieve the request scope PICurrent object.
TAO_PICurrent_Impl &rsc = this->server_request_.rs_pi_current ();
return rsc.get_slot (id ACE_ENV_ARG_PARAMETER);
}
IOP::ServiceContext *
TAO_ServerRequestInfo::get_request_service_context (
IOP::ServiceId id
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_Service_Context &service_context_list =
this->server_request_.request_service_context ();
return this->get_service_context_i (service_context_list,
id
ACE_ENV_ARG_PARAMETER);
}
IOP::ServiceContext *
TAO_ServerRequestInfo::get_reply_service_context (
IOP::ServiceId id
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_Service_Context &service_context_list =
this->server_request_.reply_service_context ();
return this->get_service_context_i (service_context_list,
id
ACE_ENV_ARG_PARAMETER);
}
IOP::ServiceContext *
TAO_ServerRequestInfo::get_service_context_i (
TAO_Service_Context &service_context_list,
IOP::ServiceId id
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
IOP::ServiceContext_var service_context;
if (service_context_list.get_context (id, service_context.out ()) != 0)
{
// Found.
return service_context._retn ();
}
else
{
// Not found.
ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 26,
CORBA::COMPLETED_NO),
0);
}
}
// 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_ServerRequestInfo::sending_exception (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
if (this->reply_status_ != PortableInterceptor::SYSTEM_EXCEPTION
&& this->reply_status_ != PortableInterceptor::USER_EXCEPTION)
{
ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 14,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?