bool CExeUnpackPkg::Extract( LPCTSTR szfile, LPCTSTR szpath, strings &files ) { USES_CONVERSION; Files filelist; if ( EE_SUCCESS == ExtractOfficePackage(szfile, szpath, filelist) ) { for (int i=0; i<filelist.size(); i++) { std::string str = CT2CA(filelist[i].GetString()); files.push_back(str); } return true; } return false; }
void DumpFiles( const Files& files, BOOL bOnlyFileName ) { if(files.empty()) { _tprintf(_T("Empty Files\r\n")); } else { int i=0; for(Files::const_iterator it=files.begin(); it!=files.end(); ++it) { ++i; LPCTSTR szFile = *it; if(bOnlyFileName) { LPCTSTR szName = _tcsrchr(szFile, _T('\\')); if(szName) szFile = ++szName; } _tprintf(_T("%d/%d %s\r\n"), i, files.size(), szFile); } } }
void load() { //osg::notify(osg::NOTICE)<<"void load(Object)"<<std::endl; Files filesA; Files filesB; readMasterFile(filesB); // osg::notify(osg::NOTICE)<<"First read "<<filesA.size()<<std::endl; // itererate until the master file is stable do { OpenThreads::Thread::microSleep(100000); filesB.swap(filesA); filesB.clear(); readMasterFile(filesB); // osg::notify(osg::NOTICE)<<"second read "<<filesB.size()<<std::endl; } while (filesA!=filesB); Files files; files.swap(filesB); // osg::notify(osg::NOTICE)<<"Now equal "<<files.size()<<std::endl; Files newFiles; Files removedFiles; // find out which files are new, and which ones have been removed. { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); for(Files::iterator fitr = files.begin(); fitr != files.end(); ++fitr) { if (_existingFilenameNodeMap.count(*fitr)==0) newFiles.insert(*fitr); } for(FilenameNodeMap::iterator litr = _existingFilenameNodeMap.begin(); litr != _existingFilenameNodeMap.end(); ++litr) { if (files.count(litr->first)==0) { removedFiles.insert(litr->first); } } } #if 0 if (!newFiles.empty() || !removedFiles.empty()) { osg::notify(osg::NOTICE)<<std::endl<<std::endl<<"void operator () files.size()="<<files.size()<<std::endl; } #endif // first load the new files. FilenameNodeMap nodesToAdd; if (!newFiles.empty()) { typedef std::vector< osg::ref_ptr<osg::GraphicsThread> > GraphicsThreads; GraphicsThreads threads; for(unsigned int i=0; i<= osg::GraphicsContext::getMaxContextID(); ++i) { osg::GraphicsContext* gc = osg::GraphicsContext::getCompileContext(i); osg::GraphicsThread* gt = gc ? gc->getGraphicsThread() : 0; if (gt) threads.push_back(gt); } if (_operationQueue.valid()) { // osg::notify(osg::NOTICE)<<"Using OperationQueue"<<std::endl; _endOfLoadBlock = new osg::RefBlockCount(newFiles.size()); _endOfLoadBlock->reset(); typedef std::list< osg::ref_ptr<LoadAndCompileOperation> > LoadAndCompileList; LoadAndCompileList loadAndCompileList; for(Files::iterator nitr = newFiles.begin(); nitr != newFiles.end(); ++nitr) { // osg::notify(osg::NOTICE)<<"Adding LoadAndCompileOperation "<<*nitr<<std::endl; osg::ref_ptr<LoadAndCompileOperation> loadAndCompile = new LoadAndCompileOperation( *nitr, _incrementalCompileOperation.get(), _endOfLoadBlock.get() ); loadAndCompileList.push_back(loadAndCompile); _operationQueue->add( loadAndCompile.get() ); } #if 1 osg::ref_ptr<osg::Operation> operation; while ((operation=_operationQueue->getNextOperation()).valid()) { // osg::notify(osg::NOTICE)<<"Local running of operation"<<std::endl; (*operation)(0); } #endif // osg::notify(osg::NOTICE)<<"Waiting for completion of LoadAndCompile operations"<<std::endl; _endOfLoadBlock->block(); // osg::notify(osg::NOTICE)<<"done ... Waiting for completion of LoadAndCompile operations"<<std::endl; for(LoadAndCompileList::iterator litr = loadAndCompileList.begin(); litr != loadAndCompileList.end(); ++litr) { if ((*litr)->_loadedModel.valid()) { nodesToAdd[(*litr)->_filename] = (*litr)->_loadedModel; } } } else { _endOfLoadBlock = new osg::RefBlockCount(newFiles.size()); _endOfLoadBlock->reset(); for(Files::iterator nitr = newFiles.begin(); nitr != newFiles.end(); ++nitr) { osg::ref_ptr<osg::Node> loadedModel = osgDB::readRefNodeFile(*nitr); if (loadedModel.get()) { nodesToAdd[*nitr] = loadedModel; if (_incrementalCompileOperation.valid()) { osg::ref_ptr<osgUtil::IncrementalCompileOperation::CompileSet> compileSet = new osgUtil::IncrementalCompileOperation::CompileSet(loadedModel.get()); compileSet->_compileCompletedCallback = new ReleaseBlockOnCompileCompleted(_endOfLoadBlock.get()); _incrementalCompileOperation->add(compileSet.get()); } else { _endOfLoadBlock->completed(); } } else { _endOfLoadBlock->completed(); } } _endOfLoadBlock->block(); } } bool requiresBlock = false; // pass the locally peppared data to MasterOperations shared data // so that updated thread can merge these changes with the main scene // graph. This merge is carried out via the update(..) method. if (!removedFiles.empty() || !nodesToAdd.empty()) { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); _nodesToRemove.swap(removedFiles); _nodesToAdd.swap(nodesToAdd); requiresBlock = true; } // now block so we don't try to load anything till the new data has been merged // otherwise _existingFilenameNodeMap will get out of sync. if (requiresBlock) { _updatesMergedBlock.block(); } else { OpenThreads::Thread::YieldCurrentThread(); } }