summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp
new file mode 100644
index 00000000000..d9948085b90
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp
@@ -0,0 +1,271 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ConstantDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+
+#include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ConstantDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ConstantDef_i::TAO_ConstantDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo)
+{
+}
+
+TAO_ConstantDef_i::~TAO_ConstantDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ConstantDef_i::def_kind (void)
+{
+ return CORBA::dk_Constant;
+}
+
+CORBA::Contained::Description *
+TAO_ConstantDef_i::describe (void)
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key ();
+
+ return this->describe_i ();
+}
+
+CORBA::Contained::Description *
+TAO_ConstantDef_i::describe_i (void)
+{
+ CORBA::Contained::Description *desc_ptr = 0;
+ ACE_NEW_THROW_EX (desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+
+ CORBA::Contained::Description_var retval = desc_ptr;
+
+ retval->kind = this->def_kind ();
+
+ CORBA::ConstantDescription cd;
+
+ cd.name = this->name_i ();
+
+ cd.id = this->id_i ();
+
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+ cd.defined_in = container_id.c_str ();
+
+ cd.version = this->version_i ();
+
+ cd.type = this->type_i ();
+
+ CORBA::Any_var val = this->value_i ();
+
+ cd.value = val.in ();
+
+ retval->value <<= cd;
+ return retval._retn ();
+}
+
+CORBA::TypeCode_ptr
+TAO_ConstantDef_i::type (void)
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key ();
+
+ return this->type_i ();
+}
+
+CORBA::TypeCode_ptr
+TAO_ConstantDef_i::type_i (void)
+{
+ ACE_TString type_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ type_path);
+
+ TAO_IDLType_i *impl = TAO_IFR_Service_Utils::path_to_idltype (type_path,
+ this->repo_);
+
+ return impl->type_i ();
+}
+
+CORBA::IDLType_ptr
+TAO_ConstantDef_i::type_def (void)
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key ();
+
+ return this->type_def_i ();
+}
+
+CORBA::IDLType_ptr
+TAO_ConstantDef_i::type_def_i (void)
+{
+ ACE_TString type_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ type_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (type_path,
+ this->repo_);
+
+ return CORBA::IDLType::_narrow (obj.in ());
+}
+
+void
+TAO_ConstantDef_i::type_def (CORBA::IDLType_ptr type_def)
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key ();
+
+ this->type_def_i (type_def);
+}
+
+void
+TAO_ConstantDef_i::type_def_i (CORBA::IDLType_ptr type_def)
+{
+ char *type_path = TAO_IFR_Service_Utils::reference_to_path (type_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "type_path",
+ type_path);
+}
+
+CORBA::Any *
+TAO_ConstantDef_i::value (void)
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key ();
+
+ return this->value_i ();
+}
+
+CORBA::Any *
+TAO_ConstantDef_i::value_i (void)
+{
+ CORBA::TypeCode_var tc = this->type_i ();
+
+ void *ref = 0;
+ size_t length = 0;
+
+ this->repo_->config ()->get_binary_value (
+ this->section_key_,
+ "value",
+ ref,
+ length
+ );
+
+ char *data = static_cast<char *> (ref);
+ ACE_Auto_Basic_Array_Ptr<char> safety (data);
+
+ ACE_Message_Block mb (data,
+ length);
+ mb.length (length);
+ TAO_InputCDR in_cdr (&mb);
+
+ CORBA::Any *retval = 0;
+ ACE_NEW_THROW_EX (retval,
+ CORBA::Any,
+ CORBA::NO_MEMORY ());
+
+ TAO::Unknown_IDL_Type *impl = 0;
+ ACE_NEW_THROW_EX (impl,
+ TAO::Unknown_IDL_Type (tc.in (),
+ in_cdr),
+ CORBA::NO_MEMORY ());
+
+ retval->replace (impl);
+ safety.release ();
+ return retval;
+}
+
+void
+TAO_ConstantDef_i::value (const CORBA::Any &value)
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key ();
+
+ this->value_i (value);
+}
+
+void
+TAO_ConstantDef_i::value_i (const CORBA::Any &value)
+{
+ CORBA::TypeCode_var my_tc =
+ this->type_i ();
+
+ CORBA::TypeCode_var val_tc = value.type ();
+
+ CORBA::Boolean const equal_tc =
+ my_tc.in ()->equal (val_tc.in ());
+
+ if (!equal_tc)
+ {
+ return;
+ }
+
+ ACE_Message_Block *mb = 0;
+ TAO::Any_Impl *impl = value.impl ();
+
+ if (impl->encoded ())
+ {
+ TAO::Unknown_IDL_Type *unk =
+ dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
+
+ mb = unk->_tao_get_cdr ().steal_contents ();
+ }
+ else
+ {
+ TAO_OutputCDR out;
+ impl->marshal_value (out);
+ TAO_InputCDR in (out);
+ mb = in.steal_contents ();
+ }
+
+ CORBA::TCKind kind = val_tc->kind ();
+
+ switch (kind)
+ {
+ // The data for these types will be aligned to an 8-byte
+ // boundary, while the rd_ptr may not.
+ case CORBA::tk_double:
+ case CORBA::tk_ulonglong:
+ case CORBA::tk_longlong:
+ case CORBA::tk_longdouble:
+ mb->rd_ptr (ACE_ptr_align_binary (mb->rd_ptr (),
+ ACE_CDR::MAX_ALIGNMENT));
+ break;
+ default:
+ break;
+ }
+
+ mb->crunch ();
+ this->repo_->config ()->set_binary_value (this->section_key_,
+ "value",
+ mb->base (),
+ mb->length ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL