summaryrefslogtreecommitdiff
path: root/TAO/tao/IOR_LookupTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/IOR_LookupTable.cpp')
-rw-r--r--TAO/tao/IOR_LookupTable.cpp175
1 files changed, 175 insertions, 0 deletions
diff --git a/TAO/tao/IOR_LookupTable.cpp b/TAO/tao/IOR_LookupTable.cpp
new file mode 100644
index 00000000000..7529a91ebbe
--- /dev/null
+++ b/TAO/tao/IOR_LookupTable.cpp
@@ -0,0 +1,175 @@
+// $Id$
+
+
+
+#include "tao/IOR_LookupTable.h"
+#include "tao/ObjectIDList.h"
+#include "tao/Exception.h"
+#include "tao/Environment.h"
+#include "tao/debug.h"
+
+
+ACE_RCSID(tao, IOR_TableLookup, "$Id$")
+
+int
+TAO_IOR_LookupTable_Callback::find_ior (const ACE_CString &,
+ ACE_CString &)
+{
+ // Nothing
+ return -1;
+}
+
+// = Initialization and termination methods.
+TAO_IOR_LookupTable::TAO_IOR_LookupTable (void)
+ : table_ (),
+ delete_callback_ (1)
+{
+ ACE_NEW (this->callback_, TAO_IOR_LookupTable_Callback);
+}
+
+TAO_IOR_LookupTable::~TAO_IOR_LookupTable (void)
+{
+ if (this->delete_callback_)
+ delete this->callback_;
+}
+
+int
+TAO_IOR_LookupTable::init (void)
+{
+ // This creates and initialises the table.
+ // Currently works on the hash map manager.
+
+return 0;
+}
+
+int
+TAO_IOR_LookupTable::add_ior (const ACE_CString &object_name,
+ const ACE_CString &ior)
+{
+ // Make an entry in the table.
+ switch (this->table_.bind (object_name, ior))
+ {
+ case 1 : // object name already exists in the table.
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO (%P|%t) Object Name already exists in the IOR table\n"));
+ return 1;
+ case -1 : // Failure.
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO (%P|%t) Unable to bind in IOR tao\n"));
+ return -1;
+ }
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO (%P|%t) IOR Table: <%s> -> <%s>\n",
+ object_name.c_str (),
+ ior.c_str ()));
+
+ return 0;
+}
+
+int
+TAO_IOR_LookupTable::find_ior (const ACE_CString &object_name,
+ ACE_CString &ior)
+{
+ // Find the IOR corresponding to the object name.
+ // returns 0 on success.
+ // -1 on failure.
+
+ // @@ This debugging output should *NOT* be used since the
+ // object key string is not null terminated, nor can it
+ // be null terminated without copying. No copying should
+ // be done since performance is somewhat important here.
+ // So, just remove the debugging output entirely.
+ //
+ // if (TAO_debug_level > 0)
+ // ACE_DEBUG ((LM_DEBUG,
+ // "TAO (%P|%t) IOR Table find <%s>\n",
+ // object_name.c_str ()));
+
+ int result = this->table_.find (object_name, ior);
+
+ if (result != 0)
+ result = this->callback_->find_ior (object_name, ior);
+
+ return result;
+}
+
+void
+TAO_IOR_LookupTable::register_callback (TAO_IOR_LookupTable_Callback *callback,
+ int delete_callback)
+{
+ if (this->delete_callback_)
+ delete this->callback_;
+
+ this->callback_ = callback;
+ this->delete_callback_ = delete_callback;
+}
+
+CORBA_ORB_ObjectIdList_ptr
+TAO_IOR_LookupTable::list_initial_services (CORBA::Environment &ACE_TRY_ENV)
+{
+ // Unsupported initial services should NOT be included in the below list!
+ const char *initial_services[] = { TAO_LIST_OF_INITIAL_SERVICES };
+ // Make sure the "terminating" zero is the last array element so
+ // that there is a stop condition when iterating through the list.
+
+ const size_t initial_services_size =
+ sizeof (initial_services) / sizeof (initial_services[0]);
+
+ const size_t total_size =
+ initial_services_size + this->table_.current_size ();
+
+ CORBA_ORB_ObjectIdList_ptr tmp = 0;
+
+ ACE_NEW_THROW_EX (tmp,
+ CORBA_ORB_ObjectIdList (total_size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA_ORB_ObjectIdList_var list = tmp;
+
+ size_t index = 0;
+ // Index for ObjectIdList members.
+
+ // Iterate over TAO's "built-in" initial references.
+ for (index = 0; index < initial_services_size; ++index)
+ list[index] = initial_services[index];
+
+ // Now iterate over the initial references created by the user and
+ // add them to the sequence.
+ TAO_IOR_Map::iterator first = this->table_.begin ();
+ TAO_IOR_Map::iterator last = this->table_.end ();
+
+ for (TAO_IOR_Map::iterator i = first;
+ i != last;
+ ++i, ++index)
+ list[index] = (*i).int_id_.c_str ();
+
+ list->length (total_size);
+
+ return list._retn ();
+}
+
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class ACE_Hash_Map_Manager<ACE_CString, ACE_CString, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Manager_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator<ACE_CString,ACE_CString,ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Entry<ACE_CString, ACE_CString>;
+template class ACE_Hash_Map_Reverse_Iterator<ACE_CString, ACE_CString, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate ACE_Hash_Map_Manager<ACE_CString,ACE_CString,ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Iterator<ACE_CString,ACE_CString,ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, ACE_CString>
+#pragma instantiate ACE_Hash_Map_Reverse_Iterator<ACE_CString, ACE_CString, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */