summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_init_cs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_init_cs.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_init_cs.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_init_cs.cpp b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_init_cs.cpp
new file mode 100644
index 00000000000..638abe1c108
--- /dev/null
+++ b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_init_cs.cpp
@@ -0,0 +1,157 @@
+//
+// $Id$
+//
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// valuetype_init_cs.cpp
+//
+// = DESCRIPTION
+// Visitor generating code for Valuetypes factory in the client header
+// (see IDL to C++ mapping)
+//
+// = AUTHOR
+// Boris Kolpackov <bosk@ipmce.ru>
+//
+//
+// ============================================================================
+
+ACE_RCSID (be_visitor_valuetype,
+ valuetype_init_cs,
+ "$Id$")
+
+be_visitor_valuetype_init_cs::be_visitor_valuetype_init_cs (
+ be_visitor_context *ctx
+ )
+ : be_visitor_valuetype_init (ctx)
+{
+}
+
+be_visitor_valuetype_init_cs::~be_visitor_valuetype_init_cs (void)
+{
+}
+
+int
+be_visitor_valuetype_init_cs::visit_valuetype (be_valuetype *node)
+{
+ if (node->is_abstract ())
+ {
+ return 0;
+ }
+
+ // There are three possible situations.
+ // (1) If there is no initializers but at least one operation.
+ // In this case we don't need to bother about factory.
+ //
+ // (2) There are no (operations or initializers) (i.e. only state
+ // members) then we need a concrete type-specific factory
+ // class whose create_for_unmarshal creates OBV_ class.
+ //
+ // (3) There is at least one operation and at least one initializer.
+ // In this case we need to generate abstract factory class.
+
+ be_valuetype::FactoryStyle factory_style =
+ node->determine_factory_style ();
+
+ if (factory_style == be_valuetype::FS_NO_FACTORY)
+ {
+ return 0;
+ }
+
+ TAO_OutStream *os = this->ctx_->stream ();
+
+ char fname [NAMEBUFSIZE]; // to hold the full and
+ char lname [NAMEBUFSIZE]; // local _out names
+
+ ACE_OS::memset (fname,
+ '\0',
+ NAMEBUFSIZE);
+ ACE_OS::sprintf (fname,
+ "%s_init",
+ node->full_name ());
+
+ ACE_OS::memset (lname,
+ '\0',
+ NAMEBUFSIZE);
+ ACE_OS::sprintf (lname,
+ "%s_init",
+ node->local_name ());
+
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
+ << "// " << __FILE__ << ":" << __LINE__;
+
+ // ctor
+ *os << be_nl << be_nl
+ << fname << "::" << lname << " (void)" << be_nl
+ << "{" << be_nl << "}";
+
+ // dtor
+ *os << be_nl << be_nl
+ << fname << "::~" << lname << " (void)" << be_nl
+ << "{" << be_nl << "}";
+
+ // The _downcast method.
+ *os << be_nl << be_nl
+ << node->name () << "_init *" << be_nl << node->name ()
+ << "_init::_downcast ( ::CORBA::ValueFactoryBase *v)" << be_nl
+ << "{" << be_idt_nl
+ << "return dynamic_cast< ::" << node->name ()
+ << "_init * > (v);" << be_uidt_nl
+ << "}";
+
+ // tao_repository_id
+ *os << be_nl << be_nl
+ << "const char* " << be_nl
+ << fname << "::tao_repository_id (void)" << be_nl
+ << "{" << be_idt_nl
+ << "return ::" << node->full_name ()
+ << "::_tao_obv_static_repository_id ();"
+ << be_uidt_nl << "}";
+
+
+ if (factory_style == be_valuetype::FS_CONCRETE_FACTORY)
+ {
+ // generate create_for_unmarshal()
+ *os << be_nl << be_nl
+ << "::CORBA::ValueBase *" << be_nl
+ << fname << "::create_for_unmarshal (void)" << be_nl
+ << "{" << be_idt_nl
+ << "::CORBA::ValueBase *ret_val = 0;" << be_nl
+ << "ACE_NEW_THROW_EX (" << be_idt << be_idt_nl
+ << "ret_val," << be_nl
+ << "OBV_" << node->full_name () << "," << be_nl
+ << "::CORBA::NO_MEMORY ()" << be_uidt_nl
+ << ");" << be_uidt_nl
+ << "return ret_val;"
+ << be_uidt_nl << "}";
+
+ if (node->supports_abstract ())
+ {
+ *os << be_nl << be_nl
+ << "::CORBA::AbstractBase_ptr" << be_nl
+ << fname << "::create_for_unmarshal_abstract (void)" << be_nl
+ << "{" << be_idt_nl
+ << "::CORBA::AbstractBase *ret_val = 0;" << be_nl
+ << "ACE_NEW_THROW_EX (" << be_idt << be_idt_nl
+ << "ret_val," << be_nl
+ << "OBV_" << node->full_name () << "," << be_nl
+ << "::CORBA::NO_MEMORY ()" << be_uidt_nl
+ << ");" << be_uidt_nl
+ << "return ret_val;"
+ << be_uidt_nl << "}";
+ }
+ }
+
+ return 0;
+}
+
+int
+be_visitor_valuetype_init_cs::visit_eventtype (be_eventtype *node)
+{
+ return this->visit_valuetype (node);
+}
+