From b71531b42b3325fd6079a7039aae8641262c8adf Mon Sep 17 00:00:00 2001
From: jai
Date: Mon, 29 Jan 2007 21:15:18 +0000
Subject: branching/tagging
---
modules/CIAO/CIDLC/AttributeHeaderEmitters.cpp | 196 +
modules/CIAO/CIDLC/AttributeHeaderEmitters.hpp | 119 +
modules/CIAO/CIDLC/AttributeSourceEmitters_T.hpp | 360 ++
modules/CIAO/CIDLC/CIDLC.mpc | 16 +
modules/CIAO/CIDLC/CIDLC.mwc | 10 +
modules/CIAO/CIDLC/Collectors.hpp | 280 ++
modules/CIAO/CIDLC/CompositionEmitter.cpp | 27 +
modules/CIAO/CIDLC/CompositionEmitter.hpp | 26 +
modules/CIAO/CIDLC/CorbaTypeNameEmitters.cpp | 2014 ++++++++++
modules/CIAO/CIDLC/CorbaTypeNameEmitters.hpp | 469 +++
modules/CIAO/CIDLC/CxxNamePrinter.cpp | 103 +
modules/CIAO/CIDLC/CxxNamePrinter.hpp | 18 +
modules/CIAO/CIDLC/DescriptorGenerator.cpp | 582 +++
modules/CIAO/CIDLC/DescriptorGenerator.hpp | 35 +
modules/CIAO/CIDLC/EmitterBase.cpp | 11 +
modules/CIAO/CIDLC/EmitterBase.hpp | 20 +
modules/CIAO/CIDLC/EmitterContext.cpp | 45 +
modules/CIAO/CIDLC/EmitterContext.hpp | 35 +
modules/CIAO/CIDLC/ExecImplGenerator.cpp | 201 +
modules/CIAO/CIDLC/ExecImplGenerator.hpp | 44 +
modules/CIAO/CIDLC/ExecImplHeaderGenerator.cpp | 819 ++++
modules/CIAO/CIDLC/ExecImplHeaderGenerator.hpp | 43 +
modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp | 1136 ++++++
modules/CIAO/CIDLC/ExecImplSourceGenerator.hpp | 43 +
modules/CIAO/CIDLC/ExecutorMappingGenerator.cpp | 2099 ++++++++++
modules/CIAO/CIDLC/ExecutorMappingGenerator.hpp | 32 +
modules/CIAO/CIDLC/InterfaceEmitter.cpp | 26 +
modules/CIAO/CIDLC/InterfaceEmitter.hpp | 30 +
modules/CIAO/CIDLC/Literals.cpp | 81 +
modules/CIAO/CIDLC/Literals.hpp | 58 +
modules/CIAO/CIDLC/ModuleEmitter.cpp | 22 +
modules/CIAO/CIDLC/ModuleEmitter.hpp | 24 +
modules/CIAO/CIDLC/OperationHeaderEmitters.cpp | 264 ++
modules/CIAO/CIDLC/OperationHeaderEmitters.hpp | 151 +
modules/CIAO/CIDLC/ParameterEmitter_T.hpp | 33 +
modules/CIAO/CIDLC/README.html | 95 +
modules/CIAO/CIDLC/RepositoryIdGenerator.cpp | 289 ++
modules/CIAO/CIDLC/RepositoryIdGenerator.hpp | 21 +
modules/CIAO/CIDLC/ServantGenerator.cpp | 220 ++
modules/CIAO/CIDLC/ServantGenerator.hpp | 53 +
modules/CIAO/CIDLC/ServantHeaderGenerator.cpp | 1783 +++++++++
modules/CIAO/CIDLC/ServantHeaderGenerator.hpp | 54 +
modules/CIAO/CIDLC/ServantSourceGenerator.cpp | 4476 ++++++++++++++++++++++
modules/CIAO/CIDLC/ServantSourceGenerator.hpp | 53 +
modules/CIAO/CIDLC/SizeTypeCalculator.cpp | 217 ++
modules/CIAO/CIDLC/SizeTypeCalculator.hpp | 21 +
modules/CIAO/CIDLC/UnescapedNamePrinter.hpp | 23 +
modules/CIAO/CIDLC/Upcase.hpp | 21 +
modules/CIAO/CIDLC/UtilityTypeNameEmitters.cpp | 78 +
modules/CIAO/CIDLC/UtilityTypeNameEmitters.hpp | 66 +
modules/CIAO/CIDLC/Version | 1 +
modules/CIAO/CIDLC/cidlc.cpp | 386 ++
52 files changed, 17329 insertions(+)
create mode 100644 modules/CIAO/CIDLC/AttributeHeaderEmitters.cpp
create mode 100644 modules/CIAO/CIDLC/AttributeHeaderEmitters.hpp
create mode 100644 modules/CIAO/CIDLC/AttributeSourceEmitters_T.hpp
create mode 100644 modules/CIAO/CIDLC/CIDLC.mpc
create mode 100644 modules/CIAO/CIDLC/CIDLC.mwc
create mode 100644 modules/CIAO/CIDLC/Collectors.hpp
create mode 100644 modules/CIAO/CIDLC/CompositionEmitter.cpp
create mode 100644 modules/CIAO/CIDLC/CompositionEmitter.hpp
create mode 100644 modules/CIAO/CIDLC/CorbaTypeNameEmitters.cpp
create mode 100644 modules/CIAO/CIDLC/CorbaTypeNameEmitters.hpp
create mode 100644 modules/CIAO/CIDLC/CxxNamePrinter.cpp
create mode 100644 modules/CIAO/CIDLC/CxxNamePrinter.hpp
create mode 100644 modules/CIAO/CIDLC/DescriptorGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/DescriptorGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/EmitterBase.cpp
create mode 100644 modules/CIAO/CIDLC/EmitterBase.hpp
create mode 100644 modules/CIAO/CIDLC/EmitterContext.cpp
create mode 100644 modules/CIAO/CIDLC/EmitterContext.hpp
create mode 100644 modules/CIAO/CIDLC/ExecImplGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/ExecImplGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/ExecImplHeaderGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/ExecImplHeaderGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/ExecImplSourceGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/ExecImplSourceGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/ExecutorMappingGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/ExecutorMappingGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/InterfaceEmitter.cpp
create mode 100644 modules/CIAO/CIDLC/InterfaceEmitter.hpp
create mode 100644 modules/CIAO/CIDLC/Literals.cpp
create mode 100644 modules/CIAO/CIDLC/Literals.hpp
create mode 100644 modules/CIAO/CIDLC/ModuleEmitter.cpp
create mode 100644 modules/CIAO/CIDLC/ModuleEmitter.hpp
create mode 100644 modules/CIAO/CIDLC/OperationHeaderEmitters.cpp
create mode 100644 modules/CIAO/CIDLC/OperationHeaderEmitters.hpp
create mode 100644 modules/CIAO/CIDLC/ParameterEmitter_T.hpp
create mode 100644 modules/CIAO/CIDLC/README.html
create mode 100644 modules/CIAO/CIDLC/RepositoryIdGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/RepositoryIdGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/ServantGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/ServantGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/ServantHeaderGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/ServantHeaderGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/ServantSourceGenerator.cpp
create mode 100644 modules/CIAO/CIDLC/ServantSourceGenerator.hpp
create mode 100644 modules/CIAO/CIDLC/SizeTypeCalculator.cpp
create mode 100644 modules/CIAO/CIDLC/SizeTypeCalculator.hpp
create mode 100644 modules/CIAO/CIDLC/UnescapedNamePrinter.hpp
create mode 100644 modules/CIAO/CIDLC/Upcase.hpp
create mode 100644 modules/CIAO/CIDLC/UtilityTypeNameEmitters.cpp
create mode 100644 modules/CIAO/CIDLC/UtilityTypeNameEmitters.hpp
create mode 100644 modules/CIAO/CIDLC/Version
create mode 100644 modules/CIAO/CIDLC/cidlc.cpp
(limited to 'modules/CIAO/CIDLC')
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
+// 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
+// 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
+// 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
+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
+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 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
+// cvs-id : $Id$
+
+#ifndef COLLECTORS_HPP
+#define COLLECTORS_HPP
+
+#include
+On Windows: Just open the generated solution file.
+
+Note: If you are building CCF on a Windows platform, use %ACE_ROOT%\bin\mwc.pl
instead
+
+of $ACE_ROOT/bin/mwc.pl
. Also, for a list of project types and other command-line options
+supported by MPC, type $ACE_ROOT/bin/mwc.pl --help
.
+
+
+
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
+// 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 (*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 (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 (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 (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 (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
+// 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
+// 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 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 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 (ofs)
+ : static_cast (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
+// cvs-id : $Id$
+
+#ifndef SERVANT_GENERATOR_HPP
+#define SERVANT_GENERATOR_HPP
+
+#include
+#include
+
+#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
+// 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
+#include
+
+#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 " << 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 "
+ << 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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
+// cvs-id : $Id$
+
+#ifndef SERVANT_HEADER_GENERATOR_HPP
+#define SERVANT_HEADER_GENERATOR_HPP
+
+#include
+#include
+
+#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
+// 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
+#include
+
+#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 (STRS[REPO_ID]) << "\"";
+ }
+ };
+
+ struct ConsumerRepoIdEmitter : Traversal::Type,
+ EmitterBase
+ {
+ ConsumerRepoIdEmitter (Context& c)
+ : EmitterBase (c)
+ {
+ }
+
+ virtual void
+ traverse (SemanticGraph::Type& t)
+ {
+ string holder (t.context ().get (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
+ struct ParameterExecEmitter : T
+ {
+ ParameterExecEmitter (std::ostream& os_)
+ : os (os_)
+ {}
+
+ virtual void
+ name (typename T::Type& p)
+ {
+ os << p.name ();
+ }
+
+ private:
+ std::ostream& os;
+ };
+
+ template
+ 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 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
+ {
+ FacetOperationEmitter (Context& c,
+ SemanticGraph::UnconstrainedInterface& i)
+ : OperationEmitter (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 " << endl;
+ }
+
+ virtual void
+ name (Type& o)
+ {
+ os << endl
+ << scope_.name () << "_Servant_T::" << o.name ();
+ }
+ };
+
+ struct FacetWriteAttributeEmitter
+ : WriteAttributeSourceEmitter
+ {
+ // 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 (c,
+ i,
+ false,
+ false)
+ {}
+
+ virtual void
+ pre (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << "template " << endl;
+
+ WriteAttributeSourceEmitter::pre (a);
+ }
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << scope_.name () << "_Servant_T::"
+ << a.name () << " (" << endl;
+
+ Traversal::ReadWriteAttribute::belongs (a, write_belongs_);
+
+ os << " " << a.name () << endl
+ << ")" << endl;
+ }
+ };
+
+ struct FacetAttributeEmitter
+ : AttributeSourceEmitter
+ {
+ FacetAttributeEmitter (Context& c,
+ SemanticGraph::Interface& i)
+ : AttributeSourceEmitter (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 " << endl;
+
+ AttributeSourceEmitter::pre (a);
+ }
+
+ virtual void
+ name (SemanticGraph::ReadWriteAttribute& a)
+ {
+ os << scope_.name () << "_Servant_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 " << endl;
+
+ AttributeSourceEmitter::pre (a);
+ }
+
+ virtual void
+ name (SemanticGraph::ReadAttribute& a)
+ {
+ os << scope_.name () << "_Servant_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 " << endl
+ << i.name () << "_Servant_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 " << endl
+ << i.name () << "_Servant_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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 " << endl
+ << "::CORBA::Object_ptr" << endl
+ << i.name () << "_Servant_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
+ 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_ 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 attribute_emitter (ctx, t);
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 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,
+ Traversal::HomeFactory,
+ Traversal::HomeFinder
+ {
+ HomeOperationEmitter (Context& c, SemanticGraph::Home& home)
+ : OperationEmitter (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 in_param (os);
+ ParameterExecEmitter inout_param (os);
+ ParameterExecEmitter 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 attribute_emitter (ctx, t);
+ defines.node_traverser (attribute_emitter);
+
+ OperationEmitter 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 in_param (ctx);
+ ParameterEmitter inout_param (ctx);
+ ParameterEmitter 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 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
+// cvs-id : $Id$
+
+#ifndef SERVANT_SOURCE_GENERATOR_HPP
+#define SERVANT_SOURCE_GENERATOR_HPP
+
+#include
+#include
+
+#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
+// cvs-id : $Id$
+
+#include "SizeTypeCalculator.hpp"
+#include "Literals.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include
+
+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 (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 (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 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
+// 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
+// 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
+
+// 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
+// cvs-id : $Id$
+
+#ifndef UPCASE_HPP
+#define UPCASE_HPP
+
+#include
+
+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
+// cvs-id : $Id$
+
+#include "UtilityTypeNameEmitters.hpp"
+#include "CCF/CodeGenerationKit/Regex.hpp"
+
+#include
+
+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
+// 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
+// cvs-id : $Id$
+
+#include
+#include
+
+#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 (ifs)
+ : static_cast (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 (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 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;
+}
--
cgit v1.2.1