diff --git a/toREST/include/session.hpp b/toREST/include/session.hpp index bcf0a3f..e12afb1 100644 --- a/toREST/include/session.hpp +++ b/toREST/include/session.hpp @@ -18,59 +18,17 @@ namespace session { // virtual std::shared_ptr get_session() = 0; }; - class translate { - public: - static nlohmann::json to_json(const libtorrent::session_handle &handle){ - nlohmann::json session_json; - return session_json; - } - }; + class translate + { public: static nlohmann::json to_json(const libtorrent::session_handle &handle); }; class manager : public basic_manager { public: // std::shared_ptr get_session() override { return handle; } void set_session(std::shared_ptr session) override { handle=session; } - nlohmann::json get_json() const override { - nlohmann::json session_json; - session_json["peer_id"] = handle->id().to_string(); - session_json["is_paused"] = handle->is_paused(); - session_json["is_listening"] = handle->is_listening(); - session_json["listen_port"] = handle->listen_port(); - session_json["ssl_listen_port"] = handle->ssl_listen_port(); - return session_json; - }; + nlohmann::json get_json() const override ; bool is_valid() const override { return handle && handle->is_valid(); } - bool patch(const nlohmann::json &data) override { - int is_paused=data["is_paued"]; - int listen_port=data["listen_port"]; - - auto pause = [this](int is_paused){ - if(is_paused!=-1){ - if(is_paused==handle->is_paused()){ - return true; - }else if(is_paused==true){ - handle->resume(); - return true; - }else if(is_paused==false){ - handle->pause(); - return true; - } - } - return false; - }; - - auto listen = [this](int listen_port){ - if(listen_port!=-1&&listen_port>6880){ - libtorrent::settings_pack sp; - sp.set_str(libtorrent::settings_pack::listen_interfaces,"0.0.0.0:"+std::to_string(listen_port)); - handle->apply_settings(sp); - return true; - } - return false; - }; - - return pause(is_paused) && listen(listen_port); - }; + bool patch(const nlohmann::json &data) override ; + private: std::shared_ptr handle; }; @@ -101,29 +59,7 @@ namespace session { * @param[in] data takes an JSON object with at least one `action` set. * available `action`s are `is_paused` `listen_port` */ - virtual void patch(const nlohmann::json data=nlohmann::json::object()) override { - if(mgr && mgr->is_valid()){ - if(data.is_object() && !data.is_null()){ - int is_paused=util::json::get("is_paused",data,-1), - listen_port=util::json::get("listen_port",data,-1); - bool at_at_least_one_option_is_set=is_paused!=-1||listen_port!=-1; - if(at_at_least_one_option_is_set){ - nlohmann::json patch={{"is_paused",is_paused},{"listen_port",listen_port}}; - if(mgr->patch(patch)){ - return get_response().set_status(http::ok); - }else{ - return get_response().set_status(http::internal_server_error); - } - }else{ - return get_response().set_status(http::bad_request); - } - } - return get_response().set_status(http::bad_request); - // auto data=data.array(); - }else{ - return get_response().set_status(http::service_unavailable); - } - } + virtual void patch(const nlohmann::json&data=nlohmann::json::object()); // @todo should we return service unavailable or just method not allowed? virtual void del(nlohmann::json arg=nullptr) override { get_response().set_status(http::method_not_allowed); } diff --git a/toREST/src/session.cpp b/toREST/src/session.cpp new file mode 100644 index 0000000..a58fdef --- /dev/null +++ b/toREST/src/session.cpp @@ -0,0 +1,73 @@ +#include + +namespace session { + nlohmann::json translate::to_json(const libtorrent::session_handle &handle){ + nlohmann::json session_json; + return session_json; + } + + nlohmann::json manager::get_json() const { + nlohmann::json session_json; + session_json["peer_id"] = handle->id().to_string(); + session_json["is_paused"] = handle->is_paused(); + session_json["is_listening"] = handle->is_listening(); + session_json["listen_port"] = handle->listen_port(); + session_json["ssl_listen_port"] = handle->ssl_listen_port(); + return session_json; + } + + bool manager::patch(const nlohmann::json &data) { + int is_paused=data["is_paued"]; + int listen_port=data["listen_port"]; + + auto pause = [this](int is_paused){ + if(is_paused!=-1){ + if(is_paused==handle->is_paused()){ + return true; + }else if(is_paused==true){ + handle->resume(); + return true; + }else if(is_paused==false){ + handle->pause(); + return true; + } + } + return false; + }; + + auto listen = [this](int listen_port){ + if(listen_port!=-1&&listen_port>6880){ + libtorrent::settings_pack sp; + sp.set_str(libtorrent::settings_pack::listen_interfaces,"0.0.0.0:"+std::to_string(listen_port)); + handle->apply_settings(sp); + return true; + } + return false; + }; + + return pause(is_paused) && listen(listen_port); + }; + void resource::patch(const nlohmann::json &data){ + if(mgr && mgr->is_valid()){ + if(data.is_object() && !data.is_null()){ + int is_paused=util::json::get("is_paused",data,-1), + listen_port=util::json::get("listen_port",data,-1); + bool at_at_least_one_option_is_set=is_paused!=-1||listen_port!=-1; + if(at_at_least_one_option_is_set){ + nlohmann::json patch={{"is_paused",is_paused},{"listen_port",listen_port}}; + if(mgr->patch(patch)){ + return get_response().set_status(http::ok); + }else{ + return get_response().set_status(http::internal_server_error); + } + }else{ + return get_response().set_status(http::bad_request); + } + } + return get_response().set_status(http::bad_request); + // auto data=data.array(); + }else{ + return get_response().set_status(http::service_unavailable); + } + } +} \ No newline at end of file