#include "Poco/Net/HTTPServer.h" #include "Poco/Net/HTTPRequestHandler.h" #include "Poco/Net/HTTPRequestHandlerFactory.h" #include "Poco/Net/HTTPServerParams.h" #include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerResponse.h" #include "Poco/Net/HTTPServerParams.h" #include "Poco/Net/ServerSocket.h" #include "Poco/UUIDGenerator.h" #include "Poco/Timestamp.h" #include "Poco/DateTimeFormatter.h" #include "Poco/DateTimeFormat.h" #include "Poco/Exception.h" #include "Poco/ThreadPool.h" #include "Poco/Task.h" #include "Poco/NotificationCenter.h" #include "Poco/TaskManager.h" #include "Poco/Util/ServerApplication.h" #include "Poco/Util/Option.h" #include "Poco/Util/OptionSet.h" #include "Poco/Util/HelpFormatter.h" #include "Poco/FileStream.h" #include "Poco/StreamCopier.h" #include "Poco/Net/HTTPStreamFactory.h" #include "Poco/StringTokenizer.h" #include #include #include "Poco/URI.h" #include "Poco/Channel.h" #include "Poco/SplitterChannel.h" #include "Poco/ConsoleChannel.h" #include "Poco/FormattingChannel.h" #include "Poco/FileChannel.h" #include "Poco/Message.h" #include "Poco/Formatter.h" #include "Poco/PatternFormatter.h" #include "Poco/AutoPtr.h" using Poco::Net::ServerSocket; using Poco::Net::HTTPResponse; using Poco::Net::HTTPRequestHandler; using Poco::Net::HTTPRequestHandlerFactory; using Poco::Net::HTTPServer; using Poco::Net::HTTPServerRequest; using Poco::Net::HTTPServerResponse; using Poco::Net::HTTPServerParams; using Poco::Timestamp; using Poco::DateTimeFormatter; using Poco::DateTimeFormat; using Poco::ThreadPool; using Poco::TaskManager; using Poco::Util::ServerApplication; using Poco::Util::Application; using Poco::Util::Option; using Poco::Util::OptionSet; using Poco::Util::OptionCallback; using Poco::Util::HelpFormatter; using Poco::Net::HTTPStreamFactory; using Poco::Logger; using Poco::Channel; using Poco::SplitterChannel; using Poco::ConsoleChannel; using Poco::FormattingChannel; using Poco::Formatter; using Poco::PatternFormatter; using Poco::FileChannel; using Poco::Message; using Poco::AutoPtr; #include "rendercontext.h" class RenderContextHandler: public HTTPRequestHandler { public: RenderContextHandler(string _content,HTTPServerResponse::HTTPStatus _status); void handleRequest(HTTPServerRequest& request,HTTPServerResponse& response); private: std::string content; HTTPServerResponse::HTTPStatus status; }; class RotorRequestHandlerFactory: public HTTPRequestHandlerFactory { public: RotorRequestHandlerFactory(): manager(pool){ xmlIO xml; if(xml.loadFile("settings.xml") ){ media_dir=xml.getAttribute("Rotor","media_dir","",0); thumbnail_dir=xml.getAttribute("Rotor","thumbnail_dir","",0); } pool.addCapacity(300); //g_type_init(); //required on server for rsvg library init - removed until rsvg restored //manager=Poco::TaskManager(pool); } HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request); private: std::unordered_map context; std::unordered_map renders; Poco::UUIDGenerator idGen; Poco::TaskManager manager; Poco::ThreadPool pool; std::string media_dir; std::string thumbnail_dir; }; class RotorServer: public Poco::Util::ServerApplication { public: RotorServer(); ~RotorServer(); protected: void initialize(Application& self); void uninitialize(); void defineOptions(OptionSet& options); void handleHelp(const std::string& name, const std::string& value); int main(const std::vector& args); private: bool _helpRequested; }; RotorServer app; //needs to be global for logger int main(int argc, char** argv) { AutoPtr splitterChannel(new SplitterChannel()); AutoPtr consoleChannel(new ConsoleChannel()); AutoPtr fileChannel(new FileChannel("Rotord.log")); splitterChannel->addChannel(consoleChannel); splitterChannel->addChannel(fileChannel); AutoPtr formatter(new PatternFormatter("%d-%m-%Y %H:%M:%S %s: %t")); AutoPtr formattingChannel(new FormattingChannel(formatter, splitterChannel)); Logger& logger = Logger::create("Rotor", formattingChannel, Message::PRIO_TRACE); logger.information("starting rendering daemon"); HTTPStreamFactory::registerFactory(); return app.run(argc, argv); }