summaryrefslogtreecommitdiff
path: root/modules/CIAO/CIDLC
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/CIDLC')
-rw-r--r--modules/CIAO/CIDLC/AttributeHeaderEmitters.cpp196
-rw-r--r--modules/CIAO/CIDLC/AttributeHeaderEmitters.hpp119
-rw-r--r--modules/CIAO/CIDLC/AttributeSourceEmitters_T.hpp360
-rw-r--r--modules/CIAO/CIDLC/CIDLC.mpc16
-rw-r--r--modules/CIAO/CIDLC/CIDLC.mwc10
-rw-r--r--modules/CIAO/CIDLC/Collectors.hpp280
-rw-r--r--modules/CIAO/CIDLC/CompositionEmitter.cpp27
-rw-r--r--modules/CIAO/CIDLC/CompositionEmitter.hpp26
-rw-r--r--modules/CIAO/CIDLC/CorbaTypeNameEmitters.cpp2014
-rw-r--r--modules/CIAO/CIDLC/CorbaTypeNameEmitters.hpp469
-rw-r--r--modules/CIAO/CIDLC/CxxNamePrinter.cpp103
-rw-r--r--modules/CIAO/CIDLC/CxxNamePrinter.hpp18
-rw-r--r--modules/CIAO/CIDLC/DescriptorGenerator.cpp582
-rw-r--r--modules/CIAO/CIDLC/DescriptorGenerator.hpp35
-rw-r--r--modules/CIAO/CIDLC/EmitterBase.cpp11
-rw-r--r--modules/CIAO/CIDLC/EmitterBase.hpp20
-rw-r--r--modules/CIAO/CIDLC/EmitterContext.cpp45
-rw-r--r--modules/CIAO/CIDLC/EmitterContext.hpp35
-rw-r--r--modules/CIAO/CIDLC/ExecImplGenerator.cpp201
-rw-r--r--modules/CIAO/CIDLC/ExecImplGenerator.hpp44
-rw-r--r--modules/CIAO/CIDLC/ExecImplHeaderGenerator.cpp819
-rw-r--r--modules/CIAO/CIDLC/ExecImplHeaderGenerator.hpp43
-rw-r--r--modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp1136
-rw-r--r--modules/CIAO/CIDLC/ExecImplSourceGenerator.hpp43
-rw-r--r--modules/CIAO/CIDLC/ExecutorMappingGenerator.cpp2099
-rw-r--r--modules/CIAO/CIDLC/ExecutorMappingGenerator.hpp32
-rw-r--r--modules/CIAO/CIDLC/InterfaceEmitter.cpp26
-rw-r--r--modules/CIAO/CIDLC/InterfaceEmitter.hpp30
-rw-r--r--modules/CIAO/CIDLC/Literals.cpp81
-rw-r--r--modules/CIAO/CIDLC/Literals.hpp58
-rw-r--r--modules/CIAO/CIDLC/ModuleEmitter.cpp22
-rw-r--r--modules/CIAO/CIDLC/ModuleEmitter.hpp24
-rw-r--r--modules/CIAO/CIDLC/OperationHeaderEmitters.cpp264
-rw-r--r--modules/CIAO/CIDLC/OperationHeaderEmitters.hpp151
-rw-r--r--modules/CIAO/CIDLC/ParameterEmitter_T.hpp33
-rw-r--r--modules/CIAO/CIDLC/README.html95
-rw-r--r--modules/CIAO/CIDLC/RepositoryIdGenerator.cpp289
-rw-r--r--modules/CIAO/CIDLC/RepositoryIdGenerator.hpp21
-rw-r--r--modules/CIAO/CIDLC/ServantGenerator.cpp220
-rw-r--r--modules/CIAO/CIDLC/ServantGenerator.hpp53
-rw-r--r--modules/CIAO/CIDLC/ServantHeaderGenerator.cpp1783
-rw-r--r--modules/CIAO/CIDLC/ServantHeaderGenerator.hpp54
-rw-r--r--modules/CIAO/CIDLC/ServantSourceGenerator.cpp4476
-rw-r--r--modules/CIAO/CIDLC/ServantSourceGenerator.hpp53
-rw-r--r--modules/CIAO/CIDLC/SizeTypeCalculator.cpp217
-rw-r--r--modules/CIAO/CIDLC/SizeTypeCalculator.hpp21
-rw-r--r--modules/CIAO/CIDLC/UnescapedNamePrinter.hpp23
-rw-r--r--modules/CIAO/CIDLC/Upcase.hpp21
-rw-r--r--modules/CIAO/CIDLC/UtilityTypeNameEmitters.cpp78
-rw-r--r--modules/CIAO/CIDLC/UtilityTypeNameEmitters.hpp66
-rw-r--r--modules/CIAO/CIDLC/Version1
-rw-r--r--modules/CIAO/CIDLC/cidlc.cpp386
52 files changed, 17329 insertions, 0 deletions
diff --git a/modules/CIAO/CIDLC/AttributeHeaderEmitters.cpp b/modules/CIAO/CIDLC/AttributeHeaderEmitters.cpp
new file mode 100644
index 00000000000..d5794a889f5
--- /dev/null
+++ b/modules/CIAO/CIDLC/AttributeHeaderEmitters.cpp
@@ -0,0 +1,196 @@
+// file : CIDLC/AttributeHeaderEmitters.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "AttributeHeaderEmitters.hpp"
+#include "Literals.hpp"
+
+using namespace StringLiterals;
+
+WriteAttributeHeaderEmitter::WriteAttributeHeaderEmitter (Context& c)
+ : EmitterBase (c),
+ write_type_name_emitter_ (c),
+ type_name_emitter_ (c)
+{
+ write_belongs_.node_traverser (write_type_name_emitter_);
+
+ edge_traverser (set_raises_);
+ set_raises_.node_traverser (type_name_emitter_);
+}
+
+void
+WriteAttributeHeaderEmitter::pre (SemanticGraph::ReadWriteAttribute&)
+{
+ os << "void" << endl;
+}
+
+void
+WriteAttributeHeaderEmitter::name (SemanticGraph::ReadWriteAttribute& a)
+{
+ os << a.name () << " (" << endl;
+
+ Traversal::ReadWriteAttribute::belongs (a, write_belongs_);
+
+ os << " " << a.name () << ")" << endl;
+}
+
+void
+WriteAttributeHeaderEmitter::get_raises (SemanticGraph::ReadWriteAttribute&)
+{
+}
+
+void
+WriteAttributeHeaderEmitter::set_raises_none (SemanticGraph::ReadWriteAttribute&)
+{
+ os << STRS[EXCP_SNGL];
+}
+
+void
+WriteAttributeHeaderEmitter::set_raises_pre (SemanticGraph::ReadWriteAttribute&)
+{
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+}
+
+void
+WriteAttributeHeaderEmitter::set_raises_post (SemanticGraph::ReadWriteAttribute&)
+{
+ os << "))";
+}
+
+void
+WriteAttributeHeaderEmitter::post (SemanticGraph::ReadWriteAttribute&)
+{
+ os << ";" << endl;
+}
+
+void
+WriteAttributeHeaderEmitter::comma (SemanticGraph::ReadWriteAttribute&)
+{
+ os << "," << endl;
+}
+
+// ============================================================
+
+AttributeHeaderEmitter::AttributeHeaderEmitter (Context& c)
+ : EmitterBase (c),
+ read_type_name_emitter_ (c),
+ type_name_emitter_ (c)
+{
+ read_belongs_.node_traverser (read_type_name_emitter_);
+
+ edge_traverser (get_raises_);
+ get_raises_.node_traverser (type_name_emitter_);
+}
+
+// ReadWriteAttribute
+//
+void
+AttributeHeaderEmitter::pre (SemanticGraph::ReadWriteAttribute& a)
+{
+ os << "virtual ";
+
+ Traversal::ReadWriteAttribute::belongs (a, read_belongs_);
+
+ os << endl;
+}
+
+void
+AttributeHeaderEmitter::name (SemanticGraph::ReadWriteAttribute& a)
+{
+ os << a.name () << " ()" << endl;
+}
+
+void
+AttributeHeaderEmitter::get_raises_none (SemanticGraph::ReadWriteAttribute&)
+{
+ os << STRS[EXCP_SNGL];
+}
+
+void
+AttributeHeaderEmitter::get_raises_pre (SemanticGraph::ReadWriteAttribute&)
+{
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+}
+
+void
+AttributeHeaderEmitter::get_raises_post (SemanticGraph::ReadWriteAttribute&)
+{
+ os << "))";
+}
+
+void
+AttributeHeaderEmitter::set_raises (SemanticGraph::ReadWriteAttribute&)
+{
+}
+
+void
+AttributeHeaderEmitter::post (SemanticGraph::ReadWriteAttribute& a)
+{
+ os << ";" << endl;
+
+ WriteAttributeHeaderEmitter write_attribute_emitter (ctx);
+ write_attribute_emitter.traverse (a);
+}
+
+void
+AttributeHeaderEmitter::comma (SemanticGraph::ReadWriteAttribute&)
+{
+ os << "," << endl;
+}
+
+// ReadAttribute
+//
+void
+AttributeHeaderEmitter::pre (SemanticGraph::ReadAttribute& a)
+{
+ os << "virtual ";
+
+ Traversal::ReadAttribute::belongs (a, read_belongs_);
+
+ os << endl;
+}
+
+void
+AttributeHeaderEmitter::name (SemanticGraph::ReadAttribute& a)
+{
+ os << a.name () << " ()" << endl;
+}
+
+void
+AttributeHeaderEmitter::get_raises_none (SemanticGraph::ReadAttribute&)
+{
+ os << STRS[EXCP_SNGL];
+}
+
+void
+AttributeHeaderEmitter::get_raises_pre (SemanticGraph::ReadAttribute&)
+{
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+}
+
+void
+AttributeHeaderEmitter::get_raises_post (SemanticGraph::ReadAttribute&)
+{
+ os << "))";
+}
+
+void
+AttributeHeaderEmitter::set_raises (SemanticGraph::ReadAttribute&)
+{
+}
+
+void
+AttributeHeaderEmitter::post (SemanticGraph::ReadAttribute&)
+{
+ os << ";" << endl;
+}
+
+void
+AttributeHeaderEmitter::comma (SemanticGraph::ReadAttribute&)
+{
+ os << "," << endl;
+}
+
diff --git a/modules/CIAO/CIDLC/AttributeHeaderEmitters.hpp b/modules/CIAO/CIDLC/AttributeHeaderEmitters.hpp
new file mode 100644
index 00000000000..f4318ad0073
--- /dev/null
+++ b/modules/CIAO/CIDLC/AttributeHeaderEmitters.hpp
@@ -0,0 +1,119 @@
+// file : CIDLC/AttributeHeaderEmitters.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef ATTRIBUTEHEADEREMITTERS_HPP
+#define ATTRIBUTEHEADEREMITTERS_HPP
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "CorbaTypeNameEmitters.hpp"
+#include "UtilityTypeNameEmitters.hpp"
+#include "EmitterBase.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+struct WriteAttributeHeaderEmitter : Traversal::ReadWriteAttribute,
+ EmitterBase
+{
+ WriteAttributeHeaderEmitter (Context& c);
+
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ get_raises (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ set_raises_none (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ set_raises_pre (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ set_raises_post (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ post (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ comma (SemanticGraph::ReadWriteAttribute&);
+
+ private:
+ INArgTypeNameEmitter write_type_name_emitter_;
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs write_belongs_;
+ Traversal::SetRaises set_raises_;
+};
+
+struct AttributeHeaderEmitter : Traversal::ReadAttribute,
+ Traversal::ReadWriteAttribute,
+ EmitterBase
+{
+ AttributeHeaderEmitter (Context&);
+
+ // ReadWriteAttribute
+ //
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ get_raises_none (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ get_raises_pre (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ get_raises_post (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ set_raises (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ post (SemanticGraph::ReadWriteAttribute&);
+
+ virtual void
+ comma (SemanticGraph::ReadWriteAttribute&);
+
+ // ReadAttribute
+ //
+ virtual void
+ pre (SemanticGraph::ReadAttribute&);
+
+ virtual void
+ name (SemanticGraph::ReadAttribute&);
+
+ virtual void
+ get_raises_none (SemanticGraph::ReadAttribute&);
+
+ virtual void
+ get_raises_pre (SemanticGraph::ReadAttribute&);
+
+ virtual void
+ get_raises_post (SemanticGraph::ReadAttribute&);
+
+ virtual void
+ set_raises (SemanticGraph::ReadAttribute&);
+
+ virtual void
+ post (SemanticGraph::ReadAttribute&);
+
+ virtual void
+ comma (SemanticGraph::ReadAttribute&);
+
+private:
+ ReturnTypeNameEmitter read_type_name_emitter_;
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs read_belongs_;
+ Traversal::GetRaises get_raises_;
+};
+
+#endif // ATTRIBUTEHEADEREMITTERS_HPP
diff --git a/modules/CIAO/CIDLC/AttributeSourceEmitters_T.hpp b/modules/CIAO/CIDLC/AttributeSourceEmitters_T.hpp
new file mode 100644
index 00000000000..9f601d27de7
--- /dev/null
+++ b/modules/CIAO/CIDLC/AttributeSourceEmitters_T.hpp
@@ -0,0 +1,360 @@
+// file : CIDLC/AttributeSourceEmitters_T.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef ATTRIBUTESOURCEEMITTERS_T_HPP
+#define ATTRIBUTESOURCEEMITTERS_T_HPP
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "Literals.hpp"
+#include "CorbaTypeNameEmitters.hpp"
+#include "UtilityTypeNameEmitters.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+using namespace StringLiterals;
+
+template <typename T>
+struct WriteAttributeSourceEmitter : Traversal::ReadWriteAttribute,
+ EmitterBase
+{
+ WriteAttributeSourceEmitter (Context& c,
+ T& scope,
+ bool swapping,
+ bool exec_src)
+ : EmitterBase (c),
+ scope_ (scope),
+ write_type_name_emitter_ (c),
+ type_name_emitter_ (c),
+ swapping_ (swapping),
+ exec_src_ (exec_src)
+ {
+ write_belongs_.node_traverser (write_type_name_emitter_);
+ edge_traverser (set_raises_);
+ set_raises_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ gen_swapping_set ()
+ {
+ os << "this->activate_component (" << ");"
+ << endl;
+ }
+
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << "void" << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << scope_.name ()
+ << (exec_src_ ? "_exec_i::" : "_Servant::")
+ << a.name () << " (" << endl;
+
+ Traversal::ReadWriteAttribute::belongs (a, write_belongs_);
+
+ os << (exec_src_ ? " /* " : " ")
+ << a.name ()
+ << (exec_src_ ? " */" : "") << endl
+ << ")" << endl;
+ }
+
+ virtual void
+ get_raises (SemanticGraph::ReadWriteAttribute&)
+ {
+ }
+
+ virtual void
+ set_raises_none (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ set_raises_pre (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ set_raises_post (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << "))" << endl;
+ }
+
+ virtual void
+ post (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << "{";
+
+ if (exec_src_)
+ {
+ os << STRS[YCH];
+ }
+ else
+ {
+ if (swapping_)
+ {
+ this->gen_swapping_set ();
+ }
+
+ os << "this->executor_->" << a.name () << " (" << endl
+ << a.name () << endl
+ << ");" << endl;
+ }
+
+ os << "}";
+ }
+
+ virtual void
+ comma (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << "," << endl;
+ }
+
+protected:
+ T& scope_;
+ Traversal::Belongs write_belongs_;
+
+private:
+ INArgTypeNameEmitter write_type_name_emitter_;
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::SetRaises set_raises_;
+ bool swapping_;
+ bool exec_src_;
+};
+
+template <typename T>
+struct AttributeSourceEmitter : Traversal::ReadAttribute,
+ Traversal::ReadWriteAttribute,
+ EmitterBase
+{
+ AttributeSourceEmitter (Context& c, T& scope, bool exec_src = false)
+ : EmitterBase (c),
+ scope_ (scope),
+ read_type_name_emitter_ (c),
+ type_name_emitter_ (c),
+ return_emitter_ (c),
+ exec_src_ (exec_src)
+ {
+ read_belongs_.node_traverser (read_type_name_emitter_);
+ return_belongs_.node_traverser (return_emitter_);
+ edge_traverser (get_raises_);
+ get_raises_.node_traverser (type_name_emitter_);
+ }
+
+ // ReadWriteAttribute
+ //
+
+ // Overridden by facet attribute emitter in servant source generator.
+ virtual void
+ gen_swapping_get (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << "this->activate_component ();";
+
+ Traversal::ReadWriteAttribute::belongs (a, ace_check_return_belongs_);
+
+ os << endl;
+ }
+
+ // Overridden by facet attribute emitter in servant source generator.
+ virtual void
+ gen_write_operation (SemanticGraph::ReadWriteAttribute& a,
+ bool swapping)
+ {
+ WriteAttributeSourceEmitter<T> write_attribute_emitter (ctx,
+ scope_,
+ swapping,
+ exec_src_);
+ write_attribute_emitter.traverse (a);
+ }
+
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute& a)
+ {
+ Traversal::ReadWriteAttribute::belongs (a, read_belongs_);
+
+ os << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << scope_.name ()
+ << (exec_src_ ? "_exec_i::" : "_Servant::")
+ << a.name () << " (" << endl
+ << ")" << endl;
+ }
+
+ virtual void
+ get_raises_none (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << STRS[EXCP_SNGL] << endl;
+ }
+
+ virtual void
+ get_raises_pre (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ get_raises_post (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << "))" << endl;
+ }
+
+ virtual void
+ set_raises (SemanticGraph::ReadWriteAttribute&)
+ {
+ }
+
+ virtual void
+ post (SemanticGraph::ReadWriteAttribute& a)
+ {
+ bool swapping = false;
+
+ os << "{";
+
+ if (exec_src_)
+ {
+ os << STRS[YCH] << endl;
+
+ Traversal::ReadWriteAttribute::belongs (a, return_belongs_);
+ }
+ else
+ {
+ string swap_option = ctx.cl ().get_value ("custom-container", "");
+ swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+ {
+ this->gen_swapping_get (a);
+ }
+
+ os << "return this->executor_->" << a.name () << " ();";
+ }
+
+ os << "}";
+
+ this->gen_write_operation (a, swapping);
+ }
+
+ virtual void
+ comma (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << "," << endl;
+ }
+
+ // ReadAttribute
+ //
+
+ // Overridden by facet attribute emitter in servant source generator.
+ virtual void
+ gen_swapping_get (SemanticGraph::ReadAttribute& a)
+ {
+ os << "this->activate_component ();";
+
+ Traversal::ReadAttribute::belongs (a, ace_check_return_belongs_);
+
+ os << endl;
+ }
+
+ virtual void
+ pre (SemanticGraph::ReadAttribute& a)
+ {
+ Traversal::ReadAttribute::belongs (a, read_belongs_);
+
+ os << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::ReadAttribute& a)
+ {
+ os << scope_.name ()
+ << (exec_src_ ? "_exec_i::" : "_Servant::")
+ << a.name () << " (" << endl
+ << ")" << endl;
+ }
+
+ virtual void
+ get_raises_none (SemanticGraph::ReadAttribute&)
+ {
+ os << STRS[EXCP_SNGL] << endl;
+ }
+
+ virtual void
+ get_raises_pre (SemanticGraph::ReadAttribute&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ get_raises_post (SemanticGraph::ReadAttribute&)
+ {
+ os << "))" << endl;
+ }
+
+ virtual void
+ set_raises (SemanticGraph::ReadAttribute&)
+ {
+ }
+
+ virtual void
+ post (SemanticGraph::ReadAttribute& a)
+ {
+ bool swapping = false;
+
+ os << "{";
+
+ if (exec_src_)
+ {
+ os << STRS[YCH] << endl;
+
+ Traversal::ReadAttribute::belongs (a, return_belongs_);
+ }
+ else
+ {
+ string swap_option = ctx.cl ().get_value ("custom-container", "");
+ swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+ {
+ this->gen_swapping_get (a);
+ }
+
+ os << "return this->executor_->" << a.name () << " ();";
+ }
+
+ os << "}";
+ }
+
+ virtual void
+ comma (SemanticGraph::ReadAttribute&)
+ {
+ os << "," << endl;
+ }
+
+protected:
+ T& scope_;
+
+private:
+ ReturnTypeNameEmitter read_type_name_emitter_;
+ FullTypeNameEmitter type_name_emitter_;
+ NullReturnEmitter return_emitter_;
+ Traversal::Belongs read_belongs_;
+ Traversal::Belongs return_belongs_;
+ Traversal::Belongs ace_check_return_belongs_;
+ Traversal::GetRaises get_raises_;
+ bool exec_src_;
+};
+
+#endif // ATTRIBUTESOURCEEMITTERS_T_HPP
diff --git a/modules/CIAO/CIDLC/CIDLC.mpc b/modules/CIAO/CIDLC/CIDLC.mpc
new file mode 100644
index 00000000000..034bf35a71b
--- /dev/null
+++ b/modules/CIAO/CIDLC/CIDLC.mpc
@@ -0,0 +1,16 @@
+//$Id$
+
+project(CIDLC): cidlc {
+ exename = cidlc
+ after += IDL2 IDL3 CIDL CodeGenerationKit CompilerElements
+ install = ../bin
+ libs += CIDL IDL3 IDL2 CodeGenerationKit CompilerElements
+
+ Source_Files {
+ *.cpp
+ }
+
+ Header_Files {
+ *.hpp
+ }
+}
diff --git a/modules/CIAO/CIDLC/CIDLC.mwc b/modules/CIAO/CIDLC/CIDLC.mwc
new file mode 100644
index 00000000000..7cddcf9a001
--- /dev/null
+++ b/modules/CIAO/CIDLC/CIDLC.mwc
@@ -0,0 +1,10 @@
+// $Id:
+workspace {
+ cmdline += -static
+ ../CCF/CCF/CIDL
+ ../CCF/CCF/IDL2
+ ../CCF/CCF/CodeGenerationKit
+ ../CCF/CCF/CompilerElements
+ ../CCF/CCF/IDL3
+ CIDLC.mpc
+}
diff --git a/modules/CIAO/CIDLC/Collectors.hpp b/modules/CIAO/CIDLC/Collectors.hpp
new file mode 100644
index 00000000000..e87667579b5
--- /dev/null
+++ b/modules/CIAO/CIDLC/Collectors.hpp
@@ -0,0 +1,280 @@
+// file : CIDLC/Collectors.hpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef COLLECTORS_HPP
+#define COLLECTORS_HPP
+
+#include <map>
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+class Declarations
+{
+public:
+ bool
+ add (CCF::IDL3::SyntaxTree::HomeDefPtr const& h)
+ {
+ return homes_.insert (h).second;
+ }
+
+ bool
+ add (CCF::IDL3::SyntaxTree::ComponentDefPtr const& c)
+ {
+ return components_.insert (c).second;
+ }
+
+ bool
+ add (CCF::CIDL::SyntaxTree::CompositionPtr const& cs,
+ CCF::IDL3::SyntaxTree::ComponentDefPtr const& cn)
+ {
+ return compositions_.insert (make_pair(cs, cn)).second;
+ }
+
+ bool
+ add (CCF::IDL3::SyntaxTree::UnconstrainedInterfaceDeclPtr const& i)
+ {
+ return interfaces_.insert (i).second
+ && interface_names_.insert (i->name ()).second;
+ }
+
+public:
+ bool
+ find (CCF::IDL3::SyntaxTree::HomeDefPtr const& h) const
+ {
+ return homes_.find (h) != homes_.end ();
+ }
+
+ bool
+ find (CCF::IDL3::SyntaxTree::ComponentDefPtr const& c) const
+ {
+ return components_.find (c) != components_.end ();
+ }
+
+ bool
+ find (CCF::CIDL::SyntaxTree::CompositionPtr const& c) const
+ {
+ return compositions_.find (c) != compositions_.end ();
+ }
+
+ bool
+ find (CCF::IDL2::SyntaxTree::UnconstrainedInterfaceDefPtr const& i) const
+ {
+ return interface_names_.find (i->name ()) != interface_names_.end ();
+ }
+
+public:
+ CCF::IDL3::SyntaxTree::ComponentDefPtr
+ resolve (CCF::CIDL::SyntaxTree::CompositionPtr const& c) const
+ {
+ CompositionMap::const_iterator i = compositions_.find (c);
+ if (i != compositions_.end ())
+ {
+ return i->second;
+ }
+ else
+ {
+ return CCF::IDL3::SyntaxTree::ComponentDefPtr (0);
+ }
+ }
+
+public:
+ bool
+ contains_suborder (CCF::CIDL::SyntaxTree::Order const& o) const
+ {
+ for (CCF::IDL2::SyntaxTree::UnconstrainedInterfaceDeclSet::const_iterator i =
+ interfaces_.begin ();
+ i != interfaces_.end ();
+ i++)
+ {
+ if (o.suborder ((*i)->order ())) return true;
+ }
+
+ for (CCF::IDL3::SyntaxTree::ComponentDefSet::const_iterator i = components_.begin ();
+ i != components_.end ();
+ i++)
+ {
+ if (o.suborder ((*i)->order ())) return true;
+ }
+
+ for (CCF::IDL3::SyntaxTree::HomeDefSet::const_iterator i = homes_.begin ();
+ i != homes_.end ();
+ i++)
+ {
+ if (o.suborder ((*i)->order ())) return true;
+ }
+
+ for (CompositionMap::const_iterator i = compositions_.begin ();
+ i != compositions_.end ();
+ i++)
+ {
+ if (o.suborder (i->first->order ())) return true;
+ }
+
+ return false;
+ }
+
+private:
+ typedef
+ std::map <CCF::CIDL::SyntaxTree::CompositionPtr,
+ CCF::IDL3::SyntaxTree::ComponentDefPtr,
+ CCF::CIDL::SyntaxTree::CompositionOrderComparator> CompositionMap;
+
+ CCF::IDL3::SyntaxTree::HomeDefSet homes_;
+ CCF::IDL3::SyntaxTree::ComponentDefSet components_;
+ CompositionMap compositions_;
+ CCF::IDL2::SyntaxTree::UnconstrainedInterfaceDeclSet interfaces_;
+ CCF::IDL2::SyntaxTree::ScopedNameSet interface_names_;
+};
+
+
+//
+//
+//
+class HomeCollector : public CCF::IDL3::Traversal::HomeDef
+{
+public:
+ HomeCollector (Declarations& declarations)
+ : declarations_ (declarations)
+ {
+ }
+
+ virtual void
+ traverse (CCF::CIDL::SyntaxTree::HomeDefPtr const& h)
+ {
+ CCF::CIDL::SyntaxTree::ScopedName n (h->name ());
+
+ CCF::CIDL::SyntaxTree::ScopedName main (n.scope (), "CCM_" + n.simple ());
+ CCF::CIDL::SyntaxTree::ScopedName expl (n.scope (), "CCM_" + n.simple () + "Explicit");
+ CCF::CIDL::SyntaxTree::ScopedName impl (n.scope (), "CCM_" + n.simple () + "Implicit");
+
+ // Check if mapping has already been provided.
+ if (h->table ().exist (main) ||
+ h->table ().exist (expl) ||
+ h->table ().exist (impl)) return;
+
+ if (declarations_.add (h))
+ {
+ // Note that I don't go after components that inherited home manages
+ // because it will be handled by component inheritance tree.
+ //
+ if (h->inherits ()) traverse (h->inherits ().resolve ());
+ }
+ }
+
+private:
+ Declarations& declarations_;
+};
+
+//
+//
+//
+class ComponentCollector : public CCF::IDL3::Traversal::ComponentDef
+{
+public:
+ ComponentCollector (Declarations& declarations)
+ : declarations_ (declarations)
+ {
+ }
+
+ virtual void
+ pre (CCF::IDL3::SyntaxTree::ComponentDefPtr const& c)
+ {
+ CCF::CIDL::SyntaxTree::ScopedName n (c->name ());
+
+ CCF::CIDL::SyntaxTree::ScopedName monolith (n.scope (), "CCM_" + n.simple ());
+ CCF::CIDL::SyntaxTree::ScopedName context (n.scope (), "CCM_" + n.simple () + "_Context");
+
+ // Check if mapping has already been provided.
+ if (c->table ().exist (context) ||
+ c->table ().exist (monolith)) return;
+
+ if(declarations_.add (c))
+ {
+ if (c->inherits ())
+ {
+ traverse (c->inherits ().resolve ());
+ }
+ }
+ }
+
+private:
+ Declarations& declarations_;
+};
+
+//
+//
+//
+class ProvidedInterfaceCollector : public CCF::IDL3::Traversal::ProvidesDecl
+{
+public:
+ ProvidedInterfaceCollector (Declarations& declarations)
+ : declarations_ (declarations)
+ {
+ }
+
+ virtual void
+ traverse (CCF::IDL3::SyntaxTree::ProvidesDeclPtr const& i)
+ {
+ //@@ CCM issue: interface should be defined at this point
+ CCF::IDL2::SyntaxTree::UnconstrainedInterfaceDeclPtr def
+ (i->type ()
+ ->dynamic_type<CCF::CIDL::SyntaxTree::UnconstrainedInterfaceDecl> ());
+
+ if (def != 0)
+ {
+ // Add to the list if it's not already there.
+ declarations_.add (def);
+ }
+ }
+
+private:
+ Declarations& declarations_;
+};
+
+
+//
+//
+//
+class HomeExecutorCollector : public CCF::CIDL::Traversal::HomeExecutor
+{
+public:
+ HomeExecutorCollector (Declarations& declarations,
+ CCF::CIDL::Traversal::Dispatcher* home_collector,
+ CCF::CIDL::Traversal::Dispatcher* component_collector)
+ : declarations_ (declarations),
+ home_collector_ (home_collector),
+ component_collector_ (component_collector)
+ {
+ }
+
+ virtual void
+ traverse (CCF::CIDL::SyntaxTree::HomeExecutorPtr const& he)
+ {
+ CCF::CIDL::SyntaxTree::HomeDefPtr home (he->implements ());
+ home_collector_->dispatch (home);
+
+ CCF::CIDL::SyntaxTree::ComponentDefPtr component (home->manages ());
+ component_collector_->dispatch (component);
+
+ CCF::CIDL::SyntaxTree::CompositionPtr
+ composition (he->scope ()->dynamic_type<CCF::CIDL::SyntaxTree::Composition> ());
+ declarations_.add (composition, component);
+ }
+
+private:
+ Declarations& declarations_;
+
+ CCF::CIDL::Traversal::Dispatcher* home_collector_;
+ CCF::CIDL::Traversal::Dispatcher* component_collector_;
+};
+
+#endif // COLLECTORS_HPP
+
+/*
+ * Local Variables:
+ * mode: C++
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/modules/CIAO/CIDLC/CompositionEmitter.cpp b/modules/CIAO/CIDLC/CompositionEmitter.cpp
new file mode 100644
index 00000000000..d477ae4a3b8
--- /dev/null
+++ b/modules/CIAO/CIDLC/CompositionEmitter.cpp
@@ -0,0 +1,27 @@
+// file : CIDLC/CompositionEmitter.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "CompositionEmitter.hpp"
+#include "Literals.hpp"
+
+using namespace StringLiterals;
+
+CompositionEmitter::CompositionEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+CompositionEmitter::pre (Type& t)
+{
+ ctx.composition_name (t.name ().unescaped_str ());
+
+ os << STRS[CIDL_NS] << t.name () << "{";
+}
+
+void
+CompositionEmitter::post (Type&)
+{
+ os << "}";
+}
diff --git a/modules/CIAO/CIDLC/CompositionEmitter.hpp b/modules/CIAO/CIDLC/CompositionEmitter.hpp
new file mode 100644
index 00000000000..c6aeab17229
--- /dev/null
+++ b/modules/CIAO/CIDLC/CompositionEmitter.hpp
@@ -0,0 +1,26 @@
+// file : CIDLC/CompositionEmitter.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef COMPOSITIONEMITTER_HPP
+#define COMPOSITIONEMITTER_HPP
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "EmitterBase.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+struct CompositionEmitter : Traversal::Composition,
+ EmitterBase
+{
+ CompositionEmitter (Context& c);
+
+ virtual void pre (Type&);
+
+ virtual void post (Type&);
+};
+
+#endif // COMPOSITIONEMITTER_HPP
diff --git a/modules/CIAO/CIDLC/CorbaTypeNameEmitters.cpp b/modules/CIAO/CIDLC/CorbaTypeNameEmitters.cpp
new file mode 100644
index 00000000000..84507c151b6
--- /dev/null
+++ b/modules/CIAO/CIDLC/CorbaTypeNameEmitters.cpp
@@ -0,0 +1,2014 @@
+// file : CIDLC/CorbaTypeNameEmitter.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "CorbaTypeNameEmitters.hpp"
+#include "Literals.hpp"
+
+#include <ostream>
+
+using namespace std;
+using namespace StringLiterals;
+
+CorbaTypeNameEmitter::CorbaTypeNameEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Void&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Boolean&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Octet&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Char&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Wchar&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Short&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (UnsignedShort&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Long&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (UnsignedLong&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (LongLong&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (UnsignedLongLong&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Float&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Double&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (String&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::BoundedString&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Wstring&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Object&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (ValueBase&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (Any&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::Array&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::Enum&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::Struct&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::Union&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::BoundedSequence&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::UnboundedSequence&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::Interface&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::ValueType&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::EventType&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::Component&)
+{
+}
+
+void
+CorbaTypeNameEmitter::traverse (SemanticGraph::Home&)
+{
+}
+
+// ====================================================================
+
+ReturnTypeNameEmitter::ReturnTypeNameEmitter (Context& c)
+ : CorbaTypeNameEmitter (c)
+{
+}
+
+void
+ReturnTypeNameEmitter::traverse (Void&)
+{
+ os << "void";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Boolean&)
+{
+ os << "::CORBA::Boolean";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Octet&)
+{
+ os << "::CORBA::Octet";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Char&)
+{
+ os << "::CORBA::Char";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Wchar&)
+{
+ os << "::CORBA::WChar";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Short&)
+{
+ os << "::CORBA::Short";
+}
+
+void
+ReturnTypeNameEmitter::traverse (UnsignedShort&)
+{
+ os << "::CORBA::UShort";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Long&)
+{
+ os << "::CORBA::Long";
+}
+
+void
+ReturnTypeNameEmitter::traverse (UnsignedLong&)
+{
+ os << "::CORBA::ULong";
+}
+
+void
+ReturnTypeNameEmitter::traverse (LongLong&)
+{
+ os << "::CORBA::LongLong";
+}
+
+void
+ReturnTypeNameEmitter::traverse (UnsignedLongLong&)
+{
+ os << "::CORBA::ULongLong";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Float&)
+{
+ os << "::CORBA::Float";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Double&)
+{
+ os << "::CORBA::Double";
+}
+
+void
+ReturnTypeNameEmitter::traverse (String&)
+{
+ os << "char *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::BoundedString&)
+{
+ os << "char *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Wstring&)
+{
+ os << "::CORBA::WChar *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+ os << "::CORBA::WChar *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Object&)
+{
+ os << "::CORBA::Object_ptr";
+}
+
+void
+ReturnTypeNameEmitter::traverse (ValueBase&)
+{
+ os << "::CORBA::ValueBase *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (Any&)
+{
+ os << "::CORBA::Any *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::Array& a)
+{
+ os << a.scoped_name () << "_slice *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::Enum& e)
+{
+ os << e.scoped_name ();
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::Struct& s)
+{
+ // This should always be in the context, since the SizeTypeCalculator
+ // is executed before the servant code generators.
+ bool var_size = s.context ().get<bool> (STRS[VAR_SIZE]);
+
+ os << s.scoped_name ();
+
+ if (var_size)
+ {
+ os << " *";
+ }
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::Union& u)
+{
+ // This should always be in the context, since the SizeTypeCalculator
+ // is executed before the servant code generators.
+ bool var_size = u.context ().get<bool> (STRS[VAR_SIZE]);
+
+ os << u.scoped_name ();
+
+ if (var_size)
+ {
+ os << " *";
+ }
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::BoundedSequence& s)
+{
+ os << s.scoped_name () << " *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::UnboundedSequence& s)
+{
+ os << s.scoped_name () << " *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::Interface& i)
+{
+ os << i.scoped_name () << "_ptr";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::ValueType& v)
+{
+ os << v.scoped_name () << " *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::EventType& e)
+{
+ os << e.scoped_name () << " *";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::Component& c)
+{
+ os << c.scoped_name () << "_ptr";
+}
+
+void
+ReturnTypeNameEmitter::traverse (SemanticGraph::Home& h)
+{
+ os << h.scoped_name () << "_ptr";
+}
+
+// ===============================================================
+
+INArgTypeNameEmitter::INArgTypeNameEmitter (Context& c)
+ : CorbaTypeNameEmitter (c)
+{
+}
+
+void
+INArgTypeNameEmitter::traverse (Boolean&)
+{
+ os << "::CORBA::Boolean";
+}
+
+void
+INArgTypeNameEmitter::traverse (Octet&)
+{
+ os << "::CORBA::Octet";
+}
+
+void
+INArgTypeNameEmitter::traverse (Char&)
+{
+ os << "::CORBA::Char";
+}
+
+void
+INArgTypeNameEmitter::traverse (Wchar&)
+{
+ os << "::CORBA::WChar";
+}
+
+void
+INArgTypeNameEmitter::traverse (Short&)
+{
+ os << "::CORBA::Short";
+}
+
+void
+INArgTypeNameEmitter::traverse (UnsignedShort&)
+{
+ os << "::CORBA::UShort";
+}
+
+void
+INArgTypeNameEmitter::traverse (Long&)
+{
+ os << "::CORBA::Long";
+}
+
+void
+INArgTypeNameEmitter::traverse (UnsignedLong&)
+{
+ os << "::CORBA::ULong";
+}
+
+void
+INArgTypeNameEmitter::traverse (LongLong&)
+{
+ os << "::CORBA::LongLong";
+}
+
+void
+INArgTypeNameEmitter::traverse (UnsignedLongLong&)
+{
+ os << "::CORBA::ULongLong";
+}
+
+void
+INArgTypeNameEmitter::traverse (Float&)
+{
+ os << "::CORBA::Float";
+}
+
+void
+INArgTypeNameEmitter::traverse (Double&)
+{
+ os << "::CORBA::Double";
+}
+
+void
+INArgTypeNameEmitter::traverse (String&)
+{
+ os << "const char *";
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::BoundedString&)
+{
+ os << "const char *";
+}
+
+void
+INArgTypeNameEmitter::traverse (Wstring&)
+{
+ os << "const ::CORBA::WChar *";
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+ os << "const ::CORBA::WChar *";
+}
+
+void
+INArgTypeNameEmitter::traverse (Object&)
+{
+ os << "::CORBA::Object_ptr";
+}
+
+void
+INArgTypeNameEmitter::traverse (ValueBase&)
+{
+ os << "::CORBA::ValueBase *";
+}
+
+void
+INArgTypeNameEmitter::traverse (Any&)
+{
+ os << "const ::CORBA::Any &";
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::Array& a)
+{
+ os << "const " << a.scoped_name ();
+}
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::Enum& e)
+{
+ os << e.scoped_name ();
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::Struct& s)
+{
+ os << "const " << s.scoped_name () << " &";;
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::Union& u)
+{
+ os << "const " << u.scoped_name () << " &";;
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::BoundedSequence& s)
+{
+ os << "const " << s.scoped_name () << " &";;
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::UnboundedSequence& s)
+{
+ os << "const " << s.scoped_name () << " &";;
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::Interface& i)
+{
+ os << i.scoped_name () << "_ptr";
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::ValueType& v)
+{
+ os << v.scoped_name () << " *";
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::EventType& e)
+{
+ os << e.scoped_name () << " *";
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::Component& c)
+{
+ os << c.scoped_name () << "_ptr";
+}
+
+void
+INArgTypeNameEmitter::traverse (SemanticGraph::Home& h)
+{
+ os << h.scoped_name () << "_ptr";
+}
+
+// ===============================================================
+
+INOUTArgTypeNameEmitter::INOUTArgTypeNameEmitter (Context& c)
+ : CorbaTypeNameEmitter (c)
+{
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Boolean&)
+{
+ os << "::CORBA::Boolean &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Octet&)
+{
+ os << "::CORBA::Octet &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Char&)
+{
+ os << "::CORBA::Char &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Wchar&)
+{
+ os << "::CORBA::WChar &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Short&)
+{
+ os << "::CORBA::Short &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (UnsignedShort&)
+{
+ os << "::CORBA::UShort &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Long&)
+{
+ os << "::CORBA::Long &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (UnsignedLong&)
+{
+ os << "::CORBA::ULong &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (LongLong&)
+{
+ os << "::CORBA::LongLong &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (UnsignedLongLong&)
+{
+ os << "::CORBA::ULongLong &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Float&)
+{
+ os << "::CORBA::Float &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Double&)
+{
+ os << "::CORBA::Double &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (String&)
+{
+ os << "char *&";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::BoundedString&)
+{
+ os << "char *&";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Wstring&)
+{
+ os << "::CORBA::WChar *&";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+ os << "::CORBA::WChar *&";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Object&)
+{
+ os << "::CORBA::Object_ptr &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (ValueBase&)
+{
+ os << "::CORBA::ValueBase *&";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (Any&)
+{
+ os << "::CORBA::Any &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::Array& a)
+{
+ os << a.scoped_name ();
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::Enum& e)
+{
+ os << e.scoped_name () << " &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::Struct& s)
+{
+ os << s.scoped_name () << " &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::Union& u)
+{
+ os << u.scoped_name () << " &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::BoundedSequence& s)
+{
+ os << s.scoped_name () << " &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::UnboundedSequence& s)
+{
+ os << s.scoped_name () << " &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::Interface& i)
+{
+ os << i.scoped_name () << "_ptr &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::ValueType& v)
+{
+ os << v.scoped_name () << " *&";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::EventType& e)
+{
+ os << e.scoped_name () << " *&";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::Component& c)
+{
+ os << c.scoped_name () << "_ptr &";
+}
+
+void
+INOUTArgTypeNameEmitter::traverse (SemanticGraph::Home& h)
+{
+ os << h.scoped_name () << "_ptr";
+}
+
+// =================================================================
+
+OUTArgTypeNameEmitter::OUTArgTypeNameEmitter (Context& c)
+ : CorbaTypeNameEmitter (c)
+{
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Boolean&)
+{
+ os << "::CORBA::Boolean_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Octet&)
+{
+ os << "::CORBA::Octet_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Char&)
+{
+ os << "::CORBA::Char_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Wchar&)
+{
+ os << "::CORBA::WChar_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Short&)
+{
+ os << "::CORBA::Short_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (UnsignedShort&)
+{
+ os << "::CORBA::UShort_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Long&)
+{
+ os << "::CORBA::Long_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (UnsignedLong&)
+{
+ os << "::CORBA::ULong_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (LongLong&)
+{
+ os << "::CORBA::LongLong_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (UnsignedLongLong&)
+{
+ os << "::CORBA::ULongLong_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Float&)
+{
+ os << "::CORBA::Float_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Double&)
+{
+ os << "::CORBA::Double_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (String&)
+{
+ os << "::CORBA::String_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::BoundedString& s)
+{
+ os << s.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Wstring&)
+{
+ os << "::CORBA::WString_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::BoundedWideString& s)
+{
+ os << s.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Object&)
+{
+ os << "::CORBA::Object_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (ValueBase&)
+{
+ os << "::CORBA::ValueBase_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (Any&)
+{
+ os << "::CORBA::Any_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::Array& a)
+{
+ os << a.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::Enum& e)
+{
+ os << e.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::Struct& s)
+{
+ os << s.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::Union& u)
+{
+ os << u.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::BoundedSequence& s)
+{
+ os << s.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::UnboundedSequence& s)
+{
+ os << s.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::Interface& i)
+{
+ os << i.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::ValueType& v)
+{
+ os << v.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::EventType& e)
+{
+ os << e.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::Component& c)
+{
+ os << c.scoped_name () << "_out";
+}
+
+void
+OUTArgTypeNameEmitter::traverse (SemanticGraph::Home& h)
+{
+ os << h.scoped_name () << "_ptr";
+}
+
+// ====================================================================
+
+NullReturnEmitter::NullReturnEmitter (Context& c)
+ : CorbaTypeNameEmitter (c)
+{
+}
+
+void
+NullReturnEmitter::traverse (Boolean&)
+{
+ os << "return false;";
+}
+
+void
+NullReturnEmitter::traverse (Octet&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (Char&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (Wchar&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (Short&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (UnsignedShort&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (Long&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (UnsignedLong&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (LongLong&)
+{
+ os << "return ACE_CDR_LONGLONG_INITIALIZER;";
+}
+
+void
+NullReturnEmitter::traverse (UnsignedLongLong&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (Float&)
+{
+ os << "return 0.0f;";
+}
+
+void
+NullReturnEmitter::traverse (Double&)
+{
+ os << "return 0.0;";
+}
+
+void
+NullReturnEmitter::traverse (String&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::BoundedString&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (Wstring&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (Object&)
+{
+ os << "return ::CORBA::Object::_nil ();";
+}
+
+void
+NullReturnEmitter::traverse (ValueBase&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (Any&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::Array&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::Enum& e)
+{
+ os << e.scoped_name () << " retval;" << endl
+ << "return retval;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::Struct& s)
+{
+ // This should always be in the context, since the SizeTypeCalculator
+ // is executed before the servant code generators.
+ bool var_size = s.context ().get<bool> (STRS[VAR_SIZE]);
+
+ if (var_size)
+ {
+ os << "return 0;";
+ }
+ else
+ {
+ os << s.scoped_name () << " retval;" << endl
+ << "return retval;";
+ }
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::Union& u)
+{
+ // This should always be in the context, since the SizeTypeCalculator
+ // is executed before the servant code generators.
+ bool var_size = u.context ().get<bool> (STRS[VAR_SIZE]);
+
+ if (var_size)
+ {
+ os << "return 0;";
+ }
+ else
+ {
+ os << u.scoped_name () << " retval;" << endl
+ << "return retval;";
+ }
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::BoundedSequence&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::UnboundedSequence&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::Interface& i)
+{
+ os << "return " << i.scoped_name () << "::_nil ();";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::ValueType&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::EventType&)
+{
+ os << "return 0;";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::Component& c)
+{
+ os << "return " << c.scoped_name () << "::_nil ();";
+}
+
+void
+NullReturnEmitter::traverse (SemanticGraph::Home& h)
+{
+ os << "return " << h.scoped_name () << "::_nil ();";
+}
+
+// ====================================================================
+/* Not currently used, but it was at one time and may be useful again.
+
+NullRHSEmitter::NullRHSEmitter (Context& c)
+ : CorbaTypeNameEmitter (c)
+{
+}
+
+void
+NullRHSEmitter::traverse (Boolean&)
+{
+ os << "= false;";
+}
+
+void
+NullRHSEmitter::traverse (Octet&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (Char&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (Wchar&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (Short&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (UnsignedShort&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (Long&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (UnsignedLong&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (LongLong&)
+{
+ os << "= ACE_CDR_LONGLONG_INITIALIZER;";
+}
+
+void
+NullRHSEmitter::traverse (UnsignedLongLong&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (Float&)
+{
+ os << "= 0.0f;";
+}
+
+void
+NullRHSEmitter::traverse (Double&)
+{
+ os << "= 0.0;";
+}
+
+void
+NullRHSEmitter::traverse (String&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::BoundedString&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (Wstring&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (Object&)
+{
+ os << "= ::CORBA::Object::_nil ();";
+}
+
+void
+NullRHSEmitter::traverse (ValueBase&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (Any&)
+{
+ // This will hopefully work both if the lhs is a pointer (for example
+ // RetunrTypeNameEmitter) or not (for example INArgTypeNameEmitter).
+ os << ";";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::Array&)
+{
+ // This will hopefully work both if the lhs is a slice pointer (for example
+ // RetunrTypeNameEmitter) or not (for example INArgTypeNameEmitter).
+ os << ";";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::Enum&)
+{
+ os << ";";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::Struct& s)
+{
+ // This should always be in the context, since the SizeTypeCalculator
+ // is executed before the servant code generators.
+ bool var_size = s.context ().get<bool> (STRS[VAR_SIZE]);
+
+ if (var_size)
+ {
+ os << "= 0;";
+ }
+ else
+ {
+ os << ";";
+ }
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::Union& u)
+{
+ // This should always be in the context, since the SizeTypeCalculator
+ // is executed before the servant code generators.
+ bool var_size = u.context ().get<bool> (STRS[VAR_SIZE]);
+
+ if (var_size)
+ {
+ os << "= 0;";
+ }
+ else
+ {
+ os << ";";
+ }
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::BoundedSequence&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::UnboundedSequence&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::Interface& i)
+{
+ os << "= " << i.scoped_name () << "::_nil ();";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::ValueType&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::EventType&)
+{
+ os << "= 0;";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::Component& c)
+{
+ os << "= " << c.scoped_name () << "::_nil ();";
+}
+
+void
+NullRHSEmitter::traverse (SemanticGraph::Home& h)
+{
+ os << "= " << h.scoped_name () << "::_nil ();";
+}
+*/
+// ====================================================================
+
+ExtractedTypeDeclEmitter::ExtractedTypeDeclEmitter (Context& c)
+ : CorbaTypeNameEmitter (c)
+{
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Boolean&)
+{
+ os << "::CORBA::Boolean " << STRS[EXTRACT_TMP] << " = false;"
+ << "::CORBA::Any::to_boolean " << STRS[EXTRACT]
+ << " (" << STRS[EXTRACT_TMP] << ");";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Octet&)
+{
+ os << "::CORBA::Octet " << STRS[EXTRACT_TMP] << " = 0;"
+ << "::CORBA::Any::to_octet " << STRS[EXTRACT]
+ << " (" << STRS[EXTRACT_TMP] << ");";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Char&)
+{
+ os << "::CORBA::Char " << STRS[EXTRACT_TMP] << " = 0;"
+ << "::CORBA::Any::to_char " << STRS[EXTRACT]
+ << " (" << STRS[EXTRACT_TMP] << ");";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Wchar&)
+{
+ os << "::CORBA::WChar " << STRS[EXTRACT_TMP] << " = 0;"
+ << "::CORBA::Any::to_wchar " << STRS[EXTRACT]
+ << " (" << STRS[EXTRACT_TMP] << ");";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Short&)
+{
+ os << "::CORBA::Short " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (UnsignedShort&)
+{
+ os << "::CORBA::UShort " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Long&)
+{
+ os << "::CORBA::Long " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (UnsignedLong&)
+{
+ os << "::CORBA::ULong " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (LongLong&)
+{
+ os << "::CORBA::LongLong " << STRS[EXTRACT]
+ << " = ACE_CDR_LONGLONG_INITIALIZER;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (UnsignedLongLong&)
+{
+ os << "::CORBA::ULongLong " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Float&)
+{
+ os << "::CORBA::Float " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Double&)
+{
+ os << "::CORBA::Double " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (String&)
+{
+ os << "const char * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::BoundedString&)
+{
+ os << "const char * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Wstring&)
+{
+ os << "::CORBA::WChar * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+ os << "::CORBA::WChar * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Object&)
+{
+ os << "::CORBA::Object_ptr " << STRS[EXTRACT]
+ << " = ::CORBA::Object::_nil ();";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (ValueBase&)
+{
+ os << "::CORBA::ValueBase * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (Any&)
+{
+ os << "::CORBA::Any * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::Array& a)
+{
+ os << a.scoped_name () << "_forany & " << STRS[EXTRACT] << ";";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::Enum& e)
+{
+ os << e.scoped_name () << " " << STRS[EXTRACT] << ";";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::Struct& s)
+{
+ os << s.scoped_name () << " * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::Union& u)
+{
+ os << u.scoped_name () << " * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::BoundedSequence& s)
+{
+ os << s.scoped_name () << " * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::UnboundedSequence& s)
+{
+ os << s.scoped_name () << " * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::Interface& i)
+{
+ os << i.scoped_name () << "_ptr " << STRS[EXTRACT] << " = "
+ << i.scoped_name () << "::_nil ();";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::ValueType& v)
+{
+ os << v.scoped_name () << " * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::EventType& e)
+{
+ os << e.scoped_name () << " * " << STRS[EXTRACT] << " = 0;";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::Component& c)
+{
+ os << c.scoped_name () << "_ptr " << STRS[EXTRACT] << " = "
+ << c.scoped_name () << "::_nil ();";
+}
+
+void
+ExtractedTypeDeclEmitter::traverse (SemanticGraph::Home& h)
+{
+ os << h.scoped_name () << "_ptr " << STRS[EXTRACT] << " = "
+ << h.scoped_name () << "::_nil ();";
+}
+
+// ====================================================================
+
+AssignFromExtractedEmitter::AssignFromExtractedEmitter (Context& c)
+ : CorbaTypeNameEmitter (c)
+{
+}
+
+void
+AssignFromExtractedEmitter::traverse (Boolean&)
+{
+ os << STRS[EXTRACT] << ".ref_";
+}
+
+void
+AssignFromExtractedEmitter::traverse (Octet&)
+{
+ os << STRS[EXTRACT] << ".ref_";
+}
+
+void
+AssignFromExtractedEmitter::traverse (Char&)
+{
+ os << STRS[EXTRACT] << ".ref_";
+}
+
+void
+AssignFromExtractedEmitter::traverse (Wchar&)
+{
+ os << STRS[EXTRACT] << ".ref_";
+}
+
+void
+AssignFromExtractedEmitter::traverse (Short&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (UnsignedShort&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (Long&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (UnsignedLong&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (LongLong&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (UnsignedLongLong&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (Float&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (Double&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (String&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::BoundedString&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (Wstring&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (Object&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (ValueBase&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (Any&)
+{
+ os << "*" << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::Array&)
+{
+ os << STRS[EXTRACT] << ".in ()";
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::Enum&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::Struct& s)
+{
+ // This should always be in the context, since the SizeTypeCalculator
+ // is executed before the servant code generators.
+ bool var_size = s.context ().get<bool> (STRS[VAR_SIZE]);
+
+ if (!var_size)
+ {
+ os << "*";
+ }
+
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::Union& u)
+{
+ // This should always be in the context, since the SizeTypeCalculator
+ // is executed before the servant code generators.
+ bool var_size = u.context ().get<bool> (STRS[VAR_SIZE]);
+
+ if (!var_size)
+ {
+ os << "*";
+ }
+
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::BoundedSequence&)
+{
+ os << "*" << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::UnboundedSequence&)
+{
+ os << "*" << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::Interface&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::ValueType&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::EventType&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::Component&)
+{
+ os << STRS[EXTRACT];
+}
+
+void
+AssignFromExtractedEmitter::traverse (SemanticGraph::Home&)
+{
+ os << STRS[EXTRACT];
+}
+
+// ====================================================================
+
+SetAttributeDelegationEmitter::SetAttributeDelegationEmitter (
+ Context& c,
+ SemanticGraph::ReadWriteAttribute& a
+ )
+ : CorbaTypeNameEmitter (c),
+ attr_ (a)
+ , assign_emitter_ (c)
+ , extract_emitter_ (c)
+{
+ assign_belongs_.node_traverser (assign_emitter_);
+ extract_belongs_.node_traverser (extract_emitter_);
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Boolean&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Octet&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Char&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Wchar&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Short&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (UnsignedShort&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Long&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (UnsignedLong&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (LongLong&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (UnsignedLongLong&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Float&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Double&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (String&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::BoundedString&)
+{
+ emit_error ("bounded string");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Wstring&)
+{
+ emit_error ("wstring");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::BoundedWideString&)
+{
+ emit_error ("bounded wstring");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Object&)
+{
+ emit_error ("CORBA::Object");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (ValueBase&)
+{
+ emit_error ("CORBA::ValueBase");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (Any&)
+{
+ emit_error ("CORBA::Any");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::Array&)
+{
+ emit_error ("array");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::Enum&)
+{
+ emit_delegation ();
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::Struct&)
+{
+ emit_error ("struct");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::Union&)
+{
+ emit_error ("union");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::BoundedSequence&)
+{
+ emit_error ("bounded sequence");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::UnboundedSequence&)
+{
+ emit_error ("unbounded sequence");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::Interface&)
+{
+ emit_error ("interface");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::ValueType&)
+{
+ emit_error ("valuetype");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::EventType&)
+{
+ emit_error ("eventtype");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::Component&)
+{
+ emit_error ("component");
+}
+
+void
+SetAttributeDelegationEmitter::traverse (SemanticGraph::Home&)
+{
+ emit_error ("home");
+}
+
+void
+SetAttributeDelegationEmitter::emit_delegation (void)
+{
+ open_if_block ();
+
+ Traversal::ReadWriteAttribute::belongs (attr_, extract_belongs_);
+
+ os << "descr_value >>= " << STRS[EXTRACT] << ";"
+ << "this->" << attr_.name () << " (";
+
+ Traversal::ReadWriteAttribute::belongs (attr_, assign_belongs_);
+
+ os << ");";
+
+ close_if_block ();
+}
+
+void
+SetAttributeDelegationEmitter::emit_error (const char *corba_kind)
+{
+ open_if_block ();
+
+ os << "ACE_ERROR ((" << endl
+ << " LM_ERROR," << endl
+ << " \"Component attributes of " << corba_kind << "\"" << endl
+ << " \"IDL type are not yet supported by CIAO\\n\"" << endl
+ << " ));";
+
+ close_if_block ();
+}
+
+void
+SetAttributeDelegationEmitter::open_if_block (void)
+{
+ os << "if (ACE_OS::strcmp (descr_name, \""
+ << attr_.name ().unescaped_str () << "\") == 0)" << endl
+ << "{";
+}
+
+void
+SetAttributeDelegationEmitter::close_if_block (void)
+{
+ os << "continue;"
+ << "}";
+}
diff --git a/modules/CIAO/CIDLC/CorbaTypeNameEmitters.hpp b/modules/CIAO/CIDLC/CorbaTypeNameEmitters.hpp
new file mode 100644
index 00000000000..b0aa8ea7dd8
--- /dev/null
+++ b/modules/CIAO/CIDLC/CorbaTypeNameEmitters.hpp
@@ -0,0 +1,469 @@
+// file : CIDLC/FullTypeNameEmitter.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef TYPENAME_EMITTER_HPP
+#define TYPENAME_EMITTER_HPP
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "EmitterBase.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+// Base class that holds the ostream member
+// common to every other class in this file,
+// and collects the ancestors in one place.
+//
+// Derived classes encapsulate the CORBA rules for
+// the C++ mapping of different type kinds.
+class CorbaTypeNameEmitter : public EmitterBase,
+ public Traversal::Void,
+ public Traversal::Boolean,
+ public Traversal::Octet,
+ public Traversal::Char,
+ public Traversal::Wchar,
+ public Traversal::Short,
+ public Traversal::UnsignedShort,
+ public Traversal::Long,
+ public Traversal::UnsignedLong,
+ public Traversal::LongLong,
+ public Traversal::UnsignedLongLong,
+ public Traversal::Float,
+ public Traversal::Double,
+ public Traversal::String,
+ public Traversal::BoundedString,
+ public Traversal::Wstring,
+ public Traversal::BoundedWideString,
+ public Traversal::Object,
+ public Traversal::ValueBase,
+ public Traversal::Any,
+ public Traversal::Array,
+ public Traversal::Enum,
+ public Traversal::Struct,
+ public Traversal::Union,
+ public Traversal::BoundedSequence,
+ public Traversal::UnboundedSequence,
+ public Traversal::Interface,
+ public Traversal::ValueType,
+ public Traversal::EventType,
+ public Traversal::Component,
+ public Traversal::Home
+{
+public:
+ virtual void traverse (Void&);
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+
+protected:
+ CorbaTypeNameEmitter (Context&);
+};
+
+// Generates the name of an operation's return type.
+//
+//
+class ReturnTypeNameEmitter : public CorbaTypeNameEmitter
+{
+public:
+ ReturnTypeNameEmitter (Context&);
+
+ virtual void traverse (Void&);
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+};
+
+// Generates the typename of an IN argument.
+//
+//
+class INArgTypeNameEmitter : public CorbaTypeNameEmitter
+{
+public:
+ INArgTypeNameEmitter (Context&);
+
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+};
+
+// Generates the typename of an INOUT argument.
+//
+//
+class INOUTArgTypeNameEmitter : public CorbaTypeNameEmitter
+{
+public:
+ INOUTArgTypeNameEmitter (Context&);
+
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+};
+
+// Generates the typename of an OUT argument.
+//
+//
+class OUTArgTypeNameEmitter : public CorbaTypeNameEmitter
+{
+public:
+ OUTArgTypeNameEmitter (Context&);
+
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+};
+
+// Generates 'return' plus the appropriate NULL return value,
+// including no output for Void.
+//
+//
+class NullReturnEmitter : public CorbaTypeNameEmitter
+{
+public:
+ NullReturnEmitter (Context&);
+
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+};
+
+/* Not currently used, but it was at one time and may be useful again.
+
+// Generates the appropriate NULL value, including the assignment operator,
+// if needed, for the rhs of an assignment statement.
+//
+//
+class NullRHSEmitter : public CorbaTypeNameEmitter
+{
+public:
+ NullRHSEmitter (Context&);
+
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+};
+*/
+// Declares and initializes a variable to use for any extraction.
+//
+//
+class ExtractedTypeDeclEmitter : public CorbaTypeNameEmitter
+{
+public:
+ ExtractedTypeDeclEmitter (Context&);
+
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+};
+
+// Declares and initializes a variable to use for any extraction.
+//
+//
+class AssignFromExtractedEmitter : public CorbaTypeNameEmitter
+{
+public:
+ AssignFromExtractedEmitter (Context&);
+
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+};
+
+class SetAttributeDelegationEmitter : public CorbaTypeNameEmitter,
+ public Traversal::ReadWriteAttribute
+{
+public:
+ SetAttributeDelegationEmitter (Context&,
+ SemanticGraph::ReadWriteAttribute&);
+
+ virtual void traverse (Boolean&);
+ virtual void traverse (Octet&);
+ virtual void traverse (Char&);
+ virtual void traverse (Wchar&);
+ virtual void traverse (Short&);
+ virtual void traverse (UnsignedShort&);
+ virtual void traverse (Long&);
+ virtual void traverse (UnsignedLong&);
+ virtual void traverse (LongLong&);
+ virtual void traverse (UnsignedLongLong&);
+ virtual void traverse (Float&);
+ virtual void traverse (Double&);
+ virtual void traverse (String&);
+ virtual void traverse (SemanticGraph::BoundedString&);
+ virtual void traverse (Wstring&);
+ virtual void traverse (SemanticGraph::BoundedWideString&);
+ virtual void traverse (Object&);
+ virtual void traverse (ValueBase&);
+ virtual void traverse (Any&);
+ virtual void traverse (SemanticGraph::Array&);
+ virtual void traverse (SemanticGraph::Enum&);
+ virtual void traverse (SemanticGraph::Struct&);
+ virtual void traverse (SemanticGraph::Union&);
+ virtual void traverse (SemanticGraph::BoundedSequence&);
+ virtual void traverse (SemanticGraph::UnboundedSequence&);
+ virtual void traverse (SemanticGraph::Interface&);
+ virtual void traverse (SemanticGraph::ValueType&);
+ virtual void traverse (SemanticGraph::EventType&);
+ virtual void traverse (SemanticGraph::Component&);
+ virtual void traverse (SemanticGraph::Home&);
+
+private:
+ void emit_delegation (void);
+ void emit_error (const char *);
+ void open_if_block (void);
+ void close_if_block (void);
+
+private:
+ SemanticGraph::ReadWriteAttribute& attr_;
+ AssignFromExtractedEmitter assign_emitter_;
+ ExtractedTypeDeclEmitter extract_emitter_;
+ Traversal::Belongs assign_belongs_;
+ Traversal::Belongs extract_belongs_;
+};
+
+#endif /* TYPENAME_EMITTER_HPP */
diff --git a/modules/CIAO/CIDLC/CxxNamePrinter.cpp b/modules/CIAO/CIDLC/CxxNamePrinter.cpp
new file mode 100644
index 00000000000..027889791ec
--- /dev/null
+++ b/modules/CIAO/CIDLC/CxxNamePrinter.cpp
@@ -0,0 +1,103 @@
+// file : CIDLC/CxxNamePrinter.cpp
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// cvs-id : $Id: Collectors.hpp 55138 2004-01-05 07:53:05Z parsons $
+
+#include "CIDLC/CxxNamePrinter.hpp"
+
+#include <ostream>
+#include <algorithm>
+
+namespace
+{
+ // Sorted C++ keywords.
+ //
+ char* keywords[] = {
+ "and",
+ "asm",
+ "auto",
+ "bitand",
+ "bitor",
+ "bool",
+ "break",
+ "case",
+ "catch",
+ "char",
+ "class",
+ "compl",
+ "const",
+ "const_cast",
+ "continue",
+ "default",
+ "delete",
+ "do",
+ "double",
+ "dynamic_cast",
+ "else",
+ "end_eq",
+ "enum",
+ "explicit",
+ "export",
+ "extern",
+ "false",
+ "float",
+ "for",
+ "friend",
+ "goto",
+ "if",
+ "inline",
+ "int",
+ "long",
+ "mutable",
+ "namespace",
+ "new",
+ "not",
+ "not_eq",
+ "operator",
+ "or",
+ "or_eq",
+ "private",
+ "protected",
+ "public",
+ "register",
+ "reinterpret_cast",
+ "return",
+ "short",
+ "signed",
+ "sizeof",
+ "static",
+ "static_cast",
+ "struct",
+ "switch",
+ "template",
+ "this",
+ "throw",
+ "true",
+ "try",
+ "typedef",
+ "typeid",
+ "typename",
+ "union",
+ "unsigned",
+ "using",
+ "virtual",
+ "void",
+ "volatile",
+ "wchar_t",
+ "while",
+ "xor",
+ "xor_eq"
+ };
+}
+
+void CxxNamePrinter::
+print (std::ostream& os, CCF::IDL2::SemanticGraph::SimpleName const& n)
+{
+ std::size_t const size (sizeof (keywords) / sizeof (char*));
+ std::string const& str (n.unescaped_str ());
+
+ if (std::binary_search (keywords, keywords + size, str))
+ os << "_cxx_";
+
+ os << str;
+}
+
diff --git a/modules/CIAO/CIDLC/CxxNamePrinter.hpp b/modules/CIAO/CIDLC/CxxNamePrinter.hpp
new file mode 100644
index 00000000000..417dfa16a9f
--- /dev/null
+++ b/modules/CIAO/CIDLC/CxxNamePrinter.hpp
@@ -0,0 +1,18 @@
+// file : CIDLC/CxxNamePrinter.hpp
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// cvs-id : $Id: Collectors.hpp 55138 2004-01-05 07:53:05Z parsons $
+
+#ifndef CXX_NAME_PRINTER_HPP
+#define CXX_NAME_PRINTER_HPP
+
+#include "CCF/IDL2/SemanticGraph/Name.hpp"
+
+// Prints names while escaping C++ keywords with the _cxx_ prefix.
+//
+struct CxxNamePrinter: CCF::IDL2::SemanticGraph::NamePrinter
+{
+ virtual void
+ print (std::ostream&, CCF::IDL2::SemanticGraph::SimpleName const&);
+};
+
+#endif // CXX_NAME_PRINTER_HPP
diff --git a/modules/CIAO/CIDLC/DescriptorGenerator.cpp b/modules/CIAO/CIDLC/DescriptorGenerator.cpp
new file mode 100644
index 00000000000..76a5a810774
--- /dev/null
+++ b/modules/CIAO/CIDLC/DescriptorGenerator.cpp
@@ -0,0 +1,582 @@
+// $Id$
+
+#include "DescriptorGenerator.hpp"
+#include "UnescapedNamePrinter.hpp"
+#include "Literals.hpp"
+
+#include <ostream>
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+#include "CCF/CodeGenerationKit/IndentationXML.hpp"
+#include "CCF/CodeGenerationKit/IndentationImplanter.hpp"
+
+using std::cout;
+using std::endl;
+using std::string;
+
+using namespace StringLiterals;
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+namespace
+{
+ class EmitterBase
+ {
+ public:
+ EmitterBase (fs::ofstream& ofs)
+ : os (ofs)
+ {}
+
+ protected:
+ fs::ofstream& os;
+ };
+
+ class CompositionEmitter : public EmitterBase,
+ public Traversal::Composition
+ {
+ // Nested classes for emitters created and dispatched inside
+ // ComponsitionEmitter::traverse().
+ private:
+ struct ComponentIdEmitter : Traversal::Component, EmitterBase
+ {
+ ComponentIdEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (Type& c)
+ {
+ os << "<componentrepid repid=\""
+ << c.context ().get<string> (STRS[REPO_ID])
+ << "\"/>"
+ << endl;
+ }
+ };
+
+ struct HomeIdEmitter : Traversal::Home, EmitterBase
+ {
+ HomeIdEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (Type& h)
+ {
+ os << "<homerepid repid=\""
+ << h.context ().get<string> (STRS[REPO_ID])
+ << "\"/>"
+ << endl;
+ }
+ };
+
+ struct HomeFeaturesEmitter : Traversal::Home, EmitterBase
+ {
+ HomeFeaturesEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (Type& h)
+ {
+ os << "<homefeatures" << endl
+ << "name=\"" << h.name () << "\"" << endl
+ << "repid=\""
+ << h.context ().get<string> (STRS[REPO_ID])
+ << "\">" << endl;
+
+ Traversal::Inherits home_inherits;
+ HomeInheritanceEmitter emitter (os);
+ home_inherits.node_traverser (emitter);
+
+ inherits (h, home_inherits);
+
+ os << "</homefeatures>" << endl << endl;
+
+ // Go after inherited homes.
+ //
+ Traversal::Home::traverse (h);
+ }
+
+ struct HomeInheritanceEmitter : Traversal::Home, EmitterBase
+ {
+ HomeInheritanceEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (Type& h)
+ {
+ os << "<inheritshome repid=\""
+ << h.context ().get<string> (STRS[REPO_ID])
+ << "\"/>"
+ << endl;
+ }
+ };
+ };
+
+ struct ComponentFeaturesEmitter : Traversal::Component, EmitterBase
+ {
+ ComponentFeaturesEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (Type& c)
+ {
+ os << "<componentfeatures" << endl
+ << "name=\"" << c.name () << "\"" << endl
+ << "repid=\""
+ << c.context ().get<string> (STRS[REPO_ID])
+ << "\">" << endl;
+
+ Traversal::Inherits component_inherits;
+ Traversal::Supports component_supports;
+ ComponentInheritanceEmitter i_emitter (os);
+ ComponentSupportsEmitter s_emitter (os);
+ component_inherits.node_traverser (i_emitter);
+ component_supports.node_traverser (s_emitter);
+
+ inherits (c, component_inherits);
+ supports (c, component_supports);
+
+ os << "<ports>" << endl;
+
+ Traversal::Defines defines;
+ PortsEmitter ports_emitter (os);
+ defines.node_traverser (ports_emitter);
+
+ names (c, defines);
+
+ os << "</ports>" << endl;
+
+ os << "</componentfeatures>" << endl << endl;
+
+ // Go after inherited components.
+ //
+ Traversal::Component::traverse (c);
+ }
+
+ struct ComponentInheritanceEmitter : Traversal::Component, EmitterBase
+ {
+ ComponentInheritanceEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (Type& c)
+ {
+ os << "<inheritscomponent repid=\""
+ << c.context ().get<string> (STRS[REPO_ID])
+ << "\"/>"
+ << endl;
+ }
+ };
+
+ struct ComponentSupportsEmitter : Traversal::Interface, EmitterBase
+ {
+ ComponentSupportsEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (Type& i)
+ {
+ os << "<supportsinterface repid=\""
+ << i.context ().get<string> (STRS[REPO_ID])
+ << "\"/>"
+ << endl;
+ }
+ };
+
+ struct PortsEmitter : Traversal::EmitterData,
+ Traversal::UserData,
+ Traversal::ProviderData,
+ Traversal::ConsumerData,
+ Traversal::PublisherData,
+ EmitterBase
+ {
+ PortsEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs),
+ type_name_emitter_ (ofs),
+ facettag_ (1U)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter& e)
+ {
+ os << "<emits" << endl
+ << "emitsname=\"" << e.name () << "\"" << endl
+ << "eventtype=";
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << ">" << endl
+ << "<eventpolicy policy=\"normal\"/>" << endl
+ << "</emits>" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::User& u)
+ {
+ os << "<uses" << endl
+ << "usesname=\"" << u.name () << "\"" << endl
+ << "repid=";
+
+ Traversal::UserData::belongs (u, belongs_);
+
+ os << ">" << endl
+ << "</uses>" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Provider& p)
+ {
+ os << "<provides" << endl
+ << "providesname=\"" << p.name () << "\"" << endl
+ << "repid=";
+
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << endl
+ << "facettag=\"" << facettag_ << "\">" << endl
+ << "</provides>" << endl;
+
+ ++facettag_;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& c)
+ {
+ os << "<consumes" << endl
+ << "consumesname=\"" << c.name () << "\"" << endl
+ << "eventtype=";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << ">" << endl
+ << "<eventpolicy policy=\"normal\"/>" << endl
+ << "</consumes>" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ os << "<publishes" << endl
+ << "publishesname=\"" << p.name ()
+ << "\"" << endl
+ << "eventtype=";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << ">" << endl
+ << "<eventpolicy policy=\"normal\"/>" << endl
+ << "</publishes>" << endl;
+ }
+
+ struct FullTypeNameEmitter : Traversal::Type, EmitterBase
+ {
+ FullTypeNameEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (SemanticGraph::Type& t)
+ {
+ os << '\"'
+ << t.context ().get<string> (STRS[REPO_ID])
+ << '\"';
+ }
+ };
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ unsigned long facettag_;
+ Traversal::Belongs belongs_;
+ };
+ };
+
+ struct InterfaceEmitter : Traversal::UnconstrainedInterface,
+ EmitterBase
+ {
+ InterfaceEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ bool
+ add (UnconstrainedInterface& i)
+ {
+ return interfaces_.insert (&i).second;
+ }
+
+ virtual void
+ traverse (UnconstrainedInterface& i)
+ {
+ if (add (i))
+ {
+ os << "<interface" << endl
+ << "name=\"" << i.name ()
+ << "\"" << endl
+ << "repid=\""
+ << i.context ().get<string> (STRS[REPO_ID])
+ << "\">" << endl;
+
+ Traversal::Inherits interface_inherits;
+ InterfaceInheritanceEmitter i_emitter (os);
+ interface_inherits.node_traverser (i_emitter);
+
+ inherits (i, interface_inherits);
+
+ os << "</interface>" << endl << endl;
+
+ // Go after inherited interfaces.
+ Traversal::UnconstrainedInterface::traverse (i);
+ }
+ }
+
+ struct InterfaceInheritanceEmitter : Traversal::Interface, EmitterBase
+ {
+ InterfaceInheritanceEmitter (fs::ofstream& ofs)
+ : EmitterBase (ofs)
+ {}
+
+ virtual void
+ traverse (Type& i)
+ {
+ os << "<inheritsinterface repid=\""
+ << i.context ().get<string> (STRS[REPO_ID])
+ << "\"/>" << endl;
+ }
+ };
+
+ private:
+ std::set<UnconstrainedInterface*> interfaces_;
+ };
+
+ public:
+ CompositionEmitter (fs::ofstream& ofs,
+ CommandLine const& cl)
+ : EmitterBase (ofs),
+ cl_ (cl)
+ {}
+
+ virtual void
+ traverse (Composition& c)
+ {
+ ScopedName scoped (c.scoped_name ());
+ Name stripped (scoped.begin () + 1, scoped.end ());
+ string name (stripped.unescaped_str ());
+ configure_stream (name);
+
+ os << "<?xml version=\"1.0\"?>" << endl
+ << "<!DOCTYPE corbacomponent SYSTEM \"corbacomponent.dtd\">"
+ << endl << endl;
+
+ os << "<corbacomponent>" << endl
+ << "<corbaversion>3.0</corbaversion>" << endl;
+
+ {
+ ComponentIdEmitter component_id_emitter (os);
+ HomeIdEmitter home_id_emitter (os);
+ Traversal::Defines defines;
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+ defines.node_traverser (component_executor);
+ defines.node_traverser (home_executor);
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+ implements.node_traverser (component_id_emitter);
+ implements.node_traverser (home_id_emitter);
+
+ names (c, defines);
+ }
+
+ os << "<componentkind>" << endl
+ << "<session>" << endl
+ << "<servant lifetime=\"container\"/>" << endl
+ << "</session>" << endl
+ << "</componentkind>" << endl
+ << "<threading policy=\"multithread\"/>" << endl
+ << "<configurationcomplete set=\"true\"/>" << endl << endl;
+
+ {
+ HomeFeaturesEmitter home_features_emitter (os);
+ Traversal::Defines defines;
+ Traversal::HomeExecutor home_executor;
+ defines.node_traverser (home_executor);
+ Traversal::Implements implements;
+ home_executor.edge_traverser (implements);
+ implements.node_traverser (home_features_emitter);
+
+ Traversal::Inherits inherits;
+ home_features_emitter.edge_traverser (inherits);
+ inherits.node_traverser (home_features_emitter);
+
+ names (c, defines);
+ }
+
+ {
+ ComponentFeaturesEmitter component_features_emitter (os);
+ Traversal::Defines defines;
+ Traversal::ComponentExecutor component_executor;
+ defines.node_traverser (component_executor);
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ implements.node_traverser (component_features_emitter);
+
+ Traversal::Inherits inherits;
+ component_features_emitter.edge_traverser (inherits);
+ inherits.node_traverser (component_features_emitter);
+
+ names (c, defines);
+ }
+
+ {
+ Traversal::Component component;
+ Traversal::Home home;
+ Traversal::Defines defines;
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+ defines.node_traverser (component_executor);
+ defines.node_traverser (home_executor);
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+ implements.node_traverser (component);
+ implements.node_traverser (home);
+
+ Traversal::Supports supports;
+ InterfaceEmitter interface_emitter (os);
+ supports.node_traverser (interface_emitter);
+ component.edge_traverser (supports);
+ home.edge_traverser (supports);
+
+ Traversal::Defines component_defines;
+ component.edge_traverser (component_defines);
+ Traversal::Provider provider;
+ Traversal::User user;
+ component_defines.node_traverser (provider);
+ component_defines.node_traverser (user);
+ Traversal::Belongs belongs;
+ belongs.node_traverser (interface_emitter);
+ provider.edge_traverser (belongs);
+ user.edge_traverser (belongs);
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (interface_emitter);
+ interface_emitter.edge_traverser (inherits);
+
+ names (c, defines);
+ }
+
+ os << "</corbacomponent>" << endl;
+ }
+
+ private:
+ void configure_stream (string const& scoped_name)
+ {
+ string file_suffix = cl_.get_value ("desc-file-suffix",
+ ".ccd");
+
+ string desc_file_name = regex::perl_s (scoped_name, "/::/_/");
+
+ desc_file_name += file_suffix;
+
+ fs::path desc_file_path (desc_file_name);
+
+ if (os.is_open ())
+ {
+ os.close ();
+ }
+
+ os.open (desc_file_path, std::ios_base::out);
+
+ if (!os.is_open ())
+ {
+ cerr << desc_file_name
+ << ": error: unable to open file in write mode"
+ << endl;
+ }
+ }
+
+ private:
+ CommandLine const& cl_;
+ };
+}
+
+// ==========================================================
+
+void
+DescriptorGenerator::options (CL::Description& d)
+{
+ d.add_option (CL::OptionDescription (
+ "desc-file-suffix",
+ "suffix",
+ "Use provided suffix instead of default \'.ccd\' "
+ "when constructing name of descriptor file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "desc-file-regex",
+ "regex",
+ "Use provided regular expression when constructing "
+ "name of descriptor file.",
+ CL::OptionType::value));
+}
+
+void
+DescriptorGenerator::generate (CommandLine const& cl,
+ TranslationUnit& u)
+{
+ // Set auto-indentation for os.
+ //
+ Indentation::Implanter<Indentation::XML> guard (ofs_);
+
+ // Set unescaped name printer for os.
+ //
+ UnescapedNamePrinter name_printer;
+ ofs_.pword (name_printer_index) = &name_printer;
+
+ //
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion region;
+ contains_principal.node_traverser (region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ Traversal::Includes includes;
+
+ region.edge_traverser (includes);
+ region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ includes.node_traverser (region);
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ Traversal::Module module;
+ CompositionEmitter composition (ofs_, cl);
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+
+ unit.traverse (u);
+}
diff --git a/modules/CIAO/CIDLC/DescriptorGenerator.hpp b/modules/CIAO/CIDLC/DescriptorGenerator.hpp
new file mode 100644
index 00000000000..e481c38e7d9
--- /dev/null
+++ b/modules/CIAO/CIDLC/DescriptorGenerator.hpp
@@ -0,0 +1,35 @@
+// file : CIDLC/DescriptorGenerator.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef DESCRIPTOR_GENERATOR_HPP
+#define DESCRIPTOR_GENERATOR_HPP
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+#include "CCF/CodeGenerationKit/CommandLineDescriptor.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+
+class DescriptorGenerator
+{
+public:
+ static void
+ options (CL::Description& d);
+
+ void
+ generate (CommandLine const&,
+ CCF::CIDL::SemanticGraph::TranslationUnit&);
+
+private:
+ fs::ofstream ofs_;
+};
+
+
+#endif // DESCRIPTOR_GENERATOR_HPP
+
+/*
+ * Local Variables:
+ * mode: C++
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/modules/CIAO/CIDLC/EmitterBase.cpp b/modules/CIAO/CIDLC/EmitterBase.cpp
new file mode 100644
index 00000000000..418db97852a
--- /dev/null
+++ b/modules/CIAO/CIDLC/EmitterBase.cpp
@@ -0,0 +1,11 @@
+// file : CIDLC/EmitterBase.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "EmitterBase.hpp"
+
+EmitterBase::EmitterBase (Context& c)
+ : ctx (c),
+ os (ctx.os ())
+{
+}
diff --git a/modules/CIAO/CIDLC/EmitterBase.hpp b/modules/CIAO/CIDLC/EmitterBase.hpp
new file mode 100644
index 00000000000..407eee8d0e0
--- /dev/null
+++ b/modules/CIAO/CIDLC/EmitterBase.hpp
@@ -0,0 +1,20 @@
+// file : CIDLC/EmitterBase.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef EMITTERBASE_HPP
+#define EMITTERBASE_HPP
+
+#include "EmitterContext.hpp"
+
+class EmitterBase
+{
+public:
+ EmitterBase (Context&);
+
+protected:
+ Context& ctx;
+ ostream& os;
+};
+
+#endif // EMITTERBASE_HPP
diff --git a/modules/CIAO/CIDLC/EmitterContext.cpp b/modules/CIAO/CIDLC/EmitterContext.cpp
new file mode 100644
index 00000000000..478ae5d0027
--- /dev/null
+++ b/modules/CIAO/CIDLC/EmitterContext.cpp
@@ -0,0 +1,45 @@
+// file : CIDLC/EmitterContext.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "EmitterContext.hpp"
+
+Context::Context (ostream& os,
+ string export_macro,
+ CommandLine const& cl)
+ : os_ (os),
+ export_macro_ (export_macro),
+ cl_ (cl)
+{
+}
+
+ostream&
+Context::os (void)
+{
+ return os_;
+}
+
+string
+Context::export_macro (void)
+{
+ return export_macro_;
+}
+
+CommandLine const&
+Context::cl (void)
+{
+ return cl_;
+}
+
+string
+Context::composition_name (void)
+{
+ return composition_name_;
+}
+
+void
+Context::composition_name (const string& name)
+{
+ composition_name_ = name;
+}
+
diff --git a/modules/CIAO/CIDLC/EmitterContext.hpp b/modules/CIAO/CIDLC/EmitterContext.hpp
new file mode 100644
index 00000000000..bec5e74f91d
--- /dev/null
+++ b/modules/CIAO/CIDLC/EmitterContext.hpp
@@ -0,0 +1,35 @@
+// file : CIDLC/EmitterContext.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef EMITTERCONTEXT_HPP
+#define EMITTERCONTEXT_HPP
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+
+#include <ostream>
+#include <string>
+
+using namespace std;
+
+class Context
+{
+public:
+ Context (ostream& os,
+ string export_macro,
+ CommandLine const& cl);
+
+ ostream& os (void);
+ string export_macro (void);
+ CommandLine const& cl (void);
+ string composition_name (void);
+ void composition_name (const string& name);
+
+private:
+ ostream& os_;
+ string export_macro_;
+ CommandLine const& cl_;
+ string composition_name_;
+};
+
+#endif // EMITTERCONTEXT_HPP
diff --git a/modules/CIAO/CIDLC/ExecImplGenerator.cpp b/modules/CIAO/CIDLC/ExecImplGenerator.cpp
new file mode 100644
index 00000000000..26f0d1c8ede
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecImplGenerator.cpp
@@ -0,0 +1,201 @@
+// file : CIDLC/ExecImplGenerator.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ExecImplGenerator.hpp"
+#include "ExecImplHeaderGenerator.hpp"
+#include "ExecImplSourceGenerator.hpp"
+#include "CxxNamePrinter.hpp"
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+#include "CCF/CodeGenerationKit/IndentationCxx.hpp"
+#include "CCF/CodeGenerationKit/IndentationImplanter.hpp"
+
+using namespace CCF;
+using namespace CIDL;
+using namespace SemanticGraph;
+using namespace Traversal;
+
+using std::string;
+using std::ostream;
+
+namespace
+{
+ // On some platforms toupper can be something else than a
+ // function.
+ int
+ upcase (int c)
+ {
+ return toupper (c);
+ }
+}
+
+ExecImplGenerator::ExecImplGenerator (CommandLine const& cl)
+ : cl_ (cl),
+ file_name_ (""),
+ export_macro_ ("")
+{
+}
+
+void ExecImplGenerator::options (CL::Description& d)
+{
+ d.add_option (CL::OptionDescription (
+ "exec-hdr-file-suffix",
+ "suffix",
+ "Use provided suffix instead of default \'_exec.h\' "
+ "when constructing name of executor implementation file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "exec-hdr-file-regex",
+ "regex",
+ "Use provided regular expression when constructing "
+ "name of executor implementation file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "exec-src-file-suffix",
+ "suffix",
+ "Use provided suffix instead of default \'_exec.cpp\' "
+ "when constructing name of executor implementation file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "exec-src-file-regex",
+ "regex",
+ "Use provided regular expression when constructing "
+ "name of executor implementation file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "exec-export-macro",
+ "macro",
+ "Replace default executor DLL export macro "
+ "with provided macro.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "exec-export-include",
+ "file",
+ "Replace default executor export include file "
+ "with provided file.",
+ CL::OptionType::value));
+}
+
+
+void ExecImplGenerator::generate (SemanticGraph::TranslationUnit& u,
+ fs::path const& file)
+{
+ // Generate files
+ compute_export_macro (file);
+
+ {
+ fs::ofstream hdr_ofs;
+ ostream& hdr_os = configure_stream ("exec-hdr-file-suffix",
+ "_exec.h",
+ "exec-hdr-file-regex",
+ hdr_ofs);
+
+ Indentation::Implanter<Indentation::Cxx> header_guard (hdr_os);
+
+ // Set C++ name printer for os.
+ //
+ CxxNamePrinter name_printer;
+ hdr_os.pword (name_printer_index) = &name_printer;
+
+
+ ExecImplHeaderEmitter hdr_emitter (hdr_os,
+ cl_,
+ export_macro_,
+ file);
+ hdr_emitter.generate (u);
+ }
+
+ {
+ fs::ofstream src_ofs;
+ ostream& src_os = configure_stream ("exec-src-file-suffix",
+ "_exec.cpp",
+ "exec-src-file-regex",
+ src_ofs);
+
+ Indentation::Implanter<Indentation::Cxx> header_guard (src_os);
+
+ // Set C++ name printer for os.
+ //
+ CxxNamePrinter name_printer;
+ src_os.pword (name_printer_index) = &name_printer;
+
+ ExecImplSourceEmitter src_emitter (src_os,
+ cl_,
+ export_macro_,
+ file);
+ src_emitter.generate (u);
+ }
+}
+
+void
+ExecImplGenerator::compute_export_macro (const fs::path& file_path)
+{
+ if (!file_path.empty ())
+ {
+ file_name_ = file_path.leaf ();
+ }
+
+ export_macro_ = cl_.get_value ("exec-export-macro", "");
+
+ if (export_macro_.empty () && !file_name_.empty ())
+ {
+ // Modify a copy of the filename string.
+ export_macro_ = file_name_;
+
+
+ // Convert filename string to upper case.
+ transform (export_macro_.begin (),
+ export_macro_.end (),
+ export_macro_.begin (),
+ upcase);
+
+ // Replace the suffix.
+ export_macro_ =
+ regex::perl_s (export_macro_,
+ "/^(.+?)(\\.(IDL|CIDL|CDL))?$/$1_EXEC_Export/");
+
+ // Replace any remaining '.' in the string with '_'.
+ export_macro_ = regex::perl_s (export_macro_,
+ "/\\./_/");
+ }
+}
+
+ostream&
+ExecImplGenerator::configure_stream (string const& suffix_option,
+ string const& default_suffix,
+ string const& regex_option,
+ fs::ofstream& ofs)
+{
+ if (! file_name_.empty ())
+ {
+ string file_suffix = cl_.get_value (suffix_option,
+ default_suffix);
+ string file_expr =
+ cl_.get_value (regex_option,
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1" + file_suffix + "/");
+
+ string file_name = regex::perl_s (file_name_, file_expr);
+
+ fs::path file_path (file_name);
+
+ ofs.open (file_path, std::ios_base::out);
+
+ if (!ofs.is_open ())
+ {
+ cerr << file_name
+ << ": error: unable to open file in write mode"
+ << endl;
+ }
+ }
+
+ return ofs.is_open ()
+ ? static_cast<ostream&> (ofs)
+ : static_cast<ostream&> (std::cout);
+}
+
diff --git a/modules/CIAO/CIDLC/ExecImplGenerator.hpp b/modules/CIAO/CIDLC/ExecImplGenerator.hpp
new file mode 100644
index 00000000000..51536b3aaa3
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecImplGenerator.hpp
@@ -0,0 +1,44 @@
+// file : CIDLC/ExecImplGenerator.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef EXEC_IMPL_GENERATOR_HPP
+#define EXEC_IMPL_GENERATOR_HPP
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+#include "CCF/CodeGenerationKit/CommandLineDescriptor.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+class ExecImplGenerator
+{
+public:
+ static void
+ options (CL::Description& d);
+
+ ExecImplGenerator (CommandLine const& cl);
+
+ void
+ generate (CCF::CIDL::SemanticGraph::TranslationUnit&,
+ fs::path const& file);
+
+private:
+ void
+ compute_export_macro (const fs::path& file_path);
+
+ std::ostream&
+ configure_stream (std::string const& suffix_option,
+ std::string const& default_suffix,
+ std::string const& regex_option,
+ fs::ofstream& ofs);
+
+private:
+ CommandLine const& cl_;
+ std::string file_name_;
+ std::string export_macro_;
+};
+
+
+#endif // EXEC_IMPL_GENERATOR_HPP
+
diff --git a/modules/CIAO/CIDLC/ExecImplHeaderGenerator.cpp b/modules/CIAO/CIDLC/ExecImplHeaderGenerator.cpp
new file mode 100644
index 00000000000..6ee4899a4df
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecImplHeaderGenerator.cpp
@@ -0,0 +1,819 @@
+// file : CIDLC/ExecImplHeaderGenerator.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ExecImplHeaderGenerator.hpp"
+#include "CorbaTypeNameEmitters.hpp"
+#include "UtilityTypeNameEmitters.hpp"
+#include "AttributeHeaderEmitters.hpp"
+#include "OperationHeaderEmitters.hpp"
+#include "ParameterEmitter_T.hpp"
+#include "CompositionEmitter.hpp"
+#include "ModuleEmitter.hpp"
+#include "InterfaceEmitter.hpp"
+#include "Literals.hpp"
+#include "Upcase.hpp"
+
+#include <ostream>
+#include <sstream>
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+
+using std::endl;
+
+using namespace StringLiterals;
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+namespace
+{
+ struct FacetEmitter : Traversal::UnconstrainedInterface,
+ EmitterBase
+ {
+ FacetEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (UnconstrainedInterface& i)
+ {
+ if (i.context ().count ("facet_impl_hdr_gen")) return;
+
+ os << "class " << ctx.export_macro () << " "
+ << i.name () << "_exec_i" << endl
+ << " : public virtual " << i.scoped_name ().scope_name ()
+ << "::CCM_" << i.name () << "," << endl
+ << " public virtual TAO_Local_RefCounted_Object" << endl
+ << "{"
+ << "public:" << endl
+ << i.name () << "_exec_i (void);"
+ << "virtual ~" << i.name () << "_exec_i (void);" << endl
+ << "// Operations from " << i.scoped_name () << endl << endl;
+
+ {
+ InterfaceEmitter interface_emitter (ctx);
+
+ Traversal::Defines defines_;
+ Traversal::Inherits inherits_;
+ interface_emitter.edge_traverser (defines_);
+ interface_emitter.edge_traverser (inherits_);
+
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines_.node_traverser (attribute_emitter);
+
+ OperationEmitter operation_emitter (ctx);
+ defines_.node_traverser (operation_emitter);
+ inherits_.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ inherits (i, inherits_);
+ names (i, defines_);
+ }
+
+ os << "};";
+
+ i.context ().set ("facet_impl_hdr_gen", true);
+ }
+ };
+
+ struct ExecPortsEmitter : Traversal::ConsumerData,
+ Traversal::ProviderData,
+ EmitterBase
+ {
+ ExecPortsEmitter (Context& c)
+ : EmitterBase (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ type_name_emitter_ (c)
+ {
+ enclosing_belongs_.node_traverser (enclosing_type_name_emitter_);
+ simple_belongs_.node_traverser (simple_type_name_emitter_);
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Provider& p)
+ {
+ os << "virtual ";
+
+ Traversal::ProviderData::belongs (p, enclosing_belongs_);
+
+ os << "::CCM_";
+
+ Traversal::ProviderData::belongs (p, simple_belongs_);
+
+ os << "_ptr" << endl
+ << "get_" << p.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& c)
+ {
+ os << "virtual void" << endl
+ << "push_" << c.name () << " (" << endl;
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << " *ev" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ private:
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs enclosing_belongs_;
+ Traversal::Belongs simple_belongs_;
+ Traversal::Belongs belongs_;
+ };
+
+ struct ComponentExecImplEmitter : Traversal::Component, EmitterBase
+ {
+ ComponentExecImplEmitter (Context& c, ComponentExecutor& exec)
+ : EmitterBase (c),
+ exec_ (exec)
+ {
+ }
+
+ virtual void
+ pre (Type& t)
+ {
+ // Generate the facet executor class(es) first.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Provider provider;
+ defines.node_traverser (provider);
+
+ Traversal::Belongs belongs;
+ provider.edge_traverser (belongs);
+
+ FacetEmitter facet_emitter (ctx);
+ belongs.node_traverser (facet_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "class " << ctx.export_macro () << " "
+ << t.name () << "_exec_i" << endl
+ << " : public virtual " << exec_.name () << "," << endl
+ << " public virtual TAO_Local_RefCounted_Object" << endl
+ << "{"
+ << "public:" << endl
+ << t.name () << "_exec_i (void);"
+ << "virtual ~" << t.name () << "_exec_i (void);" << endl;
+
+ os << "// Supported or inherited operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Supports supports_;
+ component_emitter.edge_traverser (component_inherits);
+ component_emitter.edge_traverser (supports_);
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter operation_emitter (ctx);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Attribute operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines.node_traverser (attribute_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Port operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+
+ ExecPortsEmitter exec_ports_emitter (ctx);
+ defines.node_traverser (exec_ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Operations from Components::SessionComponent" << endl << endl;
+
+ os << "virtual void" << endl
+ << "set_session_context (" << endl
+ << STRS[COMP_SC] << "_ptr ctx" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << endl
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "));" << endl;
+
+ os << "virtual void" << endl
+ << "ciao_preactivate (" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << endl
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "));" << endl;
+
+ os << "virtual void" << endl
+ << "ciao_postactivate (" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << endl
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "));" << endl;
+
+ os << "virtual void" << endl
+ << "ccm_activate (" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << endl
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "));" << endl;
+
+ os << "virtual void" << endl
+ << "ccm_passivate (" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << endl
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "));" << endl;
+
+ os << "virtual void" << endl
+ << "ccm_remove (" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << endl
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "));" << endl;
+ }
+
+ virtual void
+ post (Type& t)
+ {
+ os << "protected:" << endl
+ << t.name () << "_Context *context_;" << endl
+ << "};";
+ }
+
+ private:
+ ComponentExecutor& exec_;
+ };
+
+ struct ComponentExecutorEmitter : Traversal::ComponentExecutor, EmitterBase
+ {
+ ComponentExecutorEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ implements (Type& i)
+ {
+ Traversal::ComponentExecutor component_executor;
+
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+
+ ComponentExecImplEmitter component_exec_impl_emitter (ctx, i);
+ implements.node_traverser (component_exec_impl_emitter);
+
+ component_executor.traverse (i);
+ }
+ };
+
+ struct HomeExecImplEmitter : Traversal::Home, EmitterBase
+ {
+ HomeExecImplEmitter (Context& c, HomeExecutor& exec)
+ : EmitterBase (c),
+ exec_ (exec)
+ {
+ }
+
+ virtual void
+ pre (Type& t)
+ {
+ os << "class " << ctx.export_macro () << " "
+ << t.name () << "_exec_i" << endl
+ << " : public virtual " << exec_.name () << "," << endl
+ << " public virtual TAO_Local_RefCounted_Object" << endl
+ << "{"
+ << "public:" << endl
+ << t.name () << "_exec_i (void);"
+ << "virtual ~" << t.name () << "_exec_i (void);" << endl;
+
+ os << "// Supported or inherited operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Supports supports_;
+ home_emitter.edge_traverser (home_inherits);
+ home_emitter.edge_traverser (supports_);
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter operation_emitter (ctx);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Home operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+ home_emitter.edge_traverser (home_inherits);
+
+ HomeOperationEmitter home_operation_emitter (ctx);
+ defines.node_traverser (home_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ home_operation_emitter.edge_traverser (receives);
+ home_operation_emitter.edge_traverser (returns);
+ home_operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ // Generate home factory operations. This is a separate traversal
+ // stack because we want to generate the factory operations
+ // of ancestors with the return type of the base component.
+ os << "// Factory and finder operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits inherits;
+ home_emitter.edge_traverser (inherits);
+ inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ bool for_exec = true;
+ FactoryOperationEmitter factory_operation_emitter (ctx, for_exec);
+ FinderOperationEmitter finder_operation_emitter (ctx, for_exec);
+ defines.node_traverser (factory_operation_emitter);
+ defines.node_traverser (finder_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ factory_operation_emitter.edge_traverser (receives);
+ factory_operation_emitter.edge_traverser (returns);
+ factory_operation_emitter.edge_traverser (raises);
+ finder_operation_emitter.edge_traverser (receives);
+ finder_operation_emitter.edge_traverser (returns);
+ finder_operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Attribute operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ home_emitter.edge_traverser (home_inherits);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines.node_traverser (attribute_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Implicit operations." << endl << endl
+ << "virtual " << STRS[COMP_EC] << "_ptr" << endl
+ << "create (" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << endl
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "));" << endl;
+ }
+
+ virtual void
+ post (Type& t)
+ {
+ os << "};";
+
+ string name;
+
+ // We need to escape C++ keywords before flattening the name.
+ //
+ {
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << t.scoped_name ();
+ name = regex::perl_s (ostr.str (), "/::/_/");
+ }
+
+ os << "extern \"C\" " << ctx.export_macro ()
+ << " ::Components::HomeExecutorBase_ptr" << endl
+ << "create" << name << "_Impl (void);" << endl;
+ }
+
+ private:
+ HomeExecutor& exec_;
+ };
+
+ struct HomeExecutorEmitter : Traversal::HomeExecutor, EmitterBase
+ {
+ HomeExecutorEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ implements (Type& i)
+ {
+ Traversal::HomeExecutor home_executor;
+
+ Traversal::Implements implements;
+ home_executor.edge_traverser (implements);
+
+ HomeExecImplEmitter home_exec_impl_emitter (ctx, i);
+ implements.node_traverser (home_exec_impl_emitter);
+
+ home_executor.traverse (i);
+ }
+ };
+}
+
+ExecImplHeaderEmitter::ExecImplHeaderEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ string export_macro,
+ fs::path const& file)
+ : os (os_),
+ cl_ (cl),
+ export_macro_ (export_macro),
+ file_ (file)
+{}
+
+void
+ExecImplHeaderEmitter::pre (TranslationUnit&)
+{
+ os << COPYRIGHT;
+
+ string file_name ("");
+
+ if (!file_.empty ())
+ {
+ file_name = file_.leaf ();
+ }
+
+ string uc_file_name = file_name;
+
+ std::transform (uc_file_name.begin (),
+ uc_file_name.end (),
+ uc_file_name.begin (),
+ upcase);
+
+ string uc_file_suffix = cl_.get_value ("exec-hdr-file-suffix",
+ "_exec.h");
+
+ std::transform (uc_file_suffix.begin (),
+ uc_file_suffix.end (),
+ uc_file_suffix.begin (),
+ upcase);
+
+ string guard =
+ "CIAO_"
+ + regex::perl_s (uc_file_name,
+ "/^(.+?)(\\.(IDL|CIDL|CDL))?$/$1"
+ + uc_file_suffix
+ + "/");
+
+ // Replace any remaining '.' with '_'.
+ guard = regex::perl_s (guard, "/\\./_/");
+
+ os << "#ifndef " << guard << endl
+ << "#define " << guard << endl << endl
+ << "#include /**/ \"ace/pre.h\"" << endl << endl;
+
+ string file_suffix = cl_.get_value ("svnt-hdr-file-suffix",
+ "_svnt.h");
+
+ string svnt_file_name = regex::perl_s (file_name,
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1"
+ + file_suffix
+ + "/");
+
+ os << "#include \"" << svnt_file_name << "\"" << endl << endl;
+
+ os << "#if !defined (ACE_LACKS_PRAGMA_ONCE)" << endl
+ << "# pragma once" << endl
+ << "#endif /* ACE_LACKS_PRAGMA_ONCE */" << endl << endl;
+
+ string default_export_include =
+ regex::perl_s (file_name,
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1_exec_export.h/");
+
+ string export_include = cl_.get_value ("exec-export-include",
+ default_export_include);
+
+ if (!export_include.empty ())
+ {
+ os << "#include \"" << export_include << "\"" << endl;
+ }
+
+ os << "#include \"tao/LocalObject.h\"" << endl << endl;
+}
+
+void
+ExecImplHeaderEmitter::generate (TranslationUnit& u)
+{
+ pre (u);
+
+ Context c (os, export_macro_, cl_);
+
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion principal_region;
+ contains_principal.node_traverser (principal_region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ principal_region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ ModuleEmitter module (c);
+ CompositionEmitter composition (c);
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+
+ // Layer 4
+ //
+ composition.edge_traverser (defines);
+ module.edge_traverser (defines);
+
+ //--
+ ComponentExecutorEmitter component_executor (c);
+ HomeExecutorEmitter home_executor (c);
+ defines.node_traverser (component_executor);
+ defines.node_traverser (home_executor);
+
+ // Layer 5
+ //
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+
+ unit.traverse (u);
+
+ post (u);
+}
+
+void
+ExecImplHeaderEmitter::post (TranslationUnit&)
+{
+ if (file_.empty ()) return;
+
+ string uc_file_name = file_.leaf ();
+
+ std::transform (uc_file_name.begin (),
+ uc_file_name.end (),
+ uc_file_name.begin (),
+ upcase);
+
+ string uc_file_suffix = cl_.get_value ("exec-hdr-file-suffix",
+ "_exec.h");
+
+ std::transform (uc_file_suffix.begin (),
+ uc_file_suffix.end (),
+ uc_file_suffix.begin (),
+ upcase);
+
+ string guard =
+ "CIAO_"
+ + regex::perl_s (uc_file_name,
+ "/^(.+?)(\\.(IDL|CIDL))?$/$1" + uc_file_suffix + "/");
+
+ guard = regex::perl_s (guard, "/\\./_/");
+
+ os << "#include /**/ \"ace/post.h\"" << endl << endl
+ << "#endif /* " << guard << " */"
+ << endl << endl;
+}
+
diff --git a/modules/CIAO/CIDLC/ExecImplHeaderGenerator.hpp b/modules/CIAO/CIDLC/ExecImplHeaderGenerator.hpp
new file mode 100644
index 00000000000..0cc8127cc76
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecImplHeaderGenerator.hpp
@@ -0,0 +1,43 @@
+// file : CIDLC/ServantHeaderGenerator.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef EXEC_IMPL_HEADER_GENERATOR_HPP
+#define EXEC_IMPL_HEADER_GENERATOR_HPP
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+using std::string;
+
+class ExecImplHeaderEmitter
+{
+public:
+ ExecImplHeaderEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ string export_macro,
+ fs::path const& file);
+
+ virtual ~ExecImplHeaderEmitter () {}
+
+ virtual void
+ pre (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+ virtual void
+ generate (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+ virtual void
+ post (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+private:
+ std::ostream& os;
+ CommandLine const& cl_;
+ string export_macro_;
+ fs::path file_;
+};
+
+
+#endif // EXEC_IMPL_HEADER_GENERATOR_HPP
+
diff --git a/modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp b/modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp
new file mode 100644
index 00000000000..1f36dd99248
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp
@@ -0,0 +1,1136 @@
+// file : CIDLC/ExecImplSourceGenerator.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ExecImplSourceGenerator.hpp"
+#include "CorbaTypeNameEmitters.hpp"
+#include "UtilityTypeNameEmitters.hpp"
+#include "ParameterEmitter_T.hpp"
+#include "AttributeSourceEmitters_T.hpp"
+#include "CompositionEmitter.hpp"
+#include "ModuleEmitter.hpp"
+#include "InterfaceEmitter.hpp"
+#include "Literals.hpp"
+
+#include <ostream>
+#include <sstream>
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+using namespace StringLiterals;
+
+namespace
+{
+ template <typename T>
+ struct OperationEmitter : Traversal::Operation, EmitterBase
+ {
+ OperationEmitter (Context& c, T& scope)
+ : EmitterBase (c),
+ scope_ (scope)
+ {}
+
+ virtual void
+ name (Type& o)
+ {
+ os << endl
+ << scope_.name () << "_exec_i::" << o.name ();
+ }
+
+ virtual void
+ receives_pre (Type&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_none (Type&)
+ {
+ os << " ()" << endl;
+ }
+
+ virtual void
+ receives_post (Type&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_pre (Type&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_none (Type&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_post (Type&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (Type& o)
+ {
+ os << "{"
+ << STRS[YCH] << endl;
+
+ Traversal::Operation operation_emitter;
+
+ Traversal::Belongs returns;
+ operation_emitter.edge_traverser (returns);
+
+ NullReturnEmitter return_emitter (ctx);
+ returns.node_traverser (return_emitter);
+
+ operation_emitter.traverse (o);
+
+ os << "}";
+ }
+
+ virtual void
+ comma (Type&)
+ {
+ os << "," << endl;
+ }
+
+ protected:
+ T& scope_;
+ };
+
+ struct FacetEmitter : Traversal::UnconstrainedInterface,
+ EmitterBase
+ {
+ FacetEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (UnconstrainedInterface& i)
+ {
+ if (i.context ().count ("facet_impl_src_gen")) return;
+
+ os << STRS[SEP] << endl
+ << "// Facet Executor Implementation Class: "
+ << i.name () << "_exec_i" << endl
+ << STRS[SEP] << endl << endl;
+
+ os << i.name () << "_exec_i::"
+ << i.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}"
+ << i.name () << "_exec_i::~"
+ << i.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}"
+ << "// Operations from " << i.scoped_name () << endl << endl;
+
+ {
+ InterfaceEmitter interface_emitter (ctx);
+
+ Traversal::Defines defines_;
+ Traversal::Inherits inherits_;
+ interface_emitter.edge_traverser (defines_);
+ interface_emitter.edge_traverser (inherits_);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<UnconstrainedInterface> attribute_emitter (
+ ctx,
+ i,
+ exec_src
+ );
+ defines_.node_traverser (attribute_emitter);
+
+ OperationEmitter<UnconstrainedInterface> operation_emitter (ctx, i);
+ defines_.node_traverser (operation_emitter);
+ inherits_.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ inherits (i, inherits_);
+ names (i, defines_);
+ }
+
+ i.context ().set ("facet_impl_src_gen", true);
+ }
+ };
+
+ struct ExecPortsEmitter : Traversal::ConsumerData,
+ Traversal::ProviderData,
+ EmitterBase
+ {
+ ExecPortsEmitter (Context& c, SemanticGraph::Component& scope)
+ : EmitterBase (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ enclosing_belongs_.node_traverser (enclosing_type_name_emitter_);
+ simple_belongs_.node_traverser (simple_type_name_emitter_);
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Provider& p)
+ {
+ Traversal::ProviderData::belongs (p, enclosing_belongs_);
+
+ os << "::CCM_";
+
+ Traversal::ProviderData::belongs (p, simple_belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name () << "_exec_i::get_"
+ << p.name () << " ()" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << STRS[YCH] << endl
+ << "return ";
+
+ Traversal::ProviderData::belongs (p, enclosing_belongs_);
+
+ os << "::CCM_";
+
+ Traversal::ProviderData::belongs (p, simple_belongs_);
+
+ os << "::_nil ();" << endl
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& c)
+ {
+ os << "void" << endl
+ << scope_.name () << "_exec_i::push_"
+ << c.name () << " (" << endl;
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << " * /* ev */" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << STRS[YCH] << endl
+ << "}";
+ }
+
+ private:
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs enclosing_belongs_;
+ Traversal::Belongs simple_belongs_;
+ Traversal::Belongs belongs_;
+ SemanticGraph::Component& scope_;
+ };
+
+ struct ComponentExecImplEmitter : Traversal::Component, EmitterBase
+ {
+ ComponentExecImplEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ pre (Type& t)
+ {
+ // Generate the facet executor class(es) first.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Provider provider;
+ defines.node_traverser (provider);
+
+ Traversal::Belongs belongs;
+ provider.edge_traverser (belongs);
+
+ FacetEmitter facet_emitter (ctx);
+ belongs.node_traverser (facet_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[SEP] << endl
+ << "// Component Executor Implementation Class: "
+ << t.name () << "_exec_i" << endl
+ << STRS[SEP] << endl << endl;
+
+ os << t.name () << "_exec_i::"
+ << t.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}"
+ << t.name () << "_exec_i::~"
+ << t.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}";
+
+ os << "// Supported or inherited operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Supports supports_;
+ component_emitter.edge_traverser (component_inherits);
+ component_emitter.edge_traverser (supports_);
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<SemanticGraph::Component> attribute_emitter (
+ ctx,
+ t,
+ exec_src
+ );
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter<SemanticGraph::Component> operation_emitter (ctx, t);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Attribute operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<SemanticGraph::Component> attribute_emitter (
+ ctx,
+ t,
+ exec_src
+ );
+ defines.node_traverser (attribute_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Port operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ component_emitter.edge_traverser (component_inherits);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+
+ ExecPortsEmitter exec_ports_emitter (ctx, t);
+ defines.node_traverser (exec_ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Operations from Components::SessionComponent" << endl << endl;
+
+ os << "void" << endl
+ << t.name () << "_exec_i::set_session_context (" << endl
+ << STRS[COMP_SC] << "_ptr ctx" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << "this->context_ =" << endl
+ << " " << t.name () << "_Context::_narrow (" << endl
+ << " ctx" << endl
+ << " " <<");"
+ << endl;
+
+ os << "if (this->context_ == 0)" << endl
+ << "{"
+ << "throw ::CORBA::INTERNAL ();"
+ << "}"
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ciao_preactivate ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ciao_postactivate ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ccm_activate ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ccm_passivate ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+
+ os << "void" << endl
+ << t.name () << "_exec_i::ccm_remove ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[YCH]
+ << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ }
+ };
+
+ // HomeFactory and HomeFinder are tied to Operation in
+ // the front end. Since we want to treat them differently
+ // than regular operations in a home (we want to generate
+ // base class factory operations returning the base component,
+ // for example), we use this class for regular home operations
+ // that overrides HomeFactory and HomeFinder traversals
+ // to do nothing.
+ struct HomeOperationEmitter : OperationEmitter<SemanticGraph::Home>,
+ Traversal::HomeFactory,
+ Traversal::HomeFinder
+ {
+ HomeOperationEmitter (Context& c, SemanticGraph::Home& scope)
+ : OperationEmitter<SemanticGraph::Home> (c, scope)
+ {}
+
+ virtual void
+ traverse (SemanticGraph::HomeFactory&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::HomeFinder&)
+ {
+ }
+ };
+
+ struct FactoryOperationEmitter : Traversal::HomeFactory,
+ EmitterBase
+ {
+ FactoryOperationEmitter (Context& c, SemanticGraph::Home& scope)
+ : EmitterBase (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ enclosing_returns_.node_traverser (enclosing_type_name_emitter_);
+ simple_returns_.node_traverser (simple_type_name_emitter_);
+ }
+
+ virtual void
+ returns (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[COMP_EC] << "_ptr" << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::HomeFactory& hf)
+ {
+ os << scope_.name () << "_exec_i::" << hf.name ();
+ }
+
+ virtual void
+ receives_none (SemanticGraph::HomeFactory&)
+ {
+ os << " ()" << endl;
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFactory&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_post (SemanticGraph::HomeFactory&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_none (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_post (SemanticGraph::HomeFactory&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (SemanticGraph::HomeFactory& hf)
+ {
+ os << "{"
+ << STRS[YCH] << endl
+ << "return ";
+
+ Traversal::HomeFactory::returns (hf, enclosing_returns_);
+
+ os << "::CCM_";
+
+ Traversal::HomeFactory::returns (hf, simple_returns_);
+
+ os << "::_nil ();"
+ << "}";
+ }
+
+ virtual void
+ comma (SemanticGraph::HomeFactory&)
+ {
+ os << "," << endl;
+ }
+
+ private:
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ Traversal::Returns enclosing_returns_;
+ Traversal::Returns simple_returns_;
+ SemanticGraph::Home& scope_;
+ };
+
+ struct FinderOperationEmitter : Traversal::HomeFinder,
+ EmitterBase
+ {
+ FinderOperationEmitter (Context& c, SemanticGraph::Home& scope)
+ : EmitterBase (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ enclosing_returns_.node_traverser (enclosing_type_name_emitter_);
+ simple_returns_.node_traverser (simple_type_name_emitter_);
+ }
+
+ virtual void
+ returns (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[COMP_EC] << "_ptr" << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::HomeFinder& hf)
+ {
+ os << scope_.name () << "_exec_i::" << hf.name ();
+ }
+
+ virtual void
+ receives_none (SemanticGraph::HomeFinder&)
+ {
+ os << " ()" << endl;
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFinder&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_post (SemanticGraph::HomeFinder&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_none (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_post (SemanticGraph::HomeFinder&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (SemanticGraph::HomeFinder& hf)
+ {
+ os << "{"
+ << STRS[YCH] << endl
+ << "return ";
+
+ Traversal::HomeFinder::returns (hf, enclosing_returns_);
+
+ os << "::CCM_";
+
+ Traversal::HomeFinder::returns (hf, simple_returns_);
+
+ os << "::_nil ();"
+ << "}";
+ }
+
+ virtual void
+ comma (SemanticGraph::HomeFinder&)
+ {
+ os << "," << endl;
+ }
+
+ private:
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ Traversal::Returns enclosing_returns_;
+ Traversal::Returns simple_returns_;
+ SemanticGraph::Home& scope_;
+ };
+
+ struct HomeExecImplEmitter : Traversal::Home, EmitterBase
+ {
+ HomeExecImplEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ pre (Type& t)
+ {
+ os << STRS[SEP] << endl
+ << "// Home Executor Implementation Class: "
+ << t.name () << "_exec_i" << endl
+ << STRS[SEP] << endl << endl;
+
+ os << t.name () << "_exec_i::"
+ << t.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}"
+ << t.name () << "_exec_i::~"
+ << t.name () << "_exec_i (void)" << endl
+ << "{"
+ << "}";
+
+ os << "// Supported or inherited operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Supports supports_;
+ home_emitter.edge_traverser (home_inherits);
+ home_emitter.edge_traverser (supports_);
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<SemanticGraph::Home> attribute_emitter (
+ ctx,
+ t,
+ exec_src
+ );
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter<SemanticGraph::Home> operation_emitter (ctx, t);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Home operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+ home_emitter.edge_traverser (home_inherits);
+
+ HomeOperationEmitter home_operation_emitter (ctx, t);
+ defines.node_traverser (home_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ home_operation_emitter.edge_traverser (receives);
+ home_operation_emitter.edge_traverser (returns);
+ home_operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ // Generate home factory operations. This is a separate traversal
+ // stack because we want to generate the factory operations
+ // of ancestors with the return type of the base component.
+ os << "// Factory and finder operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits inherits;
+ home_emitter.edge_traverser (inherits);
+ inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ FactoryOperationEmitter factory_operation_emitter (ctx, t);
+ FinderOperationEmitter finder_operation_emitter (ctx, t);
+ defines.node_traverser (factory_operation_emitter);
+ defines.node_traverser (finder_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ factory_operation_emitter.edge_traverser (receives);
+ factory_operation_emitter.edge_traverser (returns);
+ factory_operation_emitter.edge_traverser (raises);
+ finder_operation_emitter.edge_traverser (receives);
+ finder_operation_emitter.edge_traverser (returns);
+ finder_operation_emitter.edge_traverser (raises);
+
+ bool for_exec_src = true;
+ ParameterEmitter<Traversal::InParameter> in_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::InOutParameter> inout_param (
+ ctx,
+ for_exec_src
+ );
+ ParameterEmitter<Traversal::OutParameter> out_param (
+ ctx,
+ for_exec_src
+ );
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Attribute operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ home_emitter.edge_traverser (home_inherits);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ bool exec_src = true;
+ AttributeSourceEmitter<SemanticGraph::Home> attribute_emitter (
+ ctx,
+ t,
+ exec_src
+ );
+ defines.node_traverser (attribute_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Implicit operations." << endl << endl
+ << STRS[COMP_EC] << "_ptr" << endl
+ << t.name () << "_exec_i::create ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_CE] << "))" << endl
+ << "{"
+ << STRS[COMP_EC] << "_ptr retval =" << endl
+ << " " << STRS[COMP_EC] << "::_nil ();" << endl
+ << "ACE_NEW_THROW_EX (" << endl
+ << "retval," << endl;
+
+ Traversal::Home home_emitter;
+
+ Traversal::Manages manages_;
+ home_emitter.edge_traverser (manages_);
+
+ SimpleTypeNameEmitter manages_emitter (ctx);
+ manages_.node_traverser (manages_emitter);
+
+ home_emitter.traverse (t);
+
+ os << "_exec_i," << endl
+ << "::CORBA::NO_MEMORY ());"
+ << endl
+ << "return retval;"
+ << "}";
+ }
+
+ virtual void
+ post (Type& t)
+ {
+ // We need to escape C++ keywords before flattening the name.
+ //
+ string name;
+ {
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << t.scoped_name ();
+ name = regex::perl_s (ostr.str (), "/::/_/");
+ }
+
+ os << "extern \"C\" " << ctx.export_macro ()
+ << " ::Components::HomeExecutorBase_ptr" << endl
+ << "create" << name << "_Impl (void)" << endl
+ << "{"
+ << "::Components::HomeExecutorBase_ptr retval =" << endl
+ << " ::Components::HomeExecutorBase::_nil ();" << endl
+ << "ACE_NEW_RETURN (" << endl
+ << "retval," << endl
+ << t.name () << "_exec_i," << endl
+ << "::Components::HomeExecutorBase::_nil ());" << endl
+ << "return retval;"
+ << "}";
+ }
+ };
+}
+
+ExecImplSourceEmitter::ExecImplSourceEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ string export_macro,
+ fs::path const& file)
+ : os (os_),
+ cl_ (cl),
+ export_macro_ (export_macro),
+ file_ (file)
+{}
+
+void
+ExecImplSourceEmitter::pre (TranslationUnit&)
+{
+ os << COPYRIGHT;
+
+ string file_name ("");
+
+ if (! file_.empty ())
+ {
+ file_name = file_.leaf ();
+ }
+
+ string file_suffix = cl_.get_value ("exec-hdr-file-suffix",
+ "_exec.h");
+
+ file_name = regex::perl_s (file_name,
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1"
+ + file_suffix
+ + "/");
+
+ os << "#include \"" << file_name << "\"" << endl
+ << "#include \"ciao/CIAO_common.h\"" << endl << endl;
+}
+
+void
+ExecImplSourceEmitter::generate (TranslationUnit& u)
+{
+ pre (u);
+
+ Context c (os, export_macro_, cl_);
+
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion principal_region;
+ contains_principal.node_traverser (principal_region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ principal_region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ ModuleEmitter module (c);
+ CompositionEmitter composition (c);
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+
+ // Layer 4
+ //
+ composition.edge_traverser (defines);
+ module.edge_traverser (defines);
+
+ //--
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+ defines.node_traverser (component_executor);
+ defines.node_traverser (home_executor);
+
+ // Layer 5
+ //
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+
+ //--
+ ComponentExecImplEmitter component_exec_impl_emitter (c);
+ HomeExecImplEmitter home_exec_impl_emitter (c);
+ implements.node_traverser (component_exec_impl_emitter);
+ implements.node_traverser (home_exec_impl_emitter);
+
+ unit.traverse (u);
+
+ post (u);
+}
+
+void
+ExecImplSourceEmitter::post (TranslationUnit&)
+{
+}
+
diff --git a/modules/CIAO/CIDLC/ExecImplSourceGenerator.hpp b/modules/CIAO/CIDLC/ExecImplSourceGenerator.hpp
new file mode 100644
index 00000000000..bf70a53870a
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecImplSourceGenerator.hpp
@@ -0,0 +1,43 @@
+// file : CIDLC/ExecImplSourceGenerator.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef EXEC_IMPL_SOURCE_GENERATOR_HPP
+#define EXEC_IMPL_SOURCE_GENERATOR_HPP
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+using std::string;
+
+class ExecImplSourceEmitter
+{
+public:
+ ExecImplSourceEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ string export_macro,
+ fs::path const& file);
+
+ virtual ~ExecImplSourceEmitter () {}
+
+ virtual void
+ pre (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+ virtual void
+ generate (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+ virtual void
+ post (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+private:
+ std::ostream& os;
+ CommandLine const& cl_;
+ string export_macro_;
+ fs::path file_;
+};
+
+
+#endif // EXEC_IMPL_SOURCE_GENERATOR_HPP
+
diff --git a/modules/CIAO/CIDLC/ExecutorMappingGenerator.cpp b/modules/CIAO/CIDLC/ExecutorMappingGenerator.cpp
new file mode 100644
index 00000000000..369fbbaac02
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecutorMappingGenerator.cpp
@@ -0,0 +1,2099 @@
+// file : CIDLC/ExecutorMappingGenerator.cpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ExecutorMappingGenerator.hpp"
+#include "Literals.hpp"
+
+#include <set>
+#include <ostream>
+#include <fstream>
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+#include "CCF/CodeGenerationKit/IndentationIDL.hpp"
+#include "CCF/CodeGenerationKit/IndentationImplanter.hpp"
+
+using std::string;
+using std::ostream;
+using std::endl;
+
+using namespace StringLiterals;
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+namespace
+{
+ class Context
+ {
+ public:
+ Context (TranslationUnit& tu)
+ : tu_ (tu)
+ {
+ }
+
+ TranslationUnit&
+ tu () const
+ {
+ return tu_;
+ }
+
+ public:
+ bool
+ add (Home& h)
+ {
+ return homes_.insert (&h).second;
+ }
+
+ bool
+ add (Component& c)
+ {
+ return components_.insert (&c).second;
+ }
+
+ bool
+ add (UnconstrainedInterface& i)
+ {
+ return interfaces_.insert (std::make_pair(&i, true)).second;
+ }
+
+ bool
+ add (Composition& c)
+ {
+ return compositions_.insert (&c).second;
+ }
+
+ public:
+ bool
+ find (Home& h) const
+ {
+ return homes_.find (&h) != homes_.end ();
+ }
+
+ bool
+ find (Component& c) const
+ {
+ return components_.find (&c) != components_.end ();
+ }
+
+ bool
+ find (UnconstrainedInterface& i) const
+ {
+ return interfaces_.find (&i) != interfaces_.end ();
+ }
+
+ // The next two functions help to keep track of forward
+ // declarations for LEM. The non-const version should be
+ // used in emitter (note that it changed the flag to false).
+ // The const version should be used in module re-opener.
+ //
+ bool
+ find_fwd (UnconstrainedInterface& i)
+ {
+ Interfaces::iterator it (interfaces_.find (&i));
+
+ if (it == interfaces_.end ()) return false;
+
+ if (it->second)
+ {
+ it->second = false;
+ return true;
+ }
+
+ return false;
+ }
+
+ bool
+ find_fwd (UnconstrainedInterface& i) const
+ {
+ Interfaces::const_iterator it (interfaces_.find (&i));
+
+ return it != interfaces_.end () && it->second;
+ }
+
+ bool
+ find (Composition& c) const
+ {
+ return compositions_.find (&c) != compositions_.end ();
+ }
+
+ private:
+ typedef std::set<Home*> Homes;
+ typedef std::set<Component*> Components;
+ typedef std::map<UnconstrainedInterface*, bool> Interfaces;
+ typedef std::set<Composition*> Compositions;
+
+ TranslationUnit& tu_;
+
+ Homes homes_;
+ Components components_;
+ Interfaces interfaces_;
+ Compositions compositions_;
+ };
+
+ class Traverser
+ {
+ protected:
+ Traverser (Context& c)
+ : ctx (c)
+ {
+ }
+
+ Context& ctx;
+ };
+
+ struct Collector : Traverser
+ {
+ protected:
+ Collector (Context& c)
+ : Traverser (c)
+ {
+ }
+
+ bool
+ exist (ScopedName const& name)
+ {
+ return !ctx.tu ().lookup (name).empty ();
+ }
+ };
+
+ //
+ //
+ //
+ struct ComponentCollector : Traversal::Component, Collector
+ {
+ ComponentCollector (Context& c)
+ : Collector (c)
+ {
+ }
+
+ virtual void
+ traverse (Type& c)
+ {
+ SimpleName name (c.name ());
+ ScopedName scope (c.scoped_name ().scope_name ());
+
+ ScopedName monolith (scope, "CCM_" + name);
+ ScopedName context (scope, "CCM_" + name + "_Context");
+
+ // Check if mapping has already been provided.
+ //
+ if (exist (context) || exist (monolith)) return;
+
+ if(ctx.add (c))
+ {
+ // Collect inherited components and provides interfaces.
+ //
+ Traversal::Component::traverse (c);
+ }
+ }
+ };
+
+
+ //
+ //
+ //
+ struct HomeCollector : Traversal::Home, Collector
+ {
+ HomeCollector (Context& c)
+ : Collector (c)
+ {
+ }
+
+ virtual void
+ traverse (Type& h)
+ {
+ SimpleName name (h.name ());
+ ScopedName scope (h.scoped_name ().scope_name ());
+
+ ScopedName main (scope, "CCM_" + name);
+ ScopedName expl (scope, "CCM_" + name + "Explicit");
+ ScopedName impl (scope, "CCM_" + name + "Implicit");
+
+ // Check if mapping has already been provided.
+ //
+ if (exist (main) || exist (expl) || exist (impl)) return;
+
+ if(ctx.add (h))
+ {
+ // Note that I don't go after components that inherited home manages
+ // because it will be handled by component inheritance tree.
+ //
+ Traversal::Home::traverse (h);
+ }
+ }
+ };
+
+
+ //
+ //
+ //
+ struct InterfaceCollector : Traversal::UnconstrainedInterface, Collector
+ {
+ InterfaceCollector (Context& c)
+ : Collector (c)
+ {
+ }
+
+ virtual void
+ traverse (Type& i)
+ {
+ SimpleName name (i.name ());
+ ScopedName scope (i.scoped_name ().scope_name ());
+
+ ScopedName mapping (scope, "CCM_" + name);
+
+ // Check if mapping has already been provided.
+ //
+ if (exist (mapping)) return;
+
+ // Add to the list if it's not already there.
+ //
+ ctx.add (i);
+ }
+ };
+
+ struct CompositionCollector : Traversal::Composition, Collector
+ {
+ CompositionCollector (Context& c)
+ : Collector (c)
+ {
+ }
+
+ virtual void
+ traverse (Type& c)
+ {
+ // Add to the list if it's not already there.
+ //
+ if (ctx.add (c))
+ {
+ Traversal::Composition::traverse (c);
+ }
+ }
+ };
+
+ struct Emitter : Traverser
+ {
+ protected:
+ Emitter (Context& c, ostream& os_)
+ : Traverser (c), os (os_)
+ {
+ }
+
+ protected:
+ ostream& os;
+ };
+
+
+ //
+ //
+ //
+ struct FullTypeNameEmitter : Traversal::FundamentalType,
+ Traversal::Type,
+ Emitter
+ {
+ FullTypeNameEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::FundamentalType& t)
+ {
+ os << t.name ();
+ }
+
+ virtual void
+ traverse (SemanticGraph::Type& t)
+ {
+ os << t.scoped_name ();
+ }
+ };
+
+
+ struct NameMangler : Traversal::Nameable, Emitter
+ {
+ NameMangler (Context& c,
+ ostream& os,
+ string const& prefix,
+ string const& suffix = "")
+ : Emitter (c, os), prefix_ (prefix), suffix_ (suffix)
+ {
+ }
+
+ virtual void
+ traverse (Type& t)
+ {
+ ScopedName n (t.scoped_name ());
+ os << n.scope_name () << "::" << prefix_ << n.simple_name () << suffix_;
+ }
+
+ private:
+ string prefix_, suffix_;
+ };
+
+
+ //
+ //
+ //
+ struct ComponentEmitter : Traversal::Component, Emitter
+ {
+ protected:
+ ComponentEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ traverse (Type& c)
+ {
+ if (ctx.find (c))
+ {
+ Component::traverse (c);
+ }
+ }
+ };
+
+ struct AttributeEmitter : Traversal::ReadAttribute,
+ Traversal::ReadWriteAttribute,
+ Emitter
+ {
+ AttributeEmitter (Context& c, ostream& os)
+ : Emitter (c, os),
+ type_name_ (c, os)
+ {
+ edge_traverser (get_raises_);
+ edge_traverser (set_raises_);
+
+ get_raises_.node_traverser (type_name_);
+ set_raises_.node_traverser (type_name_);
+ }
+
+ // ReadAttribute
+ //
+ virtual void
+ pre (SemanticGraph::ReadAttribute& )
+ {
+ os << "readonly attribute ";
+ }
+
+ virtual void
+ name (SemanticGraph::ReadAttribute& a)
+ {
+ os << " " << a.name ();
+ }
+
+ virtual void
+ get_raises_pre (SemanticGraph::ReadAttribute&)
+ {
+ os << " raises (";
+ }
+
+ virtual void
+ get_raises_post (SemanticGraph::ReadAttribute&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ post (SemanticGraph::ReadAttribute&)
+ {
+ os << ";";
+ }
+
+ virtual void
+ comma (SemanticGraph::ReadAttribute&)
+ {
+ os << ", ";
+ }
+
+ // ReadWriteAttribute
+ //
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute& )
+ {
+ os << "attribute ";
+ }
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << " " << a.name ();
+ }
+
+ virtual void
+ get_raises_pre (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << " getraises (";
+ }
+
+ virtual void
+ get_raises_post (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ set_raises_pre (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << " setraises (";
+ }
+
+ virtual void
+ set_raises_post (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ post (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << ";";
+ }
+
+ virtual void
+ comma (SemanticGraph::ReadWriteAttribute&)
+ {
+ os << ", ";
+ }
+
+ private:
+ Traversal::GetRaises get_raises_;
+ Traversal::SetRaises set_raises_;
+ FullTypeNameEmitter type_name_;
+ };
+
+
+ // MonolithEmitter generates what spec calls 'Monolithic Component
+ // Executor'.
+ //
+ struct MonolithEmitter : ComponentEmitter
+ {
+ MonolithEmitter (Context& c, ostream& os)
+ : ComponentEmitter (c, os),
+ monolith_name_emitter (c, os, "CCM_"),
+ attribute (c, os),
+ consumer (c, os),
+ provider (c, os),
+ type_name_emitter (c, os)
+ {
+ edge_traverser (inherits);
+ edge_traverser (defines);
+
+ inherits.node_traverser (monolith_name_emitter);
+
+ defines.node_traverser (attribute);
+ defines.node_traverser (consumer);
+ defines.node_traverser (provider);
+
+ attribute.edge_traverser (belongs);
+ consumer.edge_traverser (belongs);
+ provider.edge_traverser (provider_belongs);
+
+ belongs.node_traverser (type_name_emitter);
+ provider_belongs.node_traverser (monolith_name_emitter);
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "local interface ";
+ }
+
+ virtual void
+ name (Type& c)
+ {
+ os << "CCM_" << c.name ();
+ }
+
+ virtual void
+ inherits_pre (Type&)
+ {
+ os << " : ";
+ }
+
+ virtual void
+ inherits_none (Type&)
+ {
+ os << " : " << STRS[COMP_EC];
+ }
+
+ virtual void
+ supports_pre (Type&)
+ {
+ os << ", ";
+ }
+
+ virtual void
+ names_pre (Type&)
+ {
+ os << "{";
+ }
+
+ virtual void
+ names_post (Type&)
+ {
+ os << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+
+ virtual void
+ comma (Type&)
+ {
+ os << ", ";
+ }
+
+ private:
+ struct Consumer : Traversal::ConsumerSet, Emitter
+ {
+ Consumer (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ returns (Type&)
+ {
+ os << "void";
+ }
+
+ virtual void
+ name (Type& c)
+ {
+ os << " push_" << c.name ();
+ }
+
+ virtual void
+ receives_pre (Type&)
+ {
+ os << " (in ";
+ }
+
+ virtual void
+ receives_post (Type&)
+ {
+ os << " e)";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+ };
+
+
+ struct Provider : Traversal::ProviderGet, Emitter
+ {
+ Provider (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ name (Type& c)
+ {
+ os << " get_" << c.name ();
+ }
+
+ virtual void
+ receives_pre (Type&)
+ {
+ os << " (";
+ }
+
+ virtual void
+ receives_post (Type&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+ };
+
+ Traversal::Inherits inherits;
+ Traversal::Defines defines;
+
+ NameMangler monolith_name_emitter;
+
+ AttributeEmitter attribute;
+ Consumer consumer;
+ Provider provider;
+
+ Traversal::Belongs belongs;
+ Traversal::Belongs provider_belongs;
+
+ FullTypeNameEmitter type_name_emitter;
+ };
+
+
+ // ContextEmitter generates component context interface.
+ //
+ //
+ struct ContextPortEmitter : Traversal::MultiUserGet,
+ Traversal::SingleUserGet,
+ Traversal::PublisherSet,
+ Traversal::EmitterSet,
+ Emitter
+ {
+ ContextPortEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+
+ // MultiUser.
+ //
+ virtual void
+ returns (SemanticGraph::MultiUser& u)
+ {
+ Component& c (dynamic_cast<Component&>((*u.named_begin ())->scope ()));
+ os << c.scoped_name () << "::" << u.name () << "Connections";
+ }
+
+ virtual void
+ name (SemanticGraph::MultiUser& u)
+ {
+ os << " get_connections_" << u.name ();
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::MultiUser&)
+ {
+ os << " (";
+ }
+
+ virtual void
+ receives_post (SemanticGraph::MultiUser&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ post (SemanticGraph::MultiUser&)
+ {
+ os << ";";
+ }
+
+
+ // SingleUser.
+ //
+ virtual void
+ name (SemanticGraph::SingleUser& u)
+ {
+ os << " get_connection_" << u.name ();
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::SingleUser&)
+ {
+ os << " (";
+ }
+
+ virtual void
+ receives_post (SemanticGraph::SingleUser&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ post (SemanticGraph::SingleUser&)
+ {
+ os << ";";
+ }
+
+ // Publisher.
+ //
+ virtual void
+ returns (SemanticGraph::Publisher&)
+ {
+ os << "void";
+ }
+
+ virtual void
+ name (SemanticGraph::Publisher& p)
+ {
+ os << " push_" << p.name ();
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::Publisher&)
+ {
+ os << " (in ";
+ }
+
+ virtual void
+ receives_post (SemanticGraph::Publisher&)
+ {
+ os << " e)";
+ }
+
+ virtual void
+ post (SemanticGraph::Publisher&)
+ {
+ os << ";";
+ }
+
+
+ // Emitter.
+ //
+ virtual void
+ returns (SemanticGraph::Emitter&)
+ {
+ os << "void";
+ }
+
+ virtual void
+ name (SemanticGraph::Emitter& e)
+ {
+ os << " push_" << e.name ();
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::Emitter&)
+ {
+ os << " (in ";
+ }
+
+ virtual void
+ receives_post (SemanticGraph::Emitter&)
+ {
+ os << " e)";
+ }
+
+ virtual void
+ post (SemanticGraph::Emitter&)
+ {
+ os << ";";
+ }
+ };
+
+
+ struct ContextEmitter : ComponentEmitter
+ {
+ ContextEmitter (Context& c, ostream& os, CommandLine const& cl)
+ : ComponentEmitter (c, os),
+ name_emitter (c, os, "CCM_", "_Context"),
+ cl_ (cl)
+ {
+ edge_traverser (inherits);
+ inherits.node_traverser (name_emitter);
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "local interface ";
+ }
+
+ virtual void
+ name (Type& c)
+ {
+ os << "CCM_" << c.name () << "_Context";
+ }
+
+ virtual void
+ inherits_pre (Type&)
+ {
+ os << " : ";
+ }
+
+ virtual void
+ inherits_none (Type&)
+ {
+ string swap_option = cl_.get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+ {
+ os << " : ::CIAO::UpgradeableContext";
+ }
+ else
+ {
+ //@@ should be os << " : ::Components::CCMContext";
+ os << " : " << STRS[COMP_SC];
+ }
+ }
+
+ virtual void
+ names_pre (Type&)
+ {
+ os << "{";
+ }
+
+ virtual void
+ names_post (Type&)
+ {
+ os << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+
+ private:
+ Traversal::Inherits inherits;
+ NameMangler name_emitter;
+ CommandLine const& cl_;
+ };
+
+
+ //
+ //
+ //
+ struct HomeEmitter : Traversal::Home, Emitter
+ {
+ HomeEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ traverse (Type& h)
+ {
+ if (ctx.find (h))
+ {
+ Home::traverse (h);
+ }
+ }
+ };
+
+
+ // HomeExplicitEmitter generates home explicit interface
+ //
+ //
+ struct ExplicitPortEmitter : AttributeEmitter,
+ Traversal::Operation,
+ Traversal::HomeFactory,
+ Traversal::HomeFinder
+ {
+ ExplicitPortEmitter (Context& c, ostream& os)
+ : AttributeEmitter (c, os)
+ {
+ }
+
+ // Operation.
+ //
+
+ virtual void
+ name (SemanticGraph::Operation& o)
+ {
+ os << " " << o.name ();
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::Operation&)
+ {
+ os << " (";
+ }
+
+ virtual void
+ receives_post (SemanticGraph::Operation&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ receives_none (SemanticGraph::Operation&)
+ {
+ os << " ()";
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::Operation&)
+ {
+ os << " raises (";
+ }
+
+ virtual void
+ raises_post (SemanticGraph::Operation&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ post (SemanticGraph::Operation&)
+ {
+ os << ";";
+ }
+
+ virtual void
+ comma (SemanticGraph::Operation&)
+ {
+ os << ", ";
+ }
+
+
+ // HomeFactory.
+ //
+
+ virtual void
+ returns (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[COMP_EC] << " ";
+ }
+
+ virtual void
+ name (SemanticGraph::HomeFactory& hf)
+ {
+ os << " " << hf.name ();
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFactory&)
+ {
+ os << " (";
+ }
+
+ virtual void
+ receives_post (SemanticGraph::HomeFactory&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ receives_none (SemanticGraph::HomeFactory&)
+ {
+ os << " ()";
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFactory&)
+ {
+ os << " raises (";
+ }
+
+ virtual void
+ raises_post (SemanticGraph::HomeFactory&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ post (SemanticGraph::HomeFactory&)
+ {
+ os << ";";
+ }
+
+ virtual void
+ comma (SemanticGraph::HomeFactory&)
+ {
+ os << ", ";
+ }
+
+ // HomeFinder.
+ //
+
+ virtual void
+ returns (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[COMP_EC] << " ";
+ }
+
+ virtual void
+ name (SemanticGraph::HomeFinder& hf)
+ {
+ os << " " << hf.name ();
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFinder&)
+ {
+ os << " (";
+ }
+
+ virtual void
+ receives_post (SemanticGraph::HomeFinder&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ receives_none (SemanticGraph::HomeFinder&)
+ {
+ os << " ()";
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFinder&)
+ {
+ os << " raises (";
+ }
+
+ virtual void
+ raises_post (SemanticGraph::HomeFinder&)
+ {
+ os << ")";
+ }
+
+ virtual void
+ post (SemanticGraph::HomeFinder&)
+ {
+ os << ";";
+ }
+
+ virtual void
+ comma (SemanticGraph::HomeFinder&)
+ {
+ os << ", ";
+ }
+ };
+
+ struct ParameterEmitter : Traversal::InParameter,
+ Traversal::OutParameter,
+ Traversal::InOutParameter,
+ public Emitter
+ {
+ ParameterEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ pre (InParameter&)
+ {
+ os << endl << "in ";
+ }
+
+ virtual void
+ pre (OutParameter&)
+ {
+ os << endl << "out ";
+ }
+
+ virtual void
+ pre (InOutParameter&)
+ {
+ os << endl << "inout ";
+ }
+
+ virtual void
+ name (InParameter& p)
+ {
+ os << " " << p.name ();
+ }
+
+ virtual void
+ name (OutParameter& p)
+ {
+ os << " " << p.name ();
+ }
+
+ virtual void
+ name (InOutParameter& p)
+ {
+ os << " " << p.name ();
+ }
+ };
+
+ struct HomeExplicitEmitter : HomeEmitter
+ {
+ HomeExplicitEmitter (Context& c, ostream& os)
+ : HomeEmitter (c, os), name_emitter (c, os, "CCM_", "Explicit")
+ {
+ edge_traverser (inherits);
+ inherits.node_traverser (name_emitter);
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "local interface ";
+ }
+
+ virtual void
+ name (Type& h)
+ {
+ os << "CCM_" << h.name () << "Explicit";
+ }
+
+ virtual void
+ inherits_pre (Type&)
+ {
+ os << " : ";
+ }
+
+ virtual void
+ inherits_none (Type&)
+ {
+ os << " : ::Components::HomeExecutorBase";
+ }
+
+ virtual void
+ supports_pre (Type&)
+ {
+ os << ", ";
+ }
+
+ virtual void
+ names_pre (Type&)
+ {
+ os << "{";
+ }
+
+ virtual void
+ names_post (Type&)
+ {
+ os << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+
+ virtual void
+ comma (Type&)
+ {
+ os << ", ";
+ }
+
+ private:
+ Traversal::Inherits inherits;
+ NameMangler name_emitter;
+ };
+
+
+ // HomeImplicitEmitter generates home implicit interface
+ //
+ //
+ struct HomeImplicitEmitter : HomeEmitter
+ {
+ HomeImplicitEmitter (Context& c, ostream& os)
+ : HomeEmitter (c, os)
+ {
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "local interface ";
+ }
+
+ virtual void
+ name (Type& h)
+ {
+ os << "CCM_" << h.name () << "Implicit";
+ }
+
+ virtual void
+ names (Type&)
+ {
+ os << "{"
+ << STRS[COMP_EC] << " "
+ << "create () raises (" << STRS[EXCP_CE] << ");"
+ << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+ };
+
+
+ // HomeMainEmitter generates home main interface
+ //
+ //
+ struct HomeMainEmitter : HomeEmitter
+ {
+ HomeMainEmitter (Context& c, ostream& os)
+ : HomeEmitter (c, os)
+ {
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "local interface ";
+ }
+
+ virtual void
+ name (Type& h)
+ {
+ os << "CCM_" << h.name ();
+ }
+
+ virtual void
+ inherits (Type& h)
+ {
+ os << " : "
+ << "CCM_" << h.name () << "Explicit, "
+ << "CCM_" << h.name () << "Implicit";
+ }
+
+ virtual void
+ names (Type&)
+ {
+ os << "{}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+ };
+
+ //
+ //
+ //
+ struct ModuleEmitter : Traversal::Module, Emitter
+ {
+ ModuleEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ traverse (Type& m)
+ {
+ if (has_elements (m))
+ {
+ Traversal::Module::traverse (m);
+ }
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "module ";
+ }
+
+ virtual void
+ name (Type& m)
+ {
+ os << m.name ();
+ }
+
+ virtual void
+ names_pre (Type&)
+ {
+ os << "{";
+ }
+
+ virtual void
+ names_post (Type&)
+ {
+ os << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+
+ private:
+
+ template <typename T>
+ struct Finder : T
+ {
+ Finder (Context& c, bool& r)
+ : ctx (c), r_ (r)
+ {
+ }
+
+ virtual void
+ traverse (typename T::Type& t)
+ {
+ if (ctx.find (t)) r_ = true;
+ }
+
+ private:
+ Context& ctx;
+ bool& r_;
+ };
+
+
+ struct InterfaceFwdFinder : Traversal::UnconstrainedInterface
+ {
+ InterfaceFwdFinder (Context const& c, bool& r)
+ : ctx (c), r_ (r)
+ {
+ }
+
+ virtual void
+ traverse (Type& i)
+ {
+ // Make sure we use const version of find_fwd.
+ //
+ if (ctx.find_fwd (i)) r_ = true;
+ }
+
+ private:
+ Context const& ctx;
+ bool& r_;
+ };
+
+ bool
+ has_elements (Type& m)
+ {
+ bool r (false);
+
+ Traversal::Module module;
+ Traversal::Defines defines;
+ Traversal::Mentions mentions;
+
+ module.edge_traverser (defines);
+ module.edge_traverser (mentions);
+
+ //@@ MSVC bug: interface is considered to be an alias for a struct.
+ //
+ Finder<Traversal::Composition> composition (ctx, r);
+ Finder<Traversal::UnconstrainedInterface> interface_ (ctx, r);
+ InterfaceFwdFinder interface_fwd (ctx, r);
+ Finder<Traversal::Component> component (ctx, r);
+ Finder<Traversal::Home> home (ctx, r);
+
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+ defines.node_traverser (interface_);
+ defines.node_traverser (component);
+ defines.node_traverser (home);
+
+ mentions.node_traverser (interface_fwd);
+
+ module.traverse (m);
+
+ return r;
+ }
+ };
+
+ //
+ //
+ //
+ struct InterfaceFwdEmitter : Traversal::UnconstrainedInterface, Emitter
+ {
+ InterfaceFwdEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ traverse (Type& i)
+ {
+ if (ctx.find_fwd (i))
+ {
+ os << "local interface CCM_" << i.name () << ";";
+ }
+ }
+ };
+
+ //
+ //
+ //
+ struct InterfaceEmitter : Traversal::UnconstrainedInterface, Emitter
+ {
+ InterfaceEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ traverse (Type& i)
+ {
+ if (ctx.find (i))
+ {
+ // No need to emit forward declarations anymore.
+ //
+ ctx.find_fwd (i);
+
+ Traversal::UnconstrainedInterface::traverse (i);
+ }
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "local interface ";
+ }
+
+ virtual void
+ name (Type& i)
+ {
+ os << "CCM_" << i.name ();
+ }
+
+ virtual void
+ inherits (Type& i)
+ {
+ os << " : " << i.name ();
+ }
+
+ virtual void
+ names_pre (Type&)
+ {
+ os << "{";
+ }
+
+ virtual void
+ names_post (Type&)
+ {
+ os << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+ };
+
+
+ //
+ //
+ //
+ struct CompositionEmitter : Traversal::Composition, Emitter
+ {
+ CompositionEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ traverse (Type& c)
+ {
+ if (ctx.find (c))
+ {
+ Traversal::Composition::traverse (c);
+ }
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "module ";
+ }
+
+ virtual void
+ name (Type& m)
+ {
+ os << "CIDL_" << m.name ();
+ }
+
+ virtual void
+ names_pre (Type&)
+ {
+ os << "{";
+ }
+
+ virtual void
+ names_post (Type&)
+ {
+ os << "}";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << ";";
+ }
+ };
+
+
+ struct ComponentContextEmitter : Traversal::ComponentExecutor, Emitter
+ {
+ ComponentContextEmitter (Context& c, ostream& os)
+ : Emitter (c, os),
+ name_emitter_ (c, os, "CCM_", "_Context")
+ {
+ implements_traverser_.node_traverser (name_emitter_);
+ }
+
+ virtual void
+ pre (Type& i)
+ {
+ //@@ This code temporarily generates typedef. Should be changed
+ // when we have proper C++ generated code.
+ //
+ // os << "local interface ";
+ os << "typedef ";
+ Traversal::ComponentExecutor::implements (i, implements_traverser_);
+ }
+
+ virtual void
+ name (Type& i)
+ {
+ //@@ need to check if spec prescribes this name.
+ //
+ os << " " << i.name () << "_Context;";
+ }
+
+ virtual void
+ implements (Type&)
+ {
+ // os << " : ";
+
+ // Traversal::ComponentExecutor::implements (i, implements_traverser_);
+
+ // os << ", "
+ // << STRS[COMP_SC];
+ }
+
+ virtual void
+ post (Type&)
+ {
+ // os << "{};";
+ }
+
+ private:
+ NameMangler name_emitter_;
+ Traversal::Implements implements_traverser_;
+ };
+
+
+ struct ComponentExecutorEmitter : Traversal::ComponentExecutor, Emitter
+ {
+ ComponentExecutorEmitter (Context& c, ostream& os)
+ : Emitter (c, os),
+ name_emitter_ (c, os, "CCM_")
+ {
+ implements_traverser_.node_traverser (name_emitter_);
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "local interface ";
+ }
+
+ virtual void
+ name (Type& i)
+ {
+ os << i.name ();
+ }
+
+ virtual void
+ implements (Type& i)
+ {
+ os << " : ";
+
+ Traversal::ComponentExecutor::implements (i, implements_traverser_);
+
+ os << ", "
+ << "::Components::SessionComponent";
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << "{};";
+ }
+
+ private:
+ NameMangler name_emitter_;
+ Traversal::Implements implements_traverser_;
+ };
+
+
+ struct HomeExecutorEmitter : Traversal::HomeExecutor, Emitter
+ {
+ HomeExecutorEmitter (Context& c, ostream& os)
+ : Emitter (c, os),
+ name_emitter_ (c, os, "CCM_")
+ {
+ implements_traverser_.node_traverser (name_emitter_);
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "local interface ";
+ }
+
+ virtual void
+ name (Type& i)
+ {
+ os << i.name ();
+ }
+
+ virtual void
+ implements (Type& i)
+ {
+ os << " : ";
+
+ Traversal::HomeExecutor::implements (i, implements_traverser_);
+ }
+
+ virtual void
+ post (Type&)
+ {
+ os << "{};";
+ }
+
+ private:
+ NameMangler name_emitter_;
+ Traversal::Implements implements_traverser_;
+ };
+
+ //
+ //
+ //
+ struct IncludesEmitter : Traversal::QuoteIncludes,
+ Traversal::BracketIncludes,
+ Emitter
+ {
+ IncludesEmitter (Context& c, ostream& os)
+ : Emitter (c, os)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::QuoteIncludes& qi)
+ {
+ os << "#include \"" << qi.file ().string () << "\"" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::BracketIncludes& bi)
+ {
+ os << "#include <" << bi.file ().string () << ">" << endl;
+ }
+ };
+}
+
+void ExecutorMappingGenerator::
+options (CL::Description& d)
+{
+ d.add_option (CL::OptionDescription (
+ "lem-force-all",
+ "Force generation of local executor mapping for all IDL "
+ "types including those not used (directly or inderectly) "
+ "by compositions. This option is useful for generating a "
+ "common portion of local executor mapping used by more "
+ "than one component or composition.",
+ CL::OptionType::flag));
+
+ d.add_option (CL::OptionDescription (
+ "lem-file-suffix",
+ "suffix",
+ "Use provided suffix instead of default \'E\' "
+ "when constructing name of local executor mapping file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "lem-file-regex",
+ "regex",
+ "Use provided regular expression when constructing "
+ "name of local executor mapping file.",
+ CL::OptionType::value));
+}
+
+
+void ExecutorMappingGenerator::
+generate (CommandLine const& cl,
+ TranslationUnit& tu,
+ fs::path const& file_path)
+{
+ fs::ofstream ofs;
+
+ string file_name (file_path.empty () ? "" : file_path.leaf ());
+
+ if (!file_name.empty ())
+ {
+ string file_name (file_path.leaf ());
+
+ string suffix (cl.get_value ("lem-file-suffix", "E.idl"));
+
+ string expr (cl.get_value (
+ "lem-file-regex",
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1" + suffix + "/"));
+
+ string lem_file_name (regex::perl_s (file_name, expr));
+
+ fs::path lem_file_path (lem_file_name);
+
+ ofs.open (lem_file_path, std::ios_base::out);
+
+ if (!ofs.is_open ())
+ {
+ cerr << lem_file_name << ": error: unable to open in write mode"
+ << endl;
+ return;
+ }
+ }
+
+ ostream& os = ofs.is_open ()
+ ? static_cast<ostream&> (ofs)
+ : static_cast<ostream&> (std::cout);
+
+ // Dump file header.
+ //
+ os << COPYRIGHT;
+
+ // Set auto-indentation for os.
+ //
+ Indentation::Implanter<Indentation::IDL> guard (os);
+
+ Context ctx (tu);
+
+ if (cl.get_value ("lem-force-all", false))
+ {
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion region;
+
+ contains_principal.node_traverser (region);
+
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ contains_root.node_traverser (root);
+
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ Traversal::Module module;
+ HomeCollector home (ctx);
+ ComponentCollector component (ctx);
+ InterfaceCollector interface_ (ctx);
+
+ defines.node_traverser (module);
+ defines.node_traverser (home);
+ defines.node_traverser (component);
+ defines.node_traverser (interface_);
+
+ // Layer 4
+ //
+ Traversal::Defines component_defines;
+ Traversal::Inherits component_inherits;
+ Traversal::Inherits home_inherits;
+
+ module.edge_traverser (defines);
+
+ home.edge_traverser (home_inherits);
+ component.edge_traverser (component_defines);
+ component.edge_traverser (component_inherits);
+
+ //--
+
+ Traversal::Provider provider;
+
+ component_defines.node_traverser (provider);
+ component_inherits.node_traverser (component);
+ home_inherits.node_traverser (home);
+
+
+ // Layer 5
+ //
+ Traversal::Belongs provider_belongs;
+ provider.edge_traverser (provider_belongs);
+
+ //
+ provider_belongs.node_traverser (interface_);
+
+ // end
+
+ unit.traverse (tu);
+ }
+ else
+ {
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion region;
+
+ contains_principal.node_traverser (region);
+
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ Traversal::Includes includes;
+
+ region.edge_traverser (contains_root);
+ region.edge_traverser (includes);
+
+ //--
+ Traversal::Root root;
+
+ contains_root.node_traverser (root);
+ includes.node_traverser (region);
+
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ Traversal::Module module;
+ CompositionCollector composition (ctx);
+
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+
+
+ // Layer 4
+ //
+ Traversal::Defines composition_defines;
+
+ module.edge_traverser (defines);
+ composition.edge_traverser (composition_defines);
+
+ //--
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+
+ composition_defines.node_traverser (component_executor);
+ composition_defines.node_traverser (home_executor);
+
+ // Layer 5
+ //
+ Traversal::Implements component_executor_implements;
+ Traversal::Implements home_executor_implements;
+
+ component_executor.edge_traverser (component_executor_implements);
+ home_executor.edge_traverser (home_executor_implements);
+
+ //--
+ ComponentCollector component (ctx);
+ HomeCollector home (ctx);
+
+ component_executor_implements.node_traverser (component);
+ home_executor_implements.node_traverser (home);
+
+
+ // Layer 6
+ //
+ Traversal::Defines component_defines;
+ Traversal::Inherits component_inherits;
+ Traversal::Inherits home_inherits;
+
+ component.edge_traverser (component_defines);
+ component.edge_traverser (component_inherits);
+ home.edge_traverser (home_inherits);
+
+ //--
+
+ Traversal::Provider provider;
+
+ component_defines.node_traverser (provider);
+ component_inherits.node_traverser (component);
+ home_inherits.node_traverser (home);
+
+
+ // Layer 7
+ //
+ Traversal::Belongs provider_belongs;
+ provider.edge_traverser (provider_belongs);
+
+ //
+ InterfaceCollector interface_ (ctx);
+
+ provider_belongs.node_traverser (interface_);
+
+
+ // end
+
+ unit.traverse (tu);
+ }
+
+ {
+ os << "#include \"ciao/CCM_Container.idl\"" << endl;
+
+ if (cl.get_value ("lem-force-all", false) && !file_name.empty ())
+ {
+ os << "#include \"" << file_name << '\"' << endl;
+ }
+
+ string swap_option = cl.get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+ {
+ os << "#include <CIAO_UpgradeableContext.idl>" << endl;
+ }
+
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion principal_region;
+
+ contains_principal.node_traverser (principal_region);
+
+
+ // Layer 2
+ //
+ Traversal::TranslationRegion included_region;
+
+ // Inclusion handling is somewhat tricky because we want
+ // to print only top-level #include's.
+ //
+
+ Traversal::ContainsRoot contains_root;
+ Traversal::QuoteIncludes quote_includes;
+ Traversal::BracketIncludes bracket_includes;
+ IncludesEmitter includes_emitter (ctx, os);
+
+
+ principal_region.edge_traverser (includes_emitter);
+ principal_region.edge_traverser (quote_includes);
+ principal_region.edge_traverser (bracket_includes);
+ principal_region.edge_traverser (contains_root);
+
+ included_region.edge_traverser (quote_includes);
+ included_region.edge_traverser (bracket_includes);
+ included_region.edge_traverser (contains_root);
+
+
+ //--
+ Traversal::Root root;
+
+ contains_root.node_traverser (root);
+ quote_includes.node_traverser (included_region);
+ bracket_includes.node_traverser (included_region);
+
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ Traversal::Mentions mentions;
+ root.edge_traverser (defines);
+ root.edge_traverser (mentions);
+
+ //--
+ ModuleEmitter module (ctx, os);
+
+ CompositionEmitter composition (ctx, os);
+
+ InterfaceEmitter interface_ (ctx, os);
+ InterfaceFwdEmitter interface_fwd (ctx, os);
+
+ MonolithEmitter component_monolith (ctx, os);
+ ContextEmitter component_context (ctx, os, cl);
+
+ HomeImplicitEmitter home_implicit (ctx, os);
+ HomeExplicitEmitter home_explicit (ctx, os);
+ HomeMainEmitter home_main (ctx, os);
+
+ defines.node_traverser (module);
+
+ defines.node_traverser (composition);
+
+ defines.node_traverser (interface_);
+ mentions.node_traverser (interface_fwd);
+
+ defines.node_traverser (component_monolith);
+ defines.node_traverser (component_context);
+
+ defines.node_traverser (home_implicit);
+ defines.node_traverser (home_explicit);
+ defines.node_traverser (home_main);
+
+ // Layer 4
+ //
+
+ Traversal::Supports supports;
+
+ Traversal::Defines composition_defines;
+
+ Traversal::Defines component_context_defines;
+
+ Traversal::Defines home_explicit_defines;
+
+ module.edge_traverser (defines);
+ module.edge_traverser (mentions);
+
+ composition.edge_traverser (composition_defines);
+
+ component_monolith.edge_traverser (supports);
+ component_context.edge_traverser (component_context_defines);
+
+ home_explicit.edge_traverser (supports);
+ home_explicit.edge_traverser (home_explicit_defines);
+
+ //--
+ FullTypeNameEmitter type (ctx, os);
+
+ ComponentContextEmitter session_component_context (ctx, os);
+ ComponentExecutorEmitter session_component_executor (ctx, os);
+ HomeExecutorEmitter session_home_executor (ctx, os);
+
+ ContextPortEmitter port_context (ctx, os);
+ ExplicitPortEmitter port_explicit (ctx, os);
+
+ supports.node_traverser (type);
+
+ composition_defines.node_traverser (session_component_context);
+ composition_defines.node_traverser (session_component_executor);
+ composition_defines.node_traverser (session_home_executor);
+
+ component_context_defines.node_traverser (port_context);
+
+ home_explicit_defines.node_traverser (port_explicit);
+
+
+ // Layer 5
+ //
+ Traversal::Belongs belongs;
+ Traversal::Receives receives;
+ Traversal::Raises raises;
+
+ port_context.edge_traverser (belongs);
+ port_explicit.edge_traverser (belongs);
+ port_explicit.edge_traverser (raises);
+
+ port_explicit.edge_traverser (receives);
+
+ //--
+ ParameterEmitter parameter (ctx, os);
+
+ belongs.node_traverser (type);
+ receives.node_traverser (parameter);
+ raises.node_traverser (type);
+
+ // Layer 6
+ //
+ parameter.edge_traverser (belongs);
+
+
+ // end
+
+ unit.traverse (tu);
+ }
+}
diff --git a/modules/CIAO/CIDLC/ExecutorMappingGenerator.hpp b/modules/CIAO/CIDLC/ExecutorMappingGenerator.hpp
new file mode 100644
index 00000000000..b67892c0658
--- /dev/null
+++ b/modules/CIAO/CIDLC/ExecutorMappingGenerator.hpp
@@ -0,0 +1,32 @@
+// file : CIDLC/ExecutorMappingGenerator.hpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef EXECUTOR_MAPPING_GENERATOR_HPP
+#define EXECUTOR_MAPPING_GENERATOR_HPP
+
+#include "CCF/CompilerElements/FileSystem.hpp"
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+#include "CCF/CodeGenerationKit/CommandLineDescriptor.hpp"
+
+//@@ SemanticGraphFwd could be useful here.
+//
+#include "CCF/CIDL/SemanticGraph.hpp"
+
+class ExecutorMappingGenerator
+{
+public:
+ static void
+ options (CL::Description& d);
+
+ //@@ maybe I should introduce constant and non-constant
+ // traversal.
+ //
+ void
+ generate (CommandLine const& cl,
+ CCF::CIDL::SemanticGraph::TranslationUnit&,
+ fs::path const& file);
+};
+
+#endif // EXECUTOR_MAPPING_GENERATOR_HPP
diff --git a/modules/CIAO/CIDLC/InterfaceEmitter.cpp b/modules/CIAO/CIDLC/InterfaceEmitter.cpp
new file mode 100644
index 00000000000..1ce524cdfab
--- /dev/null
+++ b/modules/CIAO/CIDLC/InterfaceEmitter.cpp
@@ -0,0 +1,26 @@
+// file : CIDLC/InterfaceEmitter.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "InterfaceEmitter.hpp"
+
+InterfaceEmitter::InterfaceEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+InterfaceEmitter::traverse (UnconstrainedInterface& i)
+{
+ if (add (i))
+ {
+ Traversal::UnconstrainedInterface::traverse (i);
+ }
+}
+
+bool
+InterfaceEmitter::add (UnconstrainedInterface& i)
+{
+ return interfaces_.insert (&i).second;
+}
+
diff --git a/modules/CIAO/CIDLC/InterfaceEmitter.hpp b/modules/CIAO/CIDLC/InterfaceEmitter.hpp
new file mode 100644
index 00000000000..fdd2411f912
--- /dev/null
+++ b/modules/CIAO/CIDLC/InterfaceEmitter.hpp
@@ -0,0 +1,30 @@
+// file : CIDLC/InterfaceEmitter.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef INTERFACEEMITTER_HPP
+#define INTERFACEEMITTER_HPP
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "EmitterBase.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+struct InterfaceEmitter : Traversal::UnconstrainedInterface,
+ EmitterBase
+{
+ InterfaceEmitter (Context& c);
+
+ virtual void traverse (UnconstrainedInterface&);
+
+private:
+ bool add (UnconstrainedInterface&);
+
+private:
+ std::set<UnconstrainedInterface*> interfaces_;
+};
+
+#endif // INTERFACEEMITTER_HPP
diff --git a/modules/CIAO/CIDLC/Literals.cpp b/modules/CIAO/CIDLC/Literals.cpp
new file mode 100644
index 00000000000..0ed8f8e9699
--- /dev/null
+++ b/modules/CIAO/CIDLC/Literals.cpp
@@ -0,0 +1,81 @@
+// file : CIDLC/Literals.hpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "Literals.hpp"
+
+namespace StringLiterals
+{
+ char const* const COPYRIGHT =
+ "// $I" "d$\n"
+ "//\n"
+ "// **** Code generated by the ****\n"
+ "// **** Component Integrated ACE ORB (CIAO) CIDL Compiler ****\n"
+ "// CIAO has been developed by:\n"
+ "// Center for Distributed Object Computing\n"
+ "// Washington University\n"
+ "// St. Louis, MO\n"
+ "// USA\n"
+ "// http://www.cs.wustl.edu/~schmidt/doc-center.html\n"
+ "// CIDL Compiler has been developed by:\n"
+ "// Institute for Software Integrated Systems\n"
+ "// Vanderbilt University\n"
+ "// Nashville, TN\n"
+ "// USA\n"
+ "// http://www.isis.vanderbilt.edu/\n"
+ "//\n"
+ "// Information about CIAO is available at:\n"
+ "// http://www.dre.vanderbilt.edu/CIAO"
+ "\n\n";
+
+ char const* const STRS[LIT_SIZE] =
+ {
+ // Common CORBA and all Components exceptions.
+ "ACE_THROW_SPEC (( ::CORBA::SystemException))", // EXCP_SNGL
+ "ACE_THROW_SPEC ((", // EXCP_START
+ "::CORBA::SystemException", // EXCP_SYS
+ "::CORBA::BAD_PARAM ()", // EXCP_BP
+ "::Components::IllegalState", // EXCP_IS
+ "::Components::AlreadyConnected", // EXCP_AC
+ "::Components::InvalidConnection", // EXCP_IC
+ "::Components::NoConnection", // EXCP_NC
+ "::Components::ExceededConnectionLimit", // EXCP_ECL
+ "::Components::InvalidName", // EXCP_IN
+ "::Components::RemoveFailure", // EXCP_RF
+ "::Components::NoKeyAvailable", // EXCP_NKA
+ "::Components::InvalidConfiguration", // EXCP_ICF
+ "::Components::CookieRequired", // EXCP_CR
+ "::Components::BadEventType", // EXCP_BET
+ "::Components::CCMException", // EXCP_CE
+
+ // Commonly used Components module members.
+ "::Components::Cookie", // COMP_CK
+ "::Components::NameList & /* names */", // COMP_NAMES
+ "::Components::EventConsumerBase", // COMP_ECB
+ "::Components::EnterpriseComponent", // COMP_EC
+ "::Components::SessionContext", // COMP_SC
+ "::Components::ConsumerDescriptions", // COMP_CD
+ "::Components::ReceptacleDescriptions", // COMP_RD
+ "::Components::PublisherDescriptions", // COMP_PD
+ "::Components::EmitterDescriptions", // COMP_ED
+
+ // This could change - don't want it scattered all over.
+ "namespace CIDL_", // CIDL_NS
+ "CIAO_FACET", // FACET_PREFIX
+
+ // Labels for things stored in a SyntaxTree node's Context.
+ "CIDLC::RepositoryIdGenerator::TypeId", // TYPE_ID
+ "CIDLC::RepositoryIdGenerator::TypePrefix", // TYPE_PREFIX
+ "CIDLC::RepositoryIdGenerator::RepoId", // REPO_ID
+
+ "// Your code here.", // YCH
+ "//==================================================================", // SEP
+
+ "variable-size", // VAR_SIZE
+ "_ciao_extract_val", // EXTRACT
+ "_ciao_extract_tmp", // EXTRACT_TMP
+ "ACE_UNUSED_ARG", // ACE_UA
+ "ACE_THROW_RETURN" // ACE_TR
+ };
+}
+
diff --git a/modules/CIAO/CIDLC/Literals.hpp b/modules/CIAO/CIDLC/Literals.hpp
new file mode 100644
index 00000000000..09e2a8cb7c4
--- /dev/null
+++ b/modules/CIAO/CIDLC/Literals.hpp
@@ -0,0 +1,58 @@
+// file : CIDLC/Literals.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef LITERALS_HPP
+#define LITERALS_HPP
+
+namespace StringLiterals
+{
+ extern char const* const COPYRIGHT;
+
+ // Index into the string array in Literals.cpp.
+ enum
+ {
+ EXCP_SNGL,
+ EXCP_START,
+ EXCP_SYS,
+ EXCP_BP,
+ EXCP_IS,
+ EXCP_AC,
+ EXCP_IC,
+ EXCP_NC,
+ EXCP_ECL,
+ EXCP_IN,
+ EXCP_RF,
+ EXCP_NKA,
+ EXCP_ICF,
+ EXCP_CR,
+ EXCP_BET,
+ EXCP_CE,
+ COMP_CK,
+ COMP_NAMES,
+ COMP_ECB,
+ COMP_EC,
+ COMP_SC,
+ COMP_CD,
+ COMP_RD,
+ COMP_PD,
+ COMP_ED,
+ CIDL_NS,
+ FACET_PREFIX,
+ TYPE_ID,
+ TYPE_PREFIX,
+ REPO_ID,
+ YCH,
+ SEP,
+ VAR_SIZE,
+ EXTRACT,
+ EXTRACT_TMP,
+ ACE_UA,
+ ACE_TR,
+ LIT_SIZE
+ };
+
+ extern char const* const STRS[LIT_SIZE];
+}
+
+#endif // LITERALS_HPP
diff --git a/modules/CIAO/CIDLC/ModuleEmitter.cpp b/modules/CIAO/CIDLC/ModuleEmitter.cpp
new file mode 100644
index 00000000000..990d95ef4b8
--- /dev/null
+++ b/modules/CIAO/CIDLC/ModuleEmitter.cpp
@@ -0,0 +1,22 @@
+// file : CIDLC/ModuleEmitter.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ModuleEmitter.hpp"
+
+ModuleEmitter::ModuleEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+ModuleEmitter::pre (Type& t)
+{
+ os << "namespace " << t.name () << "{";
+}
+
+void
+ModuleEmitter::post (Type&)
+{
+ os << "}";
+}
diff --git a/modules/CIAO/CIDLC/ModuleEmitter.hpp b/modules/CIAO/CIDLC/ModuleEmitter.hpp
new file mode 100644
index 00000000000..9aa8de2f9ff
--- /dev/null
+++ b/modules/CIAO/CIDLC/ModuleEmitter.hpp
@@ -0,0 +1,24 @@
+// file : CIDLC/ModuleEmitter.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef MODULEEMITTER_HPP
+#define MODULEEMITTER_HPP
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "EmitterBase.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+struct ModuleEmitter : Traversal::Module, EmitterBase
+{
+ ModuleEmitter (Context& c);
+
+ virtual void pre (Type&);
+ virtual void post (Type&);
+};
+
+#endif // MODULEEMITTER_HPP
diff --git a/modules/CIAO/CIDLC/OperationHeaderEmitters.cpp b/modules/CIAO/CIDLC/OperationHeaderEmitters.cpp
new file mode 100644
index 00000000000..e41e3d6d023
--- /dev/null
+++ b/modules/CIAO/CIDLC/OperationHeaderEmitters.cpp
@@ -0,0 +1,264 @@
+// file : CIDLC/OperationHeaderEmitters.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "OperationHeaderEmitters.hpp"
+#include "Literals.hpp"
+
+using namespace StringLiterals;
+
+OperationEmitter::OperationEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+OperationEmitter::pre (Type&)
+{
+ os << "virtual ";
+}
+
+void
+OperationEmitter::name (Type& o)
+{
+ os << endl << o.name ();
+}
+
+void
+OperationEmitter::receives_pre (Type&)
+{
+ os << " (" << endl;
+}
+
+void
+OperationEmitter::receives_none (Type&)
+{
+ os << " ()" << endl;
+}
+
+void
+OperationEmitter::receives_post (Type&)
+{
+ os << endl << ")" << endl;
+}
+
+void
+OperationEmitter::raises_pre (Type&)
+{
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+}
+
+void
+OperationEmitter::raises_none (Type&)
+{
+ os << STRS[EXCP_SNGL];
+}
+
+void
+OperationEmitter::raises_post (Type&)
+{
+ os << "))";
+}
+
+void
+OperationEmitter::post (Type&)
+{
+ os << ";" << endl;
+}
+
+void
+OperationEmitter::comma (Type&)
+{
+ os << "," << endl;
+}
+
+// ==================================================
+
+HomeOperationEmitter::HomeOperationEmitter (Context& c)
+ : OperationEmitter (c)
+{
+}
+
+void
+HomeOperationEmitter::traverse (SemanticGraph::HomeFactory&)
+{
+}
+
+void
+HomeOperationEmitter::traverse (SemanticGraph::HomeFinder&)
+{
+}
+
+// ==================================================
+
+FactoryOperationEmitter::FactoryOperationEmitter (Context& c, bool for_exec)
+ : EmitterBase (c),
+ returns_emitter_ (c),
+ for_exec_ (for_exec)
+{
+ returns_.node_traverser (returns_emitter_);
+}
+
+void
+FactoryOperationEmitter::pre (SemanticGraph::HomeFactory&)
+{
+ os << "virtual ";
+}
+
+void
+FactoryOperationEmitter::returns (SemanticGraph::HomeFactory& t)
+{
+ if (for_exec_)
+ {
+ os << STRS[COMP_EC] << "_ptr";
+ }
+ else
+ {
+ Traversal::HomeFactory::returns (t, returns_);
+ }
+
+ os << endl;
+}
+
+void
+FactoryOperationEmitter::name (SemanticGraph::HomeFactory& t)
+{
+ os << t.name ();
+}
+
+void
+FactoryOperationEmitter::receives_none (SemanticGraph::HomeFactory&)
+{
+ os << " ()" << endl;
+}
+
+void
+FactoryOperationEmitter::receives_pre (SemanticGraph::HomeFactory&)
+{
+ os << " (" << endl;
+}
+
+void
+FactoryOperationEmitter::receives_post (SemanticGraph::HomeFactory&)
+{
+ os << endl << ")" << endl;
+}
+
+void
+FactoryOperationEmitter::raises_none (SemanticGraph::HomeFactory&)
+{
+ os << STRS[EXCP_SNGL];
+}
+
+void
+FactoryOperationEmitter::raises_pre (SemanticGraph::HomeFactory&)
+{
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+}
+
+void
+FactoryOperationEmitter::raises_post (SemanticGraph::HomeFactory&)
+{
+ os << "))";
+}
+
+void
+FactoryOperationEmitter::post (SemanticGraph::HomeFactory&)
+{
+ os << ";" << endl;
+}
+
+void
+FactoryOperationEmitter::comma (SemanticGraph::HomeFactory&)
+{
+ os << "," << endl;
+}
+
+// ==================================================
+
+FinderOperationEmitter::FinderOperationEmitter (Context& c, bool for_exec)
+ : EmitterBase (c),
+ returns_emitter_ (c),
+ for_exec_ (for_exec)
+{
+ returns_.node_traverser (returns_emitter_);
+}
+
+void
+FinderOperationEmitter::pre (SemanticGraph::HomeFinder&)
+{
+ os << "virtual ";
+}
+
+void
+FinderOperationEmitter::returns (SemanticGraph::HomeFinder& t)
+{
+ if (for_exec_)
+ {
+ os << STRS[COMP_EC] << "_ptr";
+ }
+ else
+ {
+ Traversal::HomeFinder::returns (t, returns_);
+ }
+
+ os << endl;
+}
+
+void
+FinderOperationEmitter::name (SemanticGraph::HomeFinder& t)
+{
+ os << t.name ();
+}
+
+void
+FinderOperationEmitter::receives_none (SemanticGraph::HomeFinder&)
+{
+ os << " ()" << endl;
+}
+
+void
+FinderOperationEmitter::receives_pre (SemanticGraph::HomeFinder&)
+{
+ os << " (" << endl;
+}
+
+void
+FinderOperationEmitter::receives_post (SemanticGraph::HomeFinder&)
+{
+ os << endl << ")" << endl;
+}
+
+void
+FinderOperationEmitter::raises_none (SemanticGraph::HomeFinder&)
+{
+ os << STRS[EXCP_SNGL];
+}
+
+void
+FinderOperationEmitter::raises_pre (SemanticGraph::HomeFinder&)
+{
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+}
+
+void
+FinderOperationEmitter::raises_post (SemanticGraph::HomeFinder&)
+{
+ os << "))";
+}
+
+void
+FinderOperationEmitter::post (SemanticGraph::HomeFinder&)
+{
+ os << ";" << endl;
+}
+
+void
+FinderOperationEmitter::comma (SemanticGraph::HomeFinder&)
+{
+ os << "," << endl;
+}
+
diff --git a/modules/CIAO/CIDLC/OperationHeaderEmitters.hpp b/modules/CIAO/CIDLC/OperationHeaderEmitters.hpp
new file mode 100644
index 00000000000..d1fc148e0c3
--- /dev/null
+++ b/modules/CIAO/CIDLC/OperationHeaderEmitters.hpp
@@ -0,0 +1,151 @@
+// file : CIDLC/OperationHeaderEmitters.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef OPERATIONHEADEREMITTERS_HPP
+#define OPERATIONHEADEREMITTERS_HPP
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include "EmitterBase.hpp"
+#include "CorbaTypeNameEmitters.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+struct OperationEmitter : Traversal::Operation,
+ EmitterBase
+{
+ OperationEmitter (Context& c);
+
+ virtual void pre (Type&);
+
+ virtual void name (Type&);
+
+ virtual void receives_pre (Type&);
+
+ virtual void receives_none (Type&);
+
+ virtual void receives_post (Type&);
+
+ virtual void raises_pre (Type&);
+
+ virtual void raises_none (Type&);
+
+ virtual void raises_post (Type&);
+
+ virtual void post (Type&);
+
+ virtual void comma (Type&);
+};
+
+// HomeFactory and HomeFinder are tied to Operation in
+// the front end. Since we want to treat them differently
+// than regular operations in a home (we want to generate
+// base class factory operations returning the base component,
+// for example), we use this class for regular home operations
+// that overrides HomeFactory and HomeFinder traversals
+// to do nothing.
+struct HomeOperationEmitter : OperationEmitter,
+ Traversal::HomeFactory,
+ Traversal::HomeFinder
+{
+ HomeOperationEmitter (Context& c);
+
+ virtual void
+ traverse (SemanticGraph::HomeFactory&);
+
+ virtual void
+ traverse (SemanticGraph::HomeFinder&);
+};
+
+struct FactoryOperationEmitter : Traversal::HomeFactory,
+ EmitterBase
+{
+ FactoryOperationEmitter (Context& c, bool for_exec = false);
+
+ virtual void
+ pre (SemanticGraph::HomeFactory&);
+
+ virtual void
+ returns (SemanticGraph::HomeFactory&);
+
+ virtual void
+ name (SemanticGraph::HomeFactory&);
+
+ virtual void
+ receives_none (SemanticGraph::HomeFactory&);
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFactory&);
+
+ virtual void
+ receives_post (SemanticGraph::HomeFactory&);
+
+ virtual void
+ raises_none (SemanticGraph::HomeFactory&);
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFactory&);
+
+ virtual void
+ raises_post (SemanticGraph::HomeFactory&);
+
+ virtual void
+ post (SemanticGraph::HomeFactory&);
+
+ virtual void
+ comma (SemanticGraph::HomeFactory&);
+
+private:
+ ReturnTypeNameEmitter returns_emitter_;
+ Traversal::Returns returns_;
+ bool for_exec_;
+};
+
+struct FinderOperationEmitter : Traversal::HomeFinder,
+ EmitterBase
+{
+ FinderOperationEmitter (Context& c, bool for_exec = false);
+
+ virtual void
+ pre (SemanticGraph::HomeFinder&);
+
+ virtual void
+ returns (SemanticGraph::HomeFinder&);
+
+ virtual void
+ name (SemanticGraph::HomeFinder&);
+
+ virtual void
+ receives_none (SemanticGraph::HomeFinder&);
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFinder&);
+
+ virtual void
+ receives_post (SemanticGraph::HomeFinder&);
+
+ virtual void
+ raises_none (SemanticGraph::HomeFinder&);
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFinder&);
+
+ virtual void
+ raises_post (SemanticGraph::HomeFinder&);
+
+ virtual void
+ post (SemanticGraph::HomeFinder&);
+
+ virtual void
+ comma (SemanticGraph::HomeFinder&);
+
+private:
+ ReturnTypeNameEmitter returns_emitter_;
+ Traversal::Returns returns_;
+ bool for_exec_;
+};
+
+#endif // OPERATIONHEADEREMITTERS_HPP
diff --git a/modules/CIAO/CIDLC/ParameterEmitter_T.hpp b/modules/CIAO/CIDLC/ParameterEmitter_T.hpp
new file mode 100644
index 00000000000..4fe0d55867f
--- /dev/null
+++ b/modules/CIAO/CIDLC/ParameterEmitter_T.hpp
@@ -0,0 +1,33 @@
+// file : CIDLC/ParameterEmitter_T.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef PARAMETEREMITTER_T_HPP
+#define PARAMETEREMITTER_T_HPP
+
+#include "EmitterBase.hpp"
+
+// For generating parameter names.
+template <typename T>
+struct ParameterEmitter : T, EmitterBase
+{
+ ParameterEmitter (Context& c, bool for_exec_src = false)
+ : EmitterBase (c),
+ for_exec_src_ (for_exec_src)
+ {
+ }
+
+ virtual void
+ name (typename T::Type& p)
+ {
+ os << " "
+ << (for_exec_src_ ? "/* " : "")
+ << p.name ()
+ << (for_exec_src_ ? " */" : "");
+ }
+
+private:
+ bool for_exec_src_;
+};
+
+#endif // PARAMETEREMITTER_T_HPP
diff --git a/modules/CIAO/CIDLC/README.html b/modules/CIAO/CIDLC/README.html
new file mode 100644
index 00000000000..97388a54ce7
--- /dev/null
+++ b/modules/CIAO/CIDLC/README.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<!--
+
+file : CIDCL/readme.html
+author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+cvs-id : $Id$
+-->
+
+<html>
+
+<head>
+
+ <title>CIAO CIDL Compiler Synopsis</title>
+
+ <meta name="author" content="Boris Kolpackov"/>
+ <meta name="description" content="CIAO CIDL compiler README"/>
+ <meta http-equiv="Content-Language" content="en"/>
+
+ <style type="text/css">
+ body {
+ font-family : sans-serif;
+
+ color : black;
+ background : white;
+
+ max-width : 40em;
+ padding : 2em 2em 2em 3em;
+ margin : 0 0 0 0;
+ }
+
+ h1, h2, h3, h4, h5, h6 {
+ font-family : sans-serif;
+ font-weight : 500;
+ }
+
+ h1 { font-size : 170%; }
+ h2 { font-size : 125%; }
+
+ ul.toc li {
+ padding : .4em 0em 0em 0em;
+ }
+
+ ol.multiline li {
+ padding-top : 0.6em;
+ padding-bottom : 0.6em;
+ }
+
+ </style>
+
+</head>
+
+<body>
+<h1>CIAO CIDL compiler README</h1>
+<p>Before continuing, please note that
+
+<a href="http://www.dre.vanderbilt.edu/cidlc/binary/">pre-built binary
+executables of CIDL compiler</a> are available for different platforms
+The CIDL compiler options are documented <A
+HREF="../docs/cidlc.html">here</A>. <P>
+
+<p>The C++ source files in this directory are compiled into the
+code generators and driver for the CIAO CIDL compiler. CORBA
+Compiler Framework (CCF) provides the front-end for the compiler.
+To build CIDL compiler you will need to compile CCF libraries
+first. Please refer to <a href="../CCF/Documentation/Build.html">
+instructions for building CCF libraries</a>.</p>
+
+<p>After you have compiled the CCF libraries, you are ready to build the
+CIDLC compiler. In order to build the compiler, you must generate the
+appropriate project files. If there are makefiles, or project solutions,
+already in the directory, please disgard them since because they can be
+out-of-date, or invalid. To regenerate all project files, type the following
+command:
+<pre>
+%> $ACE_ROOT/bin/mwc.pl -type &lt;project-type&gt; -static -features cidl=1,exceptions=1,boost=1 CIDLC.mwc
+</pre>
+
+Once MPC finishes generating the project files, you can now build CIDLC.
+
+<ul>
+<li>On Linux/UNIX:
+<p>If you are building with a make utility, e.g., gmake, use the following command to build CCF:
+
+<pre>%> gmake cidl=1 exceptions=1 boost=1</pre></p></li>
+<li>On Windows: <p>Just open the generated solution file.</p></li>
+</ul>
+<p><b>Note:</b> If you are building CCF on a Windows platform, use <code>%ACE_ROOT%\bin\mwc.pl</code> instead
+
+<code>of $ACE_ROOT/bin/mwc.pl</code>. Also, for a list of project types and other command-line options
+supported by MPC, type <code>$ACE_ROOT/bin/mwc.pl --help</code>.</p>
+
+</body>
+</html>
diff --git a/modules/CIAO/CIDLC/RepositoryIdGenerator.cpp b/modules/CIAO/CIDLC/RepositoryIdGenerator.cpp
new file mode 100644
index 00000000000..03a28ab8b7e
--- /dev/null
+++ b/modules/CIAO/CIDLC/RepositoryIdGenerator.cpp
@@ -0,0 +1,289 @@
+// file : CIDLC/RepositoryIdGenerator.cpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "RepositoryIdGenerator.hpp"
+#include "Literals.hpp"
+
+#include "CCF/CompilerElements/Diagnostic.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+#include "CCF/CodeGenerationKit/Regex.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+using namespace StringLiterals;
+using namespace std;
+
+namespace
+{
+ Nameable* defined_in (Nameable& n)
+ {
+ for (Nameable::NamedIterator i (n.named_begin ()), e (n.named_end ());
+ i != e;
+ ++i)
+ {
+ if (Defines* d = dynamic_cast<Defines*> (*i))
+ {
+ return &d->scope ();
+ }
+ }
+
+ return 0;
+ }
+
+ void
+ compute_new_repo_id (Nameable& d)
+ {
+ string prefix ("");
+ TypePrefix *tp = 0;
+
+ if (d.context ().count (STRS[TYPE_PREFIX]))
+ {
+ tp = d.context ().get<TypePrefix*> (STRS[TYPE_PREFIX]);
+ prefix = tp->prefix ().literal ();
+ }
+ else
+ {
+ Nameable* parent = defined_in (d);
+
+ while (parent != 0)
+ {
+ if (parent->context ().count (STRS[TYPE_PREFIX]))
+ {
+ tp =
+ parent->context ().get<TypePrefix*> (STRS[TYPE_PREFIX]);
+
+ prefix = tp->prefix ().literal ();
+ break;
+ }
+
+ parent = defined_in (*parent);
+ }
+ }
+
+ if (prefix != "") prefix += "/";
+
+ ScopedName scoped (d.scoped_name ());
+ Name stripped (scoped.begin () + 1, scoped.end ());
+
+ string scope_name = regex::perl_s (stripped.unescaped_str (), "%::%/%");
+
+ string repo_id = "IDL:" + prefix + scope_name + ":1.0";
+
+ d.context ().set<string> (STRS[REPO_ID], repo_id);
+ }
+
+ void
+ compute_repo_id (Nameable& d)
+ {
+ if (d.context ().count (STRS[REPO_ID]))
+ {
+ return;
+ }
+ else
+ {
+ compute_new_repo_id (d);
+ }
+ }
+}
+
+namespace
+{
+ class TypeIdLabelGenerator : public Traversal::TypeId
+ {
+ public:
+ TypeIdLabelGenerator (Diagnostic::Stream& dout,
+ TranslationUnit& tu)
+ : dout_ (dout),
+ tu_ (tu)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::TypeId& ti)
+ {
+ ScopedName decl_name (ti.declaration ());
+ Nameables ref = tu_.lookup (decl_name);
+
+ for (Nameables::const_iterator iter (ref.begin ());
+ iter != ref.end ();
+ ++iter)
+ {
+ Nameable *decl = *iter;
+
+ if (decl->context ().count (STRS[TYPE_ID]))
+ {
+ //@@ Seems it should contain filename and line
+ // of its origin.
+ //
+ Diagnostic::Error err ("???", 0);
+
+ err << "repetition of typeid for " << decl_name
+ << " is illegal";
+
+ dout_ << err;
+
+ Diagnostic::Info inf ("???", 0);
+
+ err << "original typeid here";
+
+ dout_ << inf;
+ }
+ else
+ {
+ decl->context ().set (STRS[TYPE_ID], &ti);
+ decl->context ().set (STRS[REPO_ID], ti.id ().literal ());
+ }
+ }
+ }
+
+ private:
+ Diagnostic::Stream& dout_;
+ SemanticGraph::TranslationUnit& tu_;
+ };
+
+ class TypePrefixLabelGenerator : public Traversal::TypePrefix
+ {
+ public:
+ TypePrefixLabelGenerator (Diagnostic::Stream& dout,
+ TranslationUnit& tu)
+ : dout_ (dout),
+ tu_ (tu)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::TypePrefix& tp)
+ {
+ ScopedName decl_name (tp.declaration ());
+ Nameables ref = tu_.lookup (decl_name);
+
+ for (Nameables::const_iterator iter (ref.begin ());
+ iter != ref.end ();
+ ++iter)
+ {
+ Nameable *decl = *iter;
+ CCF::CompilerElements::Context& ctx = decl->context ();
+
+ if (ctx.count (STRS[TYPE_PREFIX]))
+ {
+ SemanticGraph::TypePrefix* prev =
+ ctx.get<SemanticGraph::TypePrefix*> (STRS[TYPE_PREFIX]);
+
+ if (prev->prefix () != tp.prefix ())
+ {
+ //@@ Seems tp should contain filename and line
+ // of it's origin.
+ //
+ Diagnostic::Error err ("???", 0);
+
+ err << "resetting type prefix for " << decl_name
+ << " is illegal";
+
+ dout_ << err;
+
+ Diagnostic::Info inf ("???", 0);
+
+ err << "original typeprefix here";
+
+ dout_ << inf;
+ }
+ }
+ else
+ {
+ decl->context ().set (STRS[TYPE_PREFIX], &tp);
+
+ // A typeprefix declaration could appear after the IDL
+ // type declaration, so we want to update the repo id
+ // every time.
+ compute_new_repo_id (*decl);
+ }
+ }
+ }
+
+ private:
+ Diagnostic::Stream& dout_;
+ SemanticGraph::TranslationUnit& tu_;
+ };
+
+ class RepoIdGenerator : public Traversal::Interface,
+ public Traversal::EventType,
+ public Traversal::Home,
+ public Traversal::Component
+ {
+ virtual void
+ traverse (SemanticGraph::Interface& i)
+ {
+ compute_repo_id (i);
+ }
+
+ virtual void
+ traverse (SemanticGraph::EventType& e)
+ {
+ compute_repo_id (e);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Home& h)
+ {
+ compute_repo_id (h);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Component& c)
+ {
+ compute_repo_id (c);
+ }
+ };
+}
+
+
+bool RepositoryIdGenerator::generate (TranslationUnit& u)
+{
+ Diagnostic::Stream dout;
+
+ TypeIdLabelGenerator type_id (dout, u);
+ TypePrefixLabelGenerator type_prefix (dout, u);
+ RepoIdGenerator repo_id;
+
+ Traversal::TranslationUnit unit;
+
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ Traversal::TranslationRegion region;
+ contains_principal.node_traverser (region);
+
+ Traversal::ContainsRoot contains_root;
+ Traversal::Includes includes;
+
+ region.edge_traverser (includes);
+ region.edge_traverser (contains_root);
+
+ Traversal::Root root;
+ includes.node_traverser (region);
+ contains_root.node_traverser (root);
+
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ Traversal::Module module;
+
+ defines.node_traverser (module);
+ defines.node_traverser (type_id);
+ defines.node_traverser (type_prefix);
+ defines.node_traverser (repo_id);
+
+ module.edge_traverser (defines);
+
+ Traversal::Interface iface;
+ defines.node_traverser (iface);
+
+ unit.traverse (u);
+
+ if (dout.error_count () != 0) return false;
+
+ //@@ check errors
+
+ return true;
+}
diff --git a/modules/CIAO/CIDLC/RepositoryIdGenerator.hpp b/modules/CIAO/CIDLC/RepositoryIdGenerator.hpp
new file mode 100644
index 00000000000..36dc13e064e
--- /dev/null
+++ b/modules/CIAO/CIDLC/RepositoryIdGenerator.hpp
@@ -0,0 +1,21 @@
+// file : CIDLC/RepositoryIdGenerator.hpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef CIDLC_REPOSITORY_ID_GENERATOR_HPP
+#define CIDLC_REPOSITORY_ID_GENERATOR_HPP
+
+
+//@@ Don't really need this. just forward declaration of
+// TranslationUnit would be enough.
+//
+#include "CCF/CIDL/SemanticGraph.hpp"
+
+class RepositoryIdGenerator
+{
+public:
+ bool
+ generate (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+};
+
+#endif // CIDLC_REPOSITORY_ID_GENERATOR_HPP
diff --git a/modules/CIAO/CIDLC/ServantGenerator.cpp b/modules/CIAO/CIDLC/ServantGenerator.cpp
new file mode 100644
index 00000000000..f817087b92d
--- /dev/null
+++ b/modules/CIAO/CIDLC/ServantGenerator.cpp
@@ -0,0 +1,220 @@
+// file : CIDLC/ServantGenerator.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ServantGenerator.hpp"
+#include "ServantHeaderGenerator.hpp"
+#include "ServantSourceGenerator.hpp"
+#include "CxxNamePrinter.hpp"
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+#include "CCF/CodeGenerationKit/IndentationCxx.hpp"
+#include "CCF/CodeGenerationKit/IndentationImplanter.hpp"
+
+using namespace CCF;
+using namespace CIDL;
+using namespace SemanticGraph;
+using namespace Traversal;
+
+using std::string;
+using std::ostream;
+
+namespace
+{
+ // On some platforms toupper can be something else than a
+ // function.
+ int
+ upcase (int c)
+ {
+ return toupper (c);
+ }
+}
+
+ServantGenerator::ServantGenerator (CommandLine const& cl)
+ : cl_ (cl),
+ file_name_ (""),
+ export_macro_ ("")
+{
+}
+
+void ServantGenerator::options (CL::Description& d)
+{
+ d.add_option (CL::OptionDescription (
+ "svnt-hdr-file-suffix",
+ "suffix",
+ "Use provided suffix instead of default \'_svnt.h\' "
+ "when constructing name of servant file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "svnt-hdr-file-regex",
+ "regex",
+ "Use provided regular expression when constructing "
+ "name of servant file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "svnt-src-file-suffix",
+ "suffix",
+ "Use provided suffix instead of default \'_svnt.cpp\' "
+ "when constructing name of servant file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "svnt-src-file-regex",
+ "regex",
+ "Use provided regular expression when constructing "
+ "name of servant file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "svnt-export-macro",
+ "macro",
+ "Replace default servant DLL export macro "
+ "with provided ,acro.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "svnt-export-include",
+ "file",
+ "Replace default servant export include file "
+ "with provided file.",
+ CL::OptionType::value));
+
+ d.add_option (CL::OptionDescription (
+ "suppress-register-factory",
+ "Suppress generation of code to register eventtype "
+ "factories for event sinks.",
+ CL::OptionType::flag));
+
+ d.add_option (CL::OptionDescription (
+ "custom-container",
+ "type",
+ "Generate code for custom container of the provided type.",
+ CL::OptionType::value));
+}
+
+
+void ServantGenerator::generate (SemanticGraph::TranslationUnit& u,
+ fs::path const& file)
+{
+ // Generate files
+ compute_export_macro (file);
+
+ {
+ fs::ofstream hdr_ofs;
+ ostream& hdr_os = configure_stream ("svnt-hdr-file-suffix",
+ "_svnt.h",
+ "svnt-hdr-file-regex",
+ hdr_ofs);
+
+ Indentation::Implanter<Indentation::Cxx> header_guard (hdr_os);
+
+ // Set C++ name printer for os.
+ //
+ CxxNamePrinter name_printer;
+ hdr_os.pword (name_printer_index) = &name_printer;
+
+ ServantHeaderEmitter hdr_emitter (hdr_os,
+ cl_,
+ export_macro_,
+ file);
+ hdr_emitter.generate (u);
+ }
+
+ {
+ fs::ofstream src_ofs;
+ ostream& src_os = configure_stream ("svnt-src-file-suffix",
+ "_svnt.cpp",
+ "svnt-src-file-regex",
+ src_ofs);
+
+ Indentation::Implanter<Indentation::Cxx> header_guard (src_os);
+
+ // Set C++ name printer for os.
+ //
+ CxxNamePrinter name_printer;
+ src_os.pword (name_printer_index) = &name_printer;
+
+ ServantSourceEmitter src_emitter (src_os,
+ cl_,
+ export_macro_,
+ file);
+ src_emitter.generate (u);
+ }
+}
+
+void
+ServantGenerator::compute_export_macro (const fs::path& file_path)
+{
+ if (!file_path.empty ())
+ {
+ file_name_ = file_path.leaf ();
+ }
+
+ export_macro_ = cl_.get_value ("svnt-export-macro", "");
+
+ if (export_macro_.empty () && !file_name_.empty ())
+ {
+ // Modify a copy of the filename string.
+ export_macro_ = file_name_;
+
+ // Convert filename string to upper case.
+ transform (export_macro_.begin (),
+ export_macro_.end (),
+ export_macro_.begin (),
+ upcase);
+
+ // Replace the suffix.
+ export_macro_ =
+ regex::perl_s (export_macro_,
+ "/^(.+?)(\\.(IDL|CIDL|CDL))?$/$1_SVNT_Export/");
+
+ // Replace any remaining '.' in the string with '_'.
+ export_macro_ = regex::perl_s (export_macro_,
+ "/\\./_/");
+ }
+}
+
+
+
+ostream&
+ServantGenerator::configure_stream (string const& suffix_option,
+ string const& default_suffix,
+ string const& regex_option,
+ fs::ofstream& ofs)
+{
+ if (! file_name_.empty ())
+ {
+ string file_suffix = cl_.get_value (suffix_option,
+ default_suffix);
+ string file_expr =
+ cl_.get_value (regex_option,
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1" + file_suffix + "/");
+
+ string file_name = regex::perl_s (file_name_, file_expr);
+
+ fs::path file_path (file_name);
+
+ ofs.open (file_path, std::ios_base::out);
+
+ if (!ofs.is_open ())
+ {
+ cerr << file_name
+ << ": error: unable to open file in write mode"
+ << endl;
+ }
+ }
+
+ return ofs.is_open ()
+ ? static_cast<ostream&> (ofs)
+ : static_cast<ostream&> (std::cout);
+}
+
+
+/*
+ * Local Variables:
+ * mode: C++
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/modules/CIAO/CIDLC/ServantGenerator.hpp b/modules/CIAO/CIDLC/ServantGenerator.hpp
new file mode 100644
index 00000000000..ae6a4a90477
--- /dev/null
+++ b/modules/CIAO/CIDLC/ServantGenerator.hpp
@@ -0,0 +1,53 @@
+// file : CIDLC/ServantGenerator.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef SERVANT_GENERATOR_HPP
+#define SERVANT_GENERATOR_HPP
+
+#include <string>
+#include <iosfwd>
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+#include "CCF/CodeGenerationKit/CommandLineDescriptor.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+class ServantGenerator
+{
+public:
+ static void
+ options (CL::Description& d);
+
+ ServantGenerator (CommandLine const& cl);
+
+ void
+ generate (CCF::CIDL::SemanticGraph::TranslationUnit&,
+ fs::path const& file);
+
+private:
+ void
+ compute_export_macro (const fs::path& file_path);
+
+ std::ostream&
+ configure_stream (std::string const& suffix_option,
+ std::string const& default_suffix,
+ std::string const& regex_option,
+ fs::ofstream& ofs);
+
+private:
+ CommandLine const& cl_;
+ std::string file_name_;
+ std::string export_macro_;
+};
+
+
+#endif // SERVANT_GENERATOR_HPP
+
+/*
+ * Local Variables:
+ * mode: C++
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/modules/CIAO/CIDLC/ServantHeaderGenerator.cpp b/modules/CIAO/CIDLC/ServantHeaderGenerator.cpp
new file mode 100644
index 00000000000..6676db3e77d
--- /dev/null
+++ b/modules/CIAO/CIDLC/ServantHeaderGenerator.cpp
@@ -0,0 +1,1783 @@
+// file : CIDLC/ServantHeaderGenerator.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ServantHeaderGenerator.hpp"
+#include "CorbaTypeNameEmitters.hpp"
+#include "UtilityTypeNameEmitters.hpp"
+#include "AttributeHeaderEmitters.hpp"
+#include "OperationHeaderEmitters.hpp"
+#include "ParameterEmitter_T.hpp"
+#include "CompositionEmitter.hpp"
+#include "ModuleEmitter.hpp"
+#include "InterfaceEmitter.hpp"
+#include "Literals.hpp"
+#include "Upcase.hpp"
+
+#include <ostream>
+#include <sstream>
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+
+using std::endl;
+using std::string;
+
+using namespace StringLiterals;
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+namespace
+{
+ struct FacetEmitter : Traversal::UnconstrainedInterface,
+ EmitterBase
+ {
+ FacetEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (UnconstrainedInterface& i)
+ {
+ if (i.context ().count ("facet_hdr_gen")) return;
+
+ ScopedName scoped (i.scoped_name ());
+ Name stripped (scoped.begin () + 1, scoped.end ());
+
+ // We need to escape C++ keywords before flattening the name.
+ //
+ string name;
+ {
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << scoped.scope_name ();
+ name = regex::perl_s (ostr.str (), "/::/_/");
+ }
+
+ /// Open a namespace made from the interface scope's name.
+ os << "namespace " << STRS[FACET_PREFIX] << name
+ << "{";
+
+ os << "template <typename T>" << endl
+ << "class " << i.name () << "_Servant_T" << endl
+ << ": public virtual POA_" << stripped << endl
+ << "{"
+ << "public:" << endl
+ << i.name () << "_Servant_T (" << endl
+ << i.scoped_name ().scope_name () << "::CCM_" << i.name ()
+ << "_ptr executor," << endl
+ << "::Components::CCMContext_ptr ctx);" << endl
+ << "virtual ~" << i.name () << "_Servant_T (void);" << endl;
+
+ {
+ InterfaceEmitter interface_emitter (ctx);
+
+ Traversal::Defines defines_;
+ Traversal::Inherits inherits_;
+ interface_emitter.edge_traverser (defines_);
+ interface_emitter.edge_traverser (inherits_);
+
+ // Works for both read/write and readonly attributes.
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines_.node_traverser (attribute_emitter);
+
+ OperationEmitter operation_emitter (ctx);
+ defines_.node_traverser (operation_emitter);
+ inherits_.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ inherits (i, inherits_);
+ names (i, defines_);
+ }
+
+ os << "// Get component implementation." << endl
+ << "virtual CORBA::Object_ptr" << endl
+ << "_get_component ()" << endl
+ << STRS[EXCP_SNGL] << ";" << endl
+ << "protected:" << endl
+ << "// Facet executor." << endl
+ << i.scoped_name ().scope_name ()<< "::CCM_" << i.name ()
+ << "_var executor_;" << endl
+ << "// Context object." << endl
+ << "::Components::CCMContext_var ctx_;" << endl
+ << "};";
+
+ os << "typedef " << i.name () << "_Servant_T<int> "
+ << i.name () << "_Servant;";
+
+ // Close the facet servant's namespace.
+ os << "}";
+
+ i.context ().set ("facet_hdr_gen", true);
+ }
+ };
+
+ struct ContextEmitter : Traversal::Component, EmitterBase
+ {
+ ContextEmitter (Context& c, CommandLine const& cl)
+ : EmitterBase (c),
+ cl_ (cl)
+ {}
+
+ // Nested classes used by this emitter.
+ private:
+ struct PortsEmitterPublic : Traversal::EmitterData,
+ Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ Traversal::PublisherData,
+ EmitterBase
+ {
+ PortsEmitterPublic (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter& e)
+ {
+ os << "virtual void" << endl
+ << "push_" << e.name ()
+ << " (" << endl;
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "ev)" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ os << "virtual ";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << endl
+ << "get_connection_" << u.name ()
+ << " ()" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << "virtual " << u.scoped_name () << "Connections *" << endl
+ << "get_connections_" << u.name ()
+ << " ()" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ os << "virtual void" << endl
+ << "push_" << p.name ()
+ << " (" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "ev)" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ private:
+ INArgTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ };
+
+ struct PortsEmitterProtected : Traversal::EmitterData,
+ Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ Traversal::PublisherData,
+ EmitterBase
+ {
+ PortsEmitterProtected (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter& e)
+ {
+ os << "virtual void" << endl
+ << "connect_" << e.name () << " (" << endl;
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_AC] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << "disconnect_" << e.name () << " ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_NC] << "));" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ os << "virtual void" << endl
+ << "connect_" << u.name () << " (" << endl;
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_AC] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << "disconnect_" << u.name () << " ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_NC] << "));" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << "virtual ::Components::Cookie *" << endl
+ << "connect_" << u.name () << " (" << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_ptr)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << "disconnect_" << u.name () << " (" << endl
+ << "::Components::Cookie * ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ os << "virtual " << STRS[COMP_CK] << " *" << endl
+ << "subscribe_" << p.name () << " (" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "));" << endl;
+
+ os << "// CIAO-specific." << endl
+ << STRS[COMP_CK] << " *" << endl
+ << "subscribe_" << p.name () << "_generic (" << endl
+ << STRS[COMP_ECB] << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << "unsubscribe_" << p.name () << " (" << endl
+ << STRS[COMP_CK] << " *ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ };
+
+ struct PortsEmitterMembers : Traversal::EmitterData,
+ Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ Traversal::PublisherData,
+ EmitterBase
+ {
+ PortsEmitterMembers (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter& e)
+ {
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_var" << endl
+ << "ciao_emits_" << e.name () << "_consumer_;"
+ << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ os << "// Simplex " << u.name () << " connection." << endl;
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_var" << endl
+ << "ciao_uses_" << u.name () << "_;" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << "// Multiplex " << u.name () << " connection." << endl
+ << "ACE_Active_Map_Manager<" << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_var>" << endl
+ << "ciao_uses_" << u.name () << "_;" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ os << "ACE_Active_Map_Manager<" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var>" << endl
+ << "ciao_publishes_" << p.name () << "_map_;"
+ << endl;
+
+ os << "ACE_Active_Map_Manager<" << endl
+ << STRS[COMP_ECB] << "_var>" << endl
+ << "ciao_publishes_" << p.name () << "_generic_map_;"
+ << endl;
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ };
+
+ public:
+ virtual void
+ pre (Type& t)
+ {
+ os << "class " << t.name () << "_Servant;" << endl;
+
+ string swap_option = cl_.get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ os << "class " << ctx.export_macro () << " " << t.name ()
+ << "_Context" << endl
+ << " : public virtual CIAO::"
+ << (swapping ? "Upgradeable_" : "") << "Context_Impl<" << endl
+ << " " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "_Context," << endl
+ << " " << t.name () << "_Servant," << endl
+ << " " << t.scoped_name () << "," << endl
+ << " " << t.scoped_name () << "_var" << endl
+ << " >" << endl
+ << "{"
+ << "public:" << endl;
+
+ os << "// We will allow the servant glue code we generate to "
+ << "access our state." << endl
+ << "friend class " << t.name () << "_Servant;" << endl;
+
+ os << t.name () << "_Context (" << endl
+ << "::Components::CCMHome_ptr h," << endl
+ << "::CIAO::Session_Container *c," << endl
+ << t.name () << "_Servant *sv);" << endl;
+
+ os << "virtual ~" << t.name () << "_Context (void);"
+ << endl;
+
+ os << "// Operations for " << t.name () << " receptacles"
+ << " and event sources," << endl
+ << "// defined in " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "_Context."
+ << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ PortsEmitterPublic ports_emitter (ctx);
+ defines.node_traverser (ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ // Extra *_Context methods for swapping container.
+ if (swapping)
+ {
+ os << "// Operations defined in " << t.scoped_name ().scope_name ()
+ << "::CCM_" << t.name () << "_Context" << endl
+ << "// that enable component swapping in the container"
+ << endl << endl;
+
+ os << "virtual " << STRS[COMP_CD] << " *" << endl
+ << "get_registered_consumers (" << endl
+ << "const char *publisher_name)" << endl
+ << STRS[EXCP_START] << endl
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+ }
+
+ os << "// CIAO-specific." << endl << endl;
+
+ os << "static " << t.name () << "_Context *" << endl
+ << "_narrow (" << endl
+ << STRS[COMP_SC] << "_ptr p);" << endl;
+
+ os << "protected:" << endl
+ << "// Methods that manage this component's connections"
+ << " and consumers." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ PortsEmitterProtected ports_emitter (ctx);
+ defines.node_traverser (ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "protected:" << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ PortsEmitterMembers ports_emitter (ctx);
+ defines.node_traverser (ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+ }
+
+ virtual void
+ post (Type&)
+ {
+ // Component context class closer.
+ os << "};";
+ }
+
+ private:
+ CommandLine const& cl_;
+ };
+
+ struct ServantEmitter : Traversal::Component, EmitterBase
+ {
+ ServantEmitter (Context& c)
+ : EmitterBase (c)
+ {}
+
+ // Nested classes used by this emitter.
+ private:
+ struct PortsEmitterPublic : Traversal::EmitterData,
+ Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ Traversal::PublisherData,
+ Traversal::ConsumerData,
+ Traversal::ProviderData,
+ EmitterBase
+ {
+ PortsEmitterPublic (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ stripped_type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ simple_belongs_.node_traverser (simple_type_name_emitter_);
+ stripped_belongs_.node_traverser (stripped_type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Provider& p)
+ {
+ os << "virtual ";
+
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << "_ptr" << endl
+ << "provide_" << p.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ os << "virtual void" << endl
+ << "connect_" << u.name () << " (" << endl;
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_AC] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << "disconnect_" << u.name () << " ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_NC] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << "get_connection_" << u.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << "virtual ::Components::Cookie *" << endl
+ << "connect_" << u.name () << " (" << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << "disconnect_" << u.name () << " (" << endl
+ << "::Components::Cookie * ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+
+ os << "virtual " << u.scoped_name () << "Connections *" << endl
+ << "get_connections_" << u.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& c)
+ {
+ os << "// Servant class for the " << c.name ()
+ << " consumer." << endl
+ << "class " << ctx.export_macro () << " ";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_"
+ << c.name () << "_Servant" << endl
+ << ": public virtual POA_";
+
+ Traversal::ConsumerData::belongs (c, stripped_belongs_);
+
+ os << "Consumer" << endl
+ << "{"
+ << "public:" << endl;
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name () << "_Servant (" << endl
+ << c.scoped_name ().scope_name ().scope_name () << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name () << "_ptr executor,"
+ << endl
+ << c.scoped_name ().scope_name ().scope_name () << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "_Context_ptr c);" << endl;
+
+ os << "virtual ~";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_"
+ << c.name () << "_Servant (void);" << endl;
+
+ os << "virtual void" << endl
+ << "push_";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << " (" << endl;
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << " *evt" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+
+ os << "// Inherited from " << STRS[COMP_ECB] << "." << endl
+ << "virtual void" << endl
+ << "push_event ( ::Components::EventBase *ev)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_BET] << "));" << endl;
+
+ // @@ GD added below code.
+
+ os << "// CIAO-specific in " << STRS[COMP_ECB] << "." << endl
+ << "virtual void" << endl
+ << "ciao_push_event ( ::Components::EventBase *ev," << endl
+ << "const char * source_id," << endl
+ << "::CORBA::TypeCode_ptr tc)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_BET] << "));" << endl;
+
+ os << "// CIAO-specific in " << STRS[COMP_ECB] << "." << endl
+ << "virtual CORBA::Boolean" << endl
+ << "ciao_is_substitutable (" << endl
+ << "const char *event_repo_id" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+
+ os << "// Get component implementation." << endl
+ << "virtual CORBA::Object_ptr" << endl
+ << "_get_component (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+
+ os << "protected:" << endl
+ << c.scoped_name ().scope_name ().scope_name () << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "_var" << endl
+ << "executor_;" << endl;
+
+ os << c.scoped_name ().scope_name ().scope_name () << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "_Context_var" << endl
+ << "ctx_;" << endl;
+
+ os << "};";
+
+ os << "virtual ";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << "get_consumer_" << c.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter& e)
+ {
+ os << "virtual void" << endl
+ << "connect_" << e.name () << " (" << endl;
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_AC] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << "disconnect_" << e.name () << " ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_NC] << "));" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ os << "virtual " << STRS[COMP_CK] << " *" << endl
+ << "subscribe_" << p.name () << " (" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "));" << endl;
+
+ os << "// CIAO-specific." << endl
+ << STRS[COMP_CK] << " *" << endl
+ << "subscribe_" << p.name () << "_generic (" << endl
+ << STRS[COMP_ECB] << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "));" << endl;
+
+ os << "virtual ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << "unsubscribe_" << p.name () << " (" << endl
+ << STRS[COMP_CK] << " *ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ StrippedTypeNameEmitter stripped_type_name_emitter_;
+ Traversal::Belongs belongs_;
+ Traversal::Belongs simple_belongs_;
+ Traversal::Belongs stripped_belongs_;
+ };
+
+ struct PortsEmitterProtected : Traversal::ConsumerData,
+ Traversal::ProviderData,
+ EmitterBase
+ {
+ PortsEmitterProtected (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Provider& p)
+ {
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << "_var" << endl
+ << "provide_" << p.name () << "_;" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& c)
+ {
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "Consumer_var" << endl
+ << "consumes_" << c.name () << "_;" << endl;
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ };
+
+ struct PortsEmitterPrivate : Traversal::EmitterData,
+ Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ Traversal::PublisherData,
+ Traversal::ConsumerData,
+ Traversal::ProviderData,
+ EmitterBase
+ {
+ PortsEmitterPrivate (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ stripped_type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ simple_belongs_.node_traverser (simple_type_name_emitter_);
+ stripped_belongs_.node_traverser (stripped_type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Provider& p)
+ {
+ os << "::CORBA::Object_ptr" << endl
+ << "provide_" << p.name () << "_i (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& c)
+ {
+ os << "::Components::EventConsumerBase_ptr" << endl
+ << "get_consumer_" << c.name () << "_i (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher&)
+ {
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ StrippedTypeNameEmitter stripped_type_name_emitter_;
+ Traversal::Belongs belongs_;
+ Traversal::Belongs simple_belongs_;
+ Traversal::Belongs stripped_belongs_;
+ };
+
+ public:
+ virtual void
+ pre (Type& t)
+ {
+ ScopedName scoped (t.scoped_name ());
+ Name stripped (scoped.begin () + 1, scoped.end ());
+
+ os << "class " << ctx.export_macro () << " " << t.name ()
+ << "_Servant" << endl
+ << " : public virtual CIAO::Servant_Impl<" << endl
+ << " POA_" << stripped << "," << endl
+ << " " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "," << endl
+ << " " << t.name () << "_Context" << endl
+ << " >" << endl
+ << "{"
+ << "public:" << endl << endl;
+
+ os << "typedef " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << " _exec_type;" << endl;
+
+ os << t.name () << "_Servant (" << endl
+ << t.scoped_name ().scope_name () << "::CCM_" << t.name ()
+ << "_ptr executor," << endl
+ << "::Components::CCMHome_ptr h," << endl
+ << "const char *ins_name," << endl
+ << "::CIAO::Home_Servant_Impl_Base *hs," << endl
+ << "::CIAO::Session_Container *c);" << endl;
+
+ os << "virtual ~" << t.name () << "_Servant (void);" << endl;
+
+ os << "virtual void" << endl
+ << "set_attributes (" << endl
+ << "const ::Components::ConfigValues &descr" << endl
+ << ");" << endl;
+
+ os << "// Supported operations." << endl << endl;
+
+ // Generate operations for all supported interfaces.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Supports supports_;
+ component_emitter.edge_traverser (component_inherits);
+ component_emitter.edge_traverser (supports_);
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ // Works for both read/write and readonly attributes.
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter operation_emitter (ctx);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Public port operations." << endl << endl;
+
+ // Generate public operations for ports, and nested classes for
+ // event consumers.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (component_inherits);
+ component_emitter.edge_traverser (defines);
+
+ PortsEmitterPublic ports_emitter (ctx);
+ defines.node_traverser (ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ // Generate operations for component attributes.
+ os << "// Component attribute operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ // Works for both read/write and readonly attributes.
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines.node_traverser (attribute_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Operations for Receptacles interface." << endl << endl;
+
+ os << "virtual " << STRS[COMP_CK] << " *" << endl
+ << "connect (" << endl
+ << "const char *name," << endl
+ << "CORBA::Object_ptr connection)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "," << endl
+ << STRS[EXCP_AC] << "," << endl
+ << STRS[EXCP_ECL] << "));" << endl;
+
+ os << "virtual CORBA::Object_ptr" << endl
+ << "disconnect (" << endl
+ << "const char *name," << endl
+ << STRS[COMP_CK] << " *ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "," << endl
+ << STRS[EXCP_CR] << "," << endl
+ << STRS[EXCP_NC] << "));" << endl;
+
+ os << "virtual " << STRS[COMP_RD] << " *" << endl
+ << "get_all_receptacles (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+
+ os << "// Operations for Events interface." << endl << endl;
+
+ os << "virtual " << STRS[COMP_CK] << " *" << endl
+ << "subscribe (" << endl
+ << "const char *publisher_name," << endl
+ << STRS[COMP_ECB] << "_ptr subscriber)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "," << endl
+ << STRS[EXCP_ECL] << "));" << endl;
+
+ os << "virtual " << STRS[COMP_ECB] << "_ptr" << endl
+ << "unsubscribe (" << endl
+ << "const char *publisher_name," << endl
+ << STRS[COMP_CK] << " *ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+
+ os << "virtual void" << endl
+ << "connect_consumer (" << endl
+ << "const char *emitter_name," << endl
+ << STRS[COMP_ECB] << "_ptr consumer)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_AC] << "," << endl
+ << STRS[EXCP_IC] << "));" << endl;
+
+ os << "virtual " << STRS[COMP_ECB] << "_ptr" << endl
+ << "disconnect_consumer (" << endl
+ << "const char *source_name)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_NC] << "));" << endl;
+
+ os << "virtual " << STRS[COMP_PD] << " *" << endl
+ << "get_all_publishers (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+
+ os << "virtual " << STRS[COMP_ED] << " *" << endl
+ << "get_all_emitters (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+
+ os << "// CIAO specific operations on the servant. " << endl
+ << "CORBA::Object_ptr" << endl
+ << "get_facet_executor (" << endl
+ << "const char *name)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS]<< "));" << endl;
+
+ os << "private:" << endl << endl;
+
+ // Generate protected operations for facets and event sinks.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ PortsEmitterProtected ports_emitter (ctx);
+ defines.node_traverser (ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "const char *ins_name_;" << endl;
+
+ os << "private:" << endl << endl
+ << "void" << endl
+ << "populate_port_tables (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << ";" << endl;
+
+ // Generate private operations for ports.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ PortsEmitterPrivate ports_emitter (ctx);
+ defines.node_traverser (ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+ }
+
+ virtual void
+ post (Type&)
+ {
+ // Component servant class closer.
+ os << "};";
+ }
+ };
+
+ struct HomeEmitter : Traversal::Home, EmitterBase
+ {
+ HomeEmitter (Context& c, CommandLine const& cl)
+ : EmitterBase (c),
+ cl_ (cl),
+ type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ enclosing_type_name_emitter_ (c)
+ {
+ manages_.node_traverser (type_name_emitter_);
+ simple_manages_.node_traverser (simple_type_name_emitter_);
+ enclosing_manages_.node_traverser (enclosing_type_name_emitter_);
+ }
+
+ virtual void pre (Type& t)
+ {
+ os << "class " << ctx.export_macro () << " " << t.name ()
+ << "_Servant" << endl
+ << " : public virtual" << endl
+ << " ::CIAO::";
+
+ string swap_option = cl_.get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ ScopedName scoped (t.scoped_name ());
+ Name stripped (scoped.begin () + 1, scoped.end ());
+
+ os << (swapping ? "Swapping_" : "") << "Home_Servant_Impl<" << endl
+ << " ::POA_" << stripped << "," << endl
+ << " " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "," << endl
+ << " ";
+
+ Traversal::Home::manages (t, simple_manages_);
+
+ os << "_Servant" << endl
+ << " >" << endl
+ << "{"
+ << "public:" << endl << endl;
+ os << t.name () << "_Servant (" << endl
+ << t.scoped_name ().scope_name () << "::CCM_" << t.name ()
+ << "_ptr exe," << endl
+ << "const char *ins_name," << endl
+ << "::CIAO::Session_Container *c);" << endl;
+
+ os << "virtual ~" << t.name () << "_Servant (void);" << endl;
+
+ // Generate home operations.
+ os << "// Home operations." << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+ home_emitter.edge_traverser (home_inherits);
+
+ HomeOperationEmitter home_operation_emitter (ctx);
+ defines.node_traverser (home_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ home_operation_emitter.edge_traverser (receives);
+ home_operation_emitter.edge_traverser (returns);
+ home_operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ // Generate home factory operations. This is a separate traversal
+ // stack because we want to generate the factory operations
+ // of ancestors with the return type of the base component.
+ os << "// Home factory and finder operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits inherits;
+ home_emitter.edge_traverser (inherits);
+ inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ FactoryOperationEmitter factory_operation_emitter (ctx);
+ FinderOperationEmitter finder_operation_emitter (ctx);
+ defines.node_traverser (factory_operation_emitter);
+ defines.node_traverser (finder_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ factory_operation_emitter.edge_traverser (receives);
+ factory_operation_emitter.edge_traverser (returns);
+ factory_operation_emitter.edge_traverser (raises);
+ finder_operation_emitter.edge_traverser (receives);
+ finder_operation_emitter.edge_traverser (returns);
+ finder_operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ // Generate operations for home attributes.
+ os << "// Attribute operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+ home_emitter.edge_traverser (home_inherits);
+
+ // Works for both read/write and readonly attributes.
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines.node_traverser (attribute_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ // Generate operations for all supported interfaces.
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+
+ Traversal::Supports supports_;
+ home_emitter.edge_traverser (supports_);
+ home_emitter.edge_traverser (home_inherits);
+
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (inherits);
+
+ // Works for both read/write and readonly attributes.
+ AttributeHeaderEmitter attribute_emitter (ctx);
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter operation_emitter (ctx);
+ defines.node_traverser (operation_emitter);
+ inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ // Home servant class closer.
+ os << "};";
+
+ string name;
+
+ // We need to escape C++ keywords before flattening the name.
+ //
+ {
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << t.scoped_name ();
+ name = regex::perl_s (ostr.str (), "/::/_/");
+ }
+
+ os << "extern \"C\" " << ctx.export_macro ()
+ << " ::PortableServer::Servant" << endl
+ << "create" << name << "_Servant (" << endl
+ << "::Components::HomeExecutorBase_ptr p," << endl
+ << "CIAO::Session_Container *c," << endl
+ << "const char *ins_name" << endl
+ << ");" << endl;
+ }
+
+ private:
+ CommandLine const& cl_;
+ FullTypeNameEmitter type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ Traversal::Manages manages_;
+ Traversal::Manages simple_manages_;
+ Traversal::Manages enclosing_manages_;
+ };
+
+ struct IncludesEmitter : Traversal::QuoteIncludes,
+ Traversal::BracketIncludes,
+ EmitterBase
+ {
+ IncludesEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::QuoteIncludes& qi)
+ {
+ os << "#include \""
+ << regex::perl_s (qi.file ().string (),
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1S.h/")
+ << "\"" << endl << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::BracketIncludes& bi)
+ {
+ os << "#include \""
+ << regex::perl_s (bi.file ().string (),
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1S.h/")
+ << "\""
+ << endl;
+ }
+ };
+}
+
+ServantHeaderEmitter::ServantHeaderEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ string export_macro,
+ fs::path const& file)
+ : os (os_),
+ cl_ (cl),
+ export_macro_ (export_macro),
+ file_ (file)
+{}
+
+void
+ServantHeaderEmitter::generate (TranslationUnit& u)
+{
+ pre (u);
+
+ Context c (os, export_macro_, cl_);
+
+ /// CIAO has facet classes outside the context and servant classes.
+ /// We launch it here to generate the classes inside namespaces
+ /// constructed to be unique for each interface type used in a facet.
+ generate_facets (u, c);
+
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion region;
+ contains_principal.node_traverser (region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ Traversal::Includes includes;
+
+ region.edge_traverser (includes);
+ region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ ModuleEmitter module (c);
+ CompositionEmitter composition (c);
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+
+ // Layer 4
+ //
+ Traversal::Defines composition_defines;
+ composition.edge_traverser (composition_defines);
+
+ module.edge_traverser (defines);
+
+ //--
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+ composition_defines.node_traverser (component_executor);
+ composition_defines.node_traverser (home_executor);
+
+ // Layer 5
+ //
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+
+ //--
+ ContextEmitter context_emitter (c, cl_);
+ ServantEmitter servant_emitter (c);
+ HomeEmitter home_emitter (c, cl_);
+ implements.node_traverser (context_emitter);
+ implements.node_traverser (servant_emitter);
+ implements.node_traverser (home_emitter);
+
+ unit.traverse (u);
+
+ post (u);
+}
+
+void
+ServantHeaderEmitter::pre (TranslationUnit&)
+{
+ os << COPYRIGHT;
+
+ string file_name ("");
+
+ if (!file_.empty ())
+ {
+ file_name = file_.leaf ();
+ }
+
+ string uc_file_name = file_name;
+
+ std::transform (uc_file_name.begin (),
+ uc_file_name.end (),
+ uc_file_name.begin (),
+ upcase);
+
+ string uc_file_suffix = cl_.get_value ("svnt-hdr-file-suffix",
+ "_svnt.h");
+
+ std::transform (uc_file_suffix.begin (),
+ uc_file_suffix.end (),
+ uc_file_suffix.begin (),
+ upcase);
+
+ string guard =
+ "CIAO_GLUE_SESSION_"
+ + regex::perl_s (uc_file_name,
+ "/^(.+?)(\\.(IDL|CIDL|CDL))?$/$1"
+ + uc_file_suffix
+ + "/");
+
+ // Replace any remaining '.' with '_'.
+ guard = regex::perl_s (guard, "/\\./_/");
+
+ os << "#ifndef " << guard << endl
+ << "#define " << guard << endl << endl
+ << "#include /**/ \"ace/pre.h\"" << endl << endl;
+
+ string export_include = cl_.get_value ("svnt-export-include", "");
+
+ if (!export_include.empty ())
+ {
+ os << "#include \"" << export_include << "\"" << endl << endl;
+ }
+
+ // Get the suffix for the executor IDL file and strip off the
+ // trailing .idl.
+ // @@@ (JP) I guess it's a safe assumption that the tail of the
+ // suffix will be .idl.
+ string suffix = cl_.get_value ("lem-file-suffix", "E.idl");
+ suffix = regex::perl_s (suffix, "/^(.+?)(\\.idl)?$/$1/");
+
+ // @@@ (JP) No way of knowing if the IDL compiler had command line
+ // option(s) to change C.h and/or S.h. We could add command line options
+ // to the CIDL compiler for them, but the user will have to make sure
+ // they are in synch with the IDL compiler's options.
+ os << "#include \""
+ << regex::perl_s (file_name,
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1" + suffix + "C.h/")
+ << "\""
+ << endl << endl;
+
+ os << "#if !defined (ACE_LACKS_PRAGMA_ONCE)" << endl
+ << "# pragma once" << endl
+ << "#endif /* ACE_LACKS_PRAGMA_ONCE */" << endl << endl;
+
+ string swap_option = cl_.get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ os << "#include \"ciao/"
+ << (swapping ? "Swapping_Container.h" : "Container_Base.h")
+ << "\"" << endl
+ << "#include \"ciao/"
+ << (swapping ? "Upgradeable_Context_Impl_T.h"
+ : "Context_Impl_T.h")
+ << "\"" << endl
+ << "#include \"ciao/Servant_Impl_T.h\"" << endl
+ << "#include \"ciao/"
+ << (swapping ? "Swapping_Servant_Home_Impl_T.h"
+ : "Home_Servant_Impl_T.h")
+ << "\"" << endl << endl;
+}
+
+void
+ServantHeaderEmitter::generate_facets (TranslationUnit& u, Context& c)
+{
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion principal_region;
+ contains_principal.node_traverser (principal_region);
+
+ // Layer 2
+ //
+
+ /// Includes are handled here so they will all be present
+ /// before the facet servants (if any) are generated.
+
+ Traversal::ContainsRoot contains_root;
+ IncludesEmitter includes_emitter (c);
+
+ principal_region.edge_traverser (includes_emitter);
+ principal_region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines root_defines;
+ root.edge_traverser (root_defines);
+
+ //--
+ Traversal::Module module;
+ Traversal::Composition composition;
+ root_defines.node_traverser (module);
+ root_defines.node_traverser (composition);
+
+ module.edge_traverser (root_defines);
+
+ // Layer 4
+ //
+ Traversal::Defines composition_defines;
+ composition.edge_traverser (composition_defines);
+
+ //--
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+ composition_defines.node_traverser (component_executor);
+ composition_defines.node_traverser (home_executor);
+
+ // Layer 5
+ //
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+
+ // Layer 6
+ //
+ Traversal::Component component_emitter;
+ implements.node_traverser (component_emitter);
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines component_defines;
+ component_emitter.edge_traverser (component_defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ // Layer 7
+ //
+ Traversal::Provider provider;
+ component_defines.node_traverser (provider);
+
+ Traversal::Belongs belongs;
+ provider.edge_traverser (belongs);
+
+ FacetEmitter facet_emitter (c);
+ belongs.node_traverser (facet_emitter);
+
+ unit.traverse (u);
+}
+
+void
+ServantHeaderEmitter::post (TranslationUnit&)
+{
+ if (file_.empty ()) return;
+
+ string uc_file_name = file_.leaf ();
+
+ std::transform (uc_file_name.begin (),
+ uc_file_name.end (),
+ uc_file_name.begin (),
+ upcase);
+
+ string uc_file_suffix = cl_.get_value ("svnt-hdr-file-suffix",
+ "_svnt.h");
+
+ std::transform (uc_file_suffix.begin (),
+ uc_file_suffix.end (),
+ uc_file_suffix.begin (),
+ upcase);
+
+ string guard =
+ "CIAO_GLUE_SESSION_"
+ + regex::perl_s (uc_file_name,
+ "/^(.+?)(\\.(IDL|CIDL|CDL))?$/$1"
+ + uc_file_suffix
+ + "/");
+
+ guard = regex::perl_s (guard, "/\\./_/");
+
+ os << "#include /**/ \"ace/post.h\"" << endl << endl
+ << "#endif /* " << guard << " */"
+ << endl << endl;
+}
diff --git a/modules/CIAO/CIDLC/ServantHeaderGenerator.hpp b/modules/CIAO/CIDLC/ServantHeaderGenerator.hpp
new file mode 100644
index 00000000000..91e881e1411
--- /dev/null
+++ b/modules/CIAO/CIDLC/ServantHeaderGenerator.hpp
@@ -0,0 +1,54 @@
+// file : CIDLC/ServantHeaderGenerator.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef SERVANT_HEADER_GENERATOR_HPP
+#define SERVANT_HEADER_GENERATOR_HPP
+
+#include <string>
+#include <iosfwd>
+
+#include "EmitterContext.hpp"
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+class ServantHeaderEmitter
+{
+public:
+ ServantHeaderEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ std::string export_macro,
+ fs::path const& file);
+
+ virtual ~ServantHeaderEmitter () {}
+
+ /// Called by the backend driver.
+ virtual void
+ generate (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+private:
+ /// Called from generate().
+
+ virtual void
+ pre (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+ virtual void
+ generate_facets (CCF::CIDL::SemanticGraph::TranslationUnit& u,
+ Context& c);
+
+ virtual void
+ post (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+private:
+ std::ostream& os;
+ CommandLine const& cl_;
+ std::string export_macro_;
+ fs::path file_;
+};
+
+
+#endif // SERVANT_HEADER_GENERATOR_HPP
+
diff --git a/modules/CIAO/CIDLC/ServantSourceGenerator.cpp b/modules/CIAO/CIDLC/ServantSourceGenerator.cpp
new file mode 100644
index 00000000000..f4d715b523d
--- /dev/null
+++ b/modules/CIAO/CIDLC/ServantSourceGenerator.cpp
@@ -0,0 +1,4476 @@
+// file : CIDLC/ServantSourceGenerator.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "ServantSourceGenerator.hpp"
+#include "CorbaTypeNameEmitters.hpp"
+#include "UtilityTypeNameEmitters.hpp"
+#include "ParameterEmitter_T.hpp"
+#include "AttributeSourceEmitters_T.hpp"
+#include "CompositionEmitter.hpp"
+#include "ModuleEmitter.hpp"
+#include "InterfaceEmitter.hpp"
+#include "Literals.hpp"
+
+#include <ostream>
+#include <sstream>
+
+#include "CCF/CodeGenerationKit/Regex.hpp"
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+using namespace StringLiterals;
+
+using std::string;
+
+namespace
+{
+ struct RepoIdEmitter : Traversal::Type,
+ EmitterBase
+ {
+ RepoIdEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Type& t)
+ {
+ os << "\"" << t.context ().get<string> (STRS[REPO_ID]) << "\"";
+ }
+ };
+
+ struct ConsumerRepoIdEmitter : Traversal::Type,
+ EmitterBase
+ {
+ ConsumerRepoIdEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Type& t)
+ {
+ string holder (t.context ().get<string> (STRS[REPO_ID]));
+ os << "\"" << holder.substr (0, holder.rfind (':'))
+ << "Consumer:1.0\"";
+ }
+ };
+
+ struct FlatNameEmitter : Traversal::Type,
+ EmitterBase
+ {
+ FlatNameEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Type& t)
+ {
+ // We need to escape C++ keywords before flattening the name.
+ //
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << t.scoped_name ();
+ os << regex::perl_s (ostr.str (), "/::/_/");
+ }
+ };
+
+ struct OperationExecEmitter : Traversal::Operation,
+ EmitterBase
+ {
+ OperationExecEmitter (Context& c)
+ : EmitterBase (c)
+ {}
+
+ virtual void
+ name (Type& o)
+ {
+ os << o.name ();
+ }
+
+ virtual void
+ receives_pre (Type&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_none (Type&)
+ {
+ os << " ();";
+ }
+
+ virtual void
+ receives_post (Type&)
+ {
+ os << endl << ");";
+ }
+
+ /// If we don't do this, the comma() method just below
+ /// gets used not only with the arguments, but also
+ /// in raises(). Even though we are not generating the
+ /// exception list here, the front end iterator still
+ /// executes, and picks up the overridden comma(). So
+ /// we override raises() itself to do nothing.
+ virtual void
+ raises (Type&)
+ {
+ }
+
+ virtual void
+ comma (Type&)
+ {
+ os << "," << endl;
+ }
+ };
+
+ struct OpExecReturnEmitter : Traversal::Type,
+ Traversal::Void
+ {
+ OpExecReturnEmitter (std::ostream& os_)
+ : os (os_)
+ {}
+
+ virtual void
+ traverse (Void&)
+ {
+ os << "this->executor_->";
+ }
+
+ virtual void
+ traverse (SemanticGraph::Type&)
+ {
+ os << "return this->executor_->";
+ }
+
+ private:
+ std::ostream& os;
+ };
+
+ // For generating parameter names in operation delegation.
+ template <typename T>
+ struct ParameterExecEmitter : T
+ {
+ ParameterExecEmitter (std::ostream& os_)
+ : os (os_)
+ {}
+
+ virtual void
+ name (typename T::Type& p)
+ {
+ os << p.name ();
+ }
+
+ private:
+ std::ostream& os;
+ };
+
+ template <typename T>
+ struct OperationEmitter : Traversal::Operation, EmitterBase
+ {
+ OperationEmitter (Context& c,
+ T& scope)
+ : EmitterBase (c),
+ scope_ (scope)
+ {
+ }
+
+ // Overridden by facet and home operation emitters to do nothing.
+ virtual void
+ gen_swap_related (Type& o)
+ {
+ string swap_option = ctx.cl ().get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+ {
+ os << "this->activate_component ();" << endl;
+ }
+ }
+
+ virtual void
+ name (Type& o)
+ {
+ os << endl
+ << scope_.name () << "_Servant::" << o.name ();
+ }
+
+ virtual void
+ receives_pre (Type&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_none (Type&)
+ {
+ os << " ()" << endl;
+ }
+
+ virtual void
+ receives_post (Type&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_pre (Type&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_none (Type&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_post (Type&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (Type& o)
+ {
+ os << "{";
+
+ this->gen_swap_related (o);
+
+ OperationExecEmitter operation_emitter (ctx);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+
+ ParameterExecEmitter<Traversal::Parameter> param (os);
+ receives.node_traverser (param);
+
+ OpExecReturnEmitter return_emitter (os);
+ returns.node_traverser (return_emitter);
+
+ operation_emitter.traverse (o);
+
+ os << "}";
+ }
+
+ virtual void
+ comma (Type&)
+ {
+ os << "," << endl;
+ }
+
+ protected:
+ T& scope_;
+ };
+
+ struct FacetEmitter : Traversal::UnconstrainedInterface,
+ EmitterBase
+ {
+ FacetEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ struct FacetOperationEmitter
+ : OperationEmitter<SemanticGraph::UnconstrainedInterface>
+ {
+ FacetOperationEmitter (Context& c,
+ SemanticGraph::UnconstrainedInterface& i)
+ : OperationEmitter<SemanticGraph::UnconstrainedInterface> (c, i)
+ {}
+
+ // Overriden to do nothing since we don't want to generate
+ // component swapping related code for facet operations.
+ virtual void
+ gen_swap_related (Type&)
+ {
+ }
+
+ virtual void
+ pre (Type&)
+ {
+ os << "template <typename T>" << endl;
+ }
+
+ virtual void
+ name (Type& o)
+ {
+ os << endl
+ << scope_.name () << "_Servant_T<T>::" << o.name ();
+ }
+ };
+
+ struct FacetWriteAttributeEmitter
+ : WriteAttributeSourceEmitter<SemanticGraph::Interface>
+ {
+ // Since swapping does not affect facets, we can just pass 'false'
+ // to the base class constructor, and not override gen_swapping_set().
+ FacetWriteAttributeEmitter (Context& c, SemanticGraph::Interface& i)
+ : WriteAttributeSourceEmitter<SemanticGraph::Interface> (c,
+ i,
+ false,
+ false)
+ {}
+
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << "template <typename T>" << endl;
+
+ WriteAttributeSourceEmitter<SemanticGraph::Interface>::pre (a);
+ }
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << scope_.name () << "_Servant_T<T>::"
+ << a.name () << " (" << endl;
+
+ Traversal::ReadWriteAttribute::belongs (a, write_belongs_);
+
+ os << " " << a.name () << endl
+ << ")" << endl;
+ }
+ };
+
+ struct FacetAttributeEmitter
+ : AttributeSourceEmitter<SemanticGraph::Interface>
+ {
+ FacetAttributeEmitter (Context& c,
+ SemanticGraph::Interface& i)
+ : AttributeSourceEmitter<SemanticGraph::Interface> (c, i)
+ {}
+
+ // ReadWriteAttribute
+ //
+
+ // No-op override because we don't want to generate any swapping
+ // code for facets.
+ virtual void gen_swapping_get (SemanticGraph::ReadWriteAttribute&)
+ {
+ }
+
+ virtual void
+ gen_write_operation (SemanticGraph::ReadWriteAttribute& a,
+ bool /* swapping */)
+ {
+ FacetWriteAttributeEmitter write_attribute_emitter (ctx, scope_);
+ write_attribute_emitter.traverse (a);
+ }
+
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << "template <typename T>" << endl;
+
+ AttributeSourceEmitter<SemanticGraph::Interface>::pre (a);
+ }
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << scope_.name () << "_Servant_T<T>::"
+ << a.name () << " (" << endl
+ << ")" << endl;
+ }
+
+ // ReadAttribute
+ //
+
+ // No-op override because we don't want to generate any swapping
+ // code for facets.
+ virtual void gen_swapping_get (SemanticGraph::ReadAttribute&)
+ {
+ }
+
+ virtual void
+ pre (SemanticGraph::ReadAttribute& a)
+ {
+ os << "template <typename T>" << endl;
+
+ AttributeSourceEmitter<SemanticGraph::Interface>::pre (a);
+ }
+
+ virtual void
+ name (SemanticGraph::ReadAttribute& a)
+ {
+ os << scope_.name () << "_Servant_T<T>::"
+ << a.name () << " (" << endl
+ << ")" << endl;
+ }
+ };
+
+ virtual void
+ traverse (UnconstrainedInterface& i)
+ {
+ if (i.context ().count ("facet_src_gen")) return;
+
+ // We need to escape C++ keywords before flattening the name.
+ //
+ string name;
+ {
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << i.scoped_name ().scope_name ();
+ name = regex::perl_s (ostr.str (), "/::/_/");
+ }
+
+
+ /// Open a namespace made from the interface scope's name.
+ os << "namespace " << STRS[FACET_PREFIX] << name
+ << "{";
+
+ os << "template <typename T>" << endl
+ << i.name () << "_Servant_T<T>::" << i.name ()
+ << "_Servant_T (" << endl
+ << i.scoped_name ().scope_name () << "::CCM_" << i.name ()
+ << "_ptr executor," << endl
+ << "::Components::CCMContext_ptr c)" << endl
+ << " : executor_ ( " << i.scoped_name ().scope_name () << "::CCM_"
+ << i.name () << "::_duplicate (executor))," << endl
+ << " ctx_ ( ::Components::CCMContext::_duplicate (c))" << endl
+ << "{"
+ << "}";
+
+ os << "template <typename T>" << endl
+ << i.name () << "_Servant_T<T>::~" << i.name ()
+ << "_Servant_T (void)" << endl
+ << "{"
+ << "}";
+
+ {
+ InterfaceEmitter interface_emitter (ctx);
+
+ Traversal::Defines defines_;
+ Traversal::Inherits inherits_;
+ interface_emitter.edge_traverser (defines_);
+ interface_emitter.edge_traverser (inherits_);
+
+ FacetAttributeEmitter attribute_emitter (ctx, i);
+ defines_.node_traverser (attribute_emitter);
+
+ FacetOperationEmitter operation_emitter (ctx, i);
+ defines_.node_traverser (operation_emitter);
+ inherits_.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ inherits (i, inherits_);
+ names (i, defines_);
+ }
+
+ os << "template <typename T>" << endl
+ << "::CORBA::Object_ptr" << endl
+ << i.name () << "_Servant_T<T>::_get_component (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << STRS[COMP_SC] << "_var sc =" << endl
+ << " " << STRS[COMP_SC] << "::_narrow (" << endl
+ << " this->ctx_.in ()" << endl
+ << " " << ");"
+ << endl
+ << "if (! ::CORBA::is_nil (sc.in ()))" << endl
+ << "{"
+ << "return sc->get_CCM_object (" << endl
+ << ");"
+ << "}"
+ << "::Components::EntityContext_var ec =" << endl
+ << "::Components::EntityContext::_narrow (" << endl
+ << "this->ctx_.in ()" << endl
+ << ");"
+ << endl
+ << "if (! ::CORBA::is_nil (ec.in ()))" << endl
+ << "{"
+ << "return ec->get_CCM_object (" << endl
+ << ");"
+ << "}"
+ << STRS[ACE_TR] << " ( ::CORBA::INTERNAL (), 0);" << endl
+ << "}" << endl;
+
+ // Close the facet servant's namespace.
+ os << "}";
+
+ i.context ().set ("facet_src_gen", true);
+ }
+ };
+
+ struct ContextEmitter : Traversal::Component, EmitterBase
+ {
+ ContextEmitter (Context& c)
+ : EmitterBase (c)
+ {}
+
+ // Nested classes used by ContextEmitter.
+ private:
+ struct ContextPortsEmitter : Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ Traversal::PublisherData,
+ Traversal::EmitterData,
+ EmitterBase
+ {
+ ContextPortsEmitter (Context& c, SemanticGraph::Component& scope)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ enclosing_belongs_.node_traverser (enclosing_type_name_emitter_);
+ simple_belongs_.node_traverser (simple_type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name () << "_Context::get_connection_"
+ << u.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "return ";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "::_duplicate (" << endl
+ << "this->ciao_uses_" << u.name ()
+ << "_.in ());" << endl
+ << "}";
+
+ os << "void" << endl
+ << scope_.name () << "_Context::connect_"
+ << u.name () << " (" << endl;
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_AC] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{"
+ << "if (! ::CORBA::is_nil (this->ciao_uses_"
+ << u.name () << "_.in ()))" << endl
+ << "{"
+ << "throw " << STRS[EXCP_AC] << " ();"
+ << "}"
+ << "if ( ::CORBA::is_nil (c))" << endl
+ << "{"
+ << "throw " << STRS[EXCP_IC] << " ();"
+ << "}"
+ << "this->ciao_uses_" << u.name () << "_ =" << endl
+ << " ";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "::_duplicate (c);" << endl
+ << "}";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name () << "_Context::disconnect_"
+ << u.name () << " ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_NC] << "))" << endl
+ << "{"
+ << "if ( ::CORBA::is_nil (this->ciao_uses_"
+ << u.name () << "_.in ()))" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_NC] << " ()," << endl;
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "::_nil ());" << endl
+ << "}"
+ << "return this->ciao_uses_" << u.name ()
+ << "_._retn ();" << endl
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << u.scoped_name () << "Connections *" << endl
+ << scope_.name () << "_Context::get_connections_"
+ << u.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << u.scoped_name () << "Connections *tmp_retv = 0;"
+ << "ACE_NEW_THROW_EX ("
+ << "tmp_retv," << endl
+ << u.scoped_name () << "Connections (" << endl
+ << "this->ciao_uses_"
+ << u.name () << "_.current_size ())," << endl
+ << "::CORBA::NO_MEMORY ());" << endl
+ << u.scoped_name () << "Connections_var retv"
+ << " = tmp_retv;" << endl
+ << "retv->length (this->ciao_uses_" << u.name ()
+ << "_.current_size ());" << endl;
+
+ os << "::CORBA::ULong i = 0;" << endl;
+
+ os << "for (ACE_Active_Map_Manager< " << endl
+ << " ";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_var>::iterator iter =" << endl
+ << " this->ciao_uses_" << u.name () << "_.begin ();" << endl
+ << "iter != this->ciao_uses_" << u.name () << "_.end ();"
+ << endl
+ << "++iter)" << endl
+ << "{"
+ << "ACE_Active_Map_Manager< " << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_var>::ENTRY & entry = *iter;" << endl
+ << "retv[i].objref = ";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "::_narrow (" << endl
+ << "entry.int_id_.in ()" << endl
+ << ");"
+ << endl;
+
+ os << "ACE_NEW_THROW_EX ("
+ << "retv[i].ck.inout ()," << endl
+ << "::CIAO::Map_Key_Cookie (entry.ext_id_)," << endl
+ << "::CORBA::NO_MEMORY ());" << endl
+ << "++i;" << endl
+ << "}";
+
+ os << "return retv._retn ();" << endl
+ << "}";
+
+ os << STRS[COMP_CK] << " *" << endl
+ << scope_.name () << "_Context::connect_"
+ << u.name () << " (" << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{"
+ << "if ( ::CORBA::is_nil (c))" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IC] << " (), 0);" << endl
+ << "}";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_var conn = ";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "::_duplicate (c);"
+ << "ACE_Active_Map_Manager_Key key;" << endl;
+
+ os << "if (this->ciao_uses_" << u.name ()
+ << "_.bind (conn.in (), key) == -1)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IC] << " (), 0);" << endl
+ << "}";
+
+ os << "conn._retn ();" << endl;
+
+ os << STRS[COMP_CK] << " * ck = 0;"
+ << "ACE_NEW_THROW_EX ("
+ << "ck," << endl
+ << "::CIAO::Map_Key_Cookie (key)," << endl
+ << "::CORBA::NO_MEMORY ());" << endl;
+
+
+ os << "return ck;" << endl
+ << "}";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name () << "_Context::disconnect_"
+ << u.name () << " (" << endl
+ << STRS[COMP_CK] << " * ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_var retv;"
+ << "ACE_Active_Map_Manager_Key key;" << endl;
+
+ os << "if (! CIAO::Map_Key_Cookie::extract (ck, key))"
+ << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IC] << " ()," << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "::_nil ());" << endl
+ << "}";
+
+ os << "if (this->ciao_uses_" << u.name ()
+ << "_.unbind (key, retv) != 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IC] << " ()," << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "::_nil ());" << endl
+ << "}";
+
+ os << "return retv._retn ();" << endl
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ os << "void" << endl
+ << scope_.name () << "_Context::push_"
+ << p.name () << " (" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << " *ev" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "for (ACE_Active_Map_Manager< " << endl
+ << " ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var>::iterator iter =" << endl
+ << " this->ciao_publishes_" << p.name ()
+ << "_map_.begin ();" << endl
+ << "iter != this->ciao_publishes_" << p.name ()
+ << "_map_.end ();" << endl
+ << "++iter)" << endl
+ << "{"
+ << "(*iter).int_id_->push_";
+
+ Traversal::PublisherData::belongs (p, simple_belongs_);
+
+ os << " (" << endl
+ << "ev" << endl
+ << ");" << endl
+ << "}";
+
+ // @@ GD Modified Code Below
+
+ os << endl;
+ os << "ACE_CString source_id = this->_ciao_instance_id ();";
+ os << "source_id += \"_\";" << endl;
+ os << "source_id += \"" << p.name () << "\";//port name" << endl << endl;
+
+ os << "for (ACE_Active_Map_Manager< " << endl
+ << " " << STRS[COMP_ECB] << "_var>::iterator giter =" << endl
+ << " this->ciao_publishes_" << p.name ()
+ << "_generic_map_.begin ();" << endl
+ << "giter != this->ciao_publishes_" << p.name ()
+ << "_generic_map_.end ();" << endl
+ << "++giter)" << endl
+ << "{"
+ << "(*giter).int_id_->ciao_push_event" << " (" << endl
+ << "ev," << endl
+ << "source_id.c_str ()," << endl;
+
+ Traversal::PublisherData::belongs (p, enclosing_belongs_);
+
+ os << "::_tc_";
+
+ Traversal::PublisherData::belongs (p, simple_belongs_);
+
+ os << endl
+ << ");" << endl
+ << "}"
+ << "}";
+
+ os << STRS[COMP_CK] << " *" << endl
+ << scope_.name () << "_Context::subscribe_"
+ << p.name () << " (" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "))" << endl
+ << "{"
+ << "if ( ::CORBA::is_nil (c))" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( ::CORBA::BAD_PARAM (), 0);" << endl
+ << "}";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var sub =" << endl
+ << " ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer::_duplicate (c);" << endl
+ << "ACE_Active_Map_Manager_Key key;"
+ << "this->ciao_publishes_" << p.name ()
+ << "_map_.bind (sub.in (), key);"
+ << "sub._retn ();" << endl
+ << STRS[COMP_CK] << " * retv = 0;"
+ << "ACE_NEW_THROW_EX ("
+ << "retv," << endl
+ << "::CIAO::Map_Key_Cookie (key)," << endl
+ << "::CORBA::NO_MEMORY ());" << endl
+ << "return retv;" << endl
+ << "}";
+
+ os << STRS[COMP_CK] << " *" << endl
+ << scope_.name () << "_Context::subscribe_"
+ << p.name () << "_generic (" << endl
+ << STRS[COMP_ECB] << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "))" << endl
+ << "{"
+ << "if ( ::CORBA::is_nil (c))" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( ::CORBA::BAD_PARAM (), 0);" << endl
+ << "}";
+
+ os << STRS[COMP_ECB] << "_var sub =" << endl
+ << " " << STRS[COMP_ECB] << "::_duplicate (c);" << endl
+ << "ACE_Active_Map_Manager_Key key;"
+ << "this->ciao_publishes_" << p.name ()
+ << "_generic_map_.bind (sub.in (), key);"
+ << "sub._retn ();" << endl
+ << STRS[COMP_CK] << " * retv = 0;"
+ << "ACE_NEW_THROW_EX ("
+ << "retv," << endl
+ << "::CIAO::Map_Key_Cookie (key)," << endl
+ << "::CORBA::NO_MEMORY ());" << endl
+ << "return retv;" << endl
+ << "}";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << scope_.name () << "_Context::unsubscribe_"
+ << p.name () << " (" << endl
+ << STRS[COMP_CK] << " *ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{"
+ << "ACE_Active_Map_Manager_Key key;" << endl
+ << "if (ck == 0 || ::CIAO::Map_Key_Cookie::extract (ck, key) == false)"
+ << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IC] << " ()," << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer::_nil ());" << endl
+ << "}";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var retv;"
+ << "if (this->ciao_publishes_" << p.name ()
+ << "_map_.unbind (key, retv) == 0)" << endl
+ << "{"
+ << "return retv._retn ();" << endl
+ << "}";
+
+ os << STRS[COMP_ECB] << "_var ecb;" << endl;
+
+ os << "if (this->ciao_publishes_" << p.name ()
+ << "_generic_map_.unbind (key, ecb) != 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IC] << " ()," << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer::_nil ());" << endl
+ << "}"
+ << "return ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer::_nil ();" << endl
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter& e)
+ {
+ os << "void" << endl
+ << scope_.name () << "_Context::push_"
+ << e.name () << " (" << endl;
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << " *ev" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "this->ciao_emits_" << e.name ()
+ << "_consumer_->push_";
+
+ Traversal::EmitterData::belongs (e, simple_belongs_);
+
+ os << " (" << endl
+ << "ev" << endl
+ << ");" << endl
+ << "}";
+
+ os << "void" << endl
+ << scope_.name () << "_Context::connect_"
+ << e.name () << " (" << endl;
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_AC] << "))" << endl
+ << "{"
+ << "if ( ::CORBA::is_nil (c))" << endl
+ << "{"
+ << "throw ::CORBA::BAD_PARAM ();" << endl
+ << "}"
+ << "if (! ::CORBA::is_nil (this->ciao_emits_" << e.name ()
+ << "_consumer_.in ()))" << endl
+ << "{"
+ << "throw " << STRS[EXCP_AC] << " ();" << endl
+ << "}"
+ << "this->ciao_emits_" << e.name ()
+ << "_consumer_ = " << endl;
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer::_duplicate (c);" << endl
+ << "}";
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << scope_.name () << "_Context::disconnect_"
+ << e.name () << " ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_NC] << "))" << endl
+ << "{"
+ << "if ( ::CORBA::is_nil (this->ciao_emits_" << e.name ()
+ << "_consumer_.in ()))" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_NC] << " ()," << endl;
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer::_nil ());" << endl
+ << "}"
+ << "return this->ciao_emits_" << e.name ()
+ << "_consumer_._retn ();" << endl
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ Traversal::Belongs belongs_;
+ Traversal::Belongs enclosing_belongs_;
+ Traversal::Belongs simple_belongs_;
+ SemanticGraph::Component& scope_;
+ };
+
+ struct SwappableGetConsumersEmitter : Traversal::PublisherData,
+ Traversal::EmitterData,
+ EmitterBase
+ {
+ SwappableGetConsumersEmitter (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ os << "if (ACE_OS::strcmp (publisher_name, \""
+ << p.name ().unescaped_str () << "\") == 0)" << endl
+ << "{"
+ << "_ciao_size = this->ciao_publishes_" << p.name ()
+ << "_map_.current_size ();" << endl
+ << "ACE_NEW_THROW_EX ("
+ << "tmp," << endl
+ << STRS[COMP_CD] << " (_ciao_size)," << endl
+ << "::CORBA::NO_MEMORY ());" << endl
+ << "retval = tmp;"
+ << "retval->length (_ciao_size);" << endl
+ << "ACE_Active_Map_Manager<" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var>::iterator end =" << endl
+ << " this->ciao_publishes_" << p.name ()
+ << "_map_.end ();" << endl
+ << "for (ACE_Active_Map_Manager<" << endl
+ << " ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var>::iterator iter =" << endl
+ << " this->ciao_publishes_" << p.name ()
+ << "_map_.begin ();"
+ << "iter != end;"
+ << "++iter)" << endl
+ << "{"
+ << "ACE_Active_Map_Manager<" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var>::entry &e = *iter;" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var c =" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer::_narrow (" << endl
+ << "e.int_id_.in ()" << endl
+ << ");"
+ << endl
+ << "if ( ::CORBA::is_nil (c.in ()))"
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_IC] << " (), 0);"
+ << "}"
+ << "::Components::ConsumerDescription *cd = 0;"
+ << "ACE_NEW_THROW_EX ("
+ << "cd," << endl
+ << "OBV_Components::ConsumerDescription ()," << endl
+ << "::CORBA::NO_MEMORY ());" << endl
+ << "::Components::ConsumerDescription_var safe = cd;"
+ << "safe->name (\"\");"
+ << "safe->type_id (\"\");"
+ << "safe->consumer (c.in ());" << endl
+ << "retval[_ciao_index++] = safe;"
+ << "}"
+ << "return retval._retn ();"
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter&)
+ {
+ // Don't know yet if swappable components need anything here.
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ };
+
+ public:
+ virtual void
+ pre (Type& t)
+ {
+ os << t.name () << "_Context::"
+ << t.name () << "_Context (" << endl
+ << "::Components::CCMHome_ptr h," << endl
+ << "::CIAO::Session_Container *c," << endl
+ << t.name () << "_Servant *sv)" << endl
+ << " : ::CIAO::Context_Impl_Base (h, c), " << endl
+ << " ::CIAO::Context_Impl<" << endl
+ << " " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "_Context," << endl
+ << " " << t.name () << "_Servant," << endl
+ << " " << t.scoped_name () << "," << endl
+ << " " << t.scoped_name () << "_var" << endl
+ << " > (h, c, sv)";
+
+ string swap_option = ctx.cl ().get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+ {
+ os << "," << endl
+ << " ::CIAO::Upgradeable_Context_Impl<" << endl
+ << " " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "_Context," << endl
+ << " " << t.name () << "_Servant," << endl
+ << " " << t.scoped_name () << "," << endl
+ << " " << t.scoped_name () << "_var" << endl
+ << " > (h, c, sv)" << endl;
+ }
+ else
+ {
+ os << endl;
+ }
+
+ os << "{"
+ << "}";
+
+ os << t.name () << "_Context::~"
+ << t.name () << "_Context (void)" << endl
+ << "{"
+ << "}";
+
+ os << "// Operations for " << t.name () << " receptacles"
+ << " and event sources," << endl
+ << "// defined in " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "_Context."
+ << endl << endl;
+
+ // Generate Context class operations for receptacles and event sources.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ ContextPortsEmitter ports_emitter (ctx, t);
+ defines.node_traverser (ports_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ // Extra *_Context methods for swapping container.
+ if (swapping)
+ {
+ os << "// Operations defined in " << t.scoped_name ().scope_name ()
+ << "::CCM_" << t.name () << "_Context" << endl
+ << "// that enable component swapping in the container"
+ << endl << endl;
+
+ os << STRS[COMP_CD] << " *" << endl
+ << t.name () << "_Context::get_registered_consumers (" << endl
+ << "const char *publisher_name)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{"
+ << "if (publisher_name == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_IN] << " (), 0);"
+ << "}"
+ << STRS[COMP_CD] << " *tmp = 0;"
+ << STRS[COMP_CD] << "_var retval;"
+ << "CORBA::ULong _ciao_index = 0;"
+ << "CORBA::ULong _ciao_size = 0;"
+ << STRS[ACE_UA] << " (tmp);"
+ << STRS[ACE_UA] << " (retval);"
+ << STRS[ACE_UA] << " (_ciao_index);"
+ << STRS[ACE_UA] << " (_ciao_size);" << endl;
+
+ // Generate IF block for each event sources.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ SwappableGetConsumersEmitter get_consumers_emitter (ctx);
+ defines.node_traverser (get_consumers_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[ACE_TR] << " ( " << STRS[EXCP_IN] << " (), 0);"
+ << "}";
+ }
+
+ os << "// CIAO-specific." << endl << endl;
+
+ os << t.name () << "_Context *" << endl
+ << t.name () << "_Context::_narrow (" << endl
+ << STRS[COMP_SC] << "_ptr p" << endl
+ << ")" << endl
+ << "{"
+ << "return dynamic_cast<" << t.name () << "_Context *> (p);"
+ << endl
+ << "}";
+ }
+ };
+
+ struct ServantEmitter : Traversal::Component, EmitterBase
+ {
+ ServantEmitter (Context& c)
+ : EmitterBase (c)
+ {}
+
+ // Nested classes used by ServantEmitter.
+ private:
+ struct EmitsConnectEmitter : Traversal::EmitterData,
+ EmitterBase
+
+ {
+ EmitsConnectEmitter (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (Type& t)
+ {
+ os << "if (ACE_OS::strcmp (emitter_name, \""
+ << t.name ().unescaped_str () << "\") == 0)" << endl
+ << "{";
+
+ Traversal::EmitterData::belongs (t, belongs_);
+
+ os << "Consumer_var _ciao_consumer =" << endl
+ << " ";
+
+ Traversal::EmitterData::belongs (t, belongs_);
+
+ os << "Consumer::_narrow (" << endl
+ << " consumer" << endl
+ << " " << ");" << endl
+ << "if ( ::CORBA::is_nil (_ciao_consumer.in ()))" << endl
+ << "{"
+ << "throw " << STRS[EXCP_IC] << " ();"
+ << endl
+ << "}"
+ << "this->connect_" << t.name ()
+ << " (" << endl
+ << "_ciao_consumer.in ()" << endl
+ << ");" << endl
+ << "return;"
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ };
+
+ struct EmitsDisconnectEmitter : Traversal::EmitterData,
+ EmitterBase
+ {
+ EmitsDisconnectEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (Type& t)
+ {
+ os << "if (ACE_OS::strcmp (source_name, \""
+ << t.name ().unescaped_str () << "\") == 0)" << endl
+ << "{"
+ << "return this->disconnect_" << t.name ()
+ << " ();" << endl
+ << "}";
+ }
+ };
+
+ struct NavigationGetFacetExecEmitter : Traversal::ProviderData,
+ EmitterBase
+ {
+ NavigationGetFacetExecEmitter (Context& c)
+ : EmitterBase (c)
+ {}
+
+ virtual void
+ traverse (Type& t)
+ {
+ os << "if (ACE_OS::strcmp (name, \""
+ << t.name ().unescaped_str () << "\") == 0)" << endl
+ << "{"
+ << "return this->executor_->get_" << t.name ()
+ << " ();" << endl
+ << "}";
+ }
+ };
+
+ struct PublishesEmitter : Traversal::PublisherData,
+ EmitterBase
+ {
+ PublishesEmitter (Context& c,
+ SemanticGraph::Component& scope)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (Type& p)
+ {
+ os << STRS[COMP_CK] << " *" << endl
+ << scope_.name ()
+ << "_Servant::subscribe_" << p.name () << " (" << endl;
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "))" << endl
+ << "{";
+
+ string swap_option = ctx.cl ().get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "return this->context_->subscribe_" << p.name ()
+ << " (" << endl
+ << "c" << endl
+ << ");" << endl
+ << "}";
+
+ os << STRS[COMP_CK] << " *" << endl
+ << scope_.name ()
+ << "_Servant::subscribe_" << p.name () << "_generic (" << endl
+ << STRS[COMP_ECB] << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "))" << endl
+ << "{";
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "return this->context_->subscribe_" << p.name ()
+ << "_generic (" << endl
+ << "c" << endl
+ << ");" << endl
+ << "}";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << scope_.name ()
+ << "_Servant::unsubscribe_" << p.name () << " (" << endl
+ << STRS[COMP_CK] << " *ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{";
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "return this->context_->unsubscribe_"
+ << p.name () << " (" << endl
+ << "ck" << endl
+ << ");" << endl
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ SemanticGraph::Component& scope_;
+ };
+
+ struct UsesConnectEmitter : Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ EmitterBase
+ {
+ UsesConnectEmitter (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ os << "if (ACE_OS::strcmp (name, \""
+ << u.name ().unescaped_str () << "\") == 0)" << endl
+ << "{";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_var _ciao_conn =" << endl;
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "::_narrow (" << endl
+ << "connection" << endl
+ << ");"
+ << endl
+ << "if ( ::CORBA::is_nil (_ciao_conn.in ()))" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_IC] << " (), 0);"
+ << endl
+ << "}"
+ << "// Simplex connect." << endl
+ << "this->connect_" << u.name () << " (" << endl
+ << "_ciao_conn.in ()" << endl
+ << ");"
+ << endl
+ << "return 0;" << endl
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << "if (ACE_OS::strcmp (name, \""
+ << u.name ().unescaped_str () << "\") == 0)" << endl
+ << "{";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_var _ciao_conn =" << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "::_narrow (" << endl
+ << "connection" << endl
+ << ");"
+ << endl
+ << "if ( ::CORBA::is_nil (_ciao_conn.in ()))" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_IC] << " (), 0);"
+ << endl
+ << "}"
+ << "// Multiplex connect." << endl
+ << "return this->connect_" << u.name () << " (" << endl
+ << "_ciao_conn.in ()" << endl
+ << ");"
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ };
+
+ struct UsesDisconnectEmitter : Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ EmitterBase
+ {
+ UsesDisconnectEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ os << "if (ACE_OS::strcmp (name, \""
+ << u.name ().unescaped_str () << "\") == 0)" << endl
+ << "{"
+ << "// Simplex disconnect." << endl
+ << "return this->disconnect_" << u.name ()
+ << " ();" << endl
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << "if (ACE_OS::strcmp (name, \""
+ << u.name ().unescaped_str () << "\") == 0)" << endl
+ << "{"
+ << "// Multiplex disconnect." << endl
+ << "if (ck == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_CR] << " ()," << endl
+ << "::CORBA::Object::_nil ());" << endl
+ << "}"
+ << "return this->disconnect_" << u.name () << " (" << endl
+ << "ck" << endl
+ << ");" << endl
+ << "}";
+ }
+ };
+
+ struct UsesEmitter : Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ EmitterBase
+ {
+ UsesEmitter (Context& c, SemanticGraph::Component& scope)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ os << "void" << endl
+ << scope_.name () << "_Servant::connect_"
+ << u.name () << " (" << endl;
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_AC] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{"
+ << "this->context_->connect_" << u.name () << " ("
+ << endl
+ << "c" << endl
+ << ");" << endl
+ << "this->add_receptacle (\"" << u.name ().unescaped_str ()
+ << "\", c, 0);" << endl
+ << "}";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name () << "_Servant::disconnect_"
+ << u.name () << " ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_NC] << "))" << endl
+ << "{"
+ << "return this->context_->disconnect_" << u.name ()
+ << " (" << endl
+ << ");" << endl
+ << "}";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name ()
+ << "_Servant::get_connection_" << u.name ()
+ << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "return this->context_->get_connection_"
+ << u.name () << " (" << endl
+ << ");" << endl
+ << "}";
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << STRS[COMP_CK] << " *" << endl
+ << scope_.name () << "_Servant::connect_"
+ << u.name () << " (" << endl;
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_ECL] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{"
+ << "::Components::Cookie * cookie = "
+ "this->context_->connect_" << u.name () << " ("
+ << endl
+ << "c" << endl
+ << ");" << endl
+ << "this->add_receptacle (\"" << u.name ().unescaped_str ()
+ << "\", c, cookie);" << endl
+ << "return cookie;" << endl
+ << "}";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name () << "_Servant::disconnect_"
+ << u.name () << " (" << endl
+ << STRS[COMP_CK] << " * ck)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{"
+ << "return this->context_->disconnect_" << u.name ()
+ << " (" << endl
+ << "ck" << endl
+ << ");" << endl
+ << "}";
+
+ os << u.scoped_name () << "Connections *" << endl
+ << scope_.name ()
+ << "_Servant::get_connections_" << u.name ()
+ << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "return this->context_->get_connections_"
+ << u.name () << " (" << endl
+ << ");" << endl
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ SemanticGraph::Component& scope_;
+ };
+
+ struct PublishesSubscribeEmitter : Traversal::PublisherData,
+ EmitterBase
+ {
+ PublishesSubscribeEmitter (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (Type& p)
+ {
+ os << "if (ACE_OS::strcmp (publisher_name, \""
+ << p.name ().unescaped_str () << "\") == 0)" << endl
+ << "{";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var sub =" << endl
+ << " ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer::_narrow (" << endl
+ << "subscribe" << endl
+ << ");"
+ << endl;
+
+ os << "if ( ::CORBA::is_nil (sub.in ()))" << endl
+ << "{"
+ << "::CORBA::Boolean substitutable =" << endl
+ << " subscribe->ciao_is_substitutable (" << endl
+ << " ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "::_tao_obv_static_repository_id ()" << endl
+ << " " << ");"
+ << endl;
+
+ os << "if (substitutable)" << endl
+ << "{"
+ << "return this->subscribe_" << p.name () << "_generic (" << endl
+ << "subscribe" << endl
+ << ");" << endl
+ << "}"
+ << "else" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_IC] << " (), 0);" << endl
+ << "}"
+ << "}"
+ << "else" << endl
+ << "{"
+ << "return this->subscribe_" << p.name () << " (" << endl
+ << "sub.in ()" << endl
+ << ");" << endl
+ << "}"
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ };
+
+ struct PublishesUnsubscribeEmitter : Traversal::PublisherData,
+ EmitterBase
+ {
+ PublishesUnsubscribeEmitter (Context& c)
+ : EmitterBase (c)
+ {}
+
+ virtual void
+ traverse (Type& p)
+ {
+ os << "if (ACE_OS::strcmp (publisher_name, \""
+ << p.name ().unescaped_str () << "\") == 0)" << endl
+ << "{"
+ << "return this->unsubscribe_" << p.name ()
+ << " (" << endl
+ << "ck" << endl
+ << ");" << endl
+ << "}";
+ }
+ };
+
+ struct EmitsEmitter : Traversal::EmitterData,
+ EmitterBase
+ {
+ EmitsEmitter (Context& c, SemanticGraph::Component& scope)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ scope_ (scope)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ traverse (Type& e)
+ {
+ os << "void" << endl
+ << scope_.name () << "_Servant::connect_"
+ << e.name () << " (" << endl;
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_ptr c)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_AC] << "))" << endl
+ << "{"
+ << "this->context_->connect_" << e.name ()
+ << " (" << endl
+ << "c" << endl
+ << ");" << endl
+ << "}";
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << scope_.name () << "_Servant::disconnect_"
+ << e.name () << " ()" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_NC] << "))" << endl
+ << "{"
+ << "return this->context_->disconnect_"
+ << e.name () << " (" << endl
+ << ");" << endl
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ SemanticGraph::Component& scope_;
+ };
+
+ struct ServantTypeNameEmitter : Traversal::Type,
+ EmitterBase
+ {
+ ServantTypeNameEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Type& t)
+ {
+ os << t.name () << "_Servant";
+ }
+ };
+
+ struct FacetProvidesEmitter : Traversal::ProviderData,
+ EmitterBase
+ {
+ FacetProvidesEmitter (Context& c,
+ SemanticGraph::Component& scope)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ servant_type_name_emitter_ (c),
+ enclosing_type_name_emitter_ (c),
+ facet_enclosing_type_name_emitter_ (c),
+ repo_id_emitter_ (c),
+ scope_ (scope)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ simple_belongs_.node_traverser (simple_type_name_emitter_);
+ servant_belongs_.node_traverser (servant_type_name_emitter_);
+ enclosing_belongs_.node_traverser (enclosing_type_name_emitter_);
+ facet_enclosing_belongs_.node_traverser (
+ facet_enclosing_type_name_emitter_
+ );
+ repo_id_belongs_.node_traverser (repo_id_emitter_);
+ }
+
+ virtual void
+ traverse (Type& p)
+ {
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << "_ptr" << endl
+ << scope_.name ()
+ << "_Servant::provide_" << p.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{";
+
+ string swap_option = ctx.cl ().get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "if (! ::CORBA::is_nil (this->provide_"
+ << p.name () << "_.in ()))" << endl
+ << "{"
+ << "return ";
+
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << "::_duplicate (this->provide_" << p.name () << "_.in ());"
+ << "}";
+
+ os << "::CORBA::Object_var obj =" << endl
+ << " this->provide_" << p.name () << "_i ("
+ << ");"
+ << endl;
+
+ ScopedName scoped (scope_.scoped_name ());
+ Name stripped (scoped.begin () + 1, scoped.end ());
+
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << "_var fo =" << endl
+ << " ";
+
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << "::_narrow ("
+ << "obj.in ()" << endl
+ << ");"
+ << endl
+ << "this->provide_" << p.name () << "_ = fo;"
+ << "return ";
+
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << "::_duplicate (this->provide_"
+ << p.name () << "_.in ());" << endl
+ << "}";
+
+ // Corresponding private provide_*_i() method.
+
+ os << "::CORBA::Object_ptr" << endl
+ << scope_.name ()
+ << "_Servant::provide_" << p.name () << "_i (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "::CORBA::Object_ptr ret =" << endl
+ << " this->lookup_facet (\""
+ << p.name ().unescaped_str () << "\");" << endl;
+
+ os << "if (! ::CORBA::is_nil (ret))" << endl
+ << "{"
+ << "return ret;"
+ << "}";
+
+ os << "::CIAO::Port_Activator_T<" << endl
+ << " ::" << STRS[FACET_PREFIX];
+
+ Traversal::ProviderData::belongs (p, facet_enclosing_belongs_);
+
+ os << "::";
+
+ Traversal::ProviderData::belongs (p, servant_belongs_);
+
+ os << "," << endl
+ << " ";
+
+ Traversal::ProviderData::belongs (p, enclosing_belongs_);
+
+ os << "::CCM_";
+
+ Traversal::ProviderData::belongs (p, simple_belongs_);
+
+ os << "," << endl
+ << " ::Components::CCMContext," << endl
+ << " " << scope_.name () << "_Servant" << endl
+ << " > *tmp = 0;" << endl
+ << "typedef ::CIAO::Port_Activator_T<" << endl
+ << " ::" << STRS[FACET_PREFIX];
+
+ Traversal::ProviderData::belongs (p, facet_enclosing_belongs_);
+
+ os << "::";
+
+ Traversal::ProviderData::belongs (p, servant_belongs_);
+
+ os << "," << endl
+ << " ";
+
+ Traversal::ProviderData::belongs (p, enclosing_belongs_);
+
+ os << "::CCM_";
+
+ Traversal::ProviderData::belongs (p, simple_belongs_);
+
+ os << "," << endl
+ << " ::Components::CCMContext," << endl
+ << " " << scope_.name () << "_Servant" << endl
+ << " >" << endl
+ << "MACRO_MADNESS_TYPEDEF;" << endl;
+
+ os << "ACE_CString obj_id (this->ins_name_);"
+ << "obj_id += \"_" << p.name ().unescaped_str () << "\";" << endl;
+
+ os << "ACE_NEW_THROW_EX ("
+ << "tmp," << endl
+ << "MACRO_MADNESS_TYPEDEF (" << endl
+ << "obj_id.c_str ()," << endl
+ << "\"" << p.name ().unescaped_str () << "\"," << endl
+ << "::CIAO::Port_Activator::Facet," << endl
+ << "0," << endl
+ << "this->context_," << endl
+ << "this)," << endl
+ << "::CORBA::NO_MEMORY ());" << endl;
+
+ os << "::CIAO::Servant_Activator *sa = " << endl
+ << "this->container_->ports_servant_activator ();" << endl
+ << "if (!sa->register_port_activator (tmp))" << endl
+ << "{"
+ << "return ";
+
+ Traversal::ProviderData::belongs (p, belongs_);
+
+ os << "::_nil ();"
+ << "}";
+
+ os << "::CORBA::Object_var obj =" << endl
+ << " this->container_->generate_reference (" << endl
+ << " obj_id.c_str ()," << endl
+ << " ";
+
+ Traversal::ProviderData::belongs (p, repo_id_belongs_);
+
+ os << "," << endl
+ << " ::CIAO::Container::Facet_Consumer" << endl
+ << " " << ");"
+ << endl
+ << "this->add_facet (\""
+ << p.name ().unescaped_str () << "\"," << endl
+ << "obj.in ()" << endl
+ << ");"
+ << endl;
+
+ os << "return obj._retn ();" << endl
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ ServantTypeNameEmitter servant_type_name_emitter_;
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ FacetEnclosingTypeNameEmitter facet_enclosing_type_name_emitter_;
+ RepoIdEmitter repo_id_emitter_;
+ Traversal::Belongs belongs_;
+ Traversal::Belongs simple_belongs_;
+ Traversal::Belongs servant_belongs_;
+ Traversal::Belongs enclosing_belongs_;
+ Traversal::Belongs facet_enclosing_belongs_;
+ Traversal::Belongs repo_id_belongs_;
+ SemanticGraph::Component& scope_;
+ };
+
+ struct ConsumesEmitter : Traversal::ConsumerData,
+ EmitterBase
+ {
+ ConsumesEmitter (Context& c, SemanticGraph::Component& scope)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ repo_id_emitter_ (c),
+ scope_ (scope)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ simple_belongs_.node_traverser (simple_type_name_emitter_);
+ repo_id_belongs_.node_traverser (repo_id_emitter_);
+ }
+
+ virtual void
+ traverse (Type& c)
+ {
+ os << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant (" << endl
+ << c.scoped_name ().scope_name ().scope_name () << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "_ptr executor,"
+ << endl
+ << c.scoped_name ().scope_name ().scope_name () << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "_Context_ptr c)" << endl
+ << " : executor_ ( " << c.scoped_name ().scope_name ().scope_name ()
+ << "::CCM_" << c.scoped_name ().scope_name ().simple_name ()
+ << "::_duplicate (executor))," << endl
+ << " ctx_ ( " << c.scoped_name ().scope_name ().scope_name ()
+ << "::CCM_" << c.scoped_name ().scope_name ().simple_name ()
+ << "_Context::_duplicate (c))" << endl
+ << "{"
+ << "}";
+
+ os << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant::~";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant (void)" << endl
+ << "{"
+ << "}";
+
+ os << "::CORBA::Object_ptr" << endl
+ << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant::_get_component (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "return this->ctx_->get_CCM_object "
+ << "();" << endl
+ << "}";
+
+ os << "void" << endl
+ << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant::push_";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << " (" << endl;
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << " *evt" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "this->executor_->push_" << c.name ()
+ << " (" << endl
+ << "evt" << endl
+ << ");" << endl
+ << "}";
+
+ os << "// Inherited from " << STRS[COMP_ECB] << "." << endl
+ << "void" << endl
+ << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant::push_event (" << endl
+ << "::Components::EventBase *ev)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_BET] << "))" << endl
+ << "{";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << " *ev_type =" << endl
+ << " ";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "::_downcast (ev);" << endl
+ << "if (ev_type != 0)" << endl
+ << "{"
+ << "this->push_";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << " (" << endl
+ << "ev_type" << endl
+ << ");" << endl
+ << "return;" << endl
+ << "}"
+ << "throw " << STRS[EXCP_BET] << " ();" << endl
+ << "}";
+
+ // GD Added below code
+ // Begin
+
+ os << "// Inherited from " << STRS[COMP_ECB] << "." << endl
+ << "void" << endl
+ << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant::ciao_push_event (" << endl
+ << "::Components::EventBase *ev," << endl
+ << "const char * /* source_id */," << endl
+ << "::CORBA::TypeCode_ptr /* tc */)" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_BET] << "))" << endl
+ << "{"
+ << "this->push_event (ev);" << endl
+ << "}";
+
+ // End
+
+ os << "CORBA::Boolean" << endl
+ << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant::ciao_is_substitutable (" << endl
+ << "const char * event_repo_id" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "if (event_repo_id == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( ::CORBA::BAD_PARAM (), false);" << endl
+ << "}"
+ << scope_.name () << "_Context *ctx =" << endl
+ << " " << scope_.name () << "_Context::_narrow (" << endl
+ << " this->ctx_.in ()" << endl
+ << " " << ");"
+ << endl;
+
+ os << "CORBA::ORB_ptr orb = ctx->_ciao_the_Container ()->the_ORB ();"
+ << endl;
+
+ os << "CORBA::ValueFactory f =" << endl
+ << " orb->lookup_value_factory (" << endl
+ << " event_repo_id" << endl
+ << " " << ");"
+ << endl;
+
+ os << "if (f == 0)" << endl
+ << "{"
+ << "return false;" << endl
+ << "}"
+ << "CORBA::ValueBase_var v =" << endl
+ << " f->create_for_unmarshal ();"
+ << endl;
+
+ os << "f->_remove_ref ();" << endl;
+
+ os << "if (v.in () == 0)" << endl
+ << "{"
+ << "return false;" << endl
+ << "}";
+
+ os << "return dynamic_cast< ";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << " *> (v.in ()) != 0;" << endl
+ << "}" << endl;
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "Consumer_ptr" << endl
+ << scope_.name () << "_Servant::"
+ << "get_consumer_" << c.name () << " (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "if (! ::CORBA::is_nil (this->consumes_" << c.name ()
+ << "_.in ()))" << endl
+ << "{"
+ << "return ";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "Consumer::_duplicate (this->consumes_"
+ << c.name () << "_.in ());"
+ << "}";
+
+ os << "::Components::EventConsumerBase_var obj =" << endl
+ << " this->get_consumer_" << c.name () << "_i (" << endl
+ << " " << ");"
+ << endl;
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "Consumer_var eco =" << endl
+ << " ";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "Consumer::_narrow (" << endl
+ << " obj.in ()" << endl
+ << " " << ");"
+ << endl
+ << "this->consumes_" << c.name () << "_ = eco;"
+ << "return ";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "Consumer::_duplicate (this->consumes_" << c.name ()
+ << "_.in ());" << endl
+ << "}";
+
+ // Corresponding private get_consumer_*_i() method.
+
+ os << "::Components::EventConsumerBase_ptr" << endl
+ << scope_.name () << "_Servant::"
+ << "get_consumer_" << c.name () << "_i (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << "::Components::EventConsumerBase_ptr ret =" << endl
+ << " this->lookup_consumer (\""
+ << c.name ().unescaped_str () << "\");" << endl;
+
+ os << "if (! ::CORBA::is_nil (ret))" << endl
+ << "{"
+ << "return ret;"
+ << "}";
+
+ os << "::CIAO::Port_Activator_T<" << endl;
+
+ os << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant," << endl
+ << c.scoped_name ().scope_name ().scope_name ()
+ << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "," << endl
+ << c.scoped_name ().scope_name ().scope_name () << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "_Context," << endl
+ << scope_.name () << "_Servant"
+ << " > *tmp = 0;" << endl
+ << "typedef CIAO::Port_Activator_T<" << endl;
+
+ os << " " << scope_.name () << "_Servant::";
+
+ Traversal::ConsumerData::belongs (c, simple_belongs_);
+
+ os << "Consumer_" << c.name ()
+ << "_Servant," << endl
+ << " " << c.scoped_name ().scope_name ().scope_name ()
+ << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "," << endl
+ << " " << c.scoped_name ().scope_name ().scope_name () << "::CCM_"
+ << c.scoped_name ().scope_name ().simple_name ()
+ << "_Context, " << endl
+ << " " << scope_.name () << "_Servant" << endl
+ << " >" << endl
+ << "MACRO_MADNESS_TYPEDEF;" << endl;
+
+ os << "ACE_CString obj_id (this->ins_name_);"
+ << "obj_id += \"_" << c.name ().unescaped_str () << "\";" << endl;
+
+ os << "ACE_NEW_THROW_EX (" << endl
+ << "tmp," << endl
+ << "MACRO_MADNESS_TYPEDEF ("
+ << "obj_id.c_str ()," << endl
+ << "\"" << c.name ().unescaped_str () << "\"," << endl
+ << "::CIAO::Port_Activator::Sink," << endl
+ << "this->executor_.in ()," << endl
+ << "this->context_," << endl
+ << "this)," << endl
+ << "::CORBA::NO_MEMORY ());" << endl;
+
+ os << "::CIAO::Servant_Activator *sa =" << endl
+ << " this->container_->ports_servant_activator ();" << endl
+ << "if (!sa->register_port_activator (tmp))" << endl
+ << "{"
+ << "return ";
+
+ Traversal::ConsumerData::belongs (c, belongs_);
+
+ os << "Consumer::_nil ();"
+ << "}";
+
+ os << "::CORBA::Object_var obj =" << endl
+ << " this->container_->generate_reference (" << endl
+ << " obj_id.c_str ()," << endl
+ << " ";
+
+ Traversal::ConsumerData::belongs (c, repo_id_belongs_);
+
+ os << "," << endl
+ << " ::CIAO::Container::Facet_Consumer" << endl
+ << " " << ");"
+ << endl;
+
+ os << "::Components::EventConsumerBase_var ecb =" << endl
+ << " ::Components::EventConsumerBase::_narrow (" << endl
+ << " obj.in ()" << endl
+ << " " << ");"
+ << endl;
+
+ os << "this->add_consumer (\""
+ << c.name ().unescaped_str () << "\"," << endl
+ << "ecb.in ()" << endl
+ << ");"
+ << endl;
+
+ os << "return ecb._retn ();" << endl
+ << "}";
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ ConsumerRepoIdEmitter repo_id_emitter_;
+ Traversal::Belongs belongs_;
+ Traversal::Belongs simple_belongs_;
+ Traversal::Belongs repo_id_belongs_;
+ SemanticGraph::Component& scope_;
+ };
+
+ struct OperationExistsEmitter;
+
+ struct RegisterValueFactoryEmitter : Traversal::ConsumerData,
+ Traversal::PublisherData,
+ Traversal::EmitterData,
+ EmitterBase
+ {
+ RegisterValueFactoryEmitter (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ gen_factory_ (true)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ }
+
+ void factory_gen_off (void)
+ {
+ gen_factory_ = false;
+ }
+
+ bool gen_factory (void) const
+ {
+ return gen_factory_;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ Traversal::PublisherData publisher;
+ RegisterValueFactoryEmitter::traverse_common<
+ SemanticGraph::Publisher,
+ Traversal::PublisherData> (p, publisher, this, os, belongs_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter& e)
+ {
+ Traversal::EmitterData emitter;
+ RegisterValueFactoryEmitter::traverse_common<
+ SemanticGraph::Emitter,
+ Traversal::EmitterData> (e, emitter, this, os, belongs_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& c)
+ {
+ Traversal::ConsumerData consumer;
+ RegisterValueFactoryEmitter::traverse_common<
+ SemanticGraph::Consumer,
+ Traversal::ConsumerData> (c, consumer, this, os, belongs_);
+ }
+
+ template<typename SemanticType, typename TraversalType>
+ static void
+ traverse_common (SemanticType& st,
+ TraversalType& tt,
+ RegisterValueFactoryEmitter* r,
+ ostream& os,
+ Traversal::Belongs& blongs)
+ {
+ {
+ Traversal::Belongs tt_belongs;
+ tt.edge_traverser (tt_belongs);
+
+ // Separate traversers because we want to catch inherited
+ // operations, but not base class factories or private
+ // members.
+ Traversal::ValueType event_type_operations;
+ Traversal::ValueType event_type_factories;
+ tt_belongs.node_traverser (event_type_operations);
+ tt_belongs.node_traverser (event_type_factories);
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (event_type_operations);
+ event_type_operations.edge_traverser (inherits);
+
+ Traversal::Defines include_inherit_defines;
+ event_type_operations.edge_traverser (include_inherit_defines);
+ OperationExistsEmitter op_emitter (r);
+ include_inherit_defines.node_traverser (op_emitter);
+
+ Traversal::Supports supports;
+ event_type_operations.edge_traverser (supports);
+ Traversal::Interface iface;
+ supports.node_traverser (iface);
+ inherits.node_traverser (iface);
+ iface.edge_traverser (inherits);
+ iface.edge_traverser (include_inherit_defines);
+
+ Traversal::Defines no_include_inherit_defines;
+ event_type_factories.edge_traverser (no_include_inherit_defines);
+ PrivateExistsEmitter priv_emitter (r);
+ FactoryExistsEmitter factory_emitter (r);
+ no_include_inherit_defines.node_traverser (priv_emitter);
+ no_include_inherit_defines.node_traverser (factory_emitter);
+
+ tt.traverse (st);
+ }
+
+ if (r->gen_factory ())
+ {
+ os << "CIAO_REGISTER_OBV_FACTORY (" << endl;
+
+ r->TraversalType::belongs (st, blongs);
+
+ os << "_init," << endl;
+
+ r->TraversalType::belongs (st, blongs);
+
+ os << ");" << endl;
+ }
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Belongs belongs_;
+ bool gen_factory_;
+ };
+
+ struct OperationExistsEmitter : Traversal::Operation,
+ Traversal::ValueTypeFactory
+ {
+ OperationExistsEmitter (RegisterValueFactoryEmitter* r)
+ : r_ (r)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Operation&)
+ {
+ r_->factory_gen_off ();
+ }
+
+ virtual void
+ traverse (SemanticGraph::ValueTypeFactory&)
+ {
+ // This gets called for base eventtypes as well, so
+ // we don't want to catch this here, but there's no
+ // way to avoid it, so we make it a no-op. This
+ // catches both valuetype and eventtype factories.
+ }
+
+ private:
+ RegisterValueFactoryEmitter* r_;
+ };
+
+ // Since we're not interested in ancestors' factories, we can
+ // specialize all the way to EventTypeFactory.
+ struct FactoryExistsEmitter : Traversal::EventTypeFactory
+ {
+ FactoryExistsEmitter (RegisterValueFactoryEmitter* r)
+ : r_ (r)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::EventTypeFactory&)
+ {
+ r_->factory_gen_off ();
+ }
+
+ private:
+ RegisterValueFactoryEmitter* r_;
+ };
+
+ struct PrivateExistsEmitter : Traversal::ValueTypePrivateMember
+ {
+ PrivateExistsEmitter (RegisterValueFactoryEmitter* r)
+ : r_ (r)
+ {
+ }
+
+ virtual void
+ traverse (Type&)
+ {
+ r_->factory_gen_off ();
+ }
+
+ private:
+ RegisterValueFactoryEmitter* r_;
+ };
+
+ struct PortTablePopulator : Traversal::ProviderData,
+ Traversal::UserData,
+ Traversal::PublisherData,
+ Traversal::EmitterData,
+ Traversal::ConsumerData,
+ EmitterBase
+ {
+ PortTablePopulator (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Provider& p)
+ {
+ os << "obj_var =" << endl
+ << " this->provide_" << p.name () << "_i (" << endl
+ << " " << ");" << endl;
+ }
+
+ virtual void
+ traverse (SemanticGraph::User&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Consumer& p)
+ {
+ os << "ecb_var =" << endl
+ << " this->get_consumer_" << p.name () << "_i (" << endl
+ << " " << ");" << endl;
+ }
+ };
+
+ struct SetAttributesEmitter : Traversal::ReadWriteAttribute,
+ EmitterBase
+ {
+ SetAttributesEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute& a)
+ {
+ Traversal::Belongs delegate_belongs;
+
+ SetAttributeDelegationEmitter delegater (ctx, a);
+ delegate_belongs.node_traverser (delegater);
+
+ Traversal::ReadWriteAttribute::belongs (a, delegate_belongs);
+ }
+ };
+
+ struct UsesSizeCalculator : Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ EmitterBase
+ {
+ UsesSizeCalculator (Context& c, unsigned long& size)
+ : EmitterBase (c),
+ size_ (size)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser&)
+ {
+ ++size_;
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser&)
+ {
+ ++size_;
+ }
+
+ private:
+ unsigned long& size_;
+ };
+
+ struct UsesGetAllEmitter : Traversal::SingleUserData,
+ Traversal::MultiUserData,
+ EmitterBase
+ {
+ UsesGetAllEmitter (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ repo_id_emitter_ (c),
+ slot_ (0UL)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ repo_id_belongs_.node_traverser (repo_id_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::SingleUser& u)
+ {
+ os << "::CIAO::Servant_Impl_Base::describe_simplex_receptacle<"
+ << endl
+ << " ";
+
+ Traversal::SingleUserData::belongs (u, belongs_);
+
+ os << "_var" << endl
+ << " > (\"" << u.name ().unescaped_str () << "\"," << endl;
+
+ Traversal::SingleUserData::belongs (u, repo_id_belongs_);
+
+ os << "," << endl
+ << "this->context_->ciao_uses_" << u.name () << "_," << endl
+ << "safe_retval," << endl
+ << slot_ << "UL);" << endl;
+
+ ++slot_;
+ }
+
+ virtual void
+ traverse (SemanticGraph::MultiUser& u)
+ {
+ os << "::CIAO::Servant_Impl_Base::describe_multiplex_receptacle<"
+ << endl
+ << " ";
+
+ Traversal::MultiUserData::belongs (u, belongs_);
+
+ os << "_var" << endl
+ << " > (\"" << u.name ().unescaped_str () << "\"," << endl;
+
+ Traversal::MultiUserData::belongs (u, repo_id_belongs_);
+
+ os << "," << endl
+ << "this->context_->ciao_uses_" << u.name () << "_," << endl
+ << "safe_retval," << endl
+ << slot_ << "UL);" << endl;
+
+ ++slot_;
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ RepoIdEmitter repo_id_emitter_;
+ Traversal::Belongs belongs_;
+ Traversal::Belongs repo_id_belongs_;
+ unsigned long slot_;
+ };
+
+ struct PublishesSizeCalculator : Traversal::PublisherData,
+ EmitterBase
+ {
+ PublishesSizeCalculator (Context& c, unsigned long& size)
+ : EmitterBase (c),
+ size_ (size)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher&)
+ {
+ ++size_;
+ }
+
+ private:
+ unsigned long& size_;
+ };
+
+ struct PublishesGetAllEmitter : Traversal::PublisherData,
+ EmitterBase
+ {
+ PublishesGetAllEmitter (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ repo_id_emitter_ (c),
+ slot_ (0UL)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ repo_id_belongs_.node_traverser (repo_id_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Publisher& p)
+ {
+ os << "::CIAO::Servant_Impl_Base::describe_pub_event_source<"
+ << endl
+ << " ";
+
+ Traversal::PublisherData::belongs (p, belongs_);
+
+ os << "Consumer_var" << endl
+ << " > (\"" << p.name ().unescaped_str () << "\"," << endl;
+
+ Traversal::PublisherData::belongs (p, repo_id_belongs_);
+
+ os << "," << endl
+ << "this->context_->ciao_publishes_" << p.name ()
+ << "_map_," << endl
+ << "safe_retval," << endl
+ << slot_ << "UL);" << endl;
+
+ ++slot_;
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ RepoIdEmitter repo_id_emitter_;
+ Traversal::Belongs belongs_;
+ Traversal::Belongs repo_id_belongs_;
+ unsigned long slot_;
+ };
+
+ struct EmitsSizeCalculator : Traversal::EmitterData,
+ EmitterBase
+ {
+ EmitsSizeCalculator (Context& c, unsigned long& size)
+ : EmitterBase (c),
+ size_ (size)
+
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter&)
+ {
+ ++size_;
+ }
+
+ private:
+ unsigned long& size_;
+ };
+
+ struct EmitsGetAllEmitter : Traversal::EmitterData,
+ EmitterBase
+ {
+ EmitsGetAllEmitter (Context& c)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ repo_id_emitter_ (c),
+ slot_ (0UL)
+ {
+ belongs_.node_traverser (type_name_emitter_);
+ repo_id_belongs_.node_traverser (repo_id_emitter_);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Emitter& e)
+ {
+ os << "::CIAO::Servant_Impl_Base::describe_emit_event_source<"
+ << endl
+ << " ";
+
+ Traversal::EmitterData::belongs (e, belongs_);
+
+ os << "Consumer_var" << endl
+ << " > (\"" << e.name ().unescaped_str () << "\"," << endl;
+
+ Traversal::EmitterData::belongs (e, repo_id_belongs_);
+
+ os << "," << endl
+ << "this->context_->ciao_emits_" << e.name ()
+ << "_consumer_," << endl
+ << "safe_retval," << endl
+ << slot_ << "UL);" << endl;
+
+ ++slot_;
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ RepoIdEmitter repo_id_emitter_;
+ Traversal::Belongs belongs_;
+ Traversal::Belongs repo_id_belongs_;
+ unsigned long slot_;
+ };
+
+ public:
+ virtual void
+ pre (Type& t)
+ {
+ ScopedName scoped (t.scoped_name ());
+ Name stripped (scoped.begin () + 1, scoped.end ());
+
+ // Servant Constructor
+ os << t.name () << "_Servant::"
+ << t.name () << "_Servant (" << endl
+ << t.scoped_name ().scope_name () << "::CCM_" << t.name ()
+ << "_ptr exe," << endl
+ << "::Components::CCMHome_ptr h," << endl
+ << "const char *ins_name," << endl
+ << "::CIAO::Home_Servant_Impl_Base *hs," << endl
+ << "::CIAO::Session_Container *c)" << endl
+ << " : ::CIAO::Servant_Impl_Base "
+ << "(h, hs, c)," << endl
+ << " ::CIAO::Servant_Impl<" << endl
+ << " ::POA_" << stripped << "," << endl
+ << " " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "," << endl
+ << " " << t.name () << "_Context" << endl
+ << " > (exe, h, hs, c)," << endl
+ << " ins_name_ (ins_name)" << endl
+ << "{"
+ << "ACE_NEW ("
+ << "this->context_," << endl
+ << t.name () << "_Context (h, c, this));" << endl;
+
+ os << "// Set the instance id of the component on the context" << endl
+ << endl
+ << "this->context_->_ciao_instance_id (this->ins_name_);" << endl;
+
+
+ // Generate the macro to register a value factory for each
+ // eventtype consumed.
+ if (!ctx.cl ().get_value ("suppress-register-factory", false))
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ RegisterValueFactoryEmitter factory_emitter (ctx);
+ defines.node_traverser (factory_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "try" << endl
+ << "{"
+ << "::Components::SessionComponent_var scom =" << endl
+ << " ::Components::SessionComponent::_narrow (" << endl
+ << " exe" << endl
+ << " " << ");" << endl
+ << "if (! ::CORBA::is_nil (scom.in ()))" << endl
+ << "{"
+ << "scom->set_session_context (" << endl
+ << "this->context_" << endl
+ << ");"
+ << "}"
+ << "this->populate_port_tables (" << endl
+ << ");"
+ << "}"
+ << "catch (const CORBA::Exception&)" << endl
+ << "{"
+ << "}"
+ << endl
+ << "}";
+
+ // Servant Destructor
+ os << t.name () << "_Servant::~"
+ << t.name () << "_Servant (void)" << endl
+ << "{"
+ << "}";
+
+ // Override pure virtual set_attributes() operation.
+ os << "void" << endl
+ << t.name () << "_Servant::set_attributes (" << endl
+ << "const ::Components::ConfigValues &descr" << endl
+ << ")" << endl
+ << "{" << endl;
+
+ string swap_option = ctx.cl ().get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "for ( ::CORBA::ULong i = 0; i < descr.length (); ++i)" << endl
+ << "{"
+ << "const char *descr_name = descr[i]->name ();"
+ << "::CORBA::Any &descr_value = descr[i]->value ();" << endl;
+
+ // Generate string compare and set for each attribute.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ SetAttributesEmitter set_attributes_emitter (ctx);
+ defines.node_traverser (set_attributes_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+
+ os << STRS[ACE_UA] << " (descr_name);"
+ << STRS[ACE_UA] << " (descr_value);" << endl;
+
+ os << "}"
+ << "}";
+
+ // Generate provides_<facet> operation.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ FacetProvidesEmitter provides_emitter (ctx, t);
+ defines.node_traverser (provides_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ // Generate subscribe_* and unsubscribe_* operations.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ PublishesEmitter publishes_emitter (ctx, t);
+ defines.node_traverser (publishes_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ // Generate operations for nested Consumer classes.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ ConsumesEmitter consumes_emitter (ctx, t);
+ defines.node_traverser (consumes_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[COMP_CK] << " *" << endl
+ << t.name () << "_Servant::connect (" << endl
+ << "const char *name," << endl
+ << "::CORBA::Object_ptr connection" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "," << endl
+ << STRS[EXCP_AC] << "," << endl
+ << STRS[EXCP_ECL] << "))" << endl
+ << "{";
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "// If the component has no receptacles, this will be unused."
+ << endl
+ << STRS[ACE_UA] << " (connection);" << endl
+ << "if (name == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_IN] << " (), 0);" << endl
+ << "}";
+
+ // Generate IF block in connect operation for each receptacle.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ UsesConnectEmitter uses_emitter (ctx);
+ defines.node_traverser (uses_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[ACE_TR] << " ( " << STRS[EXCP_IN] << " (), 0);" << endl
+ << "}";
+
+ os << "::CORBA::Object_ptr" << endl
+ << t.name () << "_Servant::disconnect (" << endl
+ << "const char *name," << endl
+ << STRS[COMP_CK] << " * ck" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "," << endl
+ << STRS[EXCP_CR] << "," << endl
+ << STRS[EXCP_NC] << "))" << endl
+ << "{"
+ << STRS[ACE_UA] << " (ck);" << endl;
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "if (name == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_BP] << "," << endl
+ << "::CORBA::Object::_nil ());" << endl
+ << "}";
+
+ // Generate IF block in disconnect operation for each receptacle.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ UsesDisconnectEmitter uses_emitter (ctx);
+ defines.node_traverser (uses_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IN] << " ()," << endl
+ << "::CORBA::Object::_nil ());"
+ << "}";
+
+ os << STRS[COMP_RD] << " *" << endl
+ << t.name () << "_Servant::get_all_receptacles (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << STRS[COMP_RD] << " *retval = 0;"
+ << "ACE_NEW_RETURN (retval," << endl
+ << STRS[COMP_RD] << "," << endl
+ << "0);"
+ << STRS[COMP_RD] << "_var safe_retval = retval;";
+
+ unsigned long size = 0;
+
+ // Calculate the number of uses ports.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ UsesSizeCalculator size_calculator (ctx, size);
+ defines.node_traverser (size_calculator);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "safe_retval->length (" << size << "UL);" << endl;
+
+ // Generate a sequence element assignment for each uses port.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ UsesGetAllEmitter get_all_emitter (ctx);
+ defines.node_traverser (get_all_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "return safe_retval._retn ();"
+ << "}";
+
+ // Generate generic operations for receptacles.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ UsesEmitter uses_emitter (ctx, t);
+ defines.node_traverser (uses_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "void" << endl
+ << t.name () << "_Servant::connect_consumer ("
+ << endl
+ << "const char * emitter_name," << endl
+ << STRS[COMP_ECB] << "_ptr consumer" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_AC] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{";
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "if (emitter_name == 0)" << endl
+ << "{"
+ << "throw " << STRS[EXCP_BP] << ";" << endl
+ << "}";
+
+ // Generate an IF block for each 'emits' declaration.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ EmitsConnectEmitter emits_connect_emitter (ctx);
+ defines.node_traverser (emits_connect_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[ACE_UA] << " (consumer);"
+ << "throw "
+ << STRS[EXCP_IN] << " ();" << endl
+ << "}";
+
+ os << STRS[COMP_ECB] << "_ptr" << endl
+ << t.name () << "_Servant::disconnect_consumer (" << endl
+ << "const char *source_name" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_NC] << "))" << endl
+ << "{";
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "if (source_name == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_BP] << "," << endl
+ << STRS[COMP_ECB] << "::_nil ());" << endl
+ << "}";
+
+ // Generate an IF block for each 'emits' declaration.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ EmitsDisconnectEmitter emits_disconnect_emitter (ctx);
+ defines.node_traverser (emits_disconnect_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IN] << " ()," << endl
+ << STRS[COMP_ECB] << "::_nil ());" << endl
+ << "}";
+
+ os << STRS[COMP_PD] << " *" << endl
+ << t.name () << "_Servant::get_all_publishers (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << STRS[COMP_PD] << " *retval = 0;"
+ << "ACE_NEW_RETURN (retval," << endl
+ << STRS[COMP_PD] << "," << endl
+ << "0);"
+ << STRS[COMP_PD] << "_var safe_retval = retval;";
+
+ size = 0UL;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ PublishesSizeCalculator publishes_size_calculator (ctx, size);
+ defines.node_traverser (publishes_size_calculator);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "safe_retval->length (" << size << "UL);" << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ PublishesGetAllEmitter publishes_get_all_emitter (ctx);
+ defines.node_traverser (publishes_get_all_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "return safe_retval._retn ();"
+ << "}";
+
+ os << STRS[COMP_ED] << " *" << endl
+ << t.name () << "_Servant::get_all_emitters (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << STRS[COMP_ED] << " *retval = 0;"
+ << "ACE_NEW_RETURN (retval," << endl
+ << STRS[COMP_ED] << "," << endl
+ << "0);"
+ << STRS[COMP_ED] << "_var safe_retval = retval;";
+
+ size = 0UL;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ EmitsSizeCalculator emits_size_calculator (ctx, size);
+ defines.node_traverser (emits_size_calculator);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "safe_retval->length (" << size << "UL);" << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ EmitsGetAllEmitter emits_get_all_emitter (ctx);
+ defines.node_traverser (emits_get_all_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "return safe_retval._retn ();"
+ << "}";
+
+ os << STRS[COMP_CK] << " *" << endl
+ << t.name () << "_Servant::subscribe (" << endl
+ << "const char *publisher_name," << endl
+ << STRS[COMP_ECB] << "_ptr subscribe" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "," << endl
+ << STRS[EXCP_ECL] << "))" << endl
+ << "{";
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "// Just in case there are no if blocks" << endl
+ << STRS[ACE_UA] << " (subscribe);" << endl
+ << "if (publisher_name == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_IN] << " (), 0);"
+ << endl
+ << "}";
+
+ // Generate an IF block in for each publisher in subscribe().
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ PublishesSubscribeEmitter publishes_emitter (ctx);
+ defines.node_traverser (publishes_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[ACE_TR] << " ( " << STRS[EXCP_IN] << " (), 0);" << endl
+ << "}";
+
+ os << STRS[COMP_ECB] << "_ptr" << endl
+ << t.name () << "_Servant::unsubscribe ("
+ << endl
+ << "const char *publisher_name," << endl
+ << STRS[COMP_CK] << " *ck" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl
+ << STRS[EXCP_IN] << "," << endl
+ << STRS[EXCP_IC] << "))" << endl
+ << "{";
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "// Just in case there are no if blocks" << endl
+ << STRS[ACE_UA] << " (ck);" << endl
+ << "if (publisher_name == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IN] << " ()," << endl
+ << STRS[COMP_ECB] << "::_nil ());" << endl
+ << "}";
+
+ // Generate an IF block in for each publisher in unsubscribe().
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ PublishesUnsubscribeEmitter publishes_emitter (ctx);
+ defines.node_traverser (publishes_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << STRS[ACE_TR] << " ( "
+ << STRS[EXCP_IN] << " ()," << endl
+ << STRS[COMP_ECB] << "::_nil ());" << endl
+ << "}";
+
+ // Generate connect() and disconnect() for each emits declaration.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ EmitsEmitter emits_emitter (ctx, t);
+ defines.node_traverser (emits_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "::CORBA::Object_ptr" << endl
+ << t.name ()
+ << "_Servant::get_facet_executor (" << endl
+ << "const char *name" << endl
+ << ")" << endl
+ << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "))" << endl
+ << "{";
+
+ if (swapping)
+ {
+ os << "this->activate_component ();"
+ << endl;
+ }
+
+ os << "if (name == 0)" << endl
+ << "{"
+ << STRS[ACE_TR] << " ( " << STRS[EXCP_BP] << "," << endl
+ << "::CORBA::Object::_nil ());" << endl
+ << "}";
+
+
+ // Generate an IF block for each facet inside provide_facet().
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+ component_emitter.edge_traverser (inherits);
+
+ NavigationGetFacetExecEmitter navigation_facet_exec_emitter (ctx);
+ defines.node_traverser (navigation_facet_exec_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "return ::CORBA::Object::_nil ();"
+ << "}";
+
+ os << "// Supported operations." << endl << endl;
+
+ // Generate operations for all supported interfaces.
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Supports supports_;
+ component_emitter.edge_traverser (supports_);
+ component_emitter.edge_traverser (component_inherits);
+
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ AttributeSourceEmitter<SemanticGraph::Component> attribute_emitter (ctx, t);
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter<SemanticGraph::Component> operation_emitter (ctx, t);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ // Generate operations for component attributes.
+ os << "// Component attribute operations." << endl << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ component_emitter.edge_traverser (inherits);
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+
+ AttributeSourceEmitter<SemanticGraph::Component> attribute_emitter (ctx, t);
+ defines.node_traverser (attribute_emitter);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "// Private method to populate the port tables."
+ << endl;
+
+ os << "void" << endl
+ << t.name () << "_Servant::populate_port_tables (" << endl
+ << ")" << endl
+ << STRS[EXCP_SNGL] << endl
+ << "{"
+ << ";"
+ << "::CORBA::Object_var obj_var;"
+ << "::Components::EventConsumerBase_var ecb_var;" << endl;
+
+ {
+ Traversal::Component component_emitter;
+
+ Traversal::Inherits inherits;
+ component_emitter.edge_traverser (inherits);
+ inherits.node_traverser (component_emitter);
+
+ Traversal::Defines defines;
+ component_emitter.edge_traverser (defines);
+
+ PortTablePopulator port_table_populator (ctx);
+ defines.node_traverser (port_table_populator);
+
+ component_emitter.traverse (t);
+ }
+
+ os << "}";
+ }
+ };
+
+ struct HomeEmitter : Traversal::Home, EmitterBase
+ {
+ HomeEmitter (Context& c, CommandLine const& cl)
+ : EmitterBase (c),
+ cl_ (cl),
+ simple_type_name_emitter_ (c),
+ repo_id_emitter_ (c),
+ flat_name_emitter_ (c)
+ {
+ simple_manages_.node_traverser (simple_type_name_emitter_);
+ repo_id_manages_.node_traverser (repo_id_emitter_);
+ flat_name_manages_.node_traverser (flat_name_emitter_);
+ }
+
+ // Nested classes used by this emitter.
+ private:
+ struct HomeOpExecReturnEmitter : Traversal::Type
+ {
+ HomeOpExecReturnEmitter (std::ostream& os_)
+ : os (os_)
+ {}
+
+ virtual void
+ traverse (SemanticGraph::Type&)
+ {
+ os << STRS[COMP_EC] << "_var _ciao_ec =" << endl
+ << "this->executor_->";
+ }
+
+ private:
+ std::ostream& os;
+ };
+
+ // HomeFactory and HomeFinder are tied to Operation in
+ // the front end. Since we want to treat them differently
+ // than regular operations in a home (we don't want to
+ // generate anything for base class factory operations,
+ // example), we use this class for regular home operations
+ // that overrides HomeFactory and HomeFinder traversals
+ // to do nothing.
+ struct HomeOperationEmitter : OperationEmitter<SemanticGraph::Home>,
+ Traversal::HomeFactory,
+ Traversal::HomeFinder
+ {
+ HomeOperationEmitter (Context& c, SemanticGraph::Home& home)
+ : OperationEmitter<SemanticGraph::Home> (c, home)
+ {}
+
+ // Overriden to do nothing since we don't want to generate
+ // component swapping related code for facet operations.
+ virtual void
+ gen_swap_related (SemanticGraph::Operation&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::HomeFactory&)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::HomeFinder&)
+ {
+ }
+ };
+
+ struct FactoryOperationEmitter : Traversal::HomeFactory,
+ Traversal::Home,
+ EmitterBase
+ {
+ FactoryOperationEmitter (Context& c, SemanticGraph::Home& home)
+ : EmitterBase (c),
+ return_type_name_emitter_ (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ type_name_emitter_ (c),
+ scope_ (home)
+ {
+ returns_.node_traverser (return_type_name_emitter_);
+ enclosing_manages_.node_traverser (enclosing_type_name_emitter_);
+ simple_manages_.node_traverser (simple_type_name_emitter_);
+ manages_.node_traverser (type_name_emitter_);
+ }
+
+ virtual void
+ returns (SemanticGraph::HomeFactory& hf)
+ {
+ Traversal::HomeFactory::returns (hf, returns_);
+
+ os << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::HomeFactory& hf)
+ {
+ os << scope_.name () << "_Servant::" << hf.name ();
+ }
+
+ virtual void
+ receives_none (SemanticGraph::HomeFactory&)
+ {
+ os << " (" << endl
+ << ")" << endl;
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFactory&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_post (SemanticGraph::HomeFactory&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_none (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFactory&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_post (SemanticGraph::HomeFactory&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (SemanticGraph::HomeFactory& hf)
+ {
+ os << "{";
+
+ {
+ OperationExecEmitter operation_emitter (ctx);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+
+ ParameterExecEmitter<Traversal::InParameter> in_param (os);
+ ParameterExecEmitter<Traversal::InOutParameter> inout_param (os);
+ ParameterExecEmitter<Traversal::OutParameter> out_param (os);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ HomeOpExecReturnEmitter return_emitter (os);
+ returns.node_traverser (return_emitter);
+
+ operation_emitter.traverse (hf);
+ }
+
+ Traversal::Home::manages (scope_, enclosing_manages_);
+
+ os << "::CCM_";
+
+ Traversal::Home::manages (scope_, simple_manages_);
+
+ os << "_var _ciao_comp =" << endl;
+
+ Traversal::Home::manages (scope_, enclosing_manages_);
+
+ os << "::CCM_";
+
+ Traversal::Home::manages (scope_, simple_manages_);
+
+ os << "::_narrow (" << endl
+ << "_ciao_ec.in ()" << endl
+ << ");" << endl;
+
+ os << "return this->_ciao_activate_component (" << endl
+ << "_ciao_comp.in ()" << endl
+ << ");" << endl;
+
+ os << "}";
+ }
+
+ virtual void
+ comma (SemanticGraph::HomeFactory&)
+ {
+ os << "," << endl;
+ }
+
+ private:
+ ReturnTypeNameEmitter return_type_name_emitter_;
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ FullTypeNameEmitter type_name_emitter_;
+ Traversal::Returns returns_;
+ Traversal::Manages enclosing_manages_;
+ Traversal::Manages simple_manages_;
+ Traversal::Manages manages_;
+ SemanticGraph::Home& scope_;
+ };
+
+ struct FinderOperationEmitter : Traversal::HomeFinder,
+ Traversal::Home,
+ EmitterBase
+ {
+ FinderOperationEmitter (Context& c, SemanticGraph::Home& home)
+ : EmitterBase (c),
+ type_name_emitter_ (c),
+ return_type_name_emitter_ (c),
+ enclosing_type_name_emitter_ (c),
+ simple_type_name_emitter_ (c),
+ scope_ (home)
+ {
+ returns_.node_traverser (return_type_name_emitter_);
+ simple_returns_.node_traverser (type_name_emitter_);
+ enclosing_manages_.node_traverser (enclosing_type_name_emitter_);
+ simple_manages_.node_traverser (simple_type_name_emitter_);
+ }
+
+ virtual void
+ returns (SemanticGraph::HomeFinder& hf)
+ {
+ Traversal::HomeFinder::returns (hf, returns_);
+
+ os << endl;
+ }
+
+ virtual void
+ name (SemanticGraph::HomeFinder& hf)
+ {
+ os << scope_.name () << "_Servant::" << hf.name ();
+ }
+
+ virtual void
+ receives_none (SemanticGraph::HomeFinder&)
+ {
+ os << " (" << endl
+ << ")" << endl;
+ }
+
+ virtual void
+ receives_pre (SemanticGraph::HomeFinder&)
+ {
+ os << " (" << endl;
+ }
+
+ virtual void
+ receives_post (SemanticGraph::HomeFinder&)
+ {
+ os << endl << ")" << endl;
+ }
+
+ virtual void
+ raises_none (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[EXCP_SNGL];
+ }
+
+ virtual void
+ raises_pre (SemanticGraph::HomeFinder&)
+ {
+ os << STRS[EXCP_START] << " "
+ << STRS[EXCP_SYS] << "," << endl;
+ }
+
+ virtual void
+ raises_post (SemanticGraph::HomeFinder&)
+ {
+ os << "))";
+ }
+
+ virtual void
+ post (SemanticGraph::HomeFinder& hf)
+ {
+ os << "{"
+ << STRS[ACE_TR] << " ( ::CORBA::NO_IMPLEMENT ()," << endl;
+
+ Traversal::HomeFinder::returns (hf, simple_returns_);
+
+ os << "::_nil ());"
+ << "}";
+ }
+
+ virtual void
+ comma (SemanticGraph::HomeFinder&)
+ {
+ os << "," << endl;
+ }
+
+ private:
+ FullTypeNameEmitter type_name_emitter_;
+ ReturnTypeNameEmitter return_type_name_emitter_;
+ EnclosingTypeNameEmitter enclosing_type_name_emitter_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ Traversal::Returns returns_;
+ Traversal::Returns simple_returns_;
+ Traversal::Manages enclosing_manages_;
+ Traversal::Manages simple_manages_;
+ SemanticGraph::Home& scope_;
+ };
+
+ public:
+ virtual void
+ pre (Type& t)
+ {
+ os << t.name () << "_Servant::"
+ << t.name () << "_Servant (" << endl
+ << t.scoped_name ().scope_name () << "::CCM_" << t.name ()
+ << "_ptr exe," << endl
+ << "const char *ins_name," << endl
+ << "::CIAO::Session_Container *c)" << endl
+ << " : ::CIAO::Home_Servant_Impl_Base (c)," << endl
+ << " ::CIAO::";
+
+ string swap_option = cl_.get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ ScopedName scoped (t.scoped_name ());
+ Name stripped (scoped.begin () + 1, scoped.end ());
+
+ os << (swapping ? "Swapping_" : "") << "Home_Servant_Impl<" << endl
+ << " ::POA_" << stripped << "," << endl
+ << " " << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "," << endl
+ << " ";
+
+ Traversal::Home::manages (t, simple_manages_);
+
+ os << "_Servant" << endl
+ << " > (exe, c, ins_name";
+
+ if (swapping)
+ {
+ os << ", \"" << ctx.composition_name ();
+
+ Traversal::Home::manages (t, flat_name_manages_);
+
+ os << "\", ";
+
+ Traversal::Home::manages (t, repo_id_manages_);
+ }
+
+ os << ")" << endl
+ << "{"
+ << "}";
+
+ os << t.name () << "_Servant::~"
+ << t.name () << "_Servant (void)" << endl
+ << "{"
+ << "}";
+
+ os << "// Home operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits inherits;
+ home_emitter.edge_traverser (inherits);
+ inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ HomeOperationEmitter home_operation_emitter (ctx, t);
+ defines.node_traverser (home_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ home_operation_emitter.edge_traverser (receives);
+ home_operation_emitter.edge_traverser (returns);
+ home_operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Home supported interface operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits home_inherits;
+ home_inherits.node_traverser (home_emitter);
+ home_emitter.edge_traverser (home_inherits);
+
+ Traversal::Supports supports_;
+ home_emitter.edge_traverser (supports_);
+
+ InterfaceEmitter interface_emitter (ctx);
+ supports_.node_traverser (interface_emitter);
+
+ Traversal::Defines defines;
+ Traversal::Inherits interface_inherits;
+ interface_emitter.edge_traverser (defines);
+ interface_emitter.edge_traverser (interface_inherits);
+
+ AttributeSourceEmitter<SemanticGraph::Home> attribute_emitter (ctx, t);
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter<SemanticGraph::Home> operation_emitter (ctx, t);
+ defines.node_traverser (operation_emitter);
+ interface_inherits.node_traverser (interface_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ operation_emitter.edge_traverser (receives);
+ operation_emitter.edge_traverser (returns);
+ operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ os << "// Home factory and finder operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits inherits;
+ home_emitter.edge_traverser (inherits);
+ inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ FactoryOperationEmitter factory_operation_emitter (ctx, t);
+ FinderOperationEmitter finder_operation_emitter (ctx, t);
+ defines.node_traverser (factory_operation_emitter);
+ defines.node_traverser (finder_operation_emitter);
+
+ Traversal::Receives receives;
+ Traversal::Belongs returns;
+ Traversal::Raises raises;
+ factory_operation_emitter.edge_traverser (receives);
+ factory_operation_emitter.edge_traverser (returns);
+ factory_operation_emitter.edge_traverser (raises);
+ finder_operation_emitter.edge_traverser (receives);
+ finder_operation_emitter.edge_traverser (returns);
+ finder_operation_emitter.edge_traverser (raises);
+
+ ParameterEmitter<Traversal::InParameter> in_param (ctx);
+ ParameterEmitter<Traversal::InOutParameter> inout_param (ctx);
+ ParameterEmitter<Traversal::OutParameter> out_param (ctx);
+ receives.node_traverser (in_param);
+ receives.node_traverser (inout_param);
+ receives.node_traverser (out_param);
+
+ ReturnTypeNameEmitter return_type_emitter (ctx);
+ FullTypeNameEmitter type_name_emitter (ctx);
+ returns.node_traverser (return_type_emitter);
+ raises.node_traverser (type_name_emitter);
+
+ Traversal::Belongs in_belongs, inout_belongs, out_belongs;
+ in_param.edge_traverser (in_belongs);
+ inout_param.edge_traverser (inout_belongs);
+ out_param.edge_traverser (out_belongs);
+
+ INArgTypeNameEmitter in_arg_emitter (ctx);
+ INOUTArgTypeNameEmitter inout_arg_emitter (ctx);
+ OUTArgTypeNameEmitter out_arg_emitter (ctx);
+ in_belongs.node_traverser (in_arg_emitter);
+ inout_belongs.node_traverser (inout_arg_emitter);
+ out_belongs.node_traverser (out_arg_emitter);
+
+ home_emitter.traverse (t);
+ }
+
+ // Generate operations for component attributes.
+ os << "// Home attribute operations." << endl << endl;
+
+ {
+ Traversal::Home home_emitter;
+
+ Traversal::Inherits inherits;
+ home_emitter.edge_traverser (inherits);
+ inherits.node_traverser (home_emitter);
+
+ Traversal::Defines defines;
+ home_emitter.edge_traverser (defines);
+
+ AttributeSourceEmitter<SemanticGraph::Home> attribute_emitter (ctx, t);
+ defines.node_traverser (attribute_emitter);
+
+ home_emitter.traverse (t);
+ }
+ }
+
+ virtual void
+ post (Type& t)
+ {
+ // We need to escape C++ keywords before flattening the name.
+ //
+ string name;
+ {
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << t.scoped_name ();
+ name = regex::perl_s (ostr.str (), "/::/_/");
+ }
+
+ os << "extern \"C\" " << ctx.export_macro ()
+ << " ::PortableServer::Servant"
+ << endl
+ << "create" << name << "_Servant (" << endl
+ << "::Components::HomeExecutorBase_ptr p," << endl
+ << "::CIAO::Session_Container *c," << endl
+ << "const char *ins_name" << endl
+ << ")" << endl
+ << "{"
+ << "if (p == 0)" << endl
+ << "{"
+ << "return 0;" << endl
+ << "}"
+ << t.scoped_name ().scope_name () << "::CCM_"
+ << t.name () << "_var x =" << endl
+ << t.scoped_name ().scope_name () << "::CCM_" << t.name ()
+ << "::_narrow (" << endl
+ << "p" << endl
+ << ");"
+ << endl
+ << "if (::CORBA::is_nil (x.in ()))" << endl
+ << "{"
+ << "return 0;" << endl
+ << "}"
+ << "return new" << endl;
+
+ os << t.name () << "_Servant (" << endl
+ << "x.in ()," << endl
+ << "ins_name," << endl
+ << "c);" << endl
+ << "}";
+ }
+
+ private:
+ CommandLine const& cl_;
+ SimpleTypeNameEmitter simple_type_name_emitter_;
+ RepoIdEmitter repo_id_emitter_;
+ FlatNameEmitter flat_name_emitter_;
+ Traversal::Manages simple_manages_;
+ Traversal::Manages repo_id_manages_;
+ Traversal::Manages flat_name_manages_;
+ };
+}
+
+ServantSourceEmitter::ServantSourceEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ string export_macro,
+ fs::path const& file)
+ : os (os_),
+ cl_ (cl),
+ export_macro_ (export_macro),
+ file_ (file)
+{}
+
+void
+ServantSourceEmitter::generate (TranslationUnit& u)
+{
+ pre (u);
+
+ Context c (os, export_macro_, cl_);
+
+ /// CIAO has facet classes outside the context and servant classes.
+ /// We launch it here to generate the classes inside namespaces
+ /// constructed to be unique for each interface type used in a facet.
+ generate_facets (u, c);
+
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion region;
+ contains_principal.node_traverser (region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ Traversal::Includes includes;
+
+ region.edge_traverser (includes);
+ region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ ModuleEmitter module (c);
+ CompositionEmitter composition (c);
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+
+ // Layer 4
+ //
+ Traversal::Defines composition_defines;
+ composition.edge_traverser (composition_defines);
+
+ //--
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+ composition_defines.node_traverser (component_executor);
+ composition_defines.node_traverser (home_executor);
+
+ module.edge_traverser (defines);
+
+ // Layer 5
+ //
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+
+ //--
+ ContextEmitter context_emitter (c);
+ ServantEmitter servant_emitter (c);
+ HomeEmitter home_emitter (c, cl_);
+ implements.node_traverser (context_emitter);
+ implements.node_traverser (servant_emitter);
+ implements.node_traverser (home_emitter);
+
+ unit.traverse (u);
+}
+
+void
+ServantSourceEmitter::pre (TranslationUnit&)
+{
+ os << COPYRIGHT;
+
+ string file_name ("");
+
+ if (! file_.empty ())
+ {
+ file_name = file_.leaf ();
+ }
+
+ string file_suffix = cl_.get_value ("svnt-hdr-file-suffix",
+ "_svnt.h");
+
+ file_name = regex::perl_s (file_name,
+ "/^(.+?)(\\.(idl|cidl|cdl))?$/$1"
+ + file_suffix
+ + "/");
+
+ string swap_option = cl_.get_value ("custom-container", "");
+ bool swapping = (swap_option == "upgradeable");
+
+ os << "#include \"" << file_name << "\"" << endl
+ << "#include \"Cookies.h\"" << endl
+ << "#include \"ciao/Servant_Activator.h\"" << endl
+ << (swapping ? "#include \"ciao/Dynamic_Component_Activator.h\"\n" : "")
+ << "#include \"ciao/Port_Activator_T.h\"" << endl
+ << "#include \"ace/SString.h\"" << endl << endl;
+}
+
+void
+ServantSourceEmitter::generate_facets (TranslationUnit& u, Context& c)
+{
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion region;
+ contains_principal.node_traverser (region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ Traversal::Includes includes;
+
+ region.edge_traverser (includes);
+ region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ Traversal::Module module;
+ Traversal::Composition composition;
+ defines.node_traverser (module);
+ defines.node_traverser (composition);
+
+ // Layer 4
+ //
+ Traversal::Defines composition_defines;
+ composition.edge_traverser (composition_defines);
+
+ //--
+ Traversal::ComponentExecutor component_executor;
+ Traversal::HomeExecutor home_executor;
+ composition_defines.node_traverser (component_executor);
+ composition_defines.node_traverser (home_executor);
+
+ module.edge_traverser (defines);
+
+ // Layer 5
+ //
+ Traversal::Implements implements;
+ component_executor.edge_traverser (implements);
+ home_executor.edge_traverser (implements);
+
+ // Layer 6
+ //
+ Traversal::Component component_emitter;
+ implements.node_traverser (component_emitter);
+
+ Traversal::Inherits component_inherits;
+ component_inherits.node_traverser (component_emitter);
+
+ Traversal::Defines component_defines;
+ component_emitter.edge_traverser (component_defines);
+ component_emitter.edge_traverser (component_inherits);
+
+ // Layer 7
+ //
+ Traversal::Provider provider;
+ component_defines.node_traverser (provider);
+
+ Traversal::Belongs belongs;
+ provider.edge_traverser (belongs);
+
+ FacetEmitter facet_emitter (c);
+ belongs.node_traverser (facet_emitter);
+
+ unit.traverse (u);
+}
diff --git a/modules/CIAO/CIDLC/ServantSourceGenerator.hpp b/modules/CIAO/CIDLC/ServantSourceGenerator.hpp
new file mode 100644
index 00000000000..c5a15fd062c
--- /dev/null
+++ b/modules/CIAO/CIDLC/ServantSourceGenerator.hpp
@@ -0,0 +1,53 @@
+// file : CIDLC/ServantSourceGenerator.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef SERVANT_SOURCE_GENERATOR_HPP
+#define SERVANT_SOURCE_GENERATOR_HPP
+
+#include <string>
+#include <iosfwd>
+
+#include "EmitterContext.hpp"
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+class ServantSourceEmitter
+{
+public:
+ ServantSourceEmitter (std::ostream& os_,
+ CommandLine const& cl,
+ std::string export_macro,
+ fs::path const& file);
+
+ virtual ~ServantSourceEmitter () {}
+
+ virtual void
+ generate (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+private:
+ virtual void
+ pre (CCF::CIDL::SemanticGraph::TranslationUnit& u);
+
+ virtual void
+ generate_facets (CCF::CIDL::SemanticGraph::TranslationUnit& u,
+ Context& c);
+
+private:
+ std::ostream& os;
+ CommandLine const& cl_;
+ std::string export_macro_;
+ fs::path file_;
+};
+
+#endif // SERVANT_SOURCE_GENERATOR_HPP
+
+/*
+ * Local Variables:
+ * mode: C++
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/modules/CIAO/CIDLC/SizeTypeCalculator.cpp b/modules/CIAO/CIDLC/SizeTypeCalculator.cpp
new file mode 100644
index 00000000000..b8f44e879ed
--- /dev/null
+++ b/modules/CIAO/CIDLC/SizeTypeCalculator.cpp
@@ -0,0 +1,217 @@
+// file : CIDLC/SizeTypeCalculator.cpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "SizeTypeCalculator.hpp"
+#include "Literals.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include <stack>
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+using namespace StringLiterals;
+
+namespace
+{
+ class Calculator : public Traversal::String,
+ public Traversal::Struct,
+ public Traversal::Union,
+ public Traversal::Wstring,
+ public Traversal::UnboundedSequence,
+ public Traversal::Interface,
+ public Traversal::ValueType
+ {
+ public:
+ Calculator ()
+ {
+ push (false);
+ }
+
+ public:
+ virtual void
+ traverse (SemanticGraph::String&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Wstring&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ traverse (SemanticGraph::UnboundedSequence&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Interface&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ traverse (SemanticGraph::ValueType&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ pre (SemanticGraph::Struct&)
+ {
+ push (false);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Struct& s)
+ {
+ std::string n (s.scoped_name ().str ());
+ if (s.context ().count (STRS[VAR_SIZE]))
+ {
+ // Never set 'top' to false (except in pre() above),
+ // so a 'true' value will propagate up the scopes.
+ bool r = s.context ().get<bool> (STRS[VAR_SIZE]);
+ if (r) top () = r;
+ }
+ else
+ {
+ Traversal::Struct::traverse (s);
+ }
+ }
+
+ virtual void
+ post (SemanticGraph::Struct& s)
+ {
+ // Set our context to the result of nested scope traversal.
+ s.context ().set (STRS[VAR_SIZE], top ());
+ }
+
+ virtual void
+ pre (SemanticGraph::Union&)
+ {
+ push (false);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Union& u)
+ {
+ if (u.context ().count (STRS[VAR_SIZE]))
+ {
+ // Never set 'top' to false (except in pre() above),
+ // so a 'true' value will propagate up the scopes.
+ bool r = u.context ().get<bool> (STRS[VAR_SIZE]);
+ if (r) top () = r;
+ }
+ else
+ {
+ Traversal::Union::traverse (u);
+ }
+ }
+
+ virtual void
+ post (SemanticGraph::Union& u)
+ {
+ // Set our context to the result of nested scope traversal.
+ u.context ().set (STRS[VAR_SIZE], top ());
+ }
+
+ private:
+ void
+ push (bool v)
+ {
+ stack_.push (v);
+ }
+
+ bool&
+ top ()
+ {
+ return stack_.top ();
+ }
+
+ void
+ pop ()
+ {
+ stack_.pop ();
+ }
+
+ private:
+ std::stack<bool> stack_;
+ };
+}
+
+
+void SizeTypeCalculator::
+calculate (SemanticGraph::TranslationUnit& u)
+{
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion region;
+ contains_principal.node_traverser (region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ Traversal::Includes includes;
+
+ region.edge_traverser (includes);
+ region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ includes.node_traverser (region);
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ // Everything that can contain a struct or union.
+ Traversal::Module module;
+ Traversal::UnconstrainedInterface uinterface;
+ Traversal::ValueType vtype;
+ Traversal::Home component_home;
+
+ Calculator calculator;
+
+ defines.node_traverser (module);
+ defines.node_traverser (uinterface);
+ defines.node_traverser (vtype);
+ defines.node_traverser (component_home);
+ defines.node_traverser (calculator);
+
+ // Layer 4
+ //
+ Traversal::Defines struct_defines;
+ module.edge_traverser (defines);
+ uinterface.edge_traverser (defines);
+ vtype.edge_traverser (defines);
+ component_home.edge_traverser (defines);
+ calculator.edge_traverser (struct_defines);
+
+ //--
+ Traversal::Member member;
+ struct_defines.node_traverser (member);
+
+ // Layer 5
+ //
+ Traversal::Belongs belongs;
+ member.edge_traverser (belongs);
+
+ //--
+ belongs.node_traverser (calculator);
+
+ unit.traverse (u);
+}
diff --git a/modules/CIAO/CIDLC/SizeTypeCalculator.hpp b/modules/CIAO/CIDLC/SizeTypeCalculator.hpp
new file mode 100644
index 00000000000..ea765e29cdc
--- /dev/null
+++ b/modules/CIAO/CIDLC/SizeTypeCalculator.hpp
@@ -0,0 +1,21 @@
+// file : CIDLC/SizeTypeCalculator.hpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef CIDLC_SIZE_TYPE_CALCULATOR_HPP
+#define CIDLC_SIZE_TYPE_CALCULATOR_HPP
+
+
+//@@ Don't really need this. just forward declaration of
+// TranslationUnit would be enough.
+//
+#include "CCF/CIDL/SemanticGraph.hpp"
+
+class SizeTypeCalculator
+{
+public:
+ void
+ calculate (CCF::CIDL::SemanticGraph::TranslationUnit&);
+};
+
+#endif // CIDLC_SIZE_TYPE_CALCULATOR_HPP
diff --git a/modules/CIAO/CIDLC/UnescapedNamePrinter.hpp b/modules/CIAO/CIDLC/UnescapedNamePrinter.hpp
new file mode 100644
index 00000000000..0b4d31628a4
--- /dev/null
+++ b/modules/CIAO/CIDLC/UnescapedNamePrinter.hpp
@@ -0,0 +1,23 @@
+// file : CIDLC/UnescapedNamePrinter.hpp
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// cvs-id : $Id: Collectors.hpp 55138 2004-01-05 07:53:05Z parsons $
+
+#ifndef UNESCAPED_NAME_PRINTER_HPP
+#define UNESCAPED_NAME_PRINTER_HPP
+
+#include "CCF/IDL2/SemanticGraph/Name.hpp"
+
+#include <ostream>
+
+// Prints names in the unescaped form.
+//
+struct UnescapedNamePrinter: CCF::IDL2::SemanticGraph::NamePrinter
+{
+ virtual void
+ print (std::ostream& os, CCF::IDL2::SemanticGraph::SimpleName const& n)
+ {
+ os << n.unescaped_str ();
+ }
+};
+
+#endif // UNESCAPED_NAME_PRINTER_HPP
diff --git a/modules/CIAO/CIDLC/Upcase.hpp b/modules/CIAO/CIDLC/Upcase.hpp
new file mode 100644
index 00000000000..cf114dd8392
--- /dev/null
+++ b/modules/CIAO/CIDLC/Upcase.hpp
@@ -0,0 +1,21 @@
+// file : CIDLC/Upcase.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef UPCASE_HPP
+#define UPCASE_HPP
+
+#include <cctype>
+
+namespace
+{
+ // On some platforms toupper can be something other than a
+ // function.
+ int
+ upcase (int c)
+ {
+ return std::toupper (c);
+ }
+}
+
+#endif // UPCASE_HPP
diff --git a/modules/CIAO/CIDLC/UtilityTypeNameEmitters.cpp b/modules/CIAO/CIDLC/UtilityTypeNameEmitters.cpp
new file mode 100644
index 00000000000..44864e4b05e
--- /dev/null
+++ b/modules/CIAO/CIDLC/UtilityTypeNameEmitters.cpp
@@ -0,0 +1,78 @@
+// file : CIDLC/UtilityTypeNameEmitters.cpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "UtilityTypeNameEmitters.hpp"
+#include "CCF/CodeGenerationKit/Regex.hpp"
+
+#include <sstream>
+
+FullTypeNameEmitter::FullTypeNameEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+FullTypeNameEmitter::traverse (SemanticGraph::Type& t)
+{
+ os << t.scoped_name ();
+}
+
+// ===================================================
+
+SimpleTypeNameEmitter::SimpleTypeNameEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+SimpleTypeNameEmitter::traverse (SemanticGraph::Type& t)
+{
+ os << t.name ();
+}
+
+// ===================================================
+
+EnclosingTypeNameEmitter::EnclosingTypeNameEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+EnclosingTypeNameEmitter::traverse (SemanticGraph::Type& t)
+{
+ os << t.scoped_name ().scope_name ();
+}
+
+// ===================================================
+
+StrippedTypeNameEmitter::StrippedTypeNameEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+StrippedTypeNameEmitter::traverse (SemanticGraph::Type& t)
+{
+ ScopedName scoped (t.scoped_name ());
+ os << Name (scoped.begin () + 1, scoped.end ());
+}
+
+// ===================================================
+
+FacetEnclosingTypeNameEmitter::FacetEnclosingTypeNameEmitter (Context& c)
+ : EmitterBase (c)
+{
+}
+
+void
+FacetEnclosingTypeNameEmitter::traverse (SemanticGraph::Type& t)
+{
+ // We need to escape C++ keywords before flattening the name.
+ //
+ std::ostringstream ostr;
+ ostr.pword (name_printer_index) = os.pword (name_printer_index);
+ ostr << t.scoped_name ().scope_name ();
+ os << regex::perl_s (ostr.str (), "/::/_/");
+}
+
diff --git a/modules/CIAO/CIDLC/UtilityTypeNameEmitters.hpp b/modules/CIAO/CIDLC/UtilityTypeNameEmitters.hpp
new file mode 100644
index 00000000000..94c499e1a9d
--- /dev/null
+++ b/modules/CIAO/CIDLC/UtilityTypeNameEmitters.hpp
@@ -0,0 +1,66 @@
+// file : CIDLC/UtilityTypeNameEmitters.hpp
+// author : Jeff Parsons <j.parsons@vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef UTILITYTYPENAMEEMITTERS_HPP
+#define UTILITYTYPENAMEEMITTERS_HPP
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+#include "EmitterBase.hpp"
+
+using namespace std;
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+// Emits type's full scoped name.
+struct FullTypeNameEmitter : Traversal::Type,
+ EmitterBase
+{
+ FullTypeNameEmitter (Context&);
+
+ virtual void
+ traverse (SemanticGraph::Type&);
+};
+
+// Emits type's local name.
+struct SimpleTypeNameEmitter : Traversal::Type,
+ EmitterBase
+{
+ SimpleTypeNameEmitter (Context&);
+
+ virtual void
+ traverse (SemanticGraph::Type&);
+};
+
+// Emits name of type's enclosing scope.
+struct EnclosingTypeNameEmitter : Traversal::Type,
+ EmitterBase
+{
+ EnclosingTypeNameEmitter (Context&);
+
+ virtual void
+ traverse (SemanticGraph::Type&);
+};
+
+// Emits scoped name minus the leading double colon.
+struct StrippedTypeNameEmitter : Traversal::Type,
+ EmitterBase
+{
+ StrippedTypeNameEmitter (Context&);
+
+ virtual void
+ traverse (SemanticGraph::Type&);
+};
+
+// Emits scoped name in flat form for use with a prefix.
+struct FacetEnclosingTypeNameEmitter : Traversal::Type,
+ EmitterBase
+{
+ FacetEnclosingTypeNameEmitter (Context&);
+
+ virtual void
+ traverse (SemanticGraph::Type&);
+};
+
+#endif // UTILITYTYPENAMEEMITTERS_HPP
diff --git a/modules/CIAO/CIDLC/Version b/modules/CIAO/CIDLC/Version
new file mode 100644
index 00000000000..1750564f270
--- /dev/null
+++ b/modules/CIAO/CIDLC/Version
@@ -0,0 +1 @@
+0.0.6
diff --git a/modules/CIAO/CIDLC/cidlc.cpp b/modules/CIAO/CIDLC/cidlc.cpp
new file mode 100644
index 00000000000..b0ca7e2b178
--- /dev/null
+++ b/modules/CIAO/CIDLC/cidlc.cpp
@@ -0,0 +1,386 @@
+// file : CIDLC/cidlc.cpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#include <vector>
+#include <iostream>
+
+#include "CCF/CompilerElements/Context.hpp"
+#include "CCF/CompilerElements/FileSystem.hpp"
+#include "CCF/CompilerElements/Diagnostic.hpp"
+#include "CCF/CompilerElements/TokenStream.hpp"
+#include "CCF/CompilerElements/Preprocessor.hpp"
+
+#include "CCF/CodeGenerationKit/CommandLine.hpp"
+#include "CCF/CodeGenerationKit/CommandLineParser.hpp"
+#include "CCF/CodeGenerationKit/CommandLineDescriptor.hpp"
+
+#include "CCF/CIDL/LexicalAnalyzer.hpp"
+#include "CCF/CIDL/Parser.hpp"
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/SemanticAction/Impl/Factory.hpp"
+
+#include "ExecutorMappingGenerator.hpp"
+#include "ServantGenerator.hpp"
+#include "ExecImplGenerator.hpp"
+#include "RepositoryIdGenerator.hpp"
+#include "DescriptorGenerator.hpp"
+#include "SizeTypeCalculator.hpp"
+
+#include "ciao/Version.h" // for --version
+
+using std::cerr;
+using std::endl;
+
+class ErrorDetector : public std::streambuf
+{
+public:
+ ErrorDetector (std::ostream& os)
+ : error_ (false),
+ os_ (os),
+ prev_ (*os_.rdbuf ())
+ {
+ os_.rdbuf (this);
+ }
+
+ ~ErrorDetector ()
+ {
+ os_.rdbuf (&prev_);
+ }
+
+ virtual int_type
+ overflow (int_type c)
+ {
+ error_ = true;
+ return prev_.sputc (c);
+ }
+
+ virtual int
+ sync ()
+ {
+ return prev_.pubsync ();
+ }
+
+ bool
+ error () const throw ()
+ {
+ return error_;
+ }
+
+private:
+ bool error_;
+ std::ostream& os_;
+ std::streambuf& prev_;
+};
+
+using namespace CCF::CompilerElements;
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+
+int
+main (int argc, char* argv[])
+{
+ try
+ {
+ // Parsing command line options and arguments.
+ //
+
+ CL::Description cld (argv[0]);
+
+ cld.add_option (CL::OptionDescription (
+ "version",
+ "Display version information and exit.",
+ CL::OptionType::flag));
+
+ cld.add_option (CL::OptionDescription (
+ "help",
+ "Display usage information and exit.",
+ CL::OptionType::flag));
+
+ cld.add_option (CL::OptionDescription (
+ "help-html",
+ "Dump usage information in html format and exit.",
+ CL::OptionType::flag));
+
+ cld.add_option (CL::OptionDescription (
+ "I",
+ "dir",
+ "Add the directory dir to the list of directories to "
+ "be searched for header files.",
+ CL::OptionType::value));
+
+ cld.add_option (CL::OptionDescription (
+ "D",
+ "name[=definition]",
+ "Predefine name as a macro with the value definition "
+ "if present, 1 otherwise.",
+ CL::OptionType::value));
+
+ cld.add_option (CL::OptionDescription (
+ "gen-exec-impl",
+ "Generate the executor implementation classes.",
+ CL::OptionType::flag));
+
+ ExecutorMappingGenerator::options (cld);
+ ServantGenerator::options (cld);
+ DescriptorGenerator::options (cld);
+ ExecImplGenerator::options (cld);
+
+ cld.add_option (CL::OptionDescription (
+ "trace-semantic-actions",
+ "Turn on semantic actions tracing facility.",
+ CL::OptionType::flag));
+
+ cld.add_option (CL::OptionDescription (
+ "preprocess-only",
+ "Run preprocessor only and output result to stdout.",
+ CL::OptionType::flag));
+
+ cld.add_argument ("cidl file");
+
+
+ CommandLine cl;
+
+ if (!parse (argc, argv, cld, cl))
+ {
+ cerr << "try " << argv[0] << " --help for usage information" << endl;
+ return -1;
+ }
+
+ if (cl.get_value ("version", false))
+ {
+ cerr << "CIAO CIDL Compiler " << CIAO_VERSION
+ << " (built on " << __DATE__ << " at " << __TIME__ << ")" << endl;
+ return 0;
+ }
+
+ if (cl.get_value ("help", false))
+ {
+ CL::print_text (cerr, cld);
+ return 0;
+ }
+
+ if (cl.get_value ("help-html", false))
+ {
+ CL::print_html (cerr, cld);
+ return 0;
+ }
+
+
+ fs::ifstream ifs;
+ ifs.exceptions (std::ios_base::badbit | std::ios_base::failbit);
+
+ fs::path file_path;
+
+ CommandLine::ArgumentsIterator i = cl.arguments_begin ();
+
+ if (i != cl.arguments_end ())
+ {
+ try
+ {
+ file_path = fs::path (*i, fs::native);
+ ifs.open (file_path, std::ios_base::in);
+ }
+ catch (fs::filesystem_error const&)
+ {
+ cerr << *i << ": error: unable to open in read mode" << endl;
+ return -1;
+ }
+ catch (std::ios_base::failure const&)
+ {
+ cerr << *i << ": error: unable to open in read mode" << endl;
+ return -1;
+ }
+ }
+
+ //@@ for some reason ifs throws exception if I don't reset it to
+ // original state. It probably has something to do with call to
+ // get after eof.
+ ifs.exceptions (std::ios_base::iostate (0));
+
+ std::istream& is = ifs.is_open ()
+ ? static_cast<std::istream&> (ifs)
+ : static_cast<std::istream&> (std::cin);
+
+ InputStreamAdapter isa (is);
+
+
+ // Extract preprocessor symbol definitions (-D). We are not
+ // interested in the values, just symbols.
+ //
+ CPP::Symbols symbols;
+
+ for (CommandLine::OptionsIterator
+ i (cl.options_begin ()), e (cl.options_end ()); i != e; ++i)
+ {
+ if (i->name () == "D")
+ {
+ std::string def (i->value ());
+
+ // Get rid of '=value' in 'symbol=value' definitions.
+ //
+ std::size_t p (def.find ('='));
+ if (p != std::string::npos)
+ symbols.insert (std::string (def, 0, p));
+ else
+ symbols.insert (def);
+ }
+ }
+
+ CPP::Preprocessor pp (isa, symbols);
+
+ if (cl.get_value ("preprocess-only", false))
+ {
+ while (true)
+ {
+ CPP::Token t (pp.next ());
+
+ if (t == CPP::Token::eos) break;
+
+ std::cout << t;
+ }
+
+ return 0;
+ }
+
+ Diagnostic::Stream dout;
+ ErrorDetector detector (cerr);
+
+ LexicalAnalyzer lexer (pp);
+
+ TokenList token_stream;
+
+ //@@ bad token comparison
+ for (TokenPtr token = lexer.next ();; token = lexer.next ())
+ {
+ // cerr << typeid(*(token.in ())).name () << " : " << token << endl;
+ token_stream.push_back (token);
+ if (ReferenceCounting::strict_cast<EndOfStream> (token) != 0) break;
+ }
+
+ if (token_stream.size () < 2)
+ {
+ cerr << "no tokens produced so nothing to parse" << endl;
+ return 0;
+ }
+
+ TranslationUnit tu (file_path, 0);
+
+ // Initialize compilation context.
+ //
+ CCF::CompilerElements::Context context;
+ context.set ("file-path", file_path);
+ context.set ("trace-semantic-action",
+ cl.get_value ("trace-semantic-actions", false));
+ context.set ("cpp-symbols", symbols);
+
+
+ // Extract include search paths.
+ //
+
+ std::vector<fs::path> include_paths;
+
+ for (CommandLine::OptionsIterator
+ i (cl.options_begin ()), e (cl.options_end ()); i != e; ++i)
+ {
+ std::string path;
+
+ if (i->name () == "I")
+ {
+ path = i->value ();
+
+ try
+ {
+ include_paths.push_back (fs::path (path, fs::native));
+ }
+ catch (fs::filesystem_error const&)
+ {
+ cerr << "error: invalid filesystem path '" << path << "' "
+ << "provided with the -I option" << endl;
+
+ return 1;
+ }
+ }
+ }
+
+ context.set ("include-search-paths", include_paths);
+
+ // Instantiate semantic actions factory.
+ //
+ SemanticAction::Impl::Factory actions (context, dout, tu);
+
+ Parser parser (context, dout, lexer, actions);
+
+ //@@ should be able to use CIDL here. Or better yet get rid of this
+ // function completely.
+ //
+ CCF::IDL2::Parsing::parse (token_stream.begin (),
+ token_stream.end (),
+ parser.start ());
+
+ if (dout.error_count () != 0) return 1;
+
+ // This is a little hack to make CIDL compiler signal
+ // error conditions by return value. Once I redesign
+ // diagnostic in CCF this should be removed.
+
+ if (detector.error ()) return 1;
+
+
+ // Generate executor mapping.
+ {
+ ExecutorMappingGenerator lem_gen;
+ lem_gen.generate (cl, tu, file_path);
+ }
+
+ // Calculate the size type of everything in the AST.
+ // This must be executed before the servant code generator.
+ {
+ SizeTypeCalculator sizetype_calc;
+ sizetype_calc.calculate (tu);
+ }
+
+ // Compute repository IDs in a separate pass.
+ {
+ RepositoryIdGenerator repid_gen;
+ if (!repid_gen.generate (tu)) return 1;
+ }
+
+ // Generate servant code.
+ {
+ ServantGenerator svnt_gen (cl);
+ svnt_gen.generate (tu, file_path);
+ }
+
+ // Generate executor implementation code.
+ if (cl.get_value ("gen-exec-impl", false))
+ {
+ ExecImplGenerator impl_gen (cl);
+ impl_gen.generate (tu, file_path);
+ }
+
+ // Generate descriptor code.
+ {
+ DescriptorGenerator desc_gen;
+ desc_gen.generate (cl, tu);
+ }
+
+ return 0;
+ }
+ catch (std::bad_cast const&)
+ {
+ cerr << "bad cast exception" << endl;
+ }
+ catch (InvalidName const&)
+ {
+ cerr << "invalid name exception" << endl;
+ }
+ /*
+ catch (...)
+ {
+ cerr << "caught unknown exception" << endl;
+ }
+ */
+
+ return 1;
+}