static popup_t::menu_item_set_t array_to_menu_item_set(const array_t& value) { popup_t::menu_item_set_t set; for (array_t::const_iterator iter(value.begin()), last(value.end()); iter != last; ++iter) { if (iter->type_info() != typeid(dictionary_t)) continue; const dictionary_t& cur_new_item(iter->cast<dictionary_t>()); dictionary_t::const_iterator name_iter(cur_new_item.find(key_name)); dictionary_t::const_iterator value_iter(cur_new_item.find(key_value)); if (name_iter == cur_new_item.end() || name_iter->second.type_info() != typeid(std::string) || value_iter == cur_new_item.end()) continue; set.push_back(popup_t::menu_item_t(name_iter->second.cast<std::string>(), value_iter->second)); } return set; }
int ACE_DLL_Handle::open (const ACE_TCHAR *dll_name, int open_mode, ACE_SHLIB_HANDLE handle) { ACE_TRACE ("ACE_DLL_Handle::open"); ACE_MT (ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, this->lock_, 0)); if (this->dll_name_) { // Once dll_name_ has been set, it can't be changed.. if (ACE_OS::strcmp (this->dll_name_, dll_name) != 0) { if (ACE::debug ()) ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%P|%t) DLL_Handle::open: error, ") ACE_TEXT ("tried to reopen %s with name %s\n"), this->dll_name_, dll_name)); return -1; } } else this->dll_name_ = ACE::strnew (dll_name); if (!this->open_called_) this->open_called_ = 1; // If it hasn't been loaded yet, go ahead and do that now. if (this->handle_ == ACE_SHLIB_INVALID_HANDLE) { if (handle) this->handle_ = handle; else { /* ** Get the set of names to try loading. We need to do this to ** properly support the ability for a user to specify a simple, ** unadorned name (for example, "ACE") that will work across ** platforms. We apply platform specifics to get a name that will ** work (e.g. libACE, ACEd.dll, ACE.dll, etc.) We rely on the ** underlying dlopen() implementation to "Do The Right Thing" in ** terms of using relative paths, LD_LIBRARY_PATH, system security ** rules, etc. except when ACE_MUST_HELP_DLOPEN_SEARCH_PATH is set. ** If it is set, then ACE::ldfind() scans the configured path ** looking for a match on the name and prefix/suffix applications. ** NOTE: having ACE scan for a file and then pass a fully-qualified ** pathname to dlopen() is a potential security hole; therefore, ** do not use ACE_MUST_HELP_DLOPEN_SEARCH_PATH unless necessary ** and only after considering the risks. */ ACE_Array<ACE_TString> dll_names; dll_names.max_size (10); // Decent guess to avoid realloc later #if defined (ACE_MUST_HELP_DLOPEN_SEARCH_PATH) // Find out where the library is ACE_TCHAR dll_pathname[MAXPATHLEN + 1]; // Transform the pathname into the appropriate dynamic link library // by searching the ACE_LD_SEARCH_PATH. ACE::ldfind (dll_name, dll_pathname, (sizeof dll_pathname / sizeof (ACE_TCHAR))); ACE_TString dll_str (dll_pathname); dll_names.size (1); dll_names.set (dll_str, 0); #else this->get_dll_names (dll_name, dll_names); #endif ACE_Array_Iterator<ACE_TString> name_iter (dll_names); ACE_TString *name = 0; while (name_iter.next (name)) { // The ACE_SHLIB_HANDLE object is obtained. this->handle_ = ACE_OS::dlopen (name->c_str (), open_mode); if (ACE::debug ()) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ") ACE_TEXT ("(\"%s\", 0x%x) -> %s: %s\n"), name->c_str (), open_mode, ((this->handle_ != ACE_SHLIB_INVALID_HANDLE) ? ACE_TEXT ("succeeded") : ACE_TEXT ("failed")), this->error()->c_str())); } if (this->handle_ != ACE_SHLIB_INVALID_HANDLE) // Good one? break; // If errno is ENOENT we just skip over this one, // anything else - like an undefined symbol, for // instance must be flagged here or the next error will // mask it. // @TODO: If we've found our DLL _and_ it's // broken, should we continue at all? if ((errno != 0) && (errno != ENOENT) && ACE::debug ()) ACE_ERROR ((LM_ERROR, ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ") ACE_TEXT ("(\'%s\') failed, errno=") ACE_TEXT ("%d: %s\n"), name->c_str (), errno, this->error ()->c_str ())); #if defined (AIX) // AIX often puts the shared library file (most often named // shr.o) inside an archive library. If this is an archive // library name, then try appending [shr.o] and retry. if (ACE_TString::npos != name->strstr (ACE_TEXT (".a"))) { ACE_TCHAR aix_pathname[MAXPATHLEN + 1]; ACE_OS::strncpy (aix_pathname, name->c_str (), name->length ()); aix_pathname[name->length ()] = '\0'; ACE_OS::strcat (aix_pathname, ACE_TEXT ("(shr.o)")); open_mode |= RTLD_MEMBER; if (ACE::debug ()) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ") ACE_TEXT ("(\"%s\", 0x%x) -> %s: %s\n"), aix_pathname, open_mode, ACE_TEXT ((this->handle_ != ACE_SHLIB_INVALID_HANDLE) ? "succeeded" : "failed"), this->error()->c_str())); } this->handle_ = ACE_OS::dlopen (aix_pathname, open_mode); if (this->handle_ != ACE_SHLIB_INVALID_HANDLE) break; // If errno is ENOENT we just skip over this one, anything // else - like an undefined symbol, for instance // must be flagged here or the next error will mask it. // // @TODO: If we've found our DLL _and_ it's broken, // should we continue at all? if (ACE::debug () && (errno != 0) && (errno != ENOENT)) ACE_ERROR ((LM_ERROR, ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ") ACE_TEXT ("(\'%s\') failed, errno=") ACE_TEXT ("%d: %s\n"), name->c_str (), errno, this->error ()->c_str ())); } #endif /* AIX */ name_iter.advance (); } if (this->handle_ == ACE_SHLIB_INVALID_HANDLE) { if (ACE::debug ()) ACE_ERROR ((LM_ERROR, ACE_TEXT ("ACE (%P|%t) DLL_Handle::open (\"%s\"): ") ACE_TEXT ("Invalid handle error: %s\n"), this->dll_name_, this->error ()->c_str ())); return -1; } } } ++this->refcount_; if (ACE::debug ()) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("ACE (%P|%t) DLL_Handle::open - %s (%d), refcount=%d\n"), this->dll_name_, this->handle_, this->refcount_)); return 0; }