📄 trader_utils.h
字号:
// -*- C++ -*-
//=============================================================================
/**
* @file Trader_Utils.h
*
* Trader_Utils.h,v 1.31 2003/08/18 06:42:15 ossama Exp
*
* @author Seth Widoff <sbw1@cs.wustl.edu>
*/
//=============================================================================
#ifndef TAO_TRADER_UTILS_H
#define TAO_TRADER_UTILS_H
#include /**/ "ace/pre.h"
#include "Trader.h"
#if defined(_MSC_VER)
#if (_MSC_VER >= 1200)
#pragma warning(push)
#endif /* _MSC_VER >= 1200 */
#pragma warning(disable:4250)
#endif /* _MSC_VER */
/**
* @class TAO_Property_Evaluator
*
* @brief This class abstracts away the details of obtaining property
* values and property types. Since the procedure for obtaining the
* value or type of a dynamic property is disparate from the method
* for a static property, TAO_Property_Evaluator provides methods
* that will unify the two approaches under a single
* interface. Since dynamic properties aren't necessarily supported
* by a trader, this class accounts for that contingency. The use of
* indexed lookups allows them to occur in constant time on the
* CORBA sequences, but requires that the client know the layout of
* properties ahead of time.
*/
class TAO_Trading_Export TAO_Property_Evaluator
{
public:
TAO_Property_Evaluator(const CosTrading::PropertySeq& properties,
CORBA::Boolean supports_dp = 1);
/**
* Construct an instance of TAO_Property_Evaluator that operates on
* an <offer> where the support for dynamic properties is dictated
* by <supports_dynamic_properties>.
*/
TAO_Property_Evaluator(CosTrading::Offer& offer,
CORBA::Boolean supports_dp = 1);
/// Clean up dynamic properties.
virtual ~TAO_Property_Evaluator (void);
/// Returns 1 if the property at index <index> is dynamic. Returns a
/// 0 when the index is out of bounds.
int is_dynamic_property(int index);
/**
* Returns value of the property whose index is <index>. If the
* property at that index is dynamic and the trader supports dynamic
* properties, then the property_value method will obtain the value
* of the dynamic property using the evalDP method on the
* CosTradingDynamic::DynamicPropEval interface, passing on a
* CosTradingDynamic::DPEvalFailure exception on failure. If the
* property index is undefined, the method returns a null pointer.
*/
CORBA::Any* property_value(int index ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CosTradingDynamic::DPEvalFailure));
/**
* Returns the type of the property whose index is <index>. If the
* property is dynamic and the trader supports dynamic properties,
* then the method returns the <returned_type> field of the
* CosTradingDynamic::DynamicProp struct associated with the
* property name. If the index is out of bounds, the method returns
* a null pointer (that is, 0).
*/
CORBA::TypeCode_ptr property_type (int index);
protected:
typedef CosTradingDynamic::DynamicProp DP_Struct;
typedef CosTradingDynamic::DynamicPropEval DP_Eval;
/// The offer from which the TAO_Property_Evaluator extracts property
/// information.
const CosTrading::PropertySeq& props_;
int supports_dp_;
/**
* In order for the client to treat the results of property_value
* uniformly, we need to collect the dynamically allocated anys
* retrieved from dynamic properties and free them upon deletion. If
* we didn't do this, then the property_value method would leak or
* cause seg faults, since the client wouldn't be able to tell
* whether or not the return value should be freed.
*/
CORBA::Any** dp_cache_;
private:
TAO_Property_Evaluator (const TAO_Property_Evaluator&);
TAO_Property_Evaluator& operator= (const TAO_Property_Evaluator&);
};
/**
* @class TAO_Property_Evaluator_By_Name
*
* @brief This class extends the TAO_Property_Evaluator to allow lookups
* based on the property name of interest. Since the property
* information is contained within an integer indexed array,
* lookups may occur in O(n) time, where n is the length of the
* array. To make lookups by name more efficient,
* TAO_Property_Evaluator_By_Name creates a mapping of property
* names to integer indicies, upon which lookups are guaranteed to
* be O(lg n).
*/
class TAO_Trading_Export TAO_Property_Evaluator_By_Name : public TAO_Property_Evaluator
{
public:
TAO_Property_Evaluator_By_Name (const CosTrading::PropertySeq& properties
ACE_ENV_ARG_DECL ,
CORBA::Boolean supports_dp = 1)
ACE_THROW_SPEC ((CosTrading::DuplicatePropertyName,
CosTrading::IllegalPropertyName));
/**
* Construct an instance of TAO_Property_Evaluator that operates on
* an <offer> where the support for dynamic properties is dictated
* by <supports_dynamic_properties>.
*/
TAO_Property_Evaluator_By_Name(CosTrading::Offer& offer,
CORBA::Boolean supports_dp = 1);
/**
* Returns 1 if the property whose name is <property_name> is
* defined and dynamic. If the property is undefined, this method
* will throw a Property_Undefined exception with impunity.
*/
int is_dynamic_property(const char* property_name);
/**
* This method is identical to its counterpart in
* TAO_Property_Evaluator, except property_value first discovers the
* index through a string matching lookup.
*/
CORBA::Any* property_value(const char* property_name
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CosTradingDynamic::DPEvalFailure));
/**
* This method is identical to its counterpart in
* TAO_Property_Evaluator, exception property_type first discovers
* the index through a string matching lookup.
*/
CORBA::TypeCode_ptr property_type(const char* property_name);
const CosTrading::Property* get_property (const char* property_name);
private:
TAO_Property_Evaluator_By_Name (const TAO_Property_Evaluator_By_Name&);
TAO_Property_Evaluator_By_Name& operator= (const TAO_Property_Evaluator_By_Name&);
/// The instance of the above mapping for the offer provided in the
/// constructor.
TAO_Lookup_Table table_;
};
/**
* @class TAO_Dynamic_Property
*
* @brief Little helper class that you can extend to have your dynamic
* property handler construct CosTradingDynamic::DynamicProp structs.
*/
class TAO_Trading_Export TAO_Dynamic_Property
: public virtual POA_CosTradingDynamic::DynamicPropEval,
public virtual PortableServer::RefCountServantBase
{
public:
TAO_Dynamic_Property (void) {}
virtual ~TAO_Dynamic_Property (void);
void destroy (void);
/// Dynamic property evaluation call-back method.
virtual CORBA::Any* evalDP(const char* name,
CORBA::TypeCode_ptr returned_type,
const CORBA::Any& extra_info
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
CosTradingDynamic::DPEvalFailure)) = 0;
/// Method to construct a dynamic property structure suitable for
/// exporting in a CosTrading::PropertyStruct to the Trading Service.
CosTradingDynamic::DynamicProp*
construct_dynamic_prop (const char* name,
CORBA::TypeCode_ptr returned_type,
const CORBA::Any& extra_info);
private:
CosTradingDynamic::DynamicPropEval_var prop_;
};
/**
* @class TAO_Policies
*
* @brief This class ensures that policies submitted to Lookup make sense,
* have the correct value types, and don't exceed the maximums set
* through the Admin Interface.
*
* TAO_Policies does an admirable job of reconciling differences
* between the default parameter settings of the Trader and the import
* and other policies set by the client. Unbeknownst to its client
* TAO_Policies hides this arbitration, and records whether the user
* policy was chosen, or the default. This information gets returned
* to the invoker of the query method.
*/
class TAO_Policies
{
public:
#define TAO_NUM_POLICIES 11
/**
* This enum represents the relative order that properties are
* passed from one trader to another. Hence, as recommended by the
* spec, the starting_trader policies will be the first element in
* the polcy sequence if it's set for a query.
*/
enum POLICY_TYPE
{
STARTING_TRADER,
EXACT_TYPE_MATCH,
HOP_COUNT,
LINK_FOLLOW_RULE,
MATCH_CARD,
RETURN_CARD,
SEARCH_CARD,
USE_DYNAMIC_PROPERTIES,
USE_MODIFIABLE_PROPERTIES,
USE_PROXY_OFFERS,
REQUEST_ID
};
static const char * POLICY_NAMES[];
TAO_Policies (TAO_Trader_Base& trader,
const CosTrading::PolicySeq& policies
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPolicyName,
CosTrading::DuplicatePolicyName));
// BEGIN SPEC
// The "policies" parameter allows the importer to specify how the
// search should be performed as opposed to what sort of services
// should be found in the course of the search. This can be viewed
// as parameterizing the algorithms within the trader
// implementation. The "policies" are a sequence of name-value
// pairs. The names available to an importer depend on the
// implementation of the trader. However, some names are
// standardized where they effect the interpretation of other
// parameters or where they may impact linking and federation of
// traders.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -