summaryrefslogtreecommitdiff
path: root/ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp
diff options
context:
space:
mode:
authorWilliam R. Otte <wotte@dre.vanderbilt.edu>2006-07-24 15:50:30 +0000
committerWilliam R. Otte <wotte@dre.vanderbilt.edu>2006-07-24 15:50:30 +0000
commitc44379cc7d9c7aa113989237ab0f56db12aa5219 (patch)
tree66a84b20d47f2269d8bdc6e0323f338763424d3a /ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp
parent3aff90f4a822fcf5d902bbfbcc9fa931d6191a8c (diff)
downloadATCD-c44379cc7d9c7aa113989237ab0f56db12aa5219.tar.gz
Repo restructuring
Diffstat (limited to 'ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp')
-rw-r--r--ACE/ACEXML/apps/svcconf/Svcconf_Handler.cpp771
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 */