diff options
Diffstat (limited to 'modules/CIAO/tools/Config_Handlers/CPD_Handler.cpp')
-rw-r--r-- | modules/CIAO/tools/Config_Handlers/CPD_Handler.cpp | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/modules/CIAO/tools/Config_Handlers/CPD_Handler.cpp b/modules/CIAO/tools/Config_Handlers/CPD_Handler.cpp new file mode 100644 index 00000000000..0b7b54d1adf --- /dev/null +++ b/modules/CIAO/tools/Config_Handlers/CPD_Handler.cpp @@ -0,0 +1,150 @@ +// $Id$ + +#include "CPD_Handler.h" +#include "Basic_Deployment_Data.hpp" +#include "ciao/Deployment_DataC.h" +#include "ciao/CIAO_common.h" + +namespace CIAO +{ + namespace Config_Handlers + { + void + CPD_Handler::handle_component_port_description ( + const ComponentPortDescription& desc, + Deployment::ComponentPortDescription& toconfig) + { + CIAO_TRACE("CPD_Handler::component_port_description"); + toconfig.name = + desc.name ().c_str (); + + if (desc.specificType_p ()) + toconfig.specificType = + desc.specificType ().c_str (); + + toconfig.supportedType.length (desc.count_supportedType ()); + std::for_each (desc.begin_supportedType (), + desc.end_supportedType (), + String_Seq_Functor (toconfig.supportedType)); + + + switch (desc.kind ().integral ()) + { + case CCMComponentPortKind::Facet_l: + toconfig.kind = Deployment::Facet; + break; + + case CCMComponentPortKind::SimplexReceptacle_l: + toconfig.kind = Deployment::SimplexReceptacle; + break; + + case CCMComponentPortKind::MultiplexReceptacle_l: + toconfig.kind = Deployment::MultiplexReceptacle; + break; + + case CCMComponentPortKind::EventEmitter_l: + toconfig.kind = Deployment::EventEmitter; + break; + + case CCMComponentPortKind::EventPublisher_l: + toconfig.kind = Deployment::EventPublisher; + break; + + case CCMComponentPortKind::EventConsumer_l: + toconfig.kind = Deployment::EventConsumer; + break; + + default: + ACE_ERROR ((LM_ERROR, "Invalid port type in connection %s\n", + desc.name ().c_str ())); + throw 1; + } + + /* @@BUG: We need to consider how to handle booleans. */ + toconfig.provider = desc.provider (); + toconfig.exclusiveProvider = desc.exclusiveProvider (); + toconfig.exclusiveUser = desc.exclusiveUser (); + toconfig.optional = desc.optional (); + } + + ComponentPortDescription + CPD_Handler::component_port_description ( + const Deployment::ComponentPortDescription& src) + { + CIAO_TRACE("CPD_Handler::component_port_description - reverse"); + ::XMLSchema::string< char > name ((src.name)); + ::XMLSchema::string< char > stype ((src.specificType)); + + ::XMLSchema::string< char > tval ("true"); + ::XMLSchema::string< char > fval ("false"); + XMLSchema::boolean provider; + XMLSchema::boolean exclusiveProvider; + XMLSchema::boolean exclusiveUser; + XMLSchema::boolean optional; + + if (src.provider) + provider = true; + else + provider = false; + + if (src.exclusiveUser) + exclusiveUser = true; + else + provider = false; + + if (src.exclusiveProvider) + exclusiveProvider = true; + else + provider = false; + + if (src.optional) + optional = true; + else + provider = false; + + ComponentPortDescription cpd (name, + provider, + exclusiveProvider, + exclusiveUser, + optional, + CCMComponentPortKind::Facet); + + switch (src.kind) + { + case ::Deployment::Facet: + cpd.kind (CCMComponentPortKind::Facet); + break; + + case ::Deployment::SimplexReceptacle: + cpd.kind (CCMComponentPortKind::SimplexReceptacle); + break; + + case ::Deployment::MultiplexReceptacle: + cpd.kind (CCMComponentPortKind::MultiplexReceptacle); + break; + + case ::Deployment::EventEmitter: + cpd.kind (CCMComponentPortKind::EventEmitter); + break; + + case ::Deployment::EventPublisher: + cpd.kind (CCMComponentPortKind::EventPublisher); + break; + + case ::Deployment::EventConsumer: + cpd.kind (CCMComponentPortKind::EventConsumer); + break; + + default: + ACE_ERROR ((LM_ERROR, "Invalid port kind in connection %s\n", + name.c_str ())); + } + + for (CORBA::ULong i = 0; i < src.supportedType.length (); ++i) + cpd.add_supportedType (XMLSchema::string< char > ((src.supportedType[i]))); + + return cpd; + } + + } +} |