3 //=============================================================================
5 * @file Tagged_Components.h
7 * @author Carlos O'Ryan (coryan@cs.wustl.edu)
9 //=============================================================================
11 #ifndef TAO_TAGGED_COMPONENTS_H
12 #define TAO_TAGGED_COMPONENTS_H
14 #include /**/ "ace/pre.h"
18 #if !defined (ACE_LACKS_PRAGMA_ONCE)
20 #endif /* ACE_LACKS_PRAGMA_ONCE */
22 #include "tao/CONV_FRAMEC.h"
25 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
29 /// Tag for storing multiple endpoints within a single profile.
31 * This is TAO-specific, and is mostly used by TAO's RTCORBA support.
32 * The standard TAG_ALTERNATE_IIOP_ADDRESSES tagged component is the
33 * portable alternative.
35 static const CORBA::ULong TAO_TAG_ENDPOINTS
= 0x54414f02U
;
38 * @class TAO_Tagged_Components
40 * @brief The policy manager implementation.
42 * This class is used to manipulate and access the <components>
43 * field of an IIOP profile (and other GIOP profiles).
44 * The definition for that field is simply a sequence of the
45 * following structures:
46 * typedef unsigned long ComponentId;
47 * struct TaggedComponent {
49 * sequence<octet> component_data;
51 * the real motivation is to minimize the marshaling and
52 * demarshaling of the <component_data> field for certain critical
55 class TAO_Export TAO_Tagged_Components
59 TAO_Tagged_Components ();
61 // = Standard OMG that require fast access.
62 /// The the IOP::TAG_ORB_TYPE component value
63 void set_orb_type (CORBA::ULong orb_type
);
65 /// Gets the IOP::TAG_ORB_TYPE component value, return 0 if the
66 /// component is not present.
67 int get_orb_type (CORBA::ULong
& orb_type
) const;
70 * The the IOP::TAG_CODE_SETS component value, the first version
71 * copies the data, the second version steal all the sequence
74 void set_code_sets (const CONV_FRAME::CodeSetComponentInfo
&);
75 void set_code_sets (CONV_FRAME::CodeSetComponentInfo
&);
77 /// Gets a reference of the IOP::TAG_CODE_SETS component value,
78 /// return 0 if the component is not present.
79 int get_code_sets (const CONV_FRAME::CodeSetComponentInfo
* &) const;
81 /// Gets a copy of the IOP::TAG_CODE_SETS component value, return 0
82 /// if the component is not present.
83 int get_code_sets (CONV_FRAME::CodeSetComponentInfo
&) const;
85 // = Generic components
87 /// Insert the component into the list, making a copy of the octet
89 void set_component (const IOP::TaggedComponent
& component
);
91 /// Insert the component into the list, but efficiently stealing the
92 /// contents of the octet sequence.
93 void set_component (IOP::TaggedComponent
& component
);
95 /// Get a copy of the component identified by <component.tag>, return
96 /// 0 if the component is not present.
97 int get_component (IOP::TaggedComponent
& component
) const;
99 /// Remove a component, if present. Return number of components
101 int remove_component (IOP::ComponentId id
);
103 // = Marshaling and demarshaling
105 /// Marshal the list.
106 int encode (TAO_OutputCDR
& cdr
) const;
108 /// Demarshal the list.
109 int decode (TAO_InputCDR
& cdr
);
112 * Read/Write access to the underlying
113 * MutipleComponentProfile. Added by request from Chris Hafey
114 * <chris@stentorsoft.com>
116 IOP::MultipleComponentProfile
&components ();
119 /// Helper method to implement set_code_sets()
120 void set_code_sets_i (CONV_FRAME::CodeSetComponent
&lhs
,
121 CONV_FRAME::CodeSetComponent
&rhs
);
123 /// Helper methods to implement set_component()
124 void set_known_component_i (const IOP::TaggedComponent
& component
);
125 void set_component_i (const IOP::TaggedComponent
& component
);
126 void set_component_i (IOP::TaggedComponent
& component
);
127 void add_component_i (const IOP::TaggedComponent
& component
);
128 void add_component_i (IOP::TaggedComponent
& component
);
129 void set_component_i (IOP::ComponentId tag
, TAO_OutputCDR
&cdr
);
131 /// Helper methods to implement remove_component()
132 int remove_known_component_i (IOP::ComponentId tag
);
133 int remove_component_i (IOP::ComponentId tag
);
135 /// Helper methods to implement set_component()
136 int get_known_component_i (IOP::TaggedComponent
& component
) const;
137 int get_component_i (IOP::TaggedComponent
& component
) const;
139 /// Is @a tag a well-known component?
140 bool known_tag (IOP::ComponentId tag
) const;
142 /// Does @a tag show up only once?
143 bool unique_tag (IOP::ComponentId tag
) const;
146 /// The ORB_TYPE component value
147 CORBA::ULong orb_type_
;
149 /// The ORB_TYPE component value
150 CONV_FRAME::CodeSetComponentInfo code_sets_
;
152 /// The rest of the components, to be compliant we cannot drop a
154 IOP::MultipleComponentProfile components_
;
156 /// A flag for each component...
157 CORBA::Octet orb_type_set_
;
158 CORBA::Octet code_sets_set_
;
161 TAO_END_VERSIONED_NAMESPACE_DECL
163 #if defined (__ACE_INLINE__)
164 # include "tao/Tagged_Components.inl"
165 #endif /* __ACE_INLINE__ */
167 #include /**/ "ace/post.h"
169 #endif /* TAO_TAGGED_COMPONENTS_H */