#include #include #include #include #include #include class ReaderWriterRevisions : public osgDB::ReaderWriter { public: ReaderWriterRevisions() { supportsExtension("revisions","list of revision files"); supportsExtension("added","revision file containing list of added files"); supportsExtension("removed","revision file containing list of removed files"); supportsExtension("modified","revision file containing list of modified files"); } virtual const char* className() const { return "Revisions Font Reader/Writer"; } virtual ReadResult readObject(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; osgDB::ifstream fin(fileName.c_str()); if (ext=="revisions") return readRevisions(fin, file, options); else return readFileList(fin, file, options); } virtual ReadResult readObject(std::istream& fin, const osgDB::ReaderWriter::Options* options) const { std::string fileName = options->getPluginStringData("filename"); if (fileName.empty()) { OSG_NOTICE<<"Error: ReaderWriterRevision unable to determine stream type, cannot not read file."<getFileNames().insert(filename); } return fileList.get(); } ReadResult readRevisions(std::istream& fin, const std::string& name, const osgDB::ReaderWriter::Options* options) const { osg::ref_ptr revisions = new osgDB::DatabaseRevisions; revisions->setName(name); typedef std::map > RevisionMap; RevisionMap revisionMap; std::string revisions_path; if (options && !(options->getDatabasePathList().empty())) revisions_path = options->getDatabasePathList().front(); else revisions_path = osgDB::getFilePath(name); revisions->setDatabasePath(revisions_path); OSG_INFO<<"readRevisions="<setFilesAdded(fileList.get()); } else if (ext=="removed") { dbRevision->setFilesRemoved(fileList.get()); } else if (ext=="modified") { dbRevision->setFilesModified(fileList.get()); } } } } for(RevisionMap::iterator itr = revisionMap.begin(); itr != revisionMap.end(); ++itr) { revisions->addRevision(itr->second.get()); } return revisions.get(); } virtual WriteResult writeObject(const osg::Object& object, std::ostream& fout,const osgDB::ReaderWriter::Options*) const { const osgDB::FileList* fileList = dynamic_cast(&object); if (fileList) { const osgDB::FileList::FileNames& fileNames = fileList->getFileNames(); for(osgDB::FileList::FileNames::const_iterator itr = fileNames.begin(); itr != fileNames.end(); ++itr) { fout<<*itr<(&object); if (revisions) { typedef osgDB::DatabaseRevisions::DatabaseRevisionList RevisionList; const RevisionList& revisionList = revisions->getDatabaseRevisionList(); for(RevisionList::const_iterator itr = revisionList.begin(); itr != revisionList.end(); ++itr) { const osgDB::DatabaseRevision* revision = itr->get(); if (revision->getFilesAdded()) { if (!(revision->getFilesAdded()->getName().empty())) fout<getFilesAdded()->getName()<getFilesRemoved()) { if (!(revision->getFilesRemoved()->getName().empty())) fout<getFilesRemoved()->getName()<getFilesModified()) { if (!(revision->getFilesModified()->getName().empty())) fout<getFilesModified()->getName()<