summaryrefslogtreecommitdiff
path: root/trunk/TAO/tao/CORBANAME_Parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/tao/CORBANAME_Parser.cpp')
-rw-r--r--trunk/TAO/tao/CORBANAME_Parser.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/trunk/TAO/tao/CORBANAME_Parser.cpp b/trunk/TAO/tao/CORBANAME_Parser.cpp
new file mode 100644
index 00000000000..328bb860795
--- /dev/null
+++ b/trunk/TAO/tao/CORBANAME_Parser.cpp
@@ -0,0 +1,167 @@
+// $Id$
+
+#include "tao/CORBANAME_Parser.h"
+#include "tao/ORB.h"
+#include "tao/Object.h"
+#include "tao/SystemException.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Invocation_Adapter.h"
+#include "tao/debug.h"
+
+#include "ace/Log_Msg.h"
+#include "ace/SString.h"
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (tao,
+ CORBANAME_Parser,
+ "$Id$")
+
+static const char corbaname_prefix[] = "corbaname:";
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CORBANAME_Parser::~TAO_CORBANAME_Parser (void)
+{
+}
+
+bool
+TAO_CORBANAME_Parser::match_prefix (const char *ior_string) const
+{
+ return (ACE_OS::strncmp (ior_string,
+ corbaname_prefix,
+ sizeof corbaname_prefix - 1) == 0);
+}
+
+CORBA::Object_ptr
+TAO_CORBANAME_Parser::
+parse_string_dynamic_request_helper (CORBA::Object_ptr naming_context,
+ ACE_CString &key_string)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::Arg_Traits<CORBA::Object>::ret_val _tao_retval;
+ TAO::Arg_Traits<CORBA::Char *>::in_arg_val _tao_id (key_string.c_str ());
+
+ TAO::Argument *_tao_signature [] =
+ {
+ &_tao_retval,
+ &_tao_id
+ };
+
+ TAO::Invocation_Adapter tao_call (naming_context,
+ _tao_signature,
+ 2,
+ "resolve_str",
+ 11,
+ 0);
+
+ tao_call.invoke (0, 0);
+
+ return _tao_retval.retn ();
+}
+
+CORBA::Object_ptr
+TAO_CORBANAME_Parser::parse_string (const char *ior,
+ CORBA::ORB_ptr orb
+ ACE_ENV_ARG_DECL)
+ 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 *corbaname =
+ ior + sizeof corbaname_prefix - 1;
+
+ CORBA::Object_ptr obj = CORBA::Object::_nil ();
+
+ ACE_TRY
+ {
+ // The position of the seperator between the obj_addr and key
+ // string
+ ACE_CString::size_type pos_seperator = 0;
+
+ ACE_CString corbaname_str (corbaname, 0, 1);
+
+ pos_seperator = corbaname_str.find ("#", 0);
+
+ // Get the Key String
+ ACE_CString key_string;
+
+ if (pos_seperator != ACE_CString::npos)
+ {
+ key_string = corbaname_str.substring (pos_seperator + 1,
+ ACE_CString::npos);
+ }
+
+ // Prepare a suitable corbaloc string for the name service.
+ // CORBALOC assumes "NameService" for the object key if none
+ // is provided, so just pass everything between "corbaname:"
+ // and "#" as the address
+ ACE_CString corbaloc_addr ("corbaloc:", 0, 1);
+ corbaloc_addr += corbaname_str.substring (0, pos_seperator);
+
+ // Obtain a reference to the naming context
+ CORBA::Object_var name_context =
+ orb->string_to_object (corbaloc_addr.c_str ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Check if the Object reference is nil.
+ if (CORBA::is_nil (name_context.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot resolve Naming Service: CORBANAME_Parser\n"),
+ 0);
+
+ CORBA::Boolean is_a =
+ name_context->_is_a ("IDL:omg.org/CosNaming/NamingContextExt:1.0"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (!is_a)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot narrow Naming Service: "
+ "CORBANAME_Parser\n"),
+ 0);
+ }
+
+ if (key_string.length () != 0)
+ {
+
+ // Make a dynamic request for resolve_str in this naming context
+ obj = this->parse_string_dynamic_request_helper (name_context.in (),
+ key_string
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ { // There was no key string which implies that the caller wants
+ // the object reference of the naming service.
+ obj = name_context._retn ();
+ }
+ }
+ ACE_CATCH (CORBA::SystemException, ex)
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (ex, "CORBANAME_Parser");
+ }
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ return obj;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_CORBANAME_Parser,
+ ACE_TEXT ("CORBANAME_Parser"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_CORBANAME_Parser),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO, TAO_CORBANAME_Parser)
+