#include #include #include #include #include #include class ReaderWriterFreeType : public osgDB::ReaderWriter { public: ReaderWriterFreeType() { 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 "FreeType 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; std::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::notify(osg::NOTICE)<<"Error: ReaderWriterRevision unable to determine stream type, cannot not read file."< fileList = new osgDB::FileList; fileList->setName(name); while(fin) { std::string filename; fin >> filename; if (!filename.empty()) fileList->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(); while(fin) { std::string filename; fin >> filename; if (!filename.empty()) { std::string ext = osgDB::getLowerCaseFileExtension(filename); std::string revisionName = osgDB::getNameLessExtension(filename); if (revisionName.empty()) { osg::ref_ptr& dbRevision = revisionMap[revisionName]; if (!dbRevision) { dbRevision = new osgDB::DatabaseRevision; dbRevision->setName(revisionName); } std::string complete_path = osgDB::concatPaths(revisions_path, filename); osg::ref_ptr object = osgDB::readObjectFile(complete_path, options); osgDB::FileList* fileList = dynamic_cast(object.get()); if (fileList) { if (ext=="added") { dbRevision->setFilesAdded(fileList); } else if (ext=="removed") { dbRevision->setFilesRemoved(fileList); } else if (ext=="modified") { dbRevision->setFilesModified(fileList); } } } } } for(RevisionMap::iterator itr = revisionMap.begin(); itr != revisionMap.end(); ++itr) { revisions->addRevision(itr->second); } 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()<