From d67fd6103956046245744cf5cf094d4da8cbcc19 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 29 Dec 2010 21:54:04 +0100 Subject: Don't read entire directory tree into memory. --- music.cpp | 54 ++++++++++++++++++++---------------------------------- 1 file changed, 20 insertions(+), 34 deletions(-) (limited to 'music.cpp') 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 ml(new MusicDirectory(p)); + return ml; + } else if(fs::is_regular_file(p)) { + boost::shared_ptr 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("%s
") % 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("%s
") % 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()); } } } -- cgit v1.2.3