mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-29 10:26:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "filelibrary.hpp"
 | |
| 
 | |
| #include <iostream>
 | |
| 
 | |
| #include <boost/filesystem.hpp>
 | |
| #include <../components/misc/stringops.hpp>
 | |
| 
 | |
| namespace Files
 | |
| {
 | |
|     // Looks for a string in a vector of strings
 | |
|     bool containsVectorString(const StringVector& list, const std::string& str)
 | |
|     {
 | |
|         for (StringVector::const_iterator iter = list.begin();
 | |
|              iter != list.end(); ++iter)
 | |
|         {
 | |
|             if (*iter == str)
 | |
|                 return true;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     // Searches a path and adds the results to the library
 | |
|     void FileLibrary::add(const boost::filesystem::path &root, bool recursive, bool strict,
 | |
|             const StringVector &acceptableExtensions)
 | |
|     {
 | |
|         if (!boost::filesystem::exists(root))
 | |
|         {
 | |
|             std::cout << "Warning " << root.string() << " does not exist.\n";
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         std::string fileExtension;
 | |
|         std::string type;
 | |
| 
 | |
|         // remember the last location of the priority list when listing new items
 | |
|         int length = mPriorityList.size();
 | |
| 
 | |
|         // First makes a list of all candidate files
 | |
|         FileLister(root, mPriorityList, recursive);
 | |
| 
 | |
|         // Then sort these files into sections according to the folder they belong to
 | |
|         for (PathContainer::iterator listIter = mPriorityList.begin() + length;
 | |
|             listIter != mPriorityList.end(); ++listIter)
 | |
|         {
 | |
|             if( !acceptableExtensions.empty() )
 | |
|             {
 | |
|                 fileExtension = boost::filesystem::path (listIter->extension()).string();
 | |
|                 Misc::StringUtils::toLower(fileExtension);
 | |
|                 if(!containsVectorString(acceptableExtensions, fileExtension))
 | |
|                     continue;
 | |
|             }
 | |
| 
 | |
|             type = boost::filesystem::path (listIter->parent_path().leaf()).string();
 | |
|             if (!strict)
 | |
|                 Misc::StringUtils::toLower(type);
 | |
| 
 | |
|             mMap[type].push_back(*listIter);
 | |
|             // std::cout << "Added path: " << listIter->string() << " in section "<< type <<std::endl;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Returns true if the named section exists
 | |
|     bool FileLibrary::containsSection(std::string sectionName, bool strict)
 | |
|     {
 | |
|         if (!strict)
 | |
|             Misc::StringUtils::toLower(sectionName);
 | |
|         StringPathContMap::const_iterator mapIter = mMap.find(sectionName);
 | |
|         if (mapIter == mMap.end())
 | |
|             return false;
 | |
|         else
 | |
|             return true;
 | |
|     }
 | |
| 
 | |
|     // Returns a pointer to const for a section of the library
 | |
|     const PathContainer* FileLibrary::section(std::string sectionName, bool strict)
 | |
|     {
 | |
|         if (!strict)
 | |
|             Misc::StringUtils::toLower(sectionName);
 | |
|         StringPathContMap::const_iterator mapIter = mMap.find(sectionName);
 | |
|         if (mapIter == mMap.end())
 | |
|         {
 | |
|             //std::cout << "Empty\n";
 | |
|             return &mEmptyPath;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             return &(mapIter->second);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Searches the library for an item and returns a boost path to it
 | |
|     boost::filesystem::path FileLibrary::locate(std::string item, bool strict, bool ignoreExtensions, std::string sectionName)
 | |
|     {
 | |
|         boost::filesystem::path result("");
 | |
|         if (sectionName == "")
 | |
|         {
 | |
|             return FileListLocator(mPriorityList, boost::filesystem::path(item), strict, ignoreExtensions);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             if (!containsSection(sectionName, strict))
 | |
|             {
 | |
|                 std::cout << "Warning: There is no section named " << sectionName << "\n";
 | |
|                 return result;
 | |
|             }
 | |
|             result = FileListLocator(mMap[sectionName], boost::filesystem::path(item), strict, ignoreExtensions);
 | |
|         }
 | |
|         return result;
 | |
|     }
 | |
| 
 | |
|     // Prints all the available sections, used for debugging
 | |
|     void FileLibrary::printSections()
 | |
|     {
 | |
|         for(StringPathContMap::const_iterator mapIter = mMap.begin();
 | |
|              mapIter != mMap.end(); ++mapIter)
 | |
|         {
 | |
|             std::cout << mapIter->first <<std::endl;
 | |
|         }
 | |
|     }
 | |
| }
 |