Page Menu
Home
Phabricator (Chris)
Search
Configure Global Search
Log In
Files
F126925
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
5 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/util/file-system.cpp b/util/file-system.cpp
index 3d9eeb96..5fbe365d 100644
--- a/util/file-system.cpp
+++ b/util/file-system.cpp
@@ -1,62 +1,102 @@
#include "funcs.h"
#include "file-system.h"
#include "system.h"
+#include <dirent.h>
#include <sstream>
#include <exception>
#include <string>
using namespace std;
namespace Filesystem{
NotFound::NotFound(const std::string & file):
exception(),
reason(file){
}
NotFound::~NotFound() throw(){
}
static string userDirectory(){
ostringstream str;
str << getenv("HOME") << "/.paintown/";
return str.str();
}
static string lookup(const std::string & path) throw (NotFound){
/* first try the main data directory */
string final = Util::getDataPath2() + path;
if (System::readable(final)){
return final;
}
/* then try the user directory, like ~/.paintown */
final = userDirectory() + path;
if (System::readable(final)){
return final;
}
/* then just look in the cwd */
if (System::readable(path)){
return path;
}
throw NotFound("Cannot find " + path);
}
+static vector<string> findDirectoriesIn(const std::string & path){
+ vector<string> dirs;
+ DIR * dir = opendir(path.c_str());
+ if (dir == NULL){
+ return dirs;
+ }
+
+ struct dirent * entry = readdir(dir);
+ while (entry != NULL){
+ string total = path + "/" + entry->d_name;
+ if (System::isDirectory(total)){
+ dirs.push_back(total);
+ }
+ entry = readdir(dir);
+ }
+
+ closedir(dir);
+
+ return dirs;
+}
+
+vector<string> findDirectories(const std::string & path){
+ vector<string> dirs;
+
+ vector<string> main_dirs = findDirectoriesIn(Util::getDataPath2() + path);
+ vector<string> user_dirs = findDirectoriesIn(userDirectory() + path);
+ vector<string> here_dirs = findDirectoriesIn(path);
+
+ dirs.insert(dirs.end(), main_dirs.begin(), main_dirs.end());
+ dirs.insert(dirs.end(), user_dirs.begin(), user_dirs.end());
+ dirs.insert(dirs.end(), here_dirs.begin(), here_dirs.end());
+
+ return dirs;
+}
+
std::string find(const std::string & path) throw (NotFound){
if (path.length() == 0){
throw NotFound("No path given");
}
if (path[0] == '/'){
string str(path);
str.erase(0, 1);
return lookup(str);
}
return lookup(path);
}
std::string cleanse(const std::string & path){
string str = path;
- str.erase(0, Util::getDataPath2().length());
+ if (str.find(Util::getDataPath2()) == 0){
+ str.erase(0, Util::getDataPath2().length());
+ } else if (str.find(userDirectory()) == 0){
+ str.erase(0, userDirectory().length());
+ }
return str;
}
}
diff --git a/util/file-system.h b/util/file-system.h
index 7fe3021f..6f3cc848 100644
--- a/util/file-system.h
+++ b/util/file-system.h
@@ -1,32 +1,39 @@
#ifndef _paintown_file_system_h
#define _paintown_file_system_h
#include <exception>
#include <string>
+#include <vector>
namespace Filesystem{
class NotFound: public std::exception {
public:
NotFound(const std::string & file);
virtual ~NotFound() throw();
const std::string & getReason() const {
return reason;
}
private:
std::string reason;
};
/* given a relative path like sounds/arrow.png, prepend the proper
* data path to it to give data/sounds/arrow.png
*/
std::string find(const std::string & path) throw (NotFound);
/* remove the data path from a string
* data/sounds/arrow.png -> sounds/arrow.png
*/
std::string cleanse(const std::string & path);
+
+ /* returns all the directories starting with the given path.
+ * will look in the main data directory, the user directory, and
+ * the current working directory.
+ */
+ std::vector<std::string> findDirectories(const std::string & path);
}
#endif
diff --git a/util/system.cpp b/util/system.cpp
index a37a8ffe..caf8598b 100644
--- a/util/system.cpp
+++ b/util/system.cpp
@@ -1,37 +1,37 @@
#include <string>
#include "system.h"
#ifndef WINDOWS
#include <unistd.h>
#include <sys/stat.h>
#endif
#ifndef WINDOWS
static bool isReadable(const std::string & path){
if (access(path.c_str(), R_OK) == 0){
return true;
} else {
return false;
}
}
-static bool isDirectory(const std::string & path){
+bool System::isDirectory(const std::string & path){
struct stat info;
if (stat(path.c_str(), &info) == 0){
if (S_ISDIR(info.st_mode) == 1){
return true;
} else {
return false;
}
}
return false;
}
bool System::readableFile(const std::string & path){
return isReadable(path) && ! isDirectory(path);
}
bool System::readable(const std::string & path){
return isReadable(path);
}
#endif
diff --git a/util/system.h b/util/system.h
index 1393b767..499878b8 100644
--- a/util/system.h
+++ b/util/system.h
@@ -1,13 +1,14 @@
#ifndef _paintown_system_h
#define _paintown_system_h
/* system utilities */
#include <string>
namespace System{
+ bool isDirectory(const std::string & path);
bool readableFile(const std::string & path);
bool readable(const std::string & path);
}
#endif
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Jun 11, 1:37 PM (3 w, 4 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
69281
Default Alt Text
(5 KB)
Attached To
Mode
R75 R-Tech1
Attached
Detach File
Event Timeline