summaryrefslogtreecommitdiff
path: root/trunk/TAO/orbsvcs/PSS/PSDL_Code_Gen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/orbsvcs/PSS/PSDL_Code_Gen.cpp')
-rw-r--r--trunk/TAO/orbsvcs/PSS/PSDL_Code_Gen.cpp170
1 files changed, 170 insertions, 0 deletions
diff --git a/trunk/TAO/orbsvcs/PSS/PSDL_Code_Gen.cpp b/trunk/TAO/orbsvcs/PSS/PSDL_Code_Gen.cpp
new file mode 100644
index 00000000000..fe23670c74e
--- /dev/null
+++ b/trunk/TAO/orbsvcs/PSS/PSDL_Code_Gen.cpp
@@ -0,0 +1,170 @@
+// -*- C++ -*-
+// $Id$
+
+#include "PSDL_Code_Gen.h"
+#include "PSDL_Datastore.h"
+#include "tao/OctetSeqC.h"
+#include "tao/AnyTypeCode/Any.h"
+#include "tao/CodecFactory/CodecFactory.h"
+
+ACE_RCSID (PSS, PSDL_Code_Gen, "$Id$")
+
+TAO_PSDL_Code_Gen::TAO_PSDL_Code_Gen (CORBA::ORB_ptr orb)
+ : file_name_ ("Data_Store"),
+ psdl_datastore_ (),
+ orb_ (orb),
+ codec_ (0)
+{
+ this->set_codec ();
+ ACE_NEW (this->psdl_datastore_,
+ TAO_PSDL_Datastore);
+
+}
+
+TAO_PSDL_Code_Gen::~TAO_PSDL_Code_Gen (void)
+{
+ delete this->psdl_datastore_;
+}
+
+int
+TAO_PSDL_Code_Gen::set_codec (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ // Obtain a reference to the CodecFactory.
+ CORBA::Object_var obj =
+ this->orb_->resolve_initial_references ("CodecFactory"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ IOP::CodecFactory_var codec_factory =
+ IOP::CodecFactory::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Set up a structure that contains information necessary to
+ // create a GIOP 1.1 CDR encapsulation Codec.
+ IOP::Encoding encoding;
+ encoding.format = IOP::ENCODING_CDR_ENCAPS;
+ encoding.major_version = 1;
+ encoding.minor_version = 1;
+
+ // Obtain the CDR encapsulation Codec.
+ this->codec_ =
+ codec_factory->create_codec (encoding ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (this->codec_.in () == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "codec pointer not set correctly\n"));
+ return -1;
+ }
+ return 0;
+}
+
+int
+TAO_PSDL_Code_Gen::set_name_obj_ref (const char *name,
+ const char *string_obj_ref
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Invoke the helper encode method which will
+ // convert the stringified object reference to a CORBA::OctetSeq.
+ // Insert the name-CORBA::OCtetSeq pair to a hash_map and save the
+ // hash_map to the database.
+
+ // Encode the stringified object reference to a CORBA::OctetSeq *
+ CORBA::OctetSeq_var octet_seq = this->encode (string_obj_ref
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Insert the new entry to the hash map which contains all the
+ // name-octet_seq entries. And, write the hash_map to a file.
+ int result = this->psdl_datastore_->bind (name,
+ octet_seq.in ());
+
+ if (result == -1)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Bind not done successfully \n"));
+ }
+ else if (result == 1)
+ {
+ /*ACE_DEBUG ((LM_DEBUG,
+ "Bind already done.\n"));
+ */
+ return 0;
+ }
+
+ return result;
+}
+
+const char *
+TAO_PSDL_Code_Gen::get_obj_ref (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Get from the hash_map saved in the database, the corresponding entry
+ // (CORBA::OctetSeq *) for the name. Then, decode the octetseq to
+ // get the stringified object reference and return it.
+
+ CORBA::OctetSeq octet_seq;
+
+ // Find the octet_seq for the name.
+ int result = this->psdl_datastore_->find (name,
+ octet_seq);
+
+ if (result == 0)
+ {
+ // Decode the octet_seq.
+ const char *obj_ref = this->decode (octet_seq
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return CORBA::string_dup (obj_ref);
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "An entry for name %s is not found\n",
+ name));
+ return 0;
+ }
+}
+
+
+CORBA::OctetSeq *
+TAO_PSDL_Code_Gen::encode (const char *string_obj_ref
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any data;
+ data <<= string_obj_ref;
+
+ CORBA::OctetSeq *encoded_data = 0;
+
+ encoded_data = this->codec_->encode (data ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::OctetSeq_var safe_encoded_data = encoded_data;
+
+ return safe_encoded_data._retn ();
+}
+
+const char *
+TAO_PSDL_Code_Gen::decode (const CORBA::OctetSeq &data
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ const char *extracted_value;
+
+ // Extract the data from the octet sequence.
+ CORBA::Any_var decoded_data =
+ this->codec_->decode (data
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ decoded_data.in() >>= extracted_value;
+
+ return CORBA::string_dup (extracted_value);
+}