/*! * @if jp * @brief NamingContext を再帰的に下って非アクティブ化する * @else * @brief Destroy the naming context recursively * @endif */ void CorbaNaming::destroyRecursive(CosNaming::NamingContext_ptr context) throw (SystemException, NotEmpty, NotFound, CannotProceed, InvalidName) { CosNaming::BindingList_var bl; CosNaming::BindingIterator_var bi; CORBA::Boolean cont(true); #ifndef ORB_IS_RTORB context->list(m_blLength, bl.out(), bi.out()); #else // ORB_IS_RTORB // context->list(m_blLength, bl, bi); context->list(m_blLength, (CosNaming::BindingList_out)bl, (CosNaming::BindingIterator_ptr)bi); #endif // ORB_IS_RTORB while (cont) { CORBA::ULong len(bl->length()); for (CORBA::ULong i = 0; i < len; ++i) { if (bl[i].binding_type == CosNaming::ncontext) { // If Object is context, destroy recursive. CosNaming::NamingContext_var next_context; next_context = CosNaming::NamingContext:: _narrow(context->resolve(bl[i].binding_name)); // Recursive function call destroyRecursive(next_context); // +++ Recursive call +++ context->unbind(bl[i].binding_name); next_context->destroy(); } else if (bl[i].binding_type == CosNaming::nobject) { // If Object is object, unbind it. context->unbind(bl[i].binding_name); } else assert(0); // never comes here } // no more binding -> do-while loop will be finished if (CORBA::is_nil(bi)) cont = false; else bi->next_n(m_blLength, bl); } if (!CORBA::is_nil(bi)) bi->destroy(); return; }
void CNamingTreeCtrl::ListContext(HTREEITEM hItem) { CWaitCursor Waiter; try { // Get the items object and make sure we have a context CNamingObject* pObject = GetTreeObject(hItem); CosNaming::NamingContext_var Context = pObject->NamingContext(); if(CORBA::is_nil(Context)) { return; } // List the contexts entries CosNaming::BindingList_var bl; CosNaming::BindingIterator_var bi; Context->list(LISTQUANTUM, bl, bi); ListBindingList(hItem, Context, bl); if(!CORBA::is_nil(bi)) { while(bl->length()) { CString Text; Text.Format(ACE_TEXT ("This context contains more than %d entries, list the next %d?"), LISTQUANTUM, LISTQUANTUM); if(MessageBox(Text, ACE_TEXT ("Question"), MB_YESNO) == IDNO) { return; } bi->next_n(LISTQUANTUM, bl); ListBindingList(hItem, Context, bl); } bi->destroy(); } } catch(CORBA::Exception& ex) { MessageBox(ACE_TEXT_CHAR_TO_TCHAR (ex._rep_id()), ACE_TEXT ("CORBA::Exception")); } }
int Iterator_Test::execute (TAO_Naming_Client &root_context) { try { // Instantiate four dummy objects. My_Test_Object *impl = new My_Test_Object; Test_Object_var obj = impl->_this (); impl->_remove_ref (); // Bind objects to the naming context. CosNaming::Name name1; name1.length (1); name1[0].id = CORBA::string_dup ("foo1"); CosNaming::Name name2; name2.length (1); name2[0].id = CORBA::string_dup ("foo2"); CosNaming::Name name3; name3.length (1); name3[0].id = CORBA::string_dup ("foo3"); CosNaming::Name name4; name4.length (1); name4[0].id = CORBA::string_dup ("foo4"); root_context->bind (name1, obj.in ()); root_context->bind (name2, obj.in ()); root_context->bind (name3, obj.in ()); root_context->bind (name4, obj.in ()); // List the content of the Naming Context. CosNaming::BindingIterator_var iter; CosNaming::BindingList_var bindings_list; root_context->list (1, bindings_list.out (), iter.out ()); if (CORBA::is_nil (iter.in ()) || bindings_list->length () != 1 || bindings_list[0u].binding_type != CosNaming::nobject) ACE_ERROR_RETURN ((LM_ERROR, "CosNaming::list does not function properly\n"), -1); ACE_DEBUG ((LM_DEBUG, "First binding: %s\n", bindings_list[0u].binding_name[0u].id.in ())); // Invoke operations on the iterator. CosNaming::Binding_var binding; iter->next_one (binding.out ()); if (binding->binding_type != CosNaming::nobject) ACE_ERROR_RETURN ((LM_ERROR, "CosNaming::next_one does not function properly\n"), -1); ACE_DEBUG ((LM_DEBUG, "Second binding: %s\n", binding->binding_name[0].id.in ())); iter->next_n (2, bindings_list.out ()); if (bindings_list->length () != 2 || bindings_list[0u].binding_type != CosNaming::nobject || bindings_list[1u].binding_type != CosNaming::nobject) ACE_ERROR_RETURN ((LM_ERROR, "CosNaming::BindingIterator does not function properly\n"), -1); ACE_DEBUG ((LM_DEBUG, "Third binding: %s\n" "Fourth binding: %s\n", bindings_list[0u].binding_name[0].id.in (), bindings_list[1u].binding_name[0].id.in ())); // We already iterated over all the bindings, so the following // should return false. CORBA::Boolean result = iter->next_one (binding.out ()); if (result) ACE_ERROR_RETURN ((LM_ERROR, "CosNaming::BindingIterator does not function properly\n"), -1); iter->destroy (); } catch (const CORBA::Exception& ex) { ex._tao_print_exception ( "Unexpected exception in Iterator test"); return -1; } return 0; }