#include #include #include #include #include #include #include #include #include #include #include #include #if defined(WIN32) && !defined(__CYGWIN__) #include #else #include #endif class ReaderWriterZIP : public osgDB::ReaderWriter { public: virtual const char* className() const { return "ZIP Database Reader/Writer"; } virtual bool acceptsExtension(const std::string& extension) const { return osgDB::equalCaseInsensitive(extension,"zip"); } virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options) const { std::string ext = osgDB::getLowerCaseFileExtension(file); if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED; std::string fileName = osgDB::findDataFile( file, options ); if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; osg::notify(osg::INFO)<<"ReaderWriterZIP::readNode( "< local_options = options ? static_cast(options->clone(osg::CopyOp::SHALLOW_COPY)) : new osgDB::ReaderWriter::Options; local_options->getDatabasePathList().push_front(dirname); // deactivate the automatic generation of images to geode's. bool prevCreateNodeFromImage = osgDB::Registry::instance()->getCreateNodeFromImage(); osgDB::Registry::instance()->setCreateNodeFromImage(false); osgDB::DirectoryContents contents = osgDB::getDirectoryContents(dirname); for(osgDB::DirectoryContents::iterator itr = contents.begin(); itr != contents.end(); ++itr) { std::string file_ext = osgDB::getFileExtension(*itr); if (!acceptsExtension(file_ext) && *itr!=std::string(".") && *itr!=std::string("..")) { osg::Node *node = osgDB::readNodeFile( *itr, local_options.get() ); grp->addChild( node ); } } osgDB::Registry::instance()->setCreateNodeFromImage(prevCreateNodeFromImage); #if defined(WIN32) && !defined(__CYGWIN__) // note, is this the right command for windows? // is there any way of overiding the Y/N option? RO. sprintf( command, "erase /S /Q \"%s\"", dirname ); system( command ); #else sprintf( command, "rm -rf %s", dirname ); system( command ); #endif if( grp->getNumChildren() == 0 ) { grp->unref(); return ReadResult::FILE_NOT_HANDLED; } return grp; } }; // now register with sgRegistry to instantiate the above // reader/writer. osgDB::RegisterReaderWriterProxy g_readerWriter_ZIP_Proxy;