+
+
+inline bool CNodeDefManager::getNodeRegistrationStatus() const
+{
+ return m_node_registration_complete;
+}
+
+
+inline void CNodeDefManager::setNodeRegistrationStatus(bool completed)
+{
+ m_node_registration_complete = completed;
+}
+
+
+void CNodeDefManager::pendNodeResolve(NodeResolveInfo *nri)
+{
+ nri->resolver->m_ndef = this;
+ if (m_node_registration_complete) {
+ nri->resolver->resolveNodeNames(nri);
+ nri->resolver->m_lookup_done = true;
+ delete nri;
+ } else {
+ m_pending_node_lookups.push_back(nri);
+ }
+}
+
+
+void CNodeDefManager::cancelNodeResolve(NodeResolver *resolver)
+{
+ for (std::list<NodeResolveInfo *>::iterator
+ it = m_pending_node_lookups.begin();
+ it != m_pending_node_lookups.end();
+ ++it) {
+ NodeResolveInfo *nri = *it;
+ if (resolver == nri->resolver) {
+ it = m_pending_node_lookups.erase(it);
+ delete nri;
+ }
+ }
+}
+
+
+void CNodeDefManager::runNodeResolverCallbacks()
+{
+ while (!m_pending_node_lookups.empty()) {
+ NodeResolveInfo *nri = m_pending_node_lookups.front();
+ m_pending_node_lookups.pop_front();
+ nri->resolver->resolveNodeNames(nri);
+ nri->resolver->m_lookup_done = true;
+ delete nri;
+ }
+}
+
+
+bool CNodeDefManager::getIdFromResolveInfo(NodeResolveInfo *nri,
+ const std::string &node_alt, content_t c_fallback, content_t &result)
+{
+ if (nri->nodenames.empty()) {
+ result = c_fallback;
+ errorstream << "Resolver empty nodename list" << std::endl;
+ return false;
+ }
+
+ content_t c;
+ std::string name = nri->nodenames.front();
+ nri->nodenames.pop_front();
+
+ bool success = getId(name, c);
+ if (!success && node_alt != "") {
+ name = node_alt;
+ success = getId(name, c);
+ }
+
+ if (!success) {
+ errorstream << "Resolver: Failed to resolve node name '" << name
+ << "'." << std::endl;
+ c = c_fallback;
+ }
+
+ result = c;
+ return success;
+}
+
+
+bool CNodeDefManager::getIdsFromResolveInfo(NodeResolveInfo *nri,
+ std::vector<content_t> &result)
+{
+ bool success = true;
+
+ if (nri->nodelistinfo.empty()) {
+ errorstream << "Resolver: Empty nodelistinfo list" << std::endl;
+ return false;
+ }
+
+ NodeListInfo listinfo = nri->nodelistinfo.front();
+ nri->nodelistinfo.pop_front();
+
+ while (listinfo.length--) {
+ if (nri->nodenames.empty()) {
+ errorstream << "Resolver: Empty nodename list" << std::endl;
+ return false;
+ }
+
+ content_t c;
+ std::string name = nri->nodenames.front();
+ nri->nodenames.pop_front();
+
+ if (name.substr(0,6) != "group:") {
+ if (getId(name, c)) {
+ result.push_back(c);
+ } else if (listinfo.all_required) {
+ errorstream << "Resolver: Failed to resolve node name '" << name
+ << "'." << std::endl;
+ result.push_back(listinfo.c_fallback);
+ success = false;
+ }
+ } else {
+ std::set<content_t> cids;
+ std::set<content_t>::iterator it;
+ getIds(name, cids);
+ for (it = cids.begin(); it != cids.end(); ++it)
+ result.push_back(*it);
+ }
+ }
+
+ return success;
+}