plKey plKeyFinder::StupidSearch(const plString & age, const plString & rm, uint16_t classType, const plString &obName, bool subString) { if (obName.IsNull()) return nil; plUoid newOid; fLastError = kOk; uint16_t maxClasses = plFactory::GetNumClasses(); uint16_t ty = classType; if (ty == maxClasses) // error { fLastError = kInvalidClass; return nil; } if (!age.IsNull() && !rm.IsNull()) { const plLocation &loc = IGetResMgr()->FindLocation( age, rm ); if( !loc.IsValid() ) { fLastError = kPageNotFound; return nil; } plKeyFinderIter keyFinder( classType, obName, subString ); if( !IGetResMgr()->IterateKeys( &keyFinder, loc ) ) // Return value of false means it stopped somewhere, i.e. found something return keyFinder.GetFoundKey(); } else if (!age.IsNull()) { plKeyFinderIter keyFinder(classType, obName, subString, age); if( !IGetResMgr()->IterateAllPages( &keyFinder ) ) return keyFinder.GetFoundKey(); } else { plKeyFinderIter keyFinder( classType, obName, subString ); if( !IGetResMgr()->IterateKeys( &keyFinder ) ) // Return value of false means it stopped somewhere, i.e. found something return keyFinder.GetFoundKey(); } fLastError = kObjectNotFound; return nil; }
const plLocation &plKeyFinder::FindLocation(const plString &age, const plString &page) const { if (age == "") { static plLocation invalidLoc; plRegistryPageNode *pageNode; plPageFinder pageFinder( &pageNode, page ); if( IGetResMgr()->IterateAllPages( &pageFinder ) || pageNode == nil ) return invalidLoc; return pageNode->GetPageInfo().GetLocation(); } return IGetResMgr()->FindLocation( age, page ); }
virtual bool EatPage( plRegistryPageNode *pageNode ) { #ifndef _DEBUG try { #endif if (pageNode->GetPageInfo().GetAge().CompareI(fAgeName) == 0) { // Try loading and searching thru this page hsTArray<plKey> keyRefs; IGetResMgr()->LoadPageKeys( pageNode ); plKeyCollector coll( keyRefs ); pageNode->IterateKeys( &coll ); if( !pageNode->IterateKeys( this ) ) return false; } #ifndef _DEBUG } catch (...) { } #endif return true; }
const plPageInfo* plKeyFinder::GetLocationInfo( const plLocation &loc ) const { plRegistryPageNode *node = IGetResMgr()->FindPage( loc ); if (node) return &node->GetPageInfo(); else return nil; }
plKey plKeyFinder::FindSceneNodeKey(const plLocation& location) const { plRegistryPageNode* pageNode = IGetResMgr()->FindPage(location); if (pageNode == nil) return nil; return IFindSceneNodeKey(pageNode); }
plKey plKeyFinder::IFindSceneNodeKey(plRegistryPageNode* page) const { // Got the pageNode, try a find before loading plRegistryKeyList* keyList = page->IGetKeyList(CLASS_INDEX_SCOPED(plSceneNode)); if (keyList) { if (keyList->fStaticKeys.size() == 1) { return plKey::Make((plKeyData*)keyList->fStaticKeys[0]); } else if (keyList->fDynamicKeys.size() == 1) // happens during export { plRegistryKeyList::DynSet::const_iterator it = keyList->fDynamicKeys.begin(); plKeyImp* keyImp = *it; return plKey::Make(keyImp); } } // Try loading and see if that helps if (page->IsFullyLoaded()) return nil; IGetResMgr()->LoadPageKeys(page); // Get the list of all sceneNodes plKey retVal(nil); keyList = page->IGetKeyList(CLASS_INDEX_SCOPED(plSceneNode)); if (keyList && keyList->fStaticKeys.size() == 1) { retVal = plKey::Make((plKeyData*)keyList->fStaticKeys[0]); } // If we just loaded up all the keys for this page, then we // may have a bunch of keys with a refcount of 0. For any of // these keys that nothing else refs (yes, we have unused objects // in the data), they don't get deleted because the refcount never // rises above zero or falls back to zero. So we'll go ahead and // ref and unref all of them. The ones in use stay put, the ones // not being used go away. This is less than ideal. IGetResMgr()->DumpUnusedKeys(page); return retVal; }
plKey plKeyFinder::FindSceneNodeKey( const plString &ageName, const plString &pageName ) const { plRegistryPageNode *pageNode; plPageFinder pageFinder( &pageNode, ageName, pageName ); // Use our own page finder, since we want to do nifty things like partial // matches, etc. if (IGetResMgr()->IterateAllPages(&pageFinder) || pageNode == nil) return nil; return IFindSceneNodeKey( pageNode ); }
void plKeyFinder::ReallyStupidSubstringSearch(const plString &name, uint16_t objType, std::vector<plKey>& foundKeys, const plLocation &hintLocation ) { if (name.IsNull()) return; plKeyFinderIterator collector( objType, name, foundKeys ); if( hintLocation.IsValid() ) { plRegistryPageNode *hintPage = IGetResMgr()->FindPage( hintLocation ); if( hintPage != nil ) { // Try all pages in the same age as that page IGetResMgr()->IteratePages( &collector, hintPage->GetPageInfo().GetAge() ); } if (foundKeys.size() > 0) { return; } } //fpReg->IterateKeys( &collector ); IGetResMgr()->IterateAllPages( &collector ); }