operation_details.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //=============================================================================
00003 /**
00004  *  @file    operation_details.h
00005  *
00006  *  operation_details.h,v 1.30 2006/06/01 10:23:41 jwillemsen Exp
00007  *
00008  *  @author Bala Natarajan <bala@cs.wustl.edu>
00009  */
00010 //=============================================================================
00011 
00012 #ifndef TAO_OPERATION_DETAILS_H
00013 #define TAO_OPERATION_DETAILS_H
00014 
00015 #include /**/ "ace/pre.h"
00016 
00017 #include "tao/SystemException.h"
00018 
00019 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00020 # pragma once
00021 #endif /* ACE_LACKS_PRAGMA_ONCE */
00022 
00023 #include "tao/Service_Context.h"
00024 #include "tao/TimeBaseC.h"
00025 #include "tao/target_specification.h"
00026 
00027 
00028 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00029 
00030 /// Forward declarations
00031 namespace Dynamic
00032 {
00033   class ParameterList;
00034   class ExceptionList;
00035 }
00036 
00037 namespace TAO
00038 {
00039   class Argument;
00040   struct Exception_Data;
00041 }
00042 
00043 namespace TAO
00044 {
00045   namespace CSD
00046   {
00047     class FW_Server_Request_Wrapper;
00048   }
00049 }
00050 
00051 /**
00052  * @class TAO_Operation_Details
00053  *
00054  * @brief Class with operation details
00055  *
00056  * This class stores some of the "operation" details that would be
00057  * required by the invocation classes.  This class is in its
00058  * infancy now but I expect this one to grow as we come with
00059  * different varieties of use cases.
00060  *
00061  * @todo Put this in namespace TAO.
00062  */
00063 class TAO_Export TAO_Operation_Details
00064 {
00065 public:
00066 
00067   /// Declare FW_Server_Request_Wrapper a friend
00068   /// This friendship makes the FW_Server_Request_Wrapper be able to
00069   /// clone the TAO_Operation_Details data member in TAO_ServerRequest.
00070   friend class TAO::CSD::FW_Server_Request_Wrapper;
00071 
00072   /// Constructor
00073   TAO_Operation_Details (const char *name,
00074                          CORBA::ULong len,
00075                          CORBA::Boolean argument_flag,
00076                          TAO::Argument **args = 0,
00077                          CORBA::ULong num_args = 0,
00078                          TAO::Exception_Data *ex_data = 0,
00079                          CORBA::ULong ex_count = 0);
00080 
00081   /// Operation name
00082   const char* opname (void) const;
00083 
00084   /// Length of the operation name
00085   CORBA::ULong opname_len (void) const;
00086 
00087   /// Return the flag that indicates whether the operation has any
00088   /// arguments
00089   CORBA::Boolean argument_flag (void) const;
00090 
00091   /// Set the response flags
00092   void response_flags (CORBA::Octet flags);
00093 
00094   /// Get the response flags
00095   CORBA::Octet response_flags (void) const;
00096 
00097   /// Accessors for the service context list
00098   IOP::ServiceContextList &request_service_info (void);
00099   const IOP::ServiceContextList &request_service_info (void) const;
00100   IOP::ServiceContextList &reply_service_info (void);
00101   const IOP::ServiceContextList &reply_service_info (void) const;
00102 
00103   /// Access the TAO_Service_Context
00104   TAO_Service_Context &request_service_context (void);
00105   const TAO_Service_Context &request_service_context (void) const;
00106   TAO_Service_Context &reply_service_context (void);
00107   const TAO_Service_Context &reply_service_context (void) const;
00108 
00109   /// Reset the contents of the service context lists that we
00110   /// hold.
00111   void reset_request_service_info (void);
00112   void reset_reply_service_info (void);
00113 
00114   /// Cache the request id.
00115   void request_id (CORBA::ULong id);
00116 
00117   /// Return the request ID associated with the operation
00118   CORBA::ULong request_id (void) const;
00119 
00120   /// Accessor method for the addressing mode
00121   TAO_Target_Specification::TAO_Target_Address addressing_mode (void) const;
00122 
00123   /// Set method for the addressing mode
00124   void addressing_mode (CORBA::Short addr);
00125 
00126   /// Creates and returns a CORBA::Exception object whose repository
00127   /// id \a ex matches the exception list that this operation
00128   /// specified.
00129   /**
00130    * This step is important to decode the exception that the client
00131    * got from the server. If the exception received from the server
00132    * is not found in the list of exceptions specified by the operation
00133    * this call would raise an UNKNOWN exception.
00134    */
00135   CORBA::Exception *corba_exception (const char *ex
00136                                      ACE_ENV_ARG_DECL)
00137     ACE_THROW_SPEC ((CORBA::SystemException));
00138 
00139   /**
00140    * @name Helper methods used by the Invocation classes.
00141    */
00142   //@{
00143 
00144   /// Marshals the list of <this->arg_> into the \a cdr.
00145   bool marshal_args (TAO_OutputCDR &cdr);
00146 
00147   /// Demarshals the list of <this->arg_> into the \a cdr.
00148   bool demarshal_args (TAO_InputCDR &cdr);
00149 
00150   /// Accessors for the argument list
00151   TAO::Argument ** args (void) const;
00152   CORBA::ULong args_num (void) const ;
00153 
00154   /// Exception count
00155   CORBA::ULong ex_count (void) const;
00156 
00157   TAO::Exception_Data const * ex_data (void) const;
00158 
00159   void ft_expiration_time (TimeBase::TimeT time);
00160   TimeBase::TimeT ft_expiration_time (void) const;
00161 
00162   void ft_retention_id (CORBA::Long request_id);
00163   CORBA::Long ft_retention_id (void) const;
00164 
00165 private:
00166 
00167   /// Name of the operation being invoked.
00168   const char *opname_;
00169 
00170   /// Precalculated length of opname_.
00171   CORBA::ULong opname_len_;
00172 
00173   /// Request ID of this operation.
00174   CORBA::ULong request_id_;
00175 
00176   /**
00177    * Flag that indicates whether the operation has any arguments.  If
00178    * there are arguments this flag is true, else false.
00179    */
00180   CORBA::Boolean argument_flag_;
00181 
00182   /// Response flags
00183   CORBA::Octet response_flags_;
00184 
00185   /// The ServiceContextList sent to the server side. Only valid
00186   /// when sending a request.
00187   TAO_Service_Context request_service_info_;
00188 
00189   /// The ServiceContextList received from the server side. Only
00190   /// valid when sending a request.
00191   TAO_Service_Context reply_service_info_;
00192 
00193   /// Addressing  mode for this request.
00194   TAO_Target_Specification::TAO_Target_Address addressing_mode_;
00195 
00196   /**
00197    * The arguments of this operation. Note that the return value is also
00198    * an argument
00199    */
00200   TAO::Argument **args_;
00201 
00202   /// Number of arguments including the return value
00203   CORBA::ULong num_args_;
00204 
00205   /// The type of exceptions that the operations can throw.
00206   TAO::Exception_Data *ex_data_;
00207 
00208   /// Count of the exceptions that operations can throw.
00209   CORBA::ULong ex_count_;
00210 #if TAO_HAS_INTERCEPTORS == 1
00211   /// FT request expiration time (absolute gregorian)
00212   TimeBase::TimeT ft_expiration_time_;
00213 
00214   /// FT request retention id
00215   CORBA::Long ft_retention_id_;
00216 #endif /*TAO_HAS_INTERCEPTORS == 1*/
00217 };
00218 
00219 TAO_END_VERSIONED_NAMESPACE_DECL
00220 
00221 #if defined (__ACE_INLINE__)
00222 # include "tao/operation_details.i"
00223 #endif /* __ACE_INLINE__ */
00224 
00225 #include /**/ "ace/post.h"
00226 
00227 #endif  /* TAO_OPERATION_DETAILS_H */

Generated on Thu Nov 9 11:54:17 2006 for TAO by doxygen 1.3.6