diff options
Diffstat (limited to 'TAO/tao/DLL_Parser.cpp')
-rw-r--r-- | TAO/tao/DLL_Parser.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/TAO/tao/DLL_Parser.cpp b/TAO/tao/DLL_Parser.cpp new file mode 100644 index 00000000000..5b41da88805 --- /dev/null +++ b/TAO/tao/DLL_Parser.cpp @@ -0,0 +1,73 @@ +// $Id$ + +#include "DLL_Parser.h" +#include "Object_Loader.h" +#include "tao/Object.h" +#include "tao/Exception.h" +#include "tao/Environment.h" +#include "ace/Dynamic_Service.h" + +#if !defined(__ACE_INLINE__) +#include "DLL_Parser.i" +#endif /* __ACE_INLINE__ */ + +ACE_RCSID(tao, DLL_Parser, "$Id$") + +TAO_DLL_Parser::~TAO_DLL_Parser (void) +{ +} + +static const char dll_prefix[] = "DLL:"; + +int +TAO_DLL_Parser::match_prefix (const char *ior_string) const +{ + return (ACE_OS::strncmp (ior_string, + ::dll_prefix, + sizeof (::dll_prefix) - 1) == 0); +} + +CORBA::Object_ptr +TAO_DLL_Parser::parse_string (const char *ior, + CORBA::ORB_ptr orb, + CORBA::Environment &ACE_TRY_ENV) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // Skip the prefix, we know it is there because this method in only + // called if <match_prefix> returns 1. + const char *name = + ior + sizeof (::dll_prefix) + 2; + + TAO_Object_Loader *loader = + ACE_Dynamic_Service<TAO_Object_Loader>::instance (name); + + if (loader == 0) + { + ACE_THROW_RETURN + (CORBA::INV_OBJREF + (CORBA_SystemException::_tao_minor_code ( + TAO_DEFAULT_MINOR_CODE, + EINVAL), + CORBA::COMPLETED_NO), + CORBA::Object::_nil ()); + } + + return loader->create_object (orb, ACE_TRY_ENV); +} + +ACE_STATIC_SVC_DEFINE (TAO_DLL_Parser, + ACE_TEXT ("DLL_Parser"), + ACE_SVC_OBJ_T, + &ACE_SVC_NAME (TAO_DLL_Parser), + ACE_Service_Type::DELETE_THIS | + ACE_Service_Type::DELETE_OBJ, + 0) + + +ACE_FACTORY_DEFINE (TAO, TAO_DLL_Parser) + +#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) + +#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) + +#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |