diff options
author | William R. Otte <wotte@dre.vanderbilt.edu> | 2006-07-24 15:50:30 +0000 |
---|---|---|
committer | William R. Otte <wotte@dre.vanderbilt.edu> | 2006-07-24 15:50:30 +0000 |
commit | c44379cc7d9c7aa113989237ab0f56db12aa5219 (patch) | |
tree | 66a84b20d47f2269d8bdc6e0323f338763424d3a /ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp | |
parent | 3aff90f4a822fcf5d902bbfbcc9fa931d6191a8c (diff) | |
download | ATCD-c44379cc7d9c7aa113989237ab0f56db12aa5219.tar.gz |
Repo restructuring
Diffstat (limited to 'ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp')
-rw-r--r-- | ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp | 771 |
1 files changed, 771 insertions, 0 deletions
diff --git a/ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp b/ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp new file mode 100644 index 00000000000..f9105555580 --- /dev/null +++ b/ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp @@ -0,0 +1,771 @@ +// $Id$ + +#include "Svcconf_Handler.h" +#include "ace/ACE.h" +#include "ace/Log_Msg.h" +#include "ace/Service_Config.h" +#include "ace/Service_Types.h" +#include "ace/Service_Repository.h" +#include "ace/DLL.h" +#include "ace/ARGV.h" +#include "ace/Module.h" +#include "ace/OS_NS_strings.h" +#include "ace/SString.h" + +#if (ACE_USES_CLASSIC_SVC_CONF == 0) + +#if !defined (__ACEXML_INLINE__) +# include "Svcconf_Handler.i" +#endif /* __ACEXML_INLINE__ */ + +ACEXML_Svcconf_Handler::ACEXML_Svcconf_Handler (void) + : in_stream_def_ (0), + in_module_ (0), + stream_svc_type_ (0), + stream_ (0) +{ + // no-op +} + +ACEXML_Svcconf_Handler::~ACEXML_Svcconf_Handler (void) +{ + // no-op +} + +void +ACEXML_Svcconf_Handler::characters (const ACEXML_Char *, + int, + int ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // no-op +} + +void +ACEXML_Svcconf_Handler::endDocument ( ACEXML_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // no-op +} + +void +ACEXML_Svcconf_Handler::endElement (const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + if (ACE_OS::strcmp (qName, ACE_TEXT ("dynamic")) == 0) + { + ACE_Parsed_Info *active_info = (this->in_stream_def_ == 0 ? + &this->parsed_info_ : + &this->stream_info_); + + ACE_DLL svc_dll; + + if (svc_dll.open (active_info->path ()) == -1) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Cannot locate DLL: '")); + msg += ACE_CString (ACE_TEXT (active_info->path ())); + msg += ACE_CString (ACE_TEXT ("' for entity '")); + msg += ACE_CString (ACE_TEXT (active_info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + + void *(*func) (ACE_Service_Object_Exterminator *) = 0; + ACE_Service_Object_Exterminator gobbler = 0; + void *symbol = 0; + + long temp_ptr = + reinterpret_cast<long> (svc_dll.symbol (active_info->init_func ())); + func = reinterpret_cast<void *(*)(ACE_Service_Object_Exterminator *)> (temp_ptr); + + if (func == 0) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Cannot locate init function: '")); + msg += ACE_CString (ACE_TEXT (active_info->init_func ())); + msg += ACE_CString (ACE_TEXT ("' for entity '")); + msg += ACE_CString (ACE_TEXT (active_info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + symbol = (*func)(&gobbler); // target object created in the loaded DLL. + + ACE_Service_Type_Impl *stp = ACE_Service_Config::create_service_type_impl + (active_info->name (), + active_info->service_type (), + symbol, + ACE_Service_Type::DELETE_THIS | + ACE_Service_Type::DELETE_OBJ, + gobbler); + + if (this->in_stream_def_) + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Create dynamic %s for stream\n"), +// this->stream_info_.name ())); + if (active_info->service_type () == ACE_Service_Type::STREAM) + { + this->stream_ = (ACE_Stream_Type *) stp; + } + else + { + // build the error message + ACE_CString msg (ACE_TEXT ("Expecting Stream type in stream header")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (active_info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + + this->stream_svc_type_ = + ACE_Service_Config::create_service_type (this->stream_info_.name (), + this->stream_, + svc_dll, + this->stream_info_.active ()); + + } + else + { + if (this->in_module_) + { + ACE_ARGV args (active_info->init_params ()); + + ACE_Module_Type *mt = (ACE_Module_Type *) stp; + + ACE_Module<ACE_SYNCH> *mp = (ACE_Module<ACE_SYNCH> *) mt->object (); + + if (ACE_OS::strcmp (mp->name (), active_info->name ()) != 0) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("warning: assigning Module_Type name %s to Module %s since names differ\n"), + active_info->name (), + mp->name ())); + mp->name (active_info->name ()); + } + + if (mt->init (args.argc (), args.argv ()) == -1 + || this->stream_->push (mt) == -1) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Error initializing module")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (active_info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + + +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Push dynamic %s into stream %s\n"), +// this->parsed_info_.name (), +// this->stream_info_.name ())); + } + else + { + ACE_Service_Type *stype = + ACE_Service_Config::create_service_type (active_info->name (), + stp, + svc_dll, + active_info->active ()); + // @@ Check error here. + + // ACE_DEBUG ((LM_INFO, ACE_TEXT ("Apply dynamic %s\n"), +// this->parsed_info_.name ())); + if (ACE_Service_Config::initialize (stype, + active_info->init_params ()) == -1) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Failed to initialize dynamic service")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (active_info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + } + this->parsed_info_.reset (); + } + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("static")) == 0) + { + if (this->in_stream_def_) + { + // @@ Couldn't make sense out of the original Svc_Conf.y. + ACE_DEBUG ((LM_ERROR, ACE_TEXT ("Create static %s for stream\n"), + this->stream_info_.name ())); + } + else + { + if (this->in_module_) + { + // @@ Couldn't make sense out of the original Svc_Conf.y. + ACE_DEBUG ((LM_ERROR, ACE_TEXT ("Push static %s into stream %s\n"), + this->parsed_info_.name (), + this->stream_info_.name ())); + } + else + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Apply static %s\n"), +// this->parsed_info_.name ())); + if (ACE_Service_Config::initialize (this->parsed_info_.name (), + this->parsed_info_.init_params ()) == -1) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Failed to initialize static service")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (this->parsed_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + } + this->parsed_info_.reset (); + } + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("module")) == 0) + { + this->in_module_ = 0; + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("streamdef")) == 0) + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Apply stream %s of type %s\n"), +// this->stream_info_.name (), +// this->stream_info_.name ())); + ACE_Service_Config::initialize (this->stream_svc_type_, + this->stream_info_.init_params ()); + + this->stream_info_.reset (); + this->stream_svc_type_ = 0; + this->stream_ = 0; + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("stream")) == 0) + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Apply stream %s of type %s\n"), +// this->stream_info_.name (), +// this->stream_info_.name ())); + this->stream_info_.reset (); + } + else + { + } +} + +void +ACEXML_Svcconf_Handler::endPrefixMapping (const ACEXML_Char * ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // no-op +} + +void +ACEXML_Svcconf_Handler::ignorableWhitespace (const ACEXML_Char *, + int, + int ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // no-op +} + +void +ACEXML_Svcconf_Handler::processingInstruction (const ACEXML_Char *, + const ACEXML_Char * ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // no-op +} + +void +ACEXML_Svcconf_Handler::setDocumentLocator (ACEXML_Locator* locator) +{ + this->locator_ = locator; +} + +void +ACEXML_Svcconf_Handler::skippedEntity (const ACEXML_Char * ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // no-op +} + +void +ACEXML_Svcconf_Handler::startDocument ( ACEXML_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // no-op +} + +void +ACEXML_Svcconf_Handler::startElement (const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char *qName, + ACEXML_Attributes *alist ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + if (ACE_OS::strcmp (qName, ACE_TEXT ("dynamic")) == 0) + { + this->get_dynamic_attrs (alist ACEXML_ENV_ARG_PARAMETER); + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("initializer")) == 0) + { + this->get_initializer_attrs (alist ACEXML_ENV_ARG_PARAMETER); + + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("static")) == 0) + { + this->get_static_attrs (alist ACEXML_ENV_ARG_PARAMETER); + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("stream")) == 0) + { + this->get_stream_id (alist ACEXML_ENV_ARG_PARAMETER); + + if (ACE_Service_Repository::instance()->find + (this->stream_info_.name (), + (const ACE_Service_Type **) &this->stream_svc_type_) == -1) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Cannot find stream '")); + msg += ACE_CString (ACE_TEXT (this->stream_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + this->stream_ = this->stream_svc_type_ == 0 + ? 0 + : dynamic_cast<ACE_Stream_Type *> (const_cast<ACE_Service_Type_Impl *> (this->stream_svc_type_->type ())); + +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Retrieve stream %s from repository\n"), +// this->stream_info_.name ())); + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("streamdef")) == 0) + { + this->in_stream_def_ = 1; + // @@ Set up stream service object + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("module")) == 0) + { + this->in_stream_def_ = 0; + this->in_module_ = 1; + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("resume")) == 0) + { + this->get_id (alist ACEXML_ENV_ARG_PARAMETER); + if (this->in_module_) + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Resume %s in stream %s\n"), +// this->parsed_info_.name (), +// this->stream_info_.name ())); + ACE_Module_Type *mt = (this->stream_ == 0) + ? 0 + : this->stream_->find (this->parsed_info_.name ()); + + if (mt == 0) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Can't locate module '")); + msg += ACE_CString (ACE_TEXT (this->parsed_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + + mt->resume (); + } + else + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Resume %s\n"), +// this->parsed_info_.name ())); + if (ACE_Service_Config::resume (this->parsed_info_.name ()) == -1) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Resume failed")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (this->parsed_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + } + this->parsed_info_.reset (); + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("suspend")) == 0) + { + this->get_id (alist ACEXML_ENV_ARG_PARAMETER); + if (this->in_module_) + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Suspend %s in stream %s\n"), +// this->parsed_info_.name (), +// this->stream_info_.name ())); + ACE_Module_Type *mt = (this->stream_ == 0) + ? 0 + : this->stream_->find (this->parsed_info_.name ()); + + if (mt == 0) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Can't locate module '")); + msg += ACE_CString (ACE_TEXT (this->parsed_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + + mt->suspend (); + } + else + { + // ACE_DEBUG ((LM_INFO, ACE_TEXT ("Suspend %s\n"), + // this->parsed_info_.name ())); + if (ACE_Service_Config::suspend (this->parsed_info_.name ()) == -1) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Suspend failed")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (this->parsed_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + } + this->parsed_info_.reset (); + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("remove")) == 0) + { + this->get_id (alist ACEXML_ENV_ARG_PARAMETER); + if (this->in_module_) + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Remove %s in stream %s\n"), +// this->parsed_info_.name (), +// this->stream_info_.name ())); + ACE_Module_Type *mt = (this->stream_ == 0) + ? 0 + : this->stream_->find (this->parsed_info_.name ()); + + if (mt == 0) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Can't locate module '")); + msg += ACE_CString (ACE_TEXT (this->parsed_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + + this->stream_->remove (mt); + } + else + { +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("Remove %s\n"), +// this->parsed_info_.name ())); + if (ACE_Service_Config::remove (this->parsed_info_.name ()) == -1) + { + // build the error message + ACE_CString msg (ACE_TEXT ("Remove failed")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (this->parsed_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW (ACEXML_SAXException (msg.c_str ())); + } + } + this->parsed_info_.reset (); + } + else if (ACE_OS::strcmp (qName, ACE_TEXT ("ACE_Svc_Conf")) == 0) + { + // Main document tag. no-op. +// ACE_DEBUG ((LM_INFO, ACE_TEXT ("ACE_Svc_Conf tag\n"))); + } + else + { + // @@ Error. Perhaps we should relay to user event handler here, if available. + } + + return; +} + +void +ACEXML_Svcconf_Handler::startPrefixMapping (const ACEXML_Char *, + const ACEXML_Char * ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // No-op. +} + +// *** Methods inherit from ACEXML_DTDHandler. + +void +ACEXML_Svcconf_Handler::notationDecl (const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char * ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // No-op. +} + +void +ACEXML_Svcconf_Handler::unparsedEntityDecl (const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char * ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // No-op. +} + +// Methods inherit from ACEXML_EnitityResolver. + +ACEXML_InputSource * +ACEXML_Svcconf_Handler::resolveEntity (const ACEXML_Char *, + const ACEXML_Char * ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + // No-op. + return 0; +} + +// Methods inherit from ACEXML_ErrorHandler. + + /* + * Receive notification of a recoverable error. + */ +void +ACEXML_Svcconf_Handler::error (ACEXML_SAXParseException& ex ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + ACE_DEBUG ((LM_DEBUG, "%s: line :%d col: %d ", this->locator_->getSystemId(), + this->locator_->getLineNumber(), + this->locator_->getColumnNumber())); + ex.print(); +} + +void +ACEXML_Svcconf_Handler::fatalError (ACEXML_SAXParseException& ex ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + ACE_DEBUG ((LM_DEBUG, "%s: line :%d col: %d ", this->locator_->getSystemId(), + this->locator_->getLineNumber(), + this->locator_->getColumnNumber())); + ex.print(); +} + +void +ACEXML_Svcconf_Handler::warning (ACEXML_SAXParseException& ex ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + ACE_DEBUG ((LM_DEBUG, "%s: line :%d col: %d ", this->locator_->getSystemId(), + this->locator_->getLineNumber(), + this->locator_->getColumnNumber())); + ex.print(); +} + +int +ACEXML_Svcconf_Handler::get_stream_id (ACEXML_Attributes *alist ACEXML_ENV_ARG_DECL) +{ + if (alist != 0) + for (size_t i = 0; i < alist->getLength (); ++i) + { + if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("id")) == 0) + { + this->stream_info_.name (alist->getValue (i)); + } + else + { + // build the error message + ACE_CString msg (ACE_TEXT ("Invalid stream attribute '")); + msg += ACE_CString (ACE_TEXT (alist->getQName (i))); + msg += ACE_CString (ACE_TEXT ("' for entity '")); + msg += ACE_CString (ACE_TEXT (this->stream_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW_RETURN (ACEXML_SAXException (msg.c_str ()), + -1); + } + } + return 0; +} + +int +ACEXML_Svcconf_Handler::get_id (ACEXML_Attributes *alist ACEXML_ENV_ARG_DECL) +{ + if (alist != 0) + for (size_t i = 0; i < alist->getLength (); ++i) + { + if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("id")) == 0) + { + this->parsed_info_.name (alist->getValue (i)); + } + else + { + // build the error message + ACE_CString msg (ACE_TEXT ("Invalid attribute '")); + msg += ACE_CString (ACE_TEXT (alist->getQName (i))); + msg += ACE_CString (ACE_TEXT ("', expecting 'id'")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (this->parsed_info_.name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW_RETURN (ACEXML_SAXException (msg.c_str ()), + -1); + } + } + return 0; +} + +int +ACEXML_Svcconf_Handler::get_dynamic_attrs (ACEXML_Attributes *alist ACEXML_ENV_ARG_DECL) +{ + if (alist != 0) + { + ACE_Parsed_Info *info = (this->in_stream_def_ == 0 ? + &this->parsed_info_ : + &this->stream_info_); + for (size_t i = 0; i < alist->getLength (); ++i) + { + if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("id")) == 0) + { + info->name (alist->getValue (i)); + } + else if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("status")) == 0) + { + if (ACE_OS::strcmp (alist->getValue (i), ACE_TEXT ("inactive")) == 0) + { + info->active (0); + } + else if (ACE_OS::strcmp (alist->getValue (i), ACE_TEXT ("active")) == 0) + { + info->active (1); + } + else + { + // build the error message + ACE_CString msg (ACE_TEXT ("Invalid attribute value '")); + msg += ACE_CString (ACE_TEXT (alist->getQName (i))); + msg += ACE_CString (ACE_TEXT ("', expecting 'active' or 'inactive'")); + msg += ACE_CString (ACE_TEXT (" for entity '")); + msg += ACE_CString (ACE_TEXT (info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW_RETURN (ACEXML_SAXException (msg.c_str ()), + -1); + } + } + else if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("type")) == 0) + { + if (ACE_OS::strcasecmp (alist->getValue (i), ACE_TEXT ("service_object")) == 0) + { + info->service_type (ACE_Service_Type::SERVICE_OBJECT); + } + else if (ACE_OS::strcasecmp (alist->getValue (i), ACE_TEXT ("stream")) == 0) + { + info->service_type (ACE_Service_Type::STREAM); + } + else if (ACE_OS::strcasecmp (alist->getValue (i), ACE_TEXT ("module")) == 0) + { + info->service_type (ACE_Service_Type::MODULE); + } + else + { + // build the error message + ACE_CString msg (ACE_TEXT ("Invalid Service_Object attribute value'")); + msg += ACE_CString (ACE_TEXT (alist->getQName (i))); + msg += ACE_CString (ACE_TEXT ("' for entity '")); + msg += ACE_CString (ACE_TEXT (info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW_RETURN (ACEXML_SAXException (msg.c_str ()), + -1); + } + } + else + { + // build the error message + ACE_CString msg (ACE_TEXT ("Invalid attribute'")); + msg += ACE_CString (ACE_TEXT (alist->getQName (i))); + msg += ACE_CString (ACE_TEXT ("' for entity '")); + msg += ACE_CString (ACE_TEXT (info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW_RETURN (ACEXML_SAXException (msg.c_str ()), -1); + } + } + } + return 0; +} + +int +ACEXML_Svcconf_Handler::get_initializer_attrs (ACEXML_Attributes *alist ACEXML_ENV_ARG_DECL) +{ + if (alist != 0) + { + ACE_Parsed_Info *info = (this->in_stream_def_ == 0 ? + &this->parsed_info_ : + &this->stream_info_); + for (size_t i = 0; i < alist->getLength (); ++i) + { + if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("init")) == 0) + { + info->init_func (alist->getValue (i)); + } + else if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("path")) == 0) + { + info->path (alist->getValue (i)); + } + else if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("params")) == 0) + { + info->init_params (alist->getValue (i)); + } + else + { + // build the error message + ACE_CString msg (ACE_TEXT ("Invalid initializer attribute'")); + msg += ACE_CString (ACE_TEXT (alist->getQName (i))); + msg += ACE_CString (ACE_TEXT ("' for entity '")); + msg += ACE_CString (ACE_TEXT (info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW_RETURN (ACEXML_SAXException (msg.c_str ()), -1); + } + } + } + return 0; +} + +int +ACEXML_Svcconf_Handler::get_static_attrs (ACEXML_Attributes *alist ACEXML_ENV_ARG_DECL) +{ + if (alist != 0) + { + ACE_Parsed_Info *info = (this->in_stream_def_ == 0 ? + &this->parsed_info_ : + &this->stream_info_); + for (size_t i = 0; i < alist->getLength (); ++i) + { + if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("id")) == 0) + { + info->name (alist->getValue (i)); + } + else if (ACE_OS::strcmp (alist->getQName (i), ACE_TEXT ("params")) == 0) + { + info->init_params (alist->getValue (i)); + } + else + { + // build the error message + ACE_CString msg (ACE_TEXT ("Invalid static attribute '")); + msg += ACE_CString (ACE_TEXT (alist->getQName (i))); + msg += ACE_CString (ACE_TEXT ("' for entity '")); + msg += ACE_CString (ACE_TEXT (info->name ())); + msg += ACE_CString (ACE_TEXT ("'\n")); + + ACEXML_THROW_RETURN (ACEXML_SAXException (msg.c_str ()), -1); + } + } + } + return 0; +} + +#endif /* ACE_USES_CLASSIC_SVC_CONF == 0 */ |