diff options
Diffstat (limited to 'TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp')
-rw-r--r-- | TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp | 2489 |
1 files changed, 0 insertions, 2489 deletions
diff --git a/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp b/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp deleted file mode 100644 index 8b677954b4c..00000000000 --- a/TAO/CIAO/CIDLC/ServantHeaderGenerator.cpp +++ /dev/null @@ -1,2489 +0,0 @@ -// file : CIDLC/ServantHeaderGenerator.cpp -// author : Jeff Parsons <j.parsons@vanderbilt.edu> -// cvs-id : $Id$ - -#include "ServantHeaderGenerator.hpp" -#include "TypeNameEmitter.hpp" -#include "Literals.hpp" - -#include <ostream> - -#include "CCF/CodeGenerationKit/Regex.hpp" - -using std::endl; -using std::string; - -using namespace StringLiterals; -using namespace CCF::CIDL; -using namespace CCF::CIDL::SemanticGraph; - -using std::string; - -namespace -{ - // On some platforms toupper can be something other than a - // function. - int - upcase (int c) - { - return std::toupper (c); - } -} - -namespace -{ - class Context - { - public: - Context (std::ostream& os, - string export_macro) - : os_ (os), - export_macro_ (export_macro) - { - } - - std::ostream& - os () - { - return os_; - } - - string - export_macro () - { - return export_macro_; - } - - private: - std::ostream& os_; - string export_macro_; - }; - - class EmitterBase - { - public: - EmitterBase (Context& c) - : ctx (c), - os (ctx.os ()) - { - } - - protected: - Context& ctx; - std::ostream& os; - }; - - struct ModuleEmitter : Traversal::Module, EmitterBase - { - ModuleEmitter (Context& c) - : EmitterBase (c) - { - } - - virtual void - pre (Type& t) - { - os << "namespace " << t.name () << "{"; - } - - virtual void - post (Type&) - { - os << "}"; - } - }; - - struct OperationEmitter : Traversal::Operation, EmitterBase - { - OperationEmitter (Context& c) - : EmitterBase (c) - {} - - virtual void - pre (Type&) - { - os << "virtual "; - } - - virtual void - name (Type& o) - { - os << endl << o.name (); - } - - virtual void - receives_pre (Type&) - { - os << " (" << endl; - } - - virtual void - receives_none (Type&) - { - os << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl; - } - - virtual void - receives_post (Type&) - { - os << endl << STRS[ENV_HDR] << ")" << endl; - } - - virtual void - raises_pre (Type&) - { - os << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl; - } - - virtual void - raises_none (Type&) - { - os << STRS[EXCP_SNGL]; - } - - virtual void - raises_post (Type&) - { - os << "))"; - } - - virtual void - post (Type&) - { - os << ";" << endl << endl; - } - - virtual void - comma (Type&) - { - os << "," << endl; - } - }; - - // For generating parameter names. - template <typename T> - struct ParameterEmitter : T - { - ParameterEmitter (std::ostream& os_) - : os (os_) - {} - - virtual void - name (typename T::Type& p) - { - os << " " << p.name (); - } - - private: - std::ostream& os; - }; - - // Generic scoped typename emitter used by various other emitters. - struct TypeNameEmitter : Traversal::Type - { - TypeNameEmitter (std::ostream& os_) - : os (os_) - {} - - virtual void - traverse (SemanticGraph::Type& t) - { - os << t.scoped_name (); - } - - private: - std::ostream& os; - }; - - // Generic local typename emitter used by various other emitters. - struct SimpleTypeNameEmitter : Traversal::Type - { - SimpleTypeNameEmitter (std::ostream& os_) - : os (os_) - {} - - virtual void - traverse (SemanticGraph::Type& t) - { - os << t.name (); - } - - private: - std::ostream& os; - }; - - // Generate name of type's enclosing scope. - struct EnclosingTypeNameEmitter : Traversal::Type - { - EnclosingTypeNameEmitter (std::ostream& os_) - : os (os_) - {} - - virtual void - traverse (SemanticGraph::Type& t) - { - os << t.scoped_name ().scope_name (); - } - - private: - std::ostream& os; - }; - - // Emits typename minus the leading double colon. - struct StrippedTypeNameEmitter : Traversal::Type - { - StrippedTypeNameEmitter (std::ostream& os_) - : os (os_) - {} - - virtual void - traverse (SemanticGraph::Type& t) - { - ScopedName scoped (t.scoped_name ()); - os << Name (scoped.begin () + 1, scoped.end ()); - } - - private: - std::ostream& os; - }; - - // Generates the set operation of a ReadWriteAttribute. - struct WriteAttributeEmitter : Traversal::ReadWriteAttribute, - EmitterBase - { - WriteAttributeEmitter (Context& c) - : EmitterBase (c), - write_type_name_emitter_ (c.os ()), - type_name_emitter_ (c.os ()) - { - write_belongs_.node_traverser (write_type_name_emitter_); - - edge_traverser (set_raises_); - set_raises_.node_traverser (type_name_emitter_); - } - - virtual void - pre (SemanticGraph::ReadWriteAttribute&) - { - os << "virtual void" << endl; - } - - virtual void - name (SemanticGraph::ReadWriteAttribute& a) - { - os << a.name () << " (" << endl; - - Traversal::ReadWriteAttribute::belongs (a, write_belongs_); - - os << " " << a.name () << endl - << STRS[ENV_HDR] << ")" << 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] << endl - << STRS[EXCP_SYS] << "," << endl; - } - - virtual void - set_raises_post (SemanticGraph::ReadWriteAttribute&) - { - os << "))"; - } - - virtual void - post (SemanticGraph::ReadWriteAttribute&) - { - os << ";" << endl << endl; - } - - virtual void - comma (SemanticGraph::ReadWriteAttribute&) - { - os << "," << endl; - } - - private: - INArgTypeNameEmitter write_type_name_emitter_; - TypeNameEmitter type_name_emitter_; - Traversal::Belongs write_belongs_; - Traversal::SetRaises set_raises_; - }; - - // Generates operations associated with attributes. - struct AttributeEmitter : Traversal::ReadAttribute, - Traversal::ReadWriteAttribute, - EmitterBase - { - AttributeEmitter (Context& c) - : EmitterBase (c), - read_type_name_emitter_ (c.os ()), - type_name_emitter_ (c.os ()) - { - read_belongs_.node_traverser (read_type_name_emitter_); - - edge_traverser (get_raises_); - get_raises_.node_traverser (type_name_emitter_); - } - - // ReadWriteAttribute - // - virtual void - pre (SemanticGraph::ReadWriteAttribute& a) - { - os << "virtual "; - - Traversal::ReadWriteAttribute::belongs (a, read_belongs_); - - os << endl; - } - - virtual void - name (SemanticGraph::ReadWriteAttribute& a) - { - os << a.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl; - } - - virtual void - get_raises_none (SemanticGraph::ReadWriteAttribute&) - { - os << STRS[EXCP_SNGL]; - } - - virtual void - get_raises_pre (SemanticGraph::ReadWriteAttribute&) - { - os << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl; - } - - virtual void - get_raises_post (SemanticGraph::ReadWriteAttribute&) - { - os << "))"; - } - - virtual void - set_raises (SemanticGraph::ReadWriteAttribute&) - { - } - - virtual void - post (SemanticGraph::ReadWriteAttribute& a) - { - os << ";" << endl << endl; - - WriteAttributeEmitter write_attribute_emitter (ctx); - write_attribute_emitter.traverse (a); - } - - virtual void - comma (SemanticGraph::ReadWriteAttribute&) - { - os << "," << endl; - } - - // ReadAttribute - // - virtual void - pre (SemanticGraph::ReadAttribute& a) - { - os << "virtual "; - - Traversal::ReadAttribute::belongs (a, read_belongs_); - - os << endl; - } - - virtual void - name (SemanticGraph::ReadAttribute& a) - { - os << a.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl; - } - - virtual void - get_raises_none (SemanticGraph::ReadAttribute&) - { - os << STRS[EXCP_SNGL]; - } - - virtual void - get_raises_pre (SemanticGraph::ReadAttribute&) - { - os << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl; - } - - virtual void - get_raises_post (SemanticGraph::ReadAttribute&) - { - os << "))"; - } - - virtual void - set_raises (SemanticGraph::ReadAttribute&) - { - } - - virtual void - post (SemanticGraph::ReadAttribute&) - { - os << ";" << endl << endl; - } - - virtual void - comma (SemanticGraph::ReadAttribute&) - { - os << "," << endl; - } - - private: - ReturnTypeNameEmitter read_type_name_emitter_; - TypeNameEmitter type_name_emitter_; - Traversal::Belongs read_belongs_; - Traversal::GetRaises get_raises_; - }; - - struct InterfaceEmitter : Traversal::Interface, - EmitterBase - { - InterfaceEmitter (Context& c) - : EmitterBase (c) - {} - - bool - add (Interface& i) - { - return interfaces_.insert (&i).second; - } - - virtual void - traverse (Interface& i) - { - if (add (i)) - { - Traversal::Interface::traverse (i); - } - } - - private: - std::set<Interface*> interfaces_; - }; - - 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 ()); - - os << "template <typename T>" << endl - << "class " << i.name () << "_Servant_T" << endl - << ": public virtual POA_" << stripped << endl - << "{" - << "public:" << endl - << i.name () << "_Servant_T (" << endl - << i.scoped_name ().scope_name () << "::CCM_" << i.name () - << "_ptr executor," << endl - << "::Components::CCMContext_ptr ctx);" << endl - << "virtual ~" << i.name () << "_Servant_T (void);" << endl; - - { - InterfaceEmitter interface_emitter (ctx); - - Traversal::Defines defines_; - Traversal::Inherits inherits_; - interface_emitter.edge_traverser (defines_); - interface_emitter.edge_traverser (inherits_); - - // Works for both read/write and readonly attributes. - AttributeEmitter attribute_emitter (ctx); - defines_.node_traverser (attribute_emitter); - - OperationEmitter operation_emitter (ctx); - defines_.node_traverser (operation_emitter); - inherits_.node_traverser (interface_emitter); - - Traversal::Receives receives; - Traversal::Belongs returns; - Traversal::Raises raises; - operation_emitter.edge_traverser (receives); - operation_emitter.edge_traverser (returns); - operation_emitter.edge_traverser (raises); - - ParameterEmitter<Traversal::InParameter> in_param (os); - ParameterEmitter<Traversal::InOutParameter> inout_param (os); - ParameterEmitter<Traversal::OutParameter> out_param (os); - receives.node_traverser (in_param); - receives.node_traverser (inout_param); - receives.node_traverser (out_param); - - ReturnTypeNameEmitter return_type_emitter (os); - TypeNameEmitter type_name_emitter (os); - 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 (os); - INOUTArgTypeNameEmitter inout_arg_emitter (os); - OUTArgTypeNameEmitter out_arg_emitter (os); - 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[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl - << endl - << "protected:" << endl - << "// Facet executor." << endl - << i.scoped_name ().scope_name ()<< "::CCM_" << i.name () - << "_var executor_;" << endl - << "// Context object." << endl - << "::Components::CCMContext_var ctx_;" << endl - << "};"; - - os << "typedef " << i.name () << "_Servant_T<int> " - << i.name () << "_Servant;"; - - 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.os ()) - { - 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[ENV_HDR] << ")" << 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[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl; - } - - virtual void - traverse (SemanticGraph::MultiUser& u) - { - os << "virtual " << u.scoped_name () << "Connections *" << endl - << "get_connections_" << u.name () - << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << 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[ENV_HDR] << ")" << 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.os ()) - { - 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_AC] << "));" << endl << endl; - - os << "virtual "; - - Traversal::EmitterData::belongs (e, belongs_); - - os << "Consumer_ptr" << endl - << "disconnect_" << e.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NC] << "));" << endl << endl; - } - - virtual void - traverse (SemanticGraph::SingleUser& u) - { - os << "virtual void" << endl - << "connect_" << u.name () << " (" << endl; - - Traversal::SingleUserData::belongs (u, belongs_); - - os << "_ptr" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_AC] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - - os << "virtual "; - - Traversal::SingleUserData::belongs (u, belongs_); - - os << "_ptr" << endl - << "disconnect_" << u.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NC] << "));" << endl << 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ECL] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - - os << "virtual "; - - Traversal::MultiUserData::belongs (u, belongs_); - - os << "_ptr" << endl - << "disconnect_" << u.name () << " (" << endl - << "::Components::Cookie * ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IC] << "));" << endl << 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; - - os << "// CIAO-specific." << endl - << STRS[COMP_CK] << " *" << endl - << "subscribe_" << p.name () << "_generic (" << endl - << STRS[COMP_ECB] << "_ptr c" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; - - os << "virtual "; - - Traversal::PublisherData::belongs (p, belongs_); - - os << "Consumer_ptr" << endl - << "unsubscribe_" << p.name () << " (" << endl - << STRS[COMP_CK] << " *ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - } - - private: - TypeNameEmitter 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.os ()) - { - 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 << 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 << 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 << 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 << endl; - - os << "ACE_Active_Map_Manager<" << endl - << STRS[COMP_ECB] << "_var>" << endl - << "ciao_publishes_" << p.name () << "_generic_map_;" - << endl << endl; - } - - private: - TypeNameEmitter type_name_emitter_; - Traversal::Belongs belongs_; - }; - - public: - virtual void - pre (Type& t) - { - // CIAO has facet classes outside the context and servant classes. - // We launch it here to generate the classes at the top of the file, - // like the original hand-crafted examples, for easier checking. - // This can be moved later to ServantEmitter::pre() or out on its own. - { - Traversal::Component component_emitter; - - Traversal::Inherits component_inherits; - component_inherits.node_traverser (component_emitter); - - Traversal::Defines defines; - component_emitter.edge_traverser (defines); - component_emitter.edge_traverser (component_inherits); - - Traversal::Provider provider; - defines.node_traverser (provider); - - Traversal::Belongs belongs; - provider.edge_traverser (belongs); - - FacetEmitter facet_emitter (ctx); - belongs.node_traverser (facet_emitter); - - component_emitter.traverse (t); - } - - os << "class " << 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 << "/// Hack for VC6." << endl - << "typedef 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 - << " > ctx_svnt_base;" << endl; - - if (swapping) - { - os << "/// Another hack for VC6." << endl - << "typedef 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 - << " > ug_ctx_svnt_base;" << 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[ENV_HDR] << ")" << 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 - << STRS[ENV_HDR] << ");" << 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.os ()), - simple_type_name_emitter_ (c.os ()), - stripped_type_name_emitter_ (c.os ()) - { - 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 - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_AC] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - - os << "virtual "; - - Traversal::SingleUserData::belongs (u, belongs_); - - os << "_ptr" << endl - << "disconnect_" << u.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NC] << "));" << endl << endl; - - os << "virtual "; - - Traversal::SingleUserData::belongs (u, belongs_); - - os << "_ptr" << endl - << "get_connection_" << u.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ECL] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - - os << "virtual "; - - Traversal::MultiUserData::belongs (u, belongs_); - - os << "_ptr" << endl - << "disconnect_" << u.name () << " (" << endl - << "::Components::Cookie * ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - - os << "virtual " << u.scoped_name () << "Connections *" << endl - << "get_connections_" << u.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << 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 << endl; - - os << "virtual ~"; - - Traversal::ConsumerData::belongs (c, simple_belongs_); - - os << "Consumer_" - << c.name () << "_Servant (void);" << endl << endl; - - // @@@ (JP) May need to generate this for the eventtype's ancestors - // as well (the spec is vague on this point). If so, we need the - // CIDL compiler to support valuetype/eventtype inheritance. - os << "virtual void" << endl - << "push_"; - - Traversal::ConsumerData::belongs (c, simple_belongs_); - - os << " (" << endl; - - Traversal::ConsumerData::belongs (c, belongs_); - - os << " *evt" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - - os << "// Inherited from " << STRS[COMP_ECB] << "." << endl - << "virtual void" << endl - << "push_event (::Components::EventBase *ev" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_BET] << "));" << endl << endl; - - os << "// CIAO-specific in " << STRS[COMP_ECB] << "." << endl - << "virtual CORBA::Boolean" << endl - << "ciao_is_substitutable (" << endl - << "const char *event_repo_id" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - - os << "// Get component implementation." << endl - << "virtual CORBA::Object_ptr" << endl - << "_get_component (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - - os << "protected:" << endl - << c.scoped_name ().scope_name ().scope_name () << "::CCM_" - << c.scoped_name ().scope_name ().simple_name () - << "_var" << endl - << "executor_;" << endl << endl; - - os << c.scoped_name ().scope_name ().scope_name () << "::CCM_" - << c.scoped_name ().scope_name ().simple_name () - << "_Context_var" << endl - << "ctx_;" << endl << endl; - - os << "};"; - - os << "virtual "; - - Traversal::ConsumerData::belongs (c, belongs_); - - os << "Consumer_ptr" << endl - << "get_consumer_" << c.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_AC] << "));" << endl << endl; - - os << "virtual "; - - Traversal::EmitterData::belongs (e, belongs_); - - os << "Consumer_ptr" << endl - << "disconnect_" << e.name () << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_NC] << "));" << endl << 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; - - os << "// CIAO-specific." << endl - << STRS[COMP_CK] << " *" << endl - << "subscribe_" << p.name () << "_generic (" << endl - << STRS[COMP_ECB] << "_ptr c" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; - - os << "virtual "; - - Traversal::PublisherData::belongs (p, belongs_); - - os << "Consumer_ptr" << endl - << "unsubscribe_" << p.name () << " (" << endl - << STRS[COMP_CK] << " *ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - } - - private: - TypeNameEmitter 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.os ()) - { - belongs_.node_traverser (type_name_emitter_); - } - - virtual void - traverse (SemanticGraph::Provider& p) - { - Traversal::ProviderData::belongs (p, belongs_); - - os << "_var" << endl - << "provide_" << p.name () << "_;" << endl << endl; - } - - virtual void - traverse (SemanticGraph::Consumer& c) - { - Traversal::ConsumerData::belongs (c, belongs_); - - os << "Consumer_var" << endl - << "consumes_" << c.name () << "_;" << endl << endl; - } - - private: - TypeNameEmitter 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.os ()), - simple_type_name_emitter_ (c.os ()), - stripped_type_name_emitter_ (c.os ()) - { - 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 - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << 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 - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << endl; - } - - virtual void - traverse (SemanticGraph::Emitter&) - { - } - - virtual void - traverse (SemanticGraph::Publisher&) - { - } - - private: - TypeNameEmitter 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.scoped_name ().scope_name () << "::CCM_" - << t.name () << "_var," << endl - << " " << t.name () << "_Context" << endl - << " >" << endl - << "{" - << "public:" << endl; - - os << "/// Hack for VC6." << endl - << "typedef CIAO::Servant_Impl<" << endl - << " POA_" << stripped << "," << endl - << " " << t.scoped_name ().scope_name () << "::CCM_" - << t.name () << "," << endl - << " " << t.scoped_name ().scope_name () << "::CCM_" - << t.name () << "_var," << endl - << " " << t.name () << "_Context" << endl - << " > comp_svnt_base;" << endl << 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 << endl; - - os << "virtual ~" << t.name () << "_Servant (void);" - << endl << endl; - - os << "virtual void" << endl - << "set_attributes (" << endl - << "const ::Components::ConfigValues &descr" << endl - << STRS[ENV_SRC] << ");" << 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. - AttributeEmitter attribute_emitter (ctx); - defines.node_traverser (attribute_emitter); - - OperationEmitter operation_emitter (ctx); - defines.node_traverser (operation_emitter); - interface_inherits.node_traverser (interface_emitter); - - Traversal::Receives receives; - Traversal::Belongs returns; - Traversal::Raises raises; - operation_emitter.edge_traverser (receives); - operation_emitter.edge_traverser (returns); - operation_emitter.edge_traverser (raises); - - ParameterEmitter<Traversal::InParameter> in_param (os); - ParameterEmitter<Traversal::InOutParameter> inout_param (os); - ParameterEmitter<Traversal::OutParameter> out_param (os); - receives.node_traverser (in_param); - receives.node_traverser (inout_param); - receives.node_traverser (out_param); - - ReturnTypeNameEmitter return_type_emitter (os); - TypeNameEmitter type_name_emitter (os); - 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 (os); - INOUTArgTypeNameEmitter inout_arg_emitter (os); - OUTArgTypeNameEmitter out_arg_emitter (os); - 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. - AttributeEmitter 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_IC] << "," << endl - << STRS[EXCP_AC] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; - - os << "virtual CORBA::Object_ptr" << endl - << "disconnect (" << endl - << "const char *name," << endl - << STRS[COMP_CK] << " *ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_IC] << "," << endl - << STRS[EXCP_CR] << "," << endl - << STRS[EXCP_NC] << "));" << endl << 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[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_IC] << "," << endl - << STRS[EXCP_ECL] << "));" << endl << endl; - - os << "virtual " << STRS[COMP_ECB] << "_ptr" << endl - << "unsubscribe (" << endl - << "const char *publisher_name," << endl - << STRS[COMP_CK] << " *ck" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - - os << "virtual void" << endl - << "connect_consumer (" << endl - << "const char *emitter_name," << endl - << STRS[COMP_ECB] << "_ptr consumer" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl - << STRS[EXCP_IN] << "," << endl - << STRS[EXCP_AC] << "," << endl - << STRS[EXCP_IC] << "));" << endl << endl; - - os << "// CIAO specific operations on the servant " << endl - << "CORBA::Object_ptr" << endl - << "get_facet_executor (" << endl - << "const char *name" << endl - << STRS[ENV_HDR] << ")" << endl - << STRS[EXCP_START] << endl - << STRS[EXCP_SYS]<< "));" << endl << 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 << endl; - - os << "private:" << endl << endl - << "void" << endl - << "populate_port_tables (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl - << STRS[EXCP_SNGL] << ";" << endl << 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.os ()), - simple_type_name_emitter_ (c.os ()), - enclosing_type_name_emitter_ (c.os ()) - { - manages_.node_traverser (type_name_emitter_); - simple_manages_.node_traverser (simple_type_name_emitter_); - enclosing_manages_.node_traverser (enclosing_type_name_emitter_); - } - - // Nested classes used by this emitter. - private: - // HomeFactory and HomeFinder are tied to Operation in - // the front end. Since we want to treat them differently - // than regular operations in a home (we want to generate - // base class factory operations returning the base component, - // for example), we use this class for regular home operations - // that overrides HomeFactory and HomeFinder traversals - // to do nothing. - struct HomeOperationEmitter : OperationEmitter, - Traversal::HomeFactory, - Traversal::HomeFinder - { - HomeOperationEmitter (Context& c) - : OperationEmitter (c) - {} - - virtual void - traverse (SemanticGraph::HomeFactory&) - { - } - - virtual void - traverse (SemanticGraph::HomeFinder&) - { - } - }; - - struct FactoryOperationEmitter : Traversal::HomeFactory, - EmitterBase - { - FactoryOperationEmitter (Context& c) - : EmitterBase (c) - {} - - virtual void - pre (SemanticGraph::HomeFactory&) - { - os << "virtual "; - } - - virtual void - returns (SemanticGraph::HomeFactory& t) - { - ReturnTypeNameEmitter returns_emitter (os); - Traversal::Returns returns_; - returns_.node_traverser (returns_emitter); - - Traversal::HomeFactory::returns (t, returns_); - - os << endl; - } - - virtual void - name (SemanticGraph::HomeFactory& t) - { - os << t.name (); - } - - virtual void - receives_none (SemanticGraph::HomeFactory&) - { - os << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl; - } - - virtual void - receives_pre (SemanticGraph::HomeFactory&) - { - os << " (" << endl; - } - - virtual void - receives_post (SemanticGraph::HomeFactory&) - { - os << endl << STRS[ENV_HDR] << ")" << endl; - } - - virtual void - raises_none (SemanticGraph::HomeFactory&) - { - os << STRS[EXCP_SNGL]; - } - - virtual void - raises_pre (SemanticGraph::HomeFactory&) - { - os << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl; - } - - virtual void - raises_post (SemanticGraph::HomeFactory&) - { - os << "))"; - } - - virtual void - post (SemanticGraph::HomeFactory&) - { - os << ";" << endl << endl; - } - - virtual void - comma (SemanticGraph::HomeFactory&) - { - os << "," << endl; - } - }; - - struct FinderOperationEmitter : Traversal::HomeFinder, - EmitterBase - { - FinderOperationEmitter (Context& c) - : EmitterBase (c), - returns_emitter_ (c.os ()) - { - returns_.node_traverser (returns_emitter_); - } - - virtual void - pre (SemanticGraph::HomeFinder&) - { - os << "virtual "; - } - - virtual void - returns (SemanticGraph::HomeFinder& t) - { - Traversal::HomeFinder::returns (t, returns_); - - os << endl; - } - - virtual void - name (SemanticGraph::HomeFinder& t) - { - os << t.name (); - } - - virtual void - receives_none (SemanticGraph::HomeFinder&) - { - os << " (" << endl - << STRS[ENV_SNGL_HDR] << ")" << endl; - } - - virtual void - receives_pre (SemanticGraph::HomeFinder&) - { - os << " (" << endl; - } - - virtual void - receives_post (SemanticGraph::HomeFinder&) - { - os << endl << STRS[ENV_HDR] << ")" << endl; - } - - virtual void - raises_none (SemanticGraph::HomeFinder&) - { - os << STRS[EXCP_SNGL]; - } - - virtual void - raises_pre (SemanticGraph::HomeFinder&) - { - os << STRS[EXCP_START] << endl - << STRS[EXCP_SYS] << "," << endl; - } - - virtual void - raises_post (SemanticGraph::HomeFinder&) - { - os << "))"; - } - - virtual void - post (SemanticGraph::HomeFinder&) - { - os << ";" << endl << endl; - } - - virtual void - comma (SemanticGraph::HomeFinder&) - { - os << "," << endl; - } - - private: - ReturnTypeNameEmitter returns_emitter_; - Traversal::Returns returns_; - }; - - public: - virtual void pre (Type& t) - { - os << "class " << ctx.export_macro () << " " << t.name () - << "_Servant" << endl - << " : public virtual 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 - << " " << t.scoped_name ().scope_name () << "::CCM_" - << t.name () << "_var," << endl - << " "; - - Traversal::Home::manages (t, manages_); - - os << "," << endl - << " "; - - Traversal::Home::manages (t, manages_); - - os << "_var," << endl - << " "; - - Traversal::Home::manages (t, enclosing_manages_); - - os << "::CCM_"; - - Traversal::Home::manages (t, simple_manages_); - - os << "," << endl - << " "; - - Traversal::Home::manages (t, enclosing_manages_); - - os << "::CCM_"; - - Traversal::Home::manages (t, simple_manages_); - - os << "_var," << endl - << " "; - - Traversal::Home::manages (t, simple_manages_); - - os << "_Servant" << endl - << " >" << endl - << "{" - << "public:" << endl - << "/// Hack for VC6." << endl - << "typedef CIAO::" - << (swapping ? "Swapping_" : "") << "Home_Servant_Impl<" << endl - << " POA_" << stripped << "," << endl - << " " << t.scoped_name ().scope_name () << "::CCM_" - << t.name () << "," << endl - << " " << t.scoped_name ().scope_name () << "::CCM_" - << t.name () << "_var," << endl - << " "; - - Traversal::Home::manages (t, manages_); - - os << "," << endl - << " "; - - Traversal::Home::manages (t, manages_); - - os << "_var," << endl - << " "; - - Traversal::Home::manages (t, enclosing_manages_); - - os << "::CCM_"; - - Traversal::Home::manages (t, simple_manages_); - - os << "," << endl - << " "; - - Traversal::Home::manages (t, enclosing_manages_); - - os << "::CCM_"; - - Traversal::Home::manages (t, simple_manages_); - - os << "_var," << endl - << " "; - - Traversal::Home::manages (t, simple_manages_); - - os << "_Servant" << endl - << " > home_svnt_base;" << 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 << endl; - - os << "virtual ~" << t.name () << "_Servant (void);" - << endl << endl; - - // Generate home operations. - os << "// Home operations." << endl << endl; - - { - Traversal::Home home_emitter; - - Traversal::Inherits home_inherits; - home_inherits.node_traverser (home_emitter); - - Traversal::Defines defines; - home_emitter.edge_traverser (defines); - home_emitter.edge_traverser (home_inherits); - - HomeOperationEmitter home_operation_emitter (ctx); - defines.node_traverser (home_operation_emitter); - - Traversal::Receives receives; - Traversal::Belongs returns; - Traversal::Raises raises; - home_operation_emitter.edge_traverser (receives); - home_operation_emitter.edge_traverser (returns); - home_operation_emitter.edge_traverser (raises); - - ParameterEmitter<Traversal::InParameter> in_param (os); - ParameterEmitter<Traversal::InOutParameter> inout_param (os); - ParameterEmitter<Traversal::OutParameter> out_param (os); - receives.node_traverser (in_param); - receives.node_traverser (inout_param); - receives.node_traverser (out_param); - - ReturnTypeNameEmitter return_type_emitter (os); - TypeNameEmitter type_name_emitter (os); - 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 (os); - INOUTArgTypeNameEmitter inout_arg_emitter (os); - OUTArgTypeNameEmitter out_arg_emitter (os); - in_belongs.node_traverser (in_arg_emitter); - inout_belongs.node_traverser (inout_arg_emitter); - out_belongs.node_traverser (out_arg_emitter); - - home_emitter.traverse (t); - } - - // Generate home factory operations. This is a separate traversal - // stack because we want to generate the factory operations - // of ancestors with the return type of the base component. - os << "// Home factory and finder operations." << endl << endl; - - { - Traversal::Home home_emitter; - - Traversal::Inherits inherits; - home_emitter.edge_traverser (inherits); - inherits.node_traverser (home_emitter); - - Traversal::Defines defines; - home_emitter.edge_traverser (defines); - - FactoryOperationEmitter factory_operation_emitter (ctx); - FinderOperationEmitter finder_operation_emitter (ctx); - defines.node_traverser (factory_operation_emitter); - defines.node_traverser (finder_operation_emitter); - - Traversal::Receives receives; - Traversal::Belongs returns; - Traversal::Raises raises; - factory_operation_emitter.edge_traverser (receives); - factory_operation_emitter.edge_traverser (returns); - factory_operation_emitter.edge_traverser (raises); - finder_operation_emitter.edge_traverser (receives); - finder_operation_emitter.edge_traverser (returns); - finder_operation_emitter.edge_traverser (raises); - - ParameterEmitter<Traversal::InParameter> in_param (os); - ParameterEmitter<Traversal::InOutParameter> inout_param (os); - ParameterEmitter<Traversal::OutParameter> out_param (os); - receives.node_traverser (in_param); - receives.node_traverser (inout_param); - receives.node_traverser (out_param); - - ReturnTypeNameEmitter return_type_emitter (os); - TypeNameEmitter type_name_emitter (os); - 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 (os); - INOUTArgTypeNameEmitter inout_arg_emitter (os); - OUTArgTypeNameEmitter out_arg_emitter (os); - 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. - AttributeEmitter 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. - AttributeEmitter attribute_emitter (ctx); - defines.node_traverser (attribute_emitter); - - OperationEmitter operation_emitter (ctx); - defines.node_traverser (operation_emitter); - inherits.node_traverser (interface_emitter); - - Traversal::Receives receives; - Traversal::Belongs returns; - Traversal::Raises raises; - operation_emitter.edge_traverser (receives); - operation_emitter.edge_traverser (returns); - operation_emitter.edge_traverser (raises); - - ParameterEmitter<Traversal::InParameter> in_param (os); - ParameterEmitter<Traversal::InOutParameter> inout_param (os); - ParameterEmitter<Traversal::OutParameter> out_param (os); - receives.node_traverser (in_param); - receives.node_traverser (inout_param); - receives.node_traverser (out_param); - - ReturnTypeNameEmitter return_type_emitter (os); - TypeNameEmitter type_name_emitter (os); - 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 (os); - INOUTArgTypeNameEmitter inout_arg_emitter (os); - OUTArgTypeNameEmitter out_arg_emitter (os); - 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 << "};"; - - os << "extern \"C\" " << ctx.export_macro () - << " ::PortableServer::Servant" << endl - << "create" - << regex::perl_s (t.scoped_name ().str (), "/::/_/") - << "_Servant (" << endl - << "::Components::HomeExecutorBase_ptr p," << endl - << "CIAO::Session_Container *c," << endl - << "const char *ins_name" << endl - << STRS[ENV_HDR] << ");" << endl; - } - - private: - CommandLine const& cl_; - TypeNameEmitter 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 CompositionEmitter : Traversal::Composition, EmitterBase - { - CompositionEmitter (Context& c) - : EmitterBase (c) - { - } - - virtual void - pre (Type& t) - { - os << STRS[CIDL_NS] << t.name () << "{"; - } - - virtual void - post (Type&) - { - os << "}"; - } - }; - - 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::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 - << "#include \"ace/Active_Map_Manager_T.h\"" << endl << endl; -} - -void -ServantHeaderEmitter::generate (TranslationUnit& u) -{ - pre (u); - - Context c (os, export_macro_); - - Traversal::TranslationUnit unit; - - // Layer 1 - // - Traversal::ContainsPrincipal contains_principal; - unit.edge_traverser (contains_principal); - - //-- - Traversal::TranslationRegion principal_region; - contains_principal.node_traverser (principal_region); - - // Layer 2 - // - Traversal::TranslationRegion included_region; - - // Inclusion handling is somewhat tricky because we want - // to print only top-level #includes. - - Traversal::ContainsRoot contains_root; - Traversal::QuoteIncludes quote_includes; - Traversal::BracketIncludes bracket_includes; - IncludesEmitter includes_emitter (c); - - principal_region.edge_traverser (includes_emitter); - principal_region.edge_traverser (quote_includes); - principal_region.edge_traverser (bracket_includes); - principal_region.edge_traverser (contains_root); - - included_region.edge_traverser (quote_includes); - included_region.edge_traverser (bracket_includes); -// included_region.edge_traverser (contains_root); - - //-- - Traversal::Root root; - - contains_root.node_traverser (root); - quote_includes.node_traverser (included_region); - bracket_includes.node_traverser (included_region); - - // Layer 3 - // - Traversal::Defines defines; - 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::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; -} |