diff options
| -rw-r--r-- | audioLoader.xml | 6 | ||||
| -rw-r--r-- | nodeList.xml | 27 | ||||
| -rw-r--r-- | onandoff.xml | 57 | ||||
| -rw-r--r-- | poco-httpd/Makefile | 221 | ||||
| -rw-r--r-- | poco-httpd/poco-httpd.cpp | 169 | ||||
| -rw-r--r-- | rotord/Makefile | 221 | ||||
| -rw-r--r-- | rotord/rotord.cpp | 88 | ||||
| -rw-r--r-- | rotord/rotord.h | 77 | ||||
| -rw-r--r-- | rotord/rotord.xml | 4 |
9 files changed, 870 insertions, 0 deletions
diff --git a/audioLoader.xml b/audioLoader.xml new file mode 100644 index 0000000..3b39405 --- /dev/null +++ b/audioLoader.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<node ID="01" type="audioLoader">music track to analyse + <output ID="01" type="graph">beat (sawtooth)</output> + <output ID="02" type="graph">pitch</output> + <output ID="03" type="graph">excitement</output> +</node>
\ No newline at end of file diff --git a/nodeList.xml b/nodeList.xml new file mode 100644 index 0000000..57605c3 --- /dev/null +++ b/nodeList.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<node ID="01" type="audioLoader">music track to analyse + <output ID="01" type="graph">beat (sawtooth)</output> + <output ID="02" type="graph">pitch</output> + <output ID="03" type="graph">excitement</output> +</node> +<node ID="02" type="imageloader" thumbnail="">video or image + <output ID="01" type="RGB"/> + <output ID="02" type="RGBA"/> + <output ID="03" type="RGBZ"/> + <output ID="04" type="LUM"/> +</node> +<node ID="03" type="videoBank" mode="pingpong"> + <clip ID="01" file="sample.mov"/> + <input ID="01" fromID="01.01" type="graph"/>cycle + <input ID="02" fromID="01.01" type="graph"/>random + <output ID="02" type="RGB"/> +</node> + + +<node ID="05" UID="d9926bc4-720d-11e2-ad07-0fe64abef8bd" thumbnail="switch.png">Toggle switch + <setting ID="01" type="switch" name="mode" value="1" min="0" max="1">Mode</setting> + <setting ID="02" type="int" name="control" value="1">Control</setting> + <input ID="03" type="RGB">Input 1</input> + <input ID="04" type="RGB">Input 2</input> + <output ID="05" toID="07.02" type="RGB">Output</output> +</node> diff --git a/onandoff.xml b/onandoff.xml new file mode 100644 index 0000000..d7be0b5 --- /dev/null +++ b/onandoff.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<canvas description="Off and on template ©Rotor 2013"> + <node ID="01" type="audioLoader">music track to analyse + <output ID="01" type="graph">beat (sawtooth)</output> + <output ID="03" type="graph">excitement</output> + </node> + <node ID="02" type="imageLoader" thumbnail="performance1.jpg">performance take 1 + <output ID="01" type="RGB"/> + </node> + <node ID="03" type="imageLoader" thumbnail="performance1.jpg">performance take 2 + <output ID="01" type="RGB"/> + </node> + <node ID="04" type="==">1 + <input ID="01" fromID="01.01" type="graph"/> + <output ID="02" type="graph"/> + </node> + <node ID="05" type="toggle switch" > + <input ID="01" fromID="02.01" type="RGB"/> + <input ID="02" fromID="03.01" type="RGB"/> + <input ID="03" fromID="04.02" type="graph"/> + <output ID="04" type="RGB"/> + </node> + <node ID="06" type="frequency/offset" frequency="0.25" offset="1"> + <input ID="01" fromID="01.01" type="graph"/> + <output ID="02" type="graph"/> + </node> + <node ID="07" type="*">2 + <input ID="01" fromID="06.02" type="graph"/> + <output ID="02" type="graph"/> + </node> + <node ID="08" type="==">1 + <input ID="01" fromID="06.02" type="graph"/> + <output ID="02" type="graph"/> + </node> + <node ID="09" type="videoBank" mode="pingpong"> + <clip ID="01" file="sample.mov"/> + <input ID="01" fromID="08.02" type="graph"/>cycle switch + <output ID="02" type="RGB"/> + </node> + <node ID="10" type="shape" mode="triangle"> + <input ID="01" fromID="07.02" type="graph"/>scale + <output ID="02" type="LUM"/> + </node> + <node ID="11" type="channel merge" > + <input fromID="02.01" type="scale"/> + <output ID="09" type="LUM"/> + </node> +</canvas> + + +//node IDs - specific to the patch or universal (can they be renumbered?) +//connector nodes - all in the patch or just mention the ones that are used +//connector IDs - to identify connectors? seperate cIDs within a subcanvas? so- input fromID="02.01" +//how do we identify a connector? -by type (seperate for each connector) - or by ID - or by description? +//OR have a unique identifier for every node? + +//
\ No newline at end of file diff --git a/poco-httpd/Makefile b/poco-httpd/Makefile new file mode 100644 index 0000000..9098836 --- /dev/null +++ b/poco-httpd/Makefile @@ -0,0 +1,221 @@ +# The pre-processor and compiler options. +MY_CFLAGS = + +# The linker options. +MY_LIBS = -lPocoNet -lPocoXML -lPocoUtil -lPocoFoundation + +# The pre-processor options used by the cpp (man cpp for more). +CPPFLAGS = -Wall + +# The options used in linking as well as in any direct use of ld. +LDFLAGS = + +# The directories in which source files reside. +# If not specified, only the current directory will be serached. +SRCDIRS = + +# The executable file name. +# If not specified, current directory name or `a.out' will be used. +PROGRAM = + +## Implicit Section: change the following only when necessary. +##========================================================================== + +# The source file types (headers excluded). +# .c indicates C source files, and others C++ ones. +SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp + +# The header file types. +HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp + +# The pre-processor and compiler options. +# Users can override those variables from the command line. +CFLAGS = -g -O2 +CXXFLAGS= -g -O2 + +# The C program compiler. +#CC = gcc + +# The C++ program compiler. +#CXX = g++ + +# Un-comment the following line to compile C programs as C++ ones. +#CC = $(CXX) + +# The command used to delete file. +#RM = rm -f + +ETAGS = etags +ETAGSFLAGS = + +CTAGS = ctags +CTAGSFLAGS = + +## Stable Section: usually no need to be changed. But you can add more. +##========================================================================== +SHELL = /bin/sh +EMPTY = +SPACE = $(EMPTY) $(EMPTY) +ifeq ($(PROGRAM),) + CUR_PATH_NAMES = $(subst /,$(SPACE),$(subst $(SPACE),_,$(CURDIR))) + PROGRAM = $(word $(words $(CUR_PATH_NAMES)),$(CUR_PATH_NAMES)) + ifeq ($(PROGRAM),) + PROGRAM = a.out + endif +endif +ifeq ($(SRCDIRS),) + SRCDIRS = . +endif +SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) +HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS)))) +SRC_CXX = $(filter-out %.c,$(SOURCES)) +OBJS = $(addsuffix .o, $(basename $(SOURCES))) +DEPS = $(OBJS:.o=.d) + +## Define some useful variables. +DEP_OPT = $(shell if `$(CC) --version | grep "GCC" >/dev/null`; then \ + echo "-MM -MP"; else echo "-M"; fi ) +DEPEND = $(CC) $(DEP_OPT) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) +DEPEND.d = $(subst -g ,,$(DEPEND)) +COMPILE.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) -c +COMPILE.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c +LINK.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) +LINK.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) + +.PHONY: all objs tags ctags clean distclean help show + +# Delete the default suffixes +.SUFFIXES: + +all: $(PROGRAM) + +# Rules for creating dependency files (.d). +#------------------------------------------ + +%.d:%.c + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.C + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.cc + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.cpp + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.CPP + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.c++ + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.cp + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.cxx + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +# Rules for generating object files (.o). +#---------------------------------------- +objs:$(OBJS) + +%.o:%.c + $(COMPILE.c) $< -o $@ + +%.o:%.C + $(COMPILE.cxx) $< -o $@ + +%.o:%.cc + $(COMPILE.cxx) $< -o $@ + +%.o:%.cpp + $(COMPILE.cxx) $< -o $@ + +%.o:%.CPP + $(COMPILE.cxx) $< -o $@ + +%.o:%.c++ + $(COMPILE.cxx) $< -o $@ + +%.o:%.cp + $(COMPILE.cxx) $< -o $@ + +%.o:%.cxx + $(COMPILE.cxx) $< -o $@ + +# Rules for generating the tags. +#------------------------------------- +tags: $(HEADERS) $(SOURCES) + $(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES) + +ctags: $(HEADERS) $(SOURCES) + $(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES) + +# Rules for generating the executable. +#------------------------------------- +$(PROGRAM):$(OBJS) +ifeq ($(SRC_CXX),) # C program + $(LINK.c) $(OBJS) $(MY_LIBS) -o $@ + @echo Type ./$@ to execute the program. +else # C++ program + $(LINK.cxx) $(OBJS) $(MY_LIBS) -o $@ + @echo Type ./$@ to execute the program. +endif + +ifndef NODEP +ifneq ($(DEPS),) + sinclude $(DEPS) +endif +endif + +clean: + $(RM) $(OBJS) $(PROGRAM) $(PROGRAM).exe + +distclean: clean + $(RM) $(DEPS) TAGS + +# Show help. +help: + @echo 'Generic Makefile for C/C++ Programs (gcmakefile) version 0.5' + @echo 'Copyright (C) 2007, 2008 whyglinux <whyglinux@hotmail.com>' + @echo + @echo 'Usage: make [TARGET]' + @echo 'TARGETS:' + @echo ' all (=make) compile and link.' + @echo ' NODEP=yes make without generating dependencies.' + @echo ' objs compile only (no linking).' + @echo ' tags create tags for Emacs editor.' + @echo ' ctags create ctags for VI editor.' + @echo ' clean clean objects and the executable file.' + @echo ' distclean clean objects, the executable and dependencies.' + @echo ' show show variables (for debug use only).' + @echo ' help print this message.' + @echo + @echo 'Report bugs to <whyglinux AT gmail DOT com>.' + +# Show variables (for debug use only.) +show: + @echo 'PROGRAM :' $(PROGRAM) + @echo 'SRCDIRS :' $(SRCDIRS) + @echo 'HEADERS :' $(HEADERS) + @echo 'SOURCES :' $(SOURCES) + @echo 'SRC_CXX :' $(SRC_CXX) + @echo 'OBJS :' $(OBJS) + @echo 'DEPS :' $(DEPS) + @echo 'DEPEND :' $(DEPEND) + @echo 'COMPILE.c :' $(COMPILE.c) + @echo 'COMPILE.cxx :' $(COMPILE.cxx) + @echo 'link.c :' $(LINK.c) + @echo 'link.cxx :' $(LINK.cxx) + +## End of the Makefile ## Suggestions are welcome ## All rights reserved ## +############################################################################# diff --git a/poco-httpd/poco-httpd.cpp b/poco-httpd/poco-httpd.cpp new file mode 100644 index 0000000..5ca33b6 --- /dev/null +++ b/poco-httpd/poco-httpd.cpp @@ -0,0 +1,169 @@ +#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/Timestamp.h" +#include "Poco/DateTimeFormatter.h" +#include "Poco/DateTimeFormat.h" +#include "Poco/Exception.h" +#include "Poco/ThreadPool.h" +#include "Poco/Util/ServerApplication.h" +#include "Poco/Util/Option.h" +#include "Poco/Util/OptionSet.h" +#include "Poco/Util/HelpFormatter.h" +#include <iostream> + +using Poco::Net::ServerSocket; +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::Util::ServerApplication; +using Poco::Util::Application; +using Poco::Util::Option; +using Poco::Util::OptionSet; +using Poco::Util::OptionCallback; +using Poco::Util::HelpFormatter; + +class TimeRequestHandler: public HTTPRequestHandler +{ +public: + TimeRequestHandler(const std::string& format): _format(format) + { + } + + void handleRequest(HTTPServerRequest& request, + HTTPServerResponse& response) + { + Application& app = Application::instance(); + app.logger().information("Request from " + + request.clientAddress().toString()); + + Timestamp now; + std::string dt(DateTimeFormatter::format(now, _format)); + + response.setChunkedTransferEncoding(true); + response.setContentType("text/html"); + + std::ostream& ostr = response.send(); + ostr << "<html><head><title>HTTPTimeServer powered by " + "POCO C++ Libraries</title>"; + ostr << "<meta http-equiv=\"refresh\" content=\"1\"></head>"; + ostr << "<body><p style=\"text-align: center; " + "font-size: 48px;\">"; + ostr << dt; + ostr << "</p></body></html>"; + } + +private: + std::string _format; +}; + +class TimeRequestHandlerFactory: public HTTPRequestHandlerFactory +{ +public: + TimeRequestHandlerFactory(const std::string& format): + _format(format) + { + } + + HTTPRequestHandler* createRequestHandler( + const HTTPServerRequest& request) + { + if (request.getURI() == "/") + return new TimeRequestHandler(_format); + else + return 0; + } + +private: + std::string _format; +}; + +class HTTPTimeServer: public Poco::Util::ServerApplication +{ +public: + HTTPTimeServer(): _helpRequested(false) + { + } + + ~HTTPTimeServer() + { + } + +protected: + void initialize(Application& self) + { + loadConfiguration(); + ServerApplication::initialize(self); + } + + void uninitialize() + { + ServerApplication::uninitialize(); + } + + void defineOptions(OptionSet& options) + { + ServerApplication::defineOptions(options); + + options.addOption( + Option("help", "h", "display argument help information") + .required(false) + .repeatable(false) + .callback(OptionCallback<HTTPTimeServer>( + this, &HTTPTimeServer::handleHelp))); + } + + void handleHelp(const std::string& name, + const std::string& value) + { + HelpFormatter helpFormatter(options()); + helpFormatter.setCommand(commandName()); + helpFormatter.setUsage("OPTIONS"); + helpFormatter.setHeader( + "A web server that serves the current date and time."); + helpFormatter.format(std::cout); + stopOptionsProcessing(); + _helpRequested = true; + } + + int main(const std::vector<std::string>& args) + { + if (!_helpRequested) + { + unsigned short port = (unsigned short) + config().getInt("HTTPTimeServer.port", 9980); + std::string format( + config().getString("HTTPTimeServer.format", + DateTimeFormat::SORTABLE_FORMAT)); + + ServerSocket svs(port); + HTTPServer srv(new TimeRequestHandlerFactory(format), + svs, new HTTPServerParams); + srv.start(); + waitForTerminationRequest(); + srv.stop(); + } + return Application::EXIT_OK; + } + +private: + bool _helpRequested; +}; + +int main(int argc, char** argv) +{ + HTTPTimeServer app; + return app.run(argc, argv); +}
\ No newline at end of file diff --git a/rotord/Makefile b/rotord/Makefile new file mode 100644 index 0000000..9098836 --- /dev/null +++ b/rotord/Makefile @@ -0,0 +1,221 @@ +# The pre-processor and compiler options. +MY_CFLAGS = + +# The linker options. +MY_LIBS = -lPocoNet -lPocoXML -lPocoUtil -lPocoFoundation + +# The pre-processor options used by the cpp (man cpp for more). +CPPFLAGS = -Wall + +# The options used in linking as well as in any direct use of ld. +LDFLAGS = + +# The directories in which source files reside. +# If not specified, only the current directory will be serached. +SRCDIRS = + +# The executable file name. +# If not specified, current directory name or `a.out' will be used. +PROGRAM = + +## Implicit Section: change the following only when necessary. +##========================================================================== + +# The source file types (headers excluded). +# .c indicates C source files, and others C++ ones. +SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp + +# The header file types. +HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp + +# The pre-processor and compiler options. +# Users can override those variables from the command line. +CFLAGS = -g -O2 +CXXFLAGS= -g -O2 + +# The C program compiler. +#CC = gcc + +# The C++ program compiler. +#CXX = g++ + +# Un-comment the following line to compile C programs as C++ ones. +#CC = $(CXX) + +# The command used to delete file. +#RM = rm -f + +ETAGS = etags +ETAGSFLAGS = + +CTAGS = ctags +CTAGSFLAGS = + +## Stable Section: usually no need to be changed. But you can add more. +##========================================================================== +SHELL = /bin/sh +EMPTY = +SPACE = $(EMPTY) $(EMPTY) +ifeq ($(PROGRAM),) + CUR_PATH_NAMES = $(subst /,$(SPACE),$(subst $(SPACE),_,$(CURDIR))) + PROGRAM = $(word $(words $(CUR_PATH_NAMES)),$(CUR_PATH_NAMES)) + ifeq ($(PROGRAM),) + PROGRAM = a.out + endif +endif +ifeq ($(SRCDIRS),) + SRCDIRS = . +endif +SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) +HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS)))) +SRC_CXX = $(filter-out %.c,$(SOURCES)) +OBJS = $(addsuffix .o, $(basename $(SOURCES))) +DEPS = $(OBJS:.o=.d) + +## Define some useful variables. +DEP_OPT = $(shell if `$(CC) --version | grep "GCC" >/dev/null`; then \ + echo "-MM -MP"; else echo "-M"; fi ) +DEPEND = $(CC) $(DEP_OPT) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) +DEPEND.d = $(subst -g ,,$(DEPEND)) +COMPILE.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) -c +COMPILE.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c +LINK.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) +LINK.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) + +.PHONY: all objs tags ctags clean distclean help show + +# Delete the default suffixes +.SUFFIXES: + +all: $(PROGRAM) + +# Rules for creating dependency files (.d). +#------------------------------------------ + +%.d:%.c + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.C + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.cc + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.cpp + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.CPP + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.c++ + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.cp + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +%.d:%.cxx + @echo -n $(dir $<) > $@ + @$(DEPEND.d) $< >> $@ + +# Rules for generating object files (.o). +#---------------------------------------- +objs:$(OBJS) + +%.o:%.c + $(COMPILE.c) $< -o $@ + +%.o:%.C + $(COMPILE.cxx) $< -o $@ + +%.o:%.cc + $(COMPILE.cxx) $< -o $@ + +%.o:%.cpp + $(COMPILE.cxx) $< -o $@ + +%.o:%.CPP + $(COMPILE.cxx) $< -o $@ + +%.o:%.c++ + $(COMPILE.cxx) $< -o $@ + +%.o:%.cp + $(COMPILE.cxx) $< -o $@ + +%.o:%.cxx + $(COMPILE.cxx) $< -o $@ + +# Rules for generating the tags. +#------------------------------------- +tags: $(HEADERS) $(SOURCES) + $(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES) + +ctags: $(HEADERS) $(SOURCES) + $(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES) + +# Rules for generating the executable. +#------------------------------------- +$(PROGRAM):$(OBJS) +ifeq ($(SRC_CXX),) # C program + $(LINK.c) $(OBJS) $(MY_LIBS) -o $@ + @echo Type ./$@ to execute the program. +else # C++ program + $(LINK.cxx) $(OBJS) $(MY_LIBS) -o $@ + @echo Type ./$@ to execute the program. +endif + +ifndef NODEP +ifneq ($(DEPS),) + sinclude $(DEPS) +endif +endif + +clean: + $(RM) $(OBJS) $(PROGRAM) $(PROGRAM).exe + +distclean: clean + $(RM) $(DEPS) TAGS + +# Show help. +help: + @echo 'Generic Makefile for C/C++ Programs (gcmakefile) version 0.5' + @echo 'Copyright (C) 2007, 2008 whyglinux <whyglinux@hotmail.com>' + @echo + @echo 'Usage: make [TARGET]' + @echo 'TARGETS:' + @echo ' all (=make) compile and link.' + @echo ' NODEP=yes make without generating dependencies.' + @echo ' objs compile only (no linking).' + @echo ' tags create tags for Emacs editor.' + @echo ' ctags create ctags for VI editor.' + @echo ' clean clean objects and the executable file.' + @echo ' distclean clean objects, the executable and dependencies.' + @echo ' show show variables (for debug use only).' + @echo ' help print this message.' + @echo + @echo 'Report bugs to <whyglinux AT gmail DOT com>.' + +# Show variables (for debug use only.) +show: + @echo 'PROGRAM :' $(PROGRAM) + @echo 'SRCDIRS :' $(SRCDIRS) + @echo 'HEADERS :' $(HEADERS) + @echo 'SOURCES :' $(SOURCES) + @echo 'SRC_CXX :' $(SRC_CXX) + @echo 'OBJS :' $(OBJS) + @echo 'DEPS :' $(DEPS) + @echo 'DEPEND :' $(DEPEND) + @echo 'COMPILE.c :' $(COMPILE.c) + @echo 'COMPILE.cxx :' $(COMPILE.cxx) + @echo 'link.c :' $(LINK.c) + @echo 'link.cxx :' $(LINK.cxx) + +## End of the Makefile ## Suggestions are welcome ## All rights reserved ## +############################################################################# diff --git a/rotord/rotord.cpp b/rotord/rotord.cpp new file mode 100644 index 0000000..ccb770b --- /dev/null +++ b/rotord/rotord.cpp @@ -0,0 +1,88 @@ +#include "rotord.h" + +RotorRequestHandler::RotorRequestHandler(const std::string& format): _format(format){ +} + +void RotorRequestHandler::handleRequest(HTTPServerRequest& request,HTTPServerResponse& response) { + + Timestamp now; + std::string dt(DateTimeFormatter::format(now, _format)); + + response.setChunkedTransferEncoding(true); + response.setContentType("text/html"); + + std::ostream& ostr = response.send(); + ostr << "<html><head><title>RotorServer powered by " + "POCO C++ Libraries</title>"; + ostr << "<meta http-equiv=\"refresh\" content=\"1\"></head>"; + ostr << "<body><p style=\"text-align: center; " + "font-size: 48px;\">"; + ostr << dt; + ostr << "</p></body></html>"; +} + + +RotorRequestHandlerFactory::RotorRequestHandlerFactory(const std::string& format):_format(format){ +} + +HTTPRequestHandler* RotorRequestHandlerFactory::createRequestHandler(const HTTPServerRequest& request){ + Application& app = Application::instance(); + app.logger().information("Request from "+ request.clientAddress().toString()+": "+request.getURI()); + if (request.getURI() == "/") + return new RotorRequestHandler(_format); + else + return 0; +} + + +RotorServer::RotorServer(): _helpRequested(false) +{ +} + +RotorServer::~RotorServer() +{ +} + +void RotorServer::initialize(Application& self){ + loadConfiguration(); + ServerApplication::initialize(self); +} + +void RotorServer::uninitialize(){ + ServerApplication::uninitialize(); +} + +void RotorServer::defineOptions(OptionSet& options) { + ServerApplication::defineOptions(options); + options.addOption( + Option("help", "h", "display argument help information") + .required(false) + .repeatable(false) + .callback(OptionCallback<RotorServer>(this, &RotorServer::handleHelp) + ) + ); +} + +void RotorServer::handleHelp(const std::string& name, const std::string& value){ + HelpFormatter helpFormatter(options()); + helpFormatter.setCommand(commandName()); + helpFormatter.setUsage("OPTIONS"); + helpFormatter.setHeader( + "Rotor"); + helpFormatter.format(std::cout); + stopOptionsProcessing(); + _helpRequested = true; +} + +int RotorServer::main(const std::vector<std::string>& args){ + if (!_helpRequested) { + unsigned short port = (unsigned short) config().getInt("port", 9980); + std::string format(config().getString("format", DateTimeFormat::SORTABLE_FORMAT)); + ServerSocket svs(port); + HTTPServer srv(new RotorRequestHandlerFactory(format), svs, new HTTPServerParams); + srv.start(); + waitForTerminationRequest(); + srv.stop(); + } + return Application::EXIT_OK; +} diff --git a/rotord/rotord.h b/rotord/rotord.h new file mode 100644 index 0000000..c5f632b --- /dev/null +++ b/rotord/rotord.h @@ -0,0 +1,77 @@ +#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/Timestamp.h" +#include "Poco/DateTimeFormatter.h" +#include "Poco/DateTimeFormat.h" +#include "Poco/Exception.h" +#include "Poco/ThreadPool.h" +#include "Poco/Util/ServerApplication.h" +#include "Poco/Util/Option.h" +#include "Poco/Util/OptionSet.h" +#include "Poco/Util/HelpFormatter.h" +#include <iostream> + +#include "Poco/URI.h" + +using Poco::Net::ServerSocket; +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::Util::ServerApplication; +using Poco::Util::Application; +using Poco::Util::Option; +using Poco::Util::OptionSet; +using Poco::Util::OptionCallback; +using Poco::Util::HelpFormatter; + +class RotorRequestHandler: public HTTPRequestHandler +{ + public: + RotorRequestHandler(const std::string& format); + void handleRequest(HTTPServerRequest& request,HTTPServerResponse& response); + private: + std::string _format; +}; + +class RotorRequestHandlerFactory: public HTTPRequestHandlerFactory +{ + public: + RotorRequestHandlerFactory(const std::string& format); + HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request); + private: + std::string _format; +}; + +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<std::string>& args); + private: + bool _helpRequested; +}; + +int main(int argc, char** argv) +{ + RotorServer app; + return app.run(argc, argv); +}
\ No newline at end of file diff --git a/rotord/rotord.xml b/rotord/rotord.xml new file mode 100644 index 0000000..0a9422f --- /dev/null +++ b/rotord/rotord.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<config> + <port>9000</port> +</config>
\ No newline at end of file |
