summaryrefslogtreecommitdiff
path: root/music.cpp
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2010-12-29 21:54:04 +0100
committerJon Bergli Heier <snakebite@jvnv.net>2010-12-29 21:54:04 +0100
commitd67fd6103956046245744cf5cf094d4da8cbcc19 (patch)
tree3e0dc28c50644ae271e8b208eb8cb362e0e5a43a /music.cpp
parent945887004432a7634ce096a7c3744b42ae2ab987 (diff)
Don't read entire directory tree into memory.
Diffstat (limited to 'music.cpp')
-rw-r--r--music.cpp54
1 files changed, 20 insertions, 34 deletions
diff --git a/music.cpp b/music.cpp
index c1ce8f4..2c3b788 100644
--- a/music.cpp
+++ b/music.cpp
@@ -9,40 +9,28 @@
namespace music {
-MusicDirectory *root_directory = NULL;
+fs::path root_directory;
void init(std::string root) {
// remove trailing slash
if(boost::algorithm::ends_with(root, "/"))
root = root.substr(0, root.size()-1);
- root_directory = new MusicDirectory(root);
+ root_directory = root;
}
-MusicListing *find(std::string path, MusicDirectory& root) {
- // remove trailing slash
- if(boost::algorithm::ends_with(path, "/"))
- path = path.substr(0, path.size()-1);
-
- fs::path full_path = root_directory->path / path;
- if(root.path == full_path)
- return &root;
+MusicListing::p get(const std::string path) {
+ // prefix path with our root_directory
+ fs::path p = root_directory / path;
- for(MusicDirectories::iterator it = root.directories.begin(); it != root.directories.end(); it++) {
- MusicListing *ml = find(path, *it);
- if(ml) return ml;
- }
- for(MusicTracks::iterator it = root.tracks.begin(); it != root.tracks.end(); it++) {
- std::string rel_path = it->path.string().substr(root_directory->path.string().size());
- std::cout << rel_path << std::endl;
- if(rel_path == path)
- return &(*it);
+ if(fs::is_directory(p)) {
+ boost::shared_ptr<MusicListing> ml(new MusicDirectory(p));
+ return ml;
+ } else if(fs::is_regular_file(p)) {
+ boost::shared_ptr<MusicListing> ml(new MusicTrack(p));
+ return ml;
}
- return NULL;
-}
-
-MusicListing *find(std::string path) {
- return find(path, *root_directory);
+ return MusicListing::p();
}
}; // namespace music
@@ -50,12 +38,12 @@ MusicListing *find(std::string path) {
void MusicDirectory::render(HTTPRequest& req, HTTPResponse& res) {
res.add_header("content-type", "text/html");
- for(MusicDirectories::iterator it = directories.begin(); it != directories.end(); it++) {
- std::string rel_path = it->path.string().substr(music::root_directory->path.string().size());
+ for(PathListings::iterator it = directories.begin(); it != directories.end(); it++) {
+ std::string rel_path = it->string().substr(music::root_directory.string().size());
res.write(boost::str(boost::format("<a href=\"%s\">%s</a><br />") % rel_path % rel_path));
}
- for(MusicTracks::iterator it = tracks.begin(); it != tracks.end(); it++) {
- std::string rel_path = it->path.string().substr(music::root_directory->path.string().size());
+ for(PathListings::iterator it = tracks.begin(); it != tracks.end(); it++) {
+ std::string rel_path = it->string().substr(music::root_directory.string().size());
res.write(boost::str(boost::format("<a href=\"%s\">%s</a><br />") % rel_path % rel_path));
}
}
@@ -67,16 +55,14 @@ MusicTrack::MusicTrack(const fs::path path) {
MusicDirectory::MusicDirectory(const fs::path root) {
this->path = root;
- std::cout << root << std::endl;
-
- fs::path p(root);
+ std::cout << this->path << std::endl;
fs::directory_iterator end_itr;
- for(fs::directory_iterator it(p); it != end_itr; it++) {
+ for(fs::directory_iterator it(this->path); it != end_itr; it++) {
if(fs::is_directory(it->status())) {
- directories.push_back(MusicDirectory(it->path().string()));
+ directories.push_back(it->path());
} else if(fs::is_regular_file(it->status())) {
- tracks.push_back(MusicTrack(it->path().string()));
+ tracks.push_back(it->path());
}
}
}