| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2008 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include <algorithm>
 | 
					
						
							| 
									
										
										
										
											2014-11-15 15:46:40 -05:00
										 |  |  | #include <functional>
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "Common/CommonPaths.h"
 | 
					
						
							|  |  |  | #include "Common/FileSearch.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-15 15:46:40 -05:00
										 |  |  | #include "Common/FileUtil.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | static std::vector<std::string> | 
					
						
							|  |  |  | FileSearchWithTest(const std::vector<std::string>& directories, bool recursive, | 
					
						
							|  |  |  |                    std::function<bool(const File::FSTEntry&)> callback) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   std::vector<std::string> result; | 
					
						
							|  |  |  |   for (const std::string& directory : directories) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     File::FSTEntry top = File::ScanDirectoryTree(directory, recursive); | 
					
						
							| 
									
										
										
										
											2014-11-15 15:46:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     std::function<void(File::FSTEntry&)> DoEntry; | 
					
						
							|  |  |  |     DoEntry = [&](File::FSTEntry& entry) { | 
					
						
							|  |  |  |       if (callback(entry)) | 
					
						
							|  |  |  |         result.push_back(entry.physicalName); | 
					
						
							|  |  |  |       for (auto& child : entry.children) | 
					
						
							|  |  |  |         DoEntry(child); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     for (auto& child : top.children) | 
					
						
							|  |  |  |       DoEntry(child); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   // remove duplicates
 | 
					
						
							|  |  |  |   std::sort(result.begin(), result.end()); | 
					
						
							|  |  |  |   result.erase(std::unique(result.begin(), result.end()), result.end()); | 
					
						
							|  |  |  |   return result; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | std::vector<std::string> DoFileSearch(const std::vector<std::string>& exts, | 
					
						
							|  |  |  |                                       const std::vector<std::string>& directories, bool recursive) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   bool accept_all = std::find(exts.begin(), exts.end(), "") != exts.end(); | 
					
						
							|  |  |  |   return FileSearchWithTest(directories, recursive, [&](const File::FSTEntry& entry) { | 
					
						
							|  |  |  |     if (accept_all) | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     std::string name = entry.virtualName; | 
					
						
							|  |  |  |     std::transform(name.begin(), name.end(), name.begin(), ::tolower); | 
					
						
							|  |  |  |     return std::any_of(exts.begin(), exts.end(), [&](const std::string& ext) { | 
					
						
							|  |  |  |       return name.length() >= ext.length() && | 
					
						
							|  |  |  |              name.compare(name.length() - ext.length(), ext.length(), ext) == 0; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 16:03:32 -04:00
										 |  |  | // Result includes the passed directories themselves as well as their subdirectories.
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | std::vector<std::string> FindSubdirectories(const std::vector<std::string>& directories, | 
					
						
							|  |  |  |                                             bool recursive) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return FileSearchWithTest(directories, true, | 
					
						
							|  |  |  |                             [&](const File::FSTEntry& entry) { return entry.isDirectory; }); | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | } |