diff --git a/include/osgDB/Registry b/include/osgDB/Registry index b8333040a..106f3443c 100644 --- a/include/osgDB/Registry +++ b/include/osgDB/Registry @@ -385,6 +385,8 @@ class OSGDB_EXPORT Registry : public osg::Referenced /** Get the SharedStateManager. Return 0 if no SharedStateManager has been assigned.*/ SharedStateManager* getSharedStateManager() { return _sharedStateManager.get(); } + /** Add an Archive extension.*/ + void addArchiveExtension(const std::string ext); protected: @@ -394,6 +396,7 @@ class OSGDB_EXPORT Registry : public osg::Referenced typedef std::map< std::string, osg::ref_ptr > DotOsgWrapperMap; typedef std::vector< osg::ref_ptr > DynamicLibraryList; typedef std::map< std::string, std::string> ExtensionAliasMap; + typedef std::vector< std::string> ArchiveExtensionList; typedef std::pair, double > ObjectTimeStampPair; typedef std::map ObjectCache; @@ -489,7 +492,8 @@ class OSGDB_EXPORT Registry : public osg::Referenced ArchiveCache _archiveCache; OpenThreads::Mutex _archiveCacheMutex; - + + ArchiveExtensionList _archiveExtList; osg::ref_ptr _databasePager; osg::ref_ptr _sharedStateManager; diff --git a/src/osgDB/Archive.cpp b/src/osgDB/Archive.cpp index c9325f450..8fd76c516 100644 --- a/src/osgDB/Archive.cpp +++ b/src/osgDB/Archive.cpp @@ -29,6 +29,13 @@ osgDB::Archive* osgDB::openArchive(const std::string& filename, Archive::Archive osgDB::Archive* osgDB::openArchive(const std::string& filename, Archive::ArchiveStatus status, unsigned int indexBlockSizeHint,ReaderWriter::Options* options) { + // ensure archive extension is in the registry list + std::string::size_type dot = filename.find_last_of('.'); + if (dot != std::string::npos) + { + std::string ext = filename.substr(dot+1); + Registry::instance()->addArchiveExtension(ext); + } ReaderWriter::ReadResult result = osgDB::Registry::instance()->openArchive(filename, status, indexBlockSizeHint, options); return result.takeArchive(); } diff --git a/src/osgDB/Registry.cpp b/src/osgDB/Registry.cpp index 2f71644b9..7f5512eb0 100644 --- a/src/osgDB/Registry.cpp +++ b/src/osgDB/Registry.cpp @@ -136,6 +136,9 @@ Registry::Registry() _createNodeFromImage = false; _openingLibrary = false; + + // add default osga archive extension + _archiveExtList.push_back("osga"); initFilePathLists(); @@ -1291,30 +1294,47 @@ struct Registry::ReadArchiveFunctor : public Registry::ReadFunctor }; +void Registry::addArchiveExtension(const std::string ext) +{ + for(ArchiveExtensionList::iterator aitr=_archiveExtList.begin(); + aitr!=_archiveExtList.end(); + ++aitr) + { + if ( (*aitr) == ext) // extension already in archive extension list + return; + } + _archiveExtList.push_back(ext); +}; + ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor) { - std::string archiveName(".osga"); - - std::string::size_type positionArchive = readFunctor._filename.find(archiveName+'/'); - if (positionArchive==std::string::npos) positionArchive = readFunctor._filename.find(archiveName+'\\'); - if (positionArchive!=std::string::npos) + for(ArchiveExtensionList::iterator aitr=_archiveExtList.begin(); + aitr!=_archiveExtList.end(); + ++aitr) { - std::string archiveName(readFunctor._filename.substr(0,positionArchive+5)); - std::string fileName(readFunctor._filename.substr(positionArchive+6,std::string::npos)); - osg::notify(osg::INFO)<<"Contains archive : "< options = new ReaderWriter::Options; - options->setDatabasePath(archiveName); + ReaderWriter::ReadResult result = openArchiveImplementation(archiveName,ReaderWriter::READ, 4096, readFunctor._options); + + if (!result.validArchive()) return result; - return archive->readObject(fileName,options.get()); + osgDB::Archive* archive = result.getArchive(); + + osg::ref_ptr options = new ReaderWriter::Options; + options->setDatabasePath(archiveName); + + return archive->readObject(fileName,options.get()); + } } // if filename contains archive