diff options
-rw-r--r-- | http_json.cpp | 34 | ||||
-rw-r--r-- | http_json.h | 15 | ||||
-rw-r--r-- | main.cpp | 4 |
3 files changed, 53 insertions, 0 deletions
diff --git a/http_json.cpp b/http_json.cpp new file mode 100644 index 0000000..d769e5e --- /dev/null +++ b/http_json.cpp @@ -0,0 +1,34 @@ +#include "http_json.h" +#include "json.h" +#include "music.h" + +void HTTP::JSON::operator()(Connection::p connection) { + std::string directory; + if(connection->args.find("directory") != connection->args.end()) { + directory = connection->args["directory"]; + } else { + directory = "/"; + } + + ::JSON::Array results; + + MusicDirectory::p dir = music::get_directory(directory); + for(MusicDirectory::PathListings::iterator it = dir->directories.begin(); it != dir->directories.end(); it++) { + ::JSON::Object obj; + obj["type"] = std::string("dir"); + // relative path + obj["name"] = it->string().substr(music::root_directory.string().size()); + results.push_back(obj); + } + for(MusicDirectory::PathListings::iterator it = dir->tracks.begin(); it != dir->tracks.end(); it++) { + ::JSON::Object obj; + obj["type"] = std::string("file"); + obj["name"] = it->string().substr(music::root_directory.string().size()); + obj["size"] = (int)fs::file_size(*it); + results.push_back(obj); + } + + std::stringstream ss; + ss << results; + connection->send_data(ss); +} diff --git a/http_json.h b/http_json.h new file mode 100644 index 0000000..14addef --- /dev/null +++ b/http_json.h @@ -0,0 +1,15 @@ +#ifndef HTTP_JSON_H +#define HTTP_JSON_H + +#include "http_connection.h" + +namespace HTTP { + //! JSON handler. + class JSON { + public: + //! Handle request. + void operator()(Connection::p connection); + }; +}; + +#endif @@ -6,6 +6,7 @@ #include "telnetd.h" #include "http_static.h" +#include "http_json.h" #include <iostream> #include <vector> @@ -39,6 +40,9 @@ int main(int argc, char **argv) { HTTP::Static static_files("static"); httpd.add_handler("static", static_files); httpd.add_handler("", static_files); + + HTTP::JSON http_json; + httpd.add_handler("list", http_json); telnet::Server telnetd(io_service, tcp::endpoint(tcp::v6(), config::vm["audist.telnetd_port"].as<int>())); |