1 #include "tao/Tagged_Components.h"
4 #if !defined (__ACE_INLINE__)
5 # include "tao/Tagged_Components.inl"
6 #endif /* ! __ACE_INLINE__ */
8 #include "ace/OS_NS_string.h"
10 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
13 TAO_Tagged_Components::set_orb_type (CORBA::ULong orb_type
)
15 this->orb_type_
= orb_type
;
16 this->orb_type_set_
= 1;
19 cdr
<< ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER
);
20 cdr
<< this->orb_type_
;
22 this->set_component_i (IOP::TAG_ORB_TYPE
, cdr
);
26 TAO_Tagged_Components::set_code_sets (
27 const CONV_FRAME::CodeSetComponentInfo
&ci
)
29 this->code_sets_
= ci
;
30 this->code_sets_set_
= 1;
33 cdr
<< ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER
);
34 cdr
<< this->code_sets_
;
36 this->set_component_i (IOP::TAG_CODE_SETS
, cdr
);
40 TAO_Tagged_Components::set_code_sets (CONV_FRAME::CodeSetComponentInfo
&ci
)
42 this->set_code_sets_i (this->code_sets_
.ForCharData
, ci
.ForCharData
);
43 this->set_code_sets_i (this->code_sets_
.ForWcharData
, ci
.ForWcharData
);
44 this->code_sets_set_
= 1;
47 cdr
<< ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER
);
48 cdr
<< this->code_sets_
;
50 this->set_component_i (IOP::TAG_CODE_SETS
, cdr
);
54 TAO_Tagged_Components::set_code_sets_i (
55 CONV_FRAME::CodeSetComponent
&lhs
,
56 CONV_FRAME::CodeSetComponent
&rhs
)
58 lhs
.native_code_set
= rhs
.native_code_set
;
59 CORBA::ULong
const max
= rhs
.conversion_code_sets
.maximum ();
60 CORBA::ULong
const len
= rhs
.conversion_code_sets
.length ();
61 CONV_FRAME::CodeSetId
*buffer
= rhs
.conversion_code_sets
.get_buffer (true);
62 lhs
.conversion_code_sets
.replace (max
, len
, buffer
, true);
65 // ****************************************************************
68 TAO_Tagged_Components::set_component_i (IOP::ComponentId tag
,
71 IOP::TaggedComponent component
;
74 // Make a *copy* of the CDR stream...
75 size_t length
= cdr
.total_length ();
76 component
.component_data
.length (static_cast<CORBA::ULong
> (length
));
77 CORBA::Octet
*buf
= component
.component_data
.get_buffer ();
79 for (const ACE_Message_Block
*i
= cdr
.begin ();
83 ACE_OS::memcpy (buf
, i
->rd_ptr (), i
->length ());
87 this->set_component_i (component
);
91 TAO_Tagged_Components::set_component (const IOP::TaggedComponent
& component
)
93 if (this->known_tag (component
.tag
))
95 this->set_known_component_i (component
);
98 if (this->unique_tag (component
.tag
))
100 this->set_component_i (component
);
104 this->add_component_i (component
);
109 TAO_Tagged_Components::set_component (IOP::TaggedComponent
& component
)
111 if (this->known_tag (component
.tag
))
113 this->set_known_component_i (component
);
116 if (this->unique_tag (component
.tag
))
118 this->set_component_i (component
);
122 this->add_component_i (component
);
127 TAO_Tagged_Components::set_known_component_i (
128 const IOP::TaggedComponent
& component
)
130 TAO_InputCDR
cdr (reinterpret_cast<const char*> (
131 component
.component_data
.get_buffer ()),
132 component
.component_data
.length ());
134 CORBA::Boolean byte_order
;
136 if (!(cdr
>> ACE_InputCDR::to_boolean (byte_order
)))
141 cdr
.reset_byte_order (static_cast<int> (byte_order
));
143 if (component
.tag
== IOP::TAG_ORB_TYPE
)
145 CORBA::ULong orb_type
;
147 if (!(cdr
>> orb_type
))
152 this->orb_type_
= orb_type
;
153 this->orb_type_set_
= 1;
155 else if (component
.tag
== IOP::TAG_CODE_SETS
)
157 CONV_FRAME::CodeSetComponentInfo ci
;
164 this->set_code_sets_i (this->code_sets_
.ForCharData
, ci
.ForCharData
);
165 this->set_code_sets_i (this->code_sets_
.ForWcharData
, ci
.ForWcharData
);
166 this->code_sets_set_
= 1;
171 TAO_Tagged_Components::set_component_i (const IOP::TaggedComponent
& component
)
173 // @@ TODO Some components can show up multiple times, others
174 // can't find out and take appropriate action.
175 for (CORBA::ULong i
= 0; i
!= this->components_
.length (); ++i
)
177 if (component
.tag
== this->components_
[i
].tag
)
179 this->components_
[i
] = component
;
184 this->add_component_i (component
);
188 TAO_Tagged_Components::set_component_i (IOP::TaggedComponent
& component
)
190 for (CORBA::ULong i
= 0; i
!= this->components_
.length (); ++i
)
192 if (component
.tag
== this->components_
[i
].tag
)
194 CORBA::ULong max
= component
.component_data
.maximum ();
195 CORBA::ULong len
= component
.component_data
.length ();
196 CORBA::Octet
* buf
= component
.component_data
.get_buffer (1);
197 this->components_
[i
].component_data
.replace (max
, len
, buf
, 1);
202 this->add_component_i (component
);
206 TAO_Tagged_Components::add_component_i (IOP::TaggedComponent
& component
)
208 // @@ TODO Some components can show up multiple times, others
209 // can't find out and take appropriate action.
210 CORBA::ULong l
= this->components_
.length ();
211 this->components_
.length (l
+ 1);
212 this->components_
[l
].tag
= component
.tag
;
213 CORBA::ULong max
= component
.component_data
.maximum ();
214 CORBA::ULong len
= component
.component_data
.length ();
215 CORBA::Octet
* buf
= component
.component_data
.get_buffer (1);
216 this->components_
[l
].component_data
.replace (max
, len
, buf
, 1);
220 TAO_Tagged_Components::add_component_i (const IOP::TaggedComponent
& component
)
222 // @@ TODO Some components can show up multiple times, others
223 // can't find out and take appropriate action.
224 CORBA::ULong l
= this->components_
.length ();
225 this->components_
.length (l
+ 1);
226 this->components_
[l
] = component
;
230 TAO_Tagged_Components::remove_component (IOP::ComponentId id
)
232 if (this->known_tag (id
))
234 return this->remove_known_component_i (id
);
238 return this->remove_component_i (id
);
243 TAO_Tagged_Components::remove_known_component_i (IOP::ComponentId tag
)
245 if (tag
== IOP::TAG_ORB_TYPE
)
248 this->orb_type_set_
= 0;
251 else if (tag
== IOP::TAG_CODE_SETS
)
253 this->code_sets_set_
= 0;
263 TAO_Tagged_Components::remove_component_i (IOP::ComponentId tag
)
265 CORBA::ULong src
= 0, dest
= 0;
266 CORBA::ULong len
= this->components_
.length ();
268 for (;src
!= len
;++src
)
270 if ( tag
!= this->components_
[src
].tag
)
272 this->components_
[dest
] = this->components_
[src
];
277 this->components_
.length (dest
);
282 TAO_Tagged_Components::get_component (IOP::TaggedComponent
& component
) const
284 for (CORBA::ULong i
= 0; i
!= this->components_
.length (); ++i
)
286 if (component
.tag
== this->components_
[i
].tag
)
288 component
= this->components_
[i
];
296 // ****************************************************************
299 TAO_Tagged_Components::encode (TAO_OutputCDR
& cdr
) const
301 return (cdr
<< this->components_
);
305 TAO_Tagged_Components::decode (TAO_InputCDR
& cdr
)
307 // Mark the well-known components as removed
308 this->orb_type_set_
= 0;
309 this->code_sets_set_
= 0;
311 if (!(cdr
>> this->components_
))
316 CORBA::ULong
const l
= this->components_
.length ();
318 for (CORBA::ULong i
= 0; i
!= l
; ++i
)
320 const IOP::TaggedComponent
&component
= this->components_
[i
];
322 if (this->known_tag (component
.tag
))
324 this->set_known_component_i (component
);
331 TAO_END_VERSIONED_NAMESPACE_DECL