summaryrefslogtreecommitdiff
path: root/cmps
diff options
context:
space:
mode:
authorgeronimo <geronimo013@gmx.de>2012-07-13 02:26:40 (GMT)
committergeronimo <geronimo013@gmx.de>2012-07-13 02:26:40 (GMT)
commit2d48ae784ea6828e8626c32c848f64232d8f35c0 (patch)
treefab114b03e91125783a778b835dd1913b039cebe /cmps
downloadcmp-2d48ae784ea6828e8626c32c848f64232d8f35c0.tar.gz
cmp-2d48ae784ea6828e8626c32c848f64232d8f35c0.tar.bz2
initial import
Diffstat (limited to 'cmps')
-rw-r--r--cmps/.dep.inc5
-rw-r--r--cmps/Makefile128
-rw-r--r--cmps/main.cc115
-rw-r--r--cmps/nbproject/Makefile-Debug.mk180
-rw-r--r--cmps/nbproject/Makefile-Release.mk160
-rw-r--r--cmps/nbproject/Makefile-impl.mk133
-rw-r--r--cmps/nbproject/Makefile-variables.mk35
-rw-r--r--cmps/nbproject/Package-Debug.bash75
-rw-r--r--cmps/nbproject/Package-Release.bash75
-rw-r--r--cmps/nbproject/configurations.xml227
-rw-r--r--cmps/nbproject/private/Makefile-variables.mk7
-rw-r--r--cmps/nbproject/private/configurations.xml72
-rw-r--r--cmps/nbproject/private/private.xml8
-rw-r--r--cmps/nbproject/project.xml31
-rw-r--r--cmps/server.cbp69
-rw-r--r--cmps/server.cbp.save69
-rw-r--r--cmps/server.depend1
-rw-r--r--cmps/server.layout9
-rw-r--r--cmps/server.layout.save9
-rw-r--r--cmps/serverlib/.dep.inc5
-rw-r--r--cmps/serverlib/Makefile128
-rw-r--r--cmps/serverlib/include/AbstractMediaRequestHandler.h42
-rw-r--r--cmps/serverlib/include/CommandHandler.h45
-rw-r--r--cmps/serverlib/include/HTMLListAssembler.h54
-rw-r--r--cmps/serverlib/include/HTTPMediaResponse.h43
-rw-r--r--cmps/serverlib/include/JSonListAssembler.h46
-rw-r--r--cmps/serverlib/include/MediaFileHandler.h43
-rw-r--r--cmps/serverlib/include/MediaListHandler.h58
-rw-r--r--cmps/serverlib/nbproject/Makefile-Debug.mk121
-rw-r--r--cmps/serverlib/nbproject/Makefile-Release.mk121
-rw-r--r--cmps/serverlib/nbproject/Makefile-impl.mk133
-rw-r--r--cmps/serverlib/nbproject/Makefile-variables.mk35
-rw-r--r--cmps/serverlib/nbproject/Package-Debug.bash75
-rw-r--r--cmps/serverlib/nbproject/Package-Release.bash75
-rw-r--r--cmps/serverlib/nbproject/configurations.xml92
-rw-r--r--cmps/serverlib/nbproject/private/Makefile-variables.mk7
-rw-r--r--cmps/serverlib/nbproject/private/configurations.xml72
-rw-r--r--cmps/serverlib/nbproject/private/private.xml8
-rw-r--r--cmps/serverlib/nbproject/project.xml25
-rw-r--r--cmps/serverlib/serverlib.cbp68
-rw-r--r--cmps/serverlib/serverlib.depend1
-rw-r--r--cmps/serverlib/serverlib.layout24
-rw-r--r--cmps/serverlib/serverlib.layout.save24
-rw-r--r--cmps/serverlib/src/AbstractMediaRequestHandler.cc46
-rw-r--r--cmps/serverlib/src/CommandHandler.cc94
-rw-r--r--cmps/serverlib/src/HTMLListAssembler.cc171
-rw-r--r--cmps/serverlib/src/HTTPMediaResponse.cc50
-rw-r--r--cmps/serverlib/src/JSonListAssembler.cc73
-rw-r--r--cmps/serverlib/src/MediaFileHandler.cc62
-rw-r--r--cmps/serverlib/src/MediaListHandler.cc101
-rw-r--r--cmps/serverlib/summary.txt1
-rw-r--r--cmps/summary.txt1
-rw-r--r--cmps/tests/CodecTest.cc77
-rw-r--r--cmps/tests/ConnectionHandlerTest.cc153
-rw-r--r--cmps/tests/DirTest.cc74
-rw-r--r--cmps/tests/FScanTest.cc137
-rw-r--r--cmps/tests/JSonTest.cc85
-rw-r--r--cmps/tests/StringBuilderTest.cc124
-rw-r--r--cmps/tests/URLTest.cc105
-rw-r--r--cmps/tests/UTF8Test.cc96
60 files changed, 4203 insertions, 0 deletions
diff --git a/cmps/.dep.inc b/cmps/.dep.inc
new file mode 100644
index 0000000..4560e55
--- /dev/null
+++ b/cmps/.dep.inc
@@ -0,0 +1,5 @@
+# This code depends on make tool being used
+DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES}))
+ifneq (${DEPFILES},)
+include ${DEPFILES}
+endif
diff --git a/cmps/Makefile b/cmps/Makefile
new file mode 100644
index 0000000..ec9de69
--- /dev/null
+++ b/cmps/Makefile
@@ -0,0 +1,128 @@
+#
+# There exist several targets which are by default empty and which can be
+# used for execution of your targets. These targets are usually executed
+# before and after some main targets. They are:
+#
+# .build-pre: called before 'build' target
+# .build-post: called after 'build' target
+# .clean-pre: called before 'clean' target
+# .clean-post: called after 'clean' target
+# .clobber-pre: called before 'clobber' target
+# .clobber-post: called after 'clobber' target
+# .all-pre: called before 'all' target
+# .all-post: called after 'all' target
+# .help-pre: called before 'help' target
+# .help-post: called after 'help' target
+#
+# Targets beginning with '.' are not intended to be called on their own.
+#
+# Main targets can be executed directly, and they are:
+#
+# build build a specific configuration
+# clean remove built files from a configuration
+# clobber remove all built files
+# all build all configurations
+# help print help mesage
+#
+# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
+# .help-impl are implemented in nbproject/makefile-impl.mk.
+#
+# Available make variables:
+#
+# CND_BASEDIR base directory for relative paths
+# CND_DISTDIR default top distribution directory (build artifacts)
+# CND_BUILDDIR default top build directory (object files, ...)
+# CONF name of current configuration
+# CND_PLATFORM_${CONF} platform name (current configuration)
+# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
+# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
+# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
+# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
+# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
+# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
+#
+# NOCDDL
+
+
+# Environment
+MKDIR=mkdir
+CP=cp
+CCADMIN=CCadmin
+
+
+# build
+build: .build-post
+
+.build-pre:
+# Add your pre 'build' code here...
+
+.build-post: .build-impl
+# Add your post 'build' code here...
+
+
+# clean
+clean: .clean-post
+
+.clean-pre:
+# Add your pre 'clean' code here...
+
+.clean-post: .clean-impl
+# Add your post 'clean' code here...
+
+
+# clobber
+clobber: .clobber-post
+
+.clobber-pre:
+# Add your pre 'clobber' code here...
+
+.clobber-post: .clobber-impl
+# Add your post 'clobber' code here...
+
+
+# all
+all: .all-post
+
+.all-pre:
+# Add your pre 'all' code here...
+
+.all-post: .all-impl
+# Add your post 'all' code here...
+
+
+# build tests
+build-tests: .build-tests-post
+
+.build-tests-pre:
+# Add your pre 'build-tests' code here...
+
+.build-tests-post: .build-tests-impl
+# Add your post 'build-tests' code here...
+
+
+# run tests
+test: .test-post
+
+.test-pre:
+# Add your pre 'test' code here...
+
+.test-post: .test-impl
+# Add your post 'test' code here...
+
+
+# help
+help: .help-post
+
+.help-pre:
+# Add your pre 'help' code here...
+
+.help-post: .help-impl
+# Add your post 'help' code here...
+
+
+
+# include project implementation makefile
+include nbproject/Makefile-impl.mk
+
+# include project make variables
+include nbproject/Makefile-variables.mk
diff --git a/cmps/main.cc b/cmps/main.cc
new file mode 100644
index 0000000..0598e12
--- /dev/null
+++ b/cmps/main.cc
@@ -0,0 +1,115 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: main.cc
+ * Created: 2. Juli 2012, 16:51
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <HTTPServer.h>
+#include <HTTPRequest.h>
+#include <HTTPResponse.h>
+#include <FilesystemScanner.h>
+#include <MediaFactory.h>
+#include <MediaListHandler.h>
+#include <MediaFileHandler.h>
+#include <ConnectionHandler.h>
+#include <CommandHandler.h>
+#include <JSonListAssembler.h>
+#include <HTMLListAssembler.h>
+#include <Url.h>
+#include <stdio.h>
+
+
+static int refreshScanner(void *opaque, cHTTPRequest &Request)
+{
+ cFilesystemScanner *fsc = (cFilesystemScanner *)opaque;
+
+ if (fsc) {
+ fsc->Refresh();
+ return 0;
+ }
+ return -1;
+}
+
+/*
+ *
+ */
+int main(int argc, char** argv)
+{
+ cServerConfig config(12345);
+
+ config.SetAuthorizationRequired(false);
+ config.SetDocumentRoot("/media");
+ config.SetAppIcon("/media/favicon.ico");
+
+ //TODO: parse commandline, read config
+
+ cFilesystemScanner *scanner = new cFilesystemScanner();
+ if (!scanner) {
+ fprintf(stderr, "could not initialize application! (1)");
+ exit(-1);
+ }
+ scanner->SetMediaFactory(new cMediaFactory(config.DocumentRoot()));
+
+ cAbstractMediaRequestHandler::SetFilesystemScanner(scanner);
+ /*
+ * register request handlers with their uri-prefix
+ */
+ cConnectionHandler::RegisterRequestHandler("/cmd", new cCommandHandler());
+ cMediaListHandler *listHandler = new cMediaListHandler();
+
+ listHandler->SetListAssembler("json", new cJSonListAssembler());
+ listHandler->SetDefaultListAssembler(new cHTMLListAssembler());
+ cConnectionHandler::RegisterRequestHandler("/", listHandler);
+ cConnectionHandler::RegisterDefaultHandler(new cMediaFileHandler());
+
+ /*
+ * create the real server
+ */
+ cHTTPServer *server = new cHTTPServer(config);
+ if (!server) {
+ fprintf(stderr, "could not initialize application! (2)");
+ exit(-2);
+ }
+
+ /*
+ * register/enable internal commands
+ */
+ cCommandHandler::RegisterCallback("refresh", refreshScanner, scanner);
+ scanner->Refresh();
+
+ /*
+ * now start the server
+ */
+ if (!server->Start()) {
+ fprintf(stderr, "failed to start application (3)");
+ exit(-3);
+ }
+
+ //Cleanup:
+ cCommandHandler::Cleanup();
+ free((void *)cHTTPResponse::ServerID());
+ cUrl::Cleanup();
+ delete scanner;
+ delete server;
+
+ return 0;
+}
+
diff --git a/cmps/nbproject/Makefile-Debug.mk b/cmps/nbproject/Makefile-Debug.mk
new file mode 100644
index 0000000..53e20b9
--- /dev/null
+++ b/cmps/nbproject/Makefile-Debug.mk
@@ -0,0 +1,180 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a -pre and a -post target defined where you can add customized code.
+#
+# This makefile implements configuration specific macros and targets.
+
+
+# Environment
+MKDIR=mkdir
+CP=cp
+GREP=grep
+NM=nm
+CCADMIN=CCadmin
+RANLIB=ranlib
+CC=gcc
+CCC=g++
+CXX=g++
+FC=gfortran
+AS=as
+
+# Macros
+CND_PLATFORM=GNU-Linux-x86
+CND_CONF=Debug
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+
+# Include project Makefile
+include Makefile
+
+# Object Directory
+OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
+
+# Object Files
+OBJECTFILES= \
+ ${OBJECTDIR}/main.o
+
+# Test Directory
+TESTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tests
+
+# Test Files
+TESTFILES= \
+ ${TESTDIR}/TestFiles/f1 \
+ ${TESTDIR}/TestFiles/f3 \
+ ${TESTDIR}/TestFiles/f2 \
+ ${TESTDIR}/TestFiles/f4
+
+# C Compiler Flags
+CFLAGS=
+
+# CC Compiler Flags
+CCFLAGS=-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi
+CXXFLAGS=-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi
+
+# Fortran Compiler Flags
+FFLAGS=
+
+# Assembler Flags
+ASFLAGS=
+
+# Link Libraries and Options
+LDLIBSOPTIONS=serverlib/dist/Debug/GNU-Linux-x86/libserverlib.a ../libs/fsScan/dist/Debug/GNU-Linux-x86/libfsscan.a ../libs/networking/dist/Debug/GNU-Linux-x86/libnetworking.a ../libs/util/dist/Debug/GNU-Linux-x86/libutil.a ../libs/vdr/dist/Debug/GNU-Linux-x86/libvdr.a -ljpeg -lpthread -ldl -lcap -lrt -lfribidi -lfreetype -lfontconfig -lyajl -lssl -lcrypt
+
+# Build Targets
+.build-conf: ${BUILD_SUBPROJECTS}
+ "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: serverlib/dist/Debug/GNU-Linux-x86/libserverlib.a
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ../libs/fsScan/dist/Debug/GNU-Linux-x86/libfsscan.a
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ../libs/networking/dist/Debug/GNU-Linux-x86/libnetworking.a
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ../libs/util/dist/Debug/GNU-Linux-x86/libutil.a
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ../libs/vdr/dist/Debug/GNU-Linux-x86/libvdr.a
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ${OBJECTFILES}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps ${OBJECTFILES} ${LDLIBSOPTIONS}
+
+${OBJECTDIR}/main.o: nbproject/Makefile-${CND_CONF}.mk main.cc
+ ${MKDIR} -p ${OBJECTDIR}
+ ${RM} $@.d
+ $(COMPILE.cc) -g -Iinclude -Iserverlib/include -I../libs/fsScan/include -I../libs/networking/include -I../libs/util/include -I../libs/vdr/include -MMD -MP -MF $@.d -o ${OBJECTDIR}/main.o main.cc
+
+# Subprojects
+.build-subprojects:
+ cd serverlib && ${MAKE} -f Makefile CONF=Debug
+ cd ../libs/fsScan && ${MAKE} -f Makefile CONF=Debug
+ cd ../libs/networking && ${MAKE} -f Makefile CONF=Debug
+ cd ../libs/util && ${MAKE} -f Makefile CONF=Debug
+ cd ../libs/vdr && ${MAKE} -f Makefile CONF=Debug
+
+# Build Test Targets
+.build-tests-conf: .build-conf ${TESTFILES}
+${TESTDIR}/TestFiles/f1: ${TESTDIR}/tests/CodecTest.o ${OBJECTFILES:%.o=%_nomain.o}
+ ${MKDIR} -p ${TESTDIR}/TestFiles
+ ${LINK.cc} -o ${TESTDIR}/TestFiles/f1 $^ ${LDLIBSOPTIONS}
+
+${TESTDIR}/TestFiles/f3: ${TESTDIR}/tests/ConnectionHandlerTest.o ${OBJECTFILES:%.o=%_nomain.o}
+ ${MKDIR} -p ${TESTDIR}/TestFiles
+ ${LINK.cc} -o ${TESTDIR}/TestFiles/f3 $^ ${LDLIBSOPTIONS}
+
+${TESTDIR}/TestFiles/f2: ${TESTDIR}/tests/FScanTest.o ${OBJECTFILES:%.o=%_nomain.o}
+ ${MKDIR} -p ${TESTDIR}/TestFiles
+ ${LINK.cc} -o ${TESTDIR}/TestFiles/f2 $^ ${LDLIBSOPTIONS}
+
+${TESTDIR}/TestFiles/f4: ${TESTDIR}/tests/JSonTest.o ${OBJECTFILES:%.o=%_nomain.o}
+ ${MKDIR} -p ${TESTDIR}/TestFiles
+ ${LINK.cc} -o ${TESTDIR}/TestFiles/f4 $^ ${LDLIBSOPTIONS}
+
+
+${TESTDIR}/tests/CodecTest.o: tests/CodecTest.cc
+ ${MKDIR} -p ${TESTDIR}/tests
+ ${RM} $@.d
+ $(COMPILE.cc) -g -I. -Iinclude -Iserverlib/include -I../libs/fsScan/include -I../libs/networking/include -I../libs/util/include -I../libs/vdr/include -MMD -MP -MF $@.d -o ${TESTDIR}/tests/CodecTest.o tests/CodecTest.cc
+
+
+${TESTDIR}/tests/ConnectionHandlerTest.o: tests/ConnectionHandlerTest.cc
+ ${MKDIR} -p ${TESTDIR}/tests
+ ${RM} $@.d
+ $(COMPILE.cc) -g -I. -Iinclude -Iserverlib/include -I../libs/fsScan/include -I../libs/networking/include -I../libs/util/include -I../libs/vdr/include -MMD -MP -MF $@.d -o ${TESTDIR}/tests/ConnectionHandlerTest.o tests/ConnectionHandlerTest.cc
+
+
+${TESTDIR}/tests/FScanTest.o: tests/FScanTest.cc
+ ${MKDIR} -p ${TESTDIR}/tests
+ ${RM} $@.d
+ $(COMPILE.cc) -g -I. -Iinclude -Iserverlib/include -I../libs/fsScan/include -I../libs/networking/include -I../libs/util/include -I../libs/vdr/include -MMD -MP -MF $@.d -o ${TESTDIR}/tests/FScanTest.o tests/FScanTest.cc
+
+
+${TESTDIR}/tests/JSonTest.o: tests/JSonTest.cc
+ ${MKDIR} -p ${TESTDIR}/tests
+ ${RM} $@.d
+ $(COMPILE.cc) -g -I. -Iinclude -Iserverlib/include -I../libs/fsScan/include -I../libs/networking/include -I../libs/util/include -I../libs/vdr/include -MMD -MP -MF $@.d -o ${TESTDIR}/tests/JSonTest.o tests/JSonTest.cc
+
+
+${OBJECTDIR}/main_nomain.o: ${OBJECTDIR}/main.o main.cc
+ ${MKDIR} -p ${OBJECTDIR}
+ @NMOUTPUT=`${NM} ${OBJECTDIR}/main.o`; \
+ if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \
+ (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \
+ (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \
+ then \
+ ${RM} $@.d;\
+ $(COMPILE.cc) -g -Iinclude -Iserverlib/include -I../libs/fsScan/include -I../libs/networking/include -I../libs/util/include -I../libs/vdr/include -Dmain=__nomain -MMD -MP -MF $@.d -o ${OBJECTDIR}/main_nomain.o main.cc;\
+ else \
+ ${CP} ${OBJECTDIR}/main.o ${OBJECTDIR}/main_nomain.o;\
+ fi
+
+# Run Test Targets
+.test-conf:
+ @if [ "${TEST}" = "" ]; \
+ then \
+ ${TESTDIR}/TestFiles/f1 || true; \
+ ${TESTDIR}/TestFiles/f3 || true; \
+ ${TESTDIR}/TestFiles/f2 || true; \
+ ${TESTDIR}/TestFiles/f4 || true; \
+ else \
+ ./${TEST} || true; \
+ fi
+
+# Clean Targets
+.clean-conf: ${CLEAN_SUBPROJECTS}
+ ${RM} -r ${CND_BUILDDIR}/${CND_CONF}
+ ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps
+
+# Subprojects
+.clean-subprojects:
+ cd serverlib && ${MAKE} -f Makefile CONF=Debug clean
+ cd ../libs/fsScan && ${MAKE} -f Makefile CONF=Debug clean
+ cd ../libs/networking && ${MAKE} -f Makefile CONF=Debug clean
+ cd ../libs/util && ${MAKE} -f Makefile CONF=Debug clean
+ cd ../libs/vdr && ${MAKE} -f Makefile CONF=Debug clean
+
+# Enable dependency checking
+.dep.inc: .depcheck-impl
+
+include .dep.inc
diff --git a/cmps/nbproject/Makefile-Release.mk b/cmps/nbproject/Makefile-Release.mk
new file mode 100644
index 0000000..8abe8f8
--- /dev/null
+++ b/cmps/nbproject/Makefile-Release.mk
@@ -0,0 +1,160 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a -pre and a -post target defined where you can add customized code.
+#
+# This makefile implements configuration specific macros and targets.
+
+
+# Environment
+MKDIR=mkdir
+CP=cp
+GREP=grep
+NM=nm
+CCADMIN=CCadmin
+RANLIB=ranlib
+CC=gcc
+CCC=g++
+CXX=g++
+FC=gfortran
+AS=as
+
+# Macros
+CND_PLATFORM=GNU-Linux-x86
+CND_CONF=Release
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+
+# Include project Makefile
+include Makefile
+
+# Object Directory
+OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
+
+# Object Files
+OBJECTFILES= \
+ ${OBJECTDIR}/main.o
+
+# Test Directory
+TESTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tests
+
+# Test Files
+TESTFILES= \
+ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps \
+ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps \
+ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps \
+ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps
+
+# C Compiler Flags
+CFLAGS=
+
+# CC Compiler Flags
+CCFLAGS=
+CXXFLAGS=
+
+# Fortran Compiler Flags
+FFLAGS=
+
+# Assembler Flags
+ASFLAGS=
+
+# Link Libraries and Options
+LDLIBSOPTIONS=
+
+# Build Targets
+.build-conf: ${BUILD_SUBPROJECTS}
+ "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ${OBJECTFILES}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps ${OBJECTFILES} ${LDLIBSOPTIONS}
+
+${OBJECTDIR}/main.o: nbproject/Makefile-${CND_CONF}.mk main.cc
+ ${MKDIR} -p ${OBJECTDIR}
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/main.o main.cc
+
+# Subprojects
+.build-subprojects:
+
+# Build Test Targets
+.build-tests-conf: .build-conf ${TESTFILES}
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ${TESTDIR}/tests/CodecTest.o ${OBJECTFILES:%.o=%_nomain.o}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps $^ ${LDLIBSOPTIONS}
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ${TESTDIR}/tests/ConnectionHandlerTest.o ${OBJECTFILES:%.o=%_nomain.o}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps $^ ${LDLIBSOPTIONS}
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ${TESTDIR}/tests/FScanTest.o ${OBJECTFILES:%.o=%_nomain.o}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps $^ ${LDLIBSOPTIONS}
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps: ${TESTDIR}/tests/JSonTest.o ${OBJECTFILES:%.o=%_nomain.o}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps $^ ${LDLIBSOPTIONS}
+
+
+${TESTDIR}/tests/CodecTest.o: tests/CodecTest.cc
+ ${MKDIR} -p ${TESTDIR}/tests
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${TESTDIR}/tests/CodecTest.o tests/CodecTest.cc
+
+
+${TESTDIR}/tests/ConnectionHandlerTest.o: tests/ConnectionHandlerTest.cc
+ ${MKDIR} -p ${TESTDIR}/tests
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${TESTDIR}/tests/ConnectionHandlerTest.o tests/ConnectionHandlerTest.cc
+
+
+${TESTDIR}/tests/FScanTest.o: tests/FScanTest.cc
+ ${MKDIR} -p ${TESTDIR}/tests
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${TESTDIR}/tests/FScanTest.o tests/FScanTest.cc
+
+
+${TESTDIR}/tests/JSonTest.o: tests/JSonTest.cc
+ ${MKDIR} -p ${TESTDIR}/tests
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${TESTDIR}/tests/JSonTest.o tests/JSonTest.cc
+
+
+${OBJECTDIR}/main_nomain.o: ${OBJECTDIR}/main.o main.cc
+ ${MKDIR} -p ${OBJECTDIR}
+ @NMOUTPUT=`${NM} ${OBJECTDIR}/main.o`; \
+ if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \
+ (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \
+ (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \
+ then \
+ ${RM} $@.d;\
+ $(COMPILE.cc) -O2 -Dmain=__nomain -MMD -MP -MF $@.d -o ${OBJECTDIR}/main_nomain.o main.cc;\
+ else \
+ ${CP} ${OBJECTDIR}/main.o ${OBJECTDIR}/main_nomain.o;\
+ fi
+
+# Run Test Targets
+.test-conf:
+ @if [ "${TEST}" = "" ]; \
+ then \
+ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps || true; \
+ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps || true; \
+ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps || true; \
+ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps || true; \
+ else \
+ ./${TEST} || true; \
+ fi
+
+# Clean Targets
+.clean-conf: ${CLEAN_SUBPROJECTS}
+ ${RM} -r ${CND_BUILDDIR}/${CND_CONF}
+ ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps
+
+# Subprojects
+.clean-subprojects:
+
+# Enable dependency checking
+.dep.inc: .depcheck-impl
+
+include .dep.inc
diff --git a/cmps/nbproject/Makefile-impl.mk b/cmps/nbproject/Makefile-impl.mk
new file mode 100644
index 0000000..64c660e
--- /dev/null
+++ b/cmps/nbproject/Makefile-impl.mk
@@ -0,0 +1,133 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a pre- and a post- target defined where you can add customization code.
+#
+# This makefile implements macros and targets common to all configurations.
+#
+# NOCDDL
+
+
+# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
+# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
+# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
+# and .clean-reqprojects-conf unless SUB has the value 'no'
+SUB_no=NO
+SUBPROJECTS=${SUB_${SUB}}
+BUILD_SUBPROJECTS_=.build-subprojects
+BUILD_SUBPROJECTS_NO=
+BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
+CLEAN_SUBPROJECTS_=.clean-subprojects
+CLEAN_SUBPROJECTS_NO=
+CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
+
+
+# Project Name
+PROJECTNAME=cmps
+
+# Active Configuration
+DEFAULTCONF=Debug
+CONF=${DEFAULTCONF}
+
+# All Configurations
+ALLCONFS=Debug Release
+
+
+# build
+.build-impl: .build-pre .validate-impl .depcheck-impl
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf
+
+
+# clean
+.clean-impl: .clean-pre .validate-impl .depcheck-impl
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf
+
+
+# clobber
+.clobber-impl: .clobber-pre .depcheck-impl
+ @#echo "=> Running $@..."
+ for CONF in ${ALLCONFS}; \
+ do \
+ "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
+ done
+
+# all
+.all-impl: .all-pre .depcheck-impl
+ @#echo "=> Running $@..."
+ for CONF in ${ALLCONFS}; \
+ do \
+ "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \
+ done
+
+# build tests
+.build-tests-impl: .build-impl .build-tests-pre
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf
+
+# run tests
+.test-impl: .build-tests-impl .test-pre
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf
+
+# dependency checking support
+.depcheck-impl:
+ @echo "# This code depends on make tool being used" >.dep.inc
+ @if [ -n "${MAKE_VERSION}" ]; then \
+ echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
+ echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
+ echo "include \$${DEPFILES}" >>.dep.inc; \
+ echo "endif" >>.dep.inc; \
+ else \
+ echo ".KEEP_STATE:" >>.dep.inc; \
+ echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
+ fi
+
+# configuration validation
+.validate-impl:
+ @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
+ then \
+ echo ""; \
+ echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
+ echo "See 'make help' for details."; \
+ echo "Current directory: " `pwd`; \
+ echo ""; \
+ fi
+ @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
+ then \
+ exit 1; \
+ fi
+
+
+# help
+.help-impl: .help-pre
+ @echo "This makefile supports the following configurations:"
+ @echo " ${ALLCONFS}"
+ @echo ""
+ @echo "and the following targets:"
+ @echo " build (default target)"
+ @echo " clean"
+ @echo " clobber"
+ @echo " all"
+ @echo " help"
+ @echo ""
+ @echo "Makefile Usage:"
+ @echo " make [CONF=<CONFIGURATION>] [SUB=no] build"
+ @echo " make [CONF=<CONFIGURATION>] [SUB=no] clean"
+ @echo " make [SUB=no] clobber"
+ @echo " make [SUB=no] all"
+ @echo " make help"
+ @echo ""
+ @echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
+ @echo " also build subprojects."
+ @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
+ @echo " also clean subprojects."
+ @echo "Target 'clobber' will remove all built files from all configurations and,"
+ @echo " unless 'SUB=no', also from subprojects."
+ @echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
+ @echo " also build subprojects."
+ @echo "Target 'help' prints this message."
+ @echo ""
+
diff --git a/cmps/nbproject/Makefile-variables.mk b/cmps/nbproject/Makefile-variables.mk
new file mode 100644
index 0000000..e65792d
--- /dev/null
+++ b/cmps/nbproject/Makefile-variables.mk
@@ -0,0 +1,35 @@
+#
+# Generated - do not edit!
+#
+# NOCDDL
+#
+CND_BASEDIR=`pwd`
+CND_BUILDDIR=build
+CND_DISTDIR=dist
+# Debug configuration
+CND_PLATFORM_Debug=GNU-Linux-x86
+CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux-x86
+CND_ARTIFACT_NAME_Debug=cmps
+CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux-x86/cmps
+CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux-x86/package
+CND_PACKAGE_NAME_Debug=cmps.tar
+CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux-x86/package/cmps.tar
+# Release configuration
+CND_PLATFORM_Release=GNU-Linux-x86
+CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux-x86
+CND_ARTIFACT_NAME_Release=cmps
+CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux-x86/cmps
+CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux-x86/package
+CND_PACKAGE_NAME_Release=cmps.tar
+CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux-x86/package/cmps.tar
+#
+# include compiler specific variables
+#
+# dmake command
+ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \
+ (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)
+#
+# gmake command
+.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk))
+#
+include nbproject/private/Makefile-variables.mk
diff --git a/cmps/nbproject/Package-Debug.bash b/cmps/nbproject/Package-Debug.bash
new file mode 100644
index 0000000..fd304f8
--- /dev/null
+++ b/cmps/nbproject/Package-Debug.bash
@@ -0,0 +1,75 @@
+#!/bin/bash -x
+
+#
+# Generated - do not edit!
+#
+
+# Macros
+TOP=`pwd`
+CND_PLATFORM=GNU-Linux-x86
+CND_CONF=Debug
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
+TMPDIRNAME=tmp-packaging
+OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps
+OUTPUT_BASENAME=cmps
+PACKAGE_TOP_DIR=cmps/
+
+# Functions
+function checkReturnCode
+{
+ rc=$?
+ if [ $rc != 0 ]
+ then
+ exit $rc
+ fi
+}
+function makeDirectory
+# $1 directory path
+# $2 permission (optional)
+{
+ mkdir -p "$1"
+ checkReturnCode
+ if [ "$2" != "" ]
+ then
+ chmod $2 "$1"
+ checkReturnCode
+ fi
+}
+function copyFileToTmpDir
+# $1 from-file path
+# $2 to-file path
+# $3 permission
+{
+ cp "$1" "$2"
+ checkReturnCode
+ if [ "$3" != "" ]
+ then
+ chmod $3 "$2"
+ checkReturnCode
+ fi
+}
+
+# Setup
+cd "${TOP}"
+mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
+rm -rf ${NBTMPDIR}
+mkdir -p ${NBTMPDIR}
+
+# Copy files and create directories and links
+cd "${TOP}"
+makeDirectory "${NBTMPDIR}/cmps/bin"
+copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
+
+
+# Generate tar file
+cd "${TOP}"
+rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/cmps.tar
+cd ${NBTMPDIR}
+tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/cmps.tar *
+checkReturnCode
+
+# Cleanup
+cd "${TOP}"
+rm -rf ${NBTMPDIR}
diff --git a/cmps/nbproject/Package-Release.bash b/cmps/nbproject/Package-Release.bash
new file mode 100644
index 0000000..8e70cbd
--- /dev/null
+++ b/cmps/nbproject/Package-Release.bash
@@ -0,0 +1,75 @@
+#!/bin/bash -x
+
+#
+# Generated - do not edit!
+#
+
+# Macros
+TOP=`pwd`
+CND_PLATFORM=GNU-Linux-x86
+CND_CONF=Release
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
+TMPDIRNAME=tmp-packaging
+OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/cmps
+OUTPUT_BASENAME=cmps
+PACKAGE_TOP_DIR=cmps/
+
+# Functions
+function checkReturnCode
+{
+ rc=$?
+ if [ $rc != 0 ]
+ then
+ exit $rc
+ fi
+}
+function makeDirectory
+# $1 directory path
+# $2 permission (optional)
+{
+ mkdir -p "$1"
+ checkReturnCode
+ if [ "$2" != "" ]
+ then
+ chmod $2 "$1"
+ checkReturnCode
+ fi
+}
+function copyFileToTmpDir
+# $1 from-file path
+# $2 to-file path
+# $3 permission
+{
+ cp "$1" "$2"
+ checkReturnCode
+ if [ "$3" != "" ]
+ then
+ chmod $3 "$2"
+ checkReturnCode
+ fi
+}
+
+# Setup
+cd "${TOP}"
+mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
+rm -rf ${NBTMPDIR}
+mkdir -p ${NBTMPDIR}
+
+# Copy files and create directories and links
+cd "${TOP}"
+makeDirectory "${NBTMPDIR}/cmps/bin"
+copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
+
+
+# Generate tar file
+cd "${TOP}"
+rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/cmps.tar
+cd ${NBTMPDIR}
+tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/cmps.tar *
+checkReturnCode
+
+# Cleanup
+cd "${TOP}"
+rm -rf ${NBTMPDIR}
diff --git a/cmps/nbproject/configurations.xml b/cmps/nbproject/configurations.xml
new file mode 100644
index 0000000..6eb9f34
--- /dev/null
+++ b/cmps/nbproject/configurations.xml
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configurationDescriptor version="80">
+ <logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
+ <logicalFolder name="HeaderFiles"
+ displayName="Header Files"
+ projectFiles="true">
+ </logicalFolder>
+ <logicalFolder name="ResourceFiles"
+ displayName="Resource Files"
+ projectFiles="true">
+ </logicalFolder>
+ <logicalFolder name="SourceFiles"
+ displayName="Source Files"
+ projectFiles="true">
+ <itemPath>main.cc</itemPath>
+ </logicalFolder>
+ <logicalFolder name="TestFiles"
+ displayName="Test Files"
+ projectFiles="false"
+ kind="TEST_LOGICAL_FOLDER">
+ <logicalFolder name="f1"
+ displayName="CodecTest"
+ projectFiles="true"
+ kind="TEST">
+ <itemPath>tests/CodecTest.cc</itemPath>
+ </logicalFolder>
+ <logicalFolder name="f3"
+ displayName="ConnectionHandlerTest"
+ projectFiles="true"
+ kind="TEST">
+ <itemPath>tests/ConnectionHandlerTest.cc</itemPath>
+ </logicalFolder>
+ <logicalFolder name="f2"
+ displayName="FScanTest"
+ projectFiles="true"
+ kind="TEST">
+ <itemPath>tests/FScanTest.cc</itemPath>
+ </logicalFolder>
+ <logicalFolder name="f4" displayName="JSonTest" projectFiles="true" kind="TEST">
+ <itemPath>tests/JSonTest.cc</itemPath>
+ </logicalFolder>
+ </logicalFolder>
+ <logicalFolder name="ExternalFiles"
+ displayName="Important Files"
+ projectFiles="false"
+ kind="IMPORTANT_FILES_FOLDER">
+ <itemPath>Makefile</itemPath>
+ </logicalFolder>
+ </logicalFolder>
+ <projectmakefile>Makefile</projectmakefile>
+ <confs>
+ <conf name="Debug" type="1">
+ <toolsSet>
+ <remote-sources-mode>LOCAL_SOURCES</remote-sources-mode>
+ <compilerSet>default</compilerSet>
+ </toolsSet>
+ <compileType>
+ <ccTool>
+ <incDir>
+ <pElem>include</pElem>
+ <pElem>serverlib/include</pElem>
+ <pElem>../libs/fsScan/include</pElem>
+ <pElem>../libs/networking/include</pElem>
+ <pElem>../libs/util/include</pElem>
+ <pElem>../libs/vdr/include</pElem>
+ </incDir>
+ <commandLine>-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi</commandLine>
+ </ccTool>
+ <linkerTool>
+ <linkerLibItems>
+ <linkerLibProjectItem>
+ <makeArtifact PL="serverlib"
+ CT="3"
+ CN="Debug"
+ AC="true"
+ BL="true"
+ WD="serverlib"
+ BC="${MAKE} -f Makefile CONF=Debug"
+ CC="${MAKE} -f Makefile CONF=Debug clean"
+ OP="${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a">
+ </makeArtifact>
+ </linkerLibProjectItem>
+ <linkerLibProjectItem>
+ <makeArtifact PL="../libs/fsScan"
+ CT="3"
+ CN="Debug"
+ AC="true"
+ BL="true"
+ WD="../libs/fsScan"
+ BC="${MAKE} -f Makefile CONF=Debug"
+ CC="${MAKE} -f Makefile CONF=Debug clean"
+ OP="${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libfsscan.a">
+ </makeArtifact>
+ </linkerLibProjectItem>
+ <linkerLibProjectItem>
+ <makeArtifact PL="../libs/networking"
+ CT="3"
+ CN="Debug"
+ AC="true"
+ BL="true"
+ WD="../libs/networking"
+ BC="${MAKE} -f Makefile CONF=Debug"
+ CC="${MAKE} -f Makefile CONF=Debug clean"
+ OP="${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libnetworking.a">
+ </makeArtifact>
+ </linkerLibProjectItem>
+ <linkerLibProjectItem>
+ <makeArtifact PL="../libs/util"
+ CT="3"
+ CN="Debug"
+ AC="true"
+ BL="true"
+ WD="../libs/util"
+ BC="${MAKE} -f Makefile CONF=Debug"
+ CC="${MAKE} -f Makefile CONF=Debug clean"
+ OP="${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libutil.a">
+ </makeArtifact>
+ </linkerLibProjectItem>
+ <linkerLibProjectItem>
+ <makeArtifact PL="../libs/vdr"
+ CT="3"
+ CN="Debug"
+ AC="true"
+ BL="true"
+ WD="../libs/vdr"
+ BC="${MAKE} -f Makefile CONF=Debug"
+ CC="${MAKE} -f Makefile CONF=Debug clean"
+ OP="${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libvdr.a">
+ </makeArtifact>
+ </linkerLibProjectItem>
+ <linkerLibLibItem>jpeg</linkerLibLibItem>
+ <linkerLibLibItem>pthread</linkerLibLibItem>
+ <linkerLibLibItem>dl</linkerLibLibItem>
+ <linkerLibLibItem>cap</linkerLibLibItem>
+ <linkerLibLibItem>rt</linkerLibLibItem>
+ <linkerLibLibItem>fribidi</linkerLibLibItem>
+ <linkerLibLibItem>freetype</linkerLibLibItem>
+ <linkerLibLibItem>fontconfig</linkerLibLibItem>
+ <linkerLibLibItem>yajl</linkerLibLibItem>
+ <linkerLibLibItem>ssl</linkerLibLibItem>
+ <linkerLibLibItem>crypt</linkerLibLibItem>
+ </linkerLibItems>
+ </linkerTool>
+ </compileType>
+ <folder path="TestFiles/f1">
+ <cTool>
+ <incDir>
+ <pElem>.</pElem>
+ </incDir>
+ </cTool>
+ <ccTool>
+ <incDir>
+ <pElem>.</pElem>
+ </incDir>
+ </ccTool>
+ <linkerTool>
+ <output>${TESTDIR}/TestFiles/f1</output>
+ </linkerTool>
+ </folder>
+ <folder path="TestFiles/f2">
+ <cTool>
+ <incDir>
+ <pElem>.</pElem>
+ </incDir>
+ </cTool>
+ <ccTool>
+ <incDir>
+ <pElem>.</pElem>
+ </incDir>
+ </ccTool>
+ <linkerTool>
+ <output>${TESTDIR}/TestFiles/f2</output>
+ </linkerTool>
+ </folder>
+ <folder path="TestFiles/f3">
+ <cTool>
+ <incDir>
+ <pElem>.</pElem>
+ </incDir>
+ </cTool>
+ <ccTool>
+ <incDir>
+ <pElem>.</pElem>
+ </incDir>
+ </ccTool>
+ <linkerTool>
+ <output>${TESTDIR}/TestFiles/f3</output>
+ </linkerTool>
+ </folder>
+ <folder path="TestFiles/f4">
+ <cTool>
+ <incDir>
+ <pElem>.</pElem>
+ </incDir>
+ </cTool>
+ <ccTool>
+ <incDir>
+ <pElem>.</pElem>
+ </incDir>
+ </ccTool>
+ <linkerTool>
+ <output>${TESTDIR}/TestFiles/f4</output>
+ </linkerTool>
+ </folder>
+ </conf>
+ <conf name="Release" type="1">
+ <toolsSet>
+ <remote-sources-mode>LOCAL_SOURCES</remote-sources-mode>
+ <compilerSet>default</compilerSet>
+ </toolsSet>
+ <compileType>
+ <cTool>
+ <developmentMode>5</developmentMode>
+ </cTool>
+ <ccTool>
+ <developmentMode>5</developmentMode>
+ </ccTool>
+ <fortranCompilerTool>
+ <developmentMode>5</developmentMode>
+ </fortranCompilerTool>
+ <asmTool>
+ <developmentMode>5</developmentMode>
+ </asmTool>
+ </compileType>
+ </conf>
+ </confs>
+</configurationDescriptor>
diff --git a/cmps/nbproject/private/Makefile-variables.mk b/cmps/nbproject/private/Makefile-variables.mk
new file mode 100644
index 0000000..a64183e
--- /dev/null
+++ b/cmps/nbproject/private/Makefile-variables.mk
@@ -0,0 +1,7 @@
+#
+# Generated - do not edit!
+#
+# NOCDDL
+#
+# Debug configuration
+# Release configuration
diff --git a/cmps/nbproject/private/configurations.xml b/cmps/nbproject/private/configurations.xml
new file mode 100644
index 0000000..10e0756
--- /dev/null
+++ b/cmps/nbproject/private/configurations.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configurationDescriptor version="80">
+ <projectmakefile>Makefile</projectmakefile>
+ <confs>
+ <conf name="Debug" type="1">
+ <toolsSet>
+ <developmentServer>localhost</developmentServer>
+ <platform>2</platform>
+ </toolsSet>
+ <dbx_gdbdebugger version="1">
+ <gdb_pathmaps>
+ </gdb_pathmaps>
+ <gdb_interceptlist>
+ <gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
+ </gdb_interceptlist>
+ <gdb_options>
+ <DebugOptions>
+ </DebugOptions>
+ </gdb_options>
+ <gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
+ </dbx_gdbdebugger>
+ <nativedebugger version="1">
+ <engine>gdb</engine>
+ </nativedebugger>
+ <runprofile version="9">
+ <runcommandpicklist>
+ <runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
+ </runcommandpicklist>
+ <runcommand>"${OUTPUT_PATH}"</runcommand>
+ <rundir></rundir>
+ <buildfirst>true</buildfirst>
+ <terminal-type>0</terminal-type>
+ <remove-instrumentation>0</remove-instrumentation>
+ <environment>
+ </environment>
+ </runprofile>
+ </conf>
+ <conf name="Release" type="1">
+ <toolsSet>
+ <developmentServer>localhost</developmentServer>
+ <platform>2</platform>
+ </toolsSet>
+ <dbx_gdbdebugger version="1">
+ <gdb_pathmaps>
+ </gdb_pathmaps>
+ <gdb_interceptlist>
+ <gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
+ </gdb_interceptlist>
+ <gdb_options>
+ <DebugOptions>
+ </DebugOptions>
+ </gdb_options>
+ <gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
+ </dbx_gdbdebugger>
+ <nativedebugger version="1">
+ <engine>gdb</engine>
+ </nativedebugger>
+ <runprofile version="9">
+ <runcommandpicklist>
+ <runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
+ </runcommandpicklist>
+ <runcommand>"${OUTPUT_PATH}"</runcommand>
+ <rundir></rundir>
+ <buildfirst>true</buildfirst>
+ <terminal-type>0</terminal-type>
+ <remove-instrumentation>0</remove-instrumentation>
+ <environment>
+ </environment>
+ </runprofile>
+ </conf>
+ </confs>
+</configurationDescriptor>
diff --git a/cmps/nbproject/private/private.xml b/cmps/nbproject/private/private.xml
new file mode 100644
index 0000000..a38cae6
--- /dev/null
+++ b/cmps/nbproject/private/private.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+ <data xmlns="http://www.netbeans.org/ns/make-project-private/1">
+ <activeConfTypeElem>1</activeConfTypeElem>
+ <activeConfIndexElem>0</activeConfIndexElem>
+ </data>
+ <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
+</project-private>
diff --git a/cmps/nbproject/project.xml b/cmps/nbproject/project.xml
new file mode 100644
index 0000000..b24cfef
--- /dev/null
+++ b/cmps/nbproject/project.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.cnd.makeproject</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/make-project/1">
+ <name>cmps</name>
+ <c-extensions/>
+ <cpp-extensions>cc</cpp-extensions>
+ <header-extensions/>
+ <sourceEncoding>UTF-8</sourceEncoding>
+ <make-dep-projects>
+ <make-dep-project>../libs/util</make-dep-project>
+ <make-dep-project>../libs/vdr</make-dep-project>
+ <make-dep-project>../libs/fsScan</make-dep-project>
+ <make-dep-project>serverlib</make-dep-project>
+ <make-dep-project>../libs/networking</make-dep-project>
+ </make-dep-projects>
+ <sourceRootList/>
+ <confList>
+ <confElem>
+ <name>Debug</name>
+ <type>1</type>
+ </confElem>
+ <confElem>
+ <name>Release</name>
+ <type>1</type>
+ </confElem>
+ </confList>
+ </data>
+ </configuration>
+</project>
diff --git a/cmps/server.cbp b/cmps/server.cbp
new file mode 100644
index 0000000..55c4f6d
--- /dev/null
+++ b/cmps/server.cbp
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+ <FileVersion major="1" minor="6" />
+ <Project>
+ <Option title="CMP.server" />
+ <Option pch_mode="2" />
+ <Option compiler="gcc" />
+ <Build>
+ <Target title="Debug">
+ <Option output="bin/Debug/CMP" prefix_auto="1" extension_auto="1" />
+ <Option object_output="obj/Debug/" />
+ <Option type="1" />
+ <Option compiler="gcc" />
+ <Compiler>
+ <Add option="-g" />
+ </Compiler>
+ </Target>
+ <Target title="Release">
+ <Option output="bin/Release/CMP" prefix_auto="1" extension_auto="1" />
+ <Option object_output="obj/Release/" />
+ <Option type="1" />
+ <Option compiler="gcc" />
+ <Compiler>
+ <Add option="-O2" />
+ </Compiler>
+ <Linker>
+ <Add option="-s" />
+ </Linker>
+ </Target>
+ </Build>
+ <Compiler>
+ <Add option="-Wall" />
+ <Add option="-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi" />
+ <Add option="-D_REENTRANT" />
+ <Add option="-D_GNU_SOURCE=1" />
+ <Add directory="../libs/vdr/include" />
+ <Add directory="../libs/util/include" />
+ <Add directory="../libs/networking/include" />
+ <Add directory="../libs/fsScan/include" />
+ <Add directory="serverlib/include" />
+ <Add directory="include" />
+ </Compiler>
+ <Linker>
+ <Add library="serverlib/libserverlib.a" />
+ <Add library="../libs/fsScan/libfsScan.a" />
+ <Add library="../libs/networking/libnetworking.a" />
+ <Add library="../libs/util/libutil.a" />
+ <Add library="../libs/vdr/libvdr.a" />
+ <Add library="jpeg" />
+ <Add library="pthread" />
+ <Add library="dl" />
+ <Add library="cap" />
+ <Add library="rt" />
+ <Add library="fribidi" />
+ <Add library="freetype" />
+ <Add library="fontconfig" />
+ <Add library="yajl" />
+ <Add library="ssl" />
+ <Add library="crypt" />
+ </Linker>
+ <Unit filename="main.cc" />
+ <Extensions>
+ <code_completion />
+ <envvars />
+ <lib_finder disable_auto="1" />
+ <debugger />
+ </Extensions>
+ </Project>
+</CodeBlocks_project_file>
diff --git a/cmps/server.cbp.save b/cmps/server.cbp.save
new file mode 100644
index 0000000..55c4f6d
--- /dev/null
+++ b/cmps/server.cbp.save
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+ <FileVersion major="1" minor="6" />
+ <Project>
+ <Option title="CMP.server" />
+ <Option pch_mode="2" />
+ <Option compiler="gcc" />
+ <Build>
+ <Target title="Debug">
+ <Option output="bin/Debug/CMP" prefix_auto="1" extension_auto="1" />
+ <Option object_output="obj/Debug/" />
+ <Option type="1" />
+ <Option compiler="gcc" />
+ <Compiler>
+ <Add option="-g" />
+ </Compiler>
+ </Target>
+ <Target title="Release">
+ <Option output="bin/Release/CMP" prefix_auto="1" extension_auto="1" />
+ <Option object_output="obj/Release/" />
+ <Option type="1" />
+ <Option compiler="gcc" />
+ <Compiler>
+ <Add option="-O2" />
+ </Compiler>
+ <Linker>
+ <Add option="-s" />
+ </Linker>
+ </Target>
+ </Build>
+ <Compiler>
+ <Add option="-Wall" />
+ <Add option="-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi" />
+ <Add option="-D_REENTRANT" />
+ <Add option="-D_GNU_SOURCE=1" />
+ <Add directory="../libs/vdr/include" />
+ <Add directory="../libs/util/include" />
+ <Add directory="../libs/networking/include" />
+ <Add directory="../libs/fsScan/include" />
+ <Add directory="serverlib/include" />
+ <Add directory="include" />
+ </Compiler>
+ <Linker>
+ <Add library="serverlib/libserverlib.a" />
+ <Add library="../libs/fsScan/libfsScan.a" />
+ <Add library="../libs/networking/libnetworking.a" />
+ <Add library="../libs/util/libutil.a" />
+ <Add library="../libs/vdr/libvdr.a" />
+ <Add library="jpeg" />
+ <Add library="pthread" />
+ <Add library="dl" />
+ <Add library="cap" />
+ <Add library="rt" />
+ <Add library="fribidi" />
+ <Add library="freetype" />
+ <Add library="fontconfig" />
+ <Add library="yajl" />
+ <Add library="ssl" />
+ <Add library="crypt" />
+ </Linker>
+ <Unit filename="main.cc" />
+ <Extensions>
+ <code_completion />
+ <envvars />
+ <lib_finder disable_auto="1" />
+ <debugger />
+ </Extensions>
+ </Project>
+</CodeBlocks_project_file>
diff --git a/cmps/server.depend b/cmps/server.depend
new file mode 100644
index 0000000..c4ac310
--- /dev/null
+++ b/cmps/server.depend
@@ -0,0 +1 @@
+# depslib dependency file v1.0
diff --git a/cmps/server.layout b/cmps/server.layout
new file mode 100644
index 0000000..9c308ee
--- /dev/null
+++ b/cmps/server.layout
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_layout_file>
+ <ActiveTarget name="Debug" />
+ <File name="main.cc" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="213" topLine="0" />
+ </Cursor>
+ </File>
+</CodeBlocks_layout_file>
diff --git a/cmps/server.layout.save b/cmps/server.layout.save
new file mode 100644
index 0000000..9c308ee
--- /dev/null
+++ b/cmps/server.layout.save
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_layout_file>
+ <ActiveTarget name="Debug" />
+ <File name="main.cc" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="213" topLine="0" />
+ </Cursor>
+ </File>
+</CodeBlocks_layout_file>
diff --git a/cmps/serverlib/.dep.inc b/cmps/serverlib/.dep.inc
new file mode 100644
index 0000000..4560e55
--- /dev/null
+++ b/cmps/serverlib/.dep.inc
@@ -0,0 +1,5 @@
+# This code depends on make tool being used
+DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES}))
+ifneq (${DEPFILES},)
+include ${DEPFILES}
+endif
diff --git a/cmps/serverlib/Makefile b/cmps/serverlib/Makefile
new file mode 100644
index 0000000..ec9de69
--- /dev/null
+++ b/cmps/serverlib/Makefile
@@ -0,0 +1,128 @@
+#
+# There exist several targets which are by default empty and which can be
+# used for execution of your targets. These targets are usually executed
+# before and after some main targets. They are:
+#
+# .build-pre: called before 'build' target
+# .build-post: called after 'build' target
+# .clean-pre: called before 'clean' target
+# .clean-post: called after 'clean' target
+# .clobber-pre: called before 'clobber' target
+# .clobber-post: called after 'clobber' target
+# .all-pre: called before 'all' target
+# .all-post: called after 'all' target
+# .help-pre: called before 'help' target
+# .help-post: called after 'help' target
+#
+# Targets beginning with '.' are not intended to be called on their own.
+#
+# Main targets can be executed directly, and they are:
+#
+# build build a specific configuration
+# clean remove built files from a configuration
+# clobber remove all built files
+# all build all configurations
+# help print help mesage
+#
+# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
+# .help-impl are implemented in nbproject/makefile-impl.mk.
+#
+# Available make variables:
+#
+# CND_BASEDIR base directory for relative paths
+# CND_DISTDIR default top distribution directory (build artifacts)
+# CND_BUILDDIR default top build directory (object files, ...)
+# CONF name of current configuration
+# CND_PLATFORM_${CONF} platform name (current configuration)
+# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
+# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
+# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
+# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
+# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
+# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
+#
+# NOCDDL
+
+
+# Environment
+MKDIR=mkdir
+CP=cp
+CCADMIN=CCadmin
+
+
+# build
+build: .build-post
+
+.build-pre:
+# Add your pre 'build' code here...
+
+.build-post: .build-impl
+# Add your post 'build' code here...
+
+
+# clean
+clean: .clean-post
+
+.clean-pre:
+# Add your pre 'clean' code here...
+
+.clean-post: .clean-impl
+# Add your post 'clean' code here...
+
+
+# clobber
+clobber: .clobber-post
+
+.clobber-pre:
+# Add your pre 'clobber' code here...
+
+.clobber-post: .clobber-impl
+# Add your post 'clobber' code here...
+
+
+# all
+all: .all-post
+
+.all-pre:
+# Add your pre 'all' code here...
+
+.all-post: .all-impl
+# Add your post 'all' code here...
+
+
+# build tests
+build-tests: .build-tests-post
+
+.build-tests-pre:
+# Add your pre 'build-tests' code here...
+
+.build-tests-post: .build-tests-impl
+# Add your post 'build-tests' code here...
+
+
+# run tests
+test: .test-post
+
+.test-pre:
+# Add your pre 'test' code here...
+
+.test-post: .test-impl
+# Add your post 'test' code here...
+
+
+# help
+help: .help-post
+
+.help-pre:
+# Add your pre 'help' code here...
+
+.help-post: .help-impl
+# Add your post 'help' code here...
+
+
+
+# include project implementation makefile
+include nbproject/Makefile-impl.mk
+
+# include project make variables
+include nbproject/Makefile-variables.mk
diff --git a/cmps/serverlib/include/AbstractMediaRequestHandler.h b/cmps/serverlib/include/AbstractMediaRequestHandler.h
new file mode 100644
index 0000000..ff57e33
--- /dev/null
+++ b/cmps/serverlib/include/AbstractMediaRequestHandler.h
@@ -0,0 +1,42 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: AbstractMediaRequestHandler.h
+ * Created: 5. Juli 2012, 07:58
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#ifndef ABSTRACTMEDIAREQUESTHANDLER_H
+#define ABSTRACTMEDIAREQUESTHANDLER_H
+
+#include <HTTPRequestHandler.h>
+
+class cFilesystemScanner;
+class cAbstractMediaRequestHandler : public cHTTPRequestHandler {
+public:
+ virtual ~cAbstractMediaRequestHandler();
+ static void SetFilesystemScanner(cFilesystemScanner *Scanner);
+
+protected:
+ cAbstractMediaRequestHandler();
+ cFilesystemScanner *FileSystemScanner(void);
+ };
+
+#endif /* ABSTRACTMEDIAREQUESTHANDLER_H */
+
diff --git a/cmps/serverlib/include/CommandHandler.h b/cmps/serverlib/include/CommandHandler.h
new file mode 100644
index 0000000..42436da
--- /dev/null
+++ b/cmps/serverlib/include/CommandHandler.h
@@ -0,0 +1,45 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: CommandHandler.h
+ * Created: 5. Juli 2012, 16:06
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#ifndef COMMANDHANDLER_H
+#define COMMANDHANDLER_H
+
+#include <AbstractMediaRequestHandler.h>
+
+typedef int (*CommandCallback)(void *, cHTTPRequest &);
+
+class cCommandHandler : public cAbstractMediaRequestHandler {
+public:
+ cCommandHandler();
+ virtual ~cCommandHandler();
+
+ virtual cHTTPResponse *ProcessRequest(cHTTPRequest &Request);
+ virtual void Usage(cStringBuilder &sb);
+
+ static void RegisterCallback(const char *CommandID, CommandCallback cb, void *opaque);
+ static void Cleanup(void);
+ };
+
+#endif /* COMMANDHANDLER_H */
+
diff --git a/cmps/serverlib/include/HTMLListAssembler.h b/cmps/serverlib/include/HTMLListAssembler.h
new file mode 100644
index 0000000..d53d861
--- /dev/null
+++ b/cmps/serverlib/include/HTMLListAssembler.h
@@ -0,0 +1,54 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: HTMLListAssembler.h
+ * Created: 6. Juli 2012, 09:55
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#ifndef HTMLLISTASSEMBLER_H
+#define HTMLLISTASSEMBLER_H
+
+#include <AbstractListAssembler.h>
+#include <map>
+
+class cStringBuilder;
+class cHTMLListAssembler : public cAbstractListAssembler {
+public:
+ cHTMLListAssembler();
+ virtual ~cHTMLListAssembler();
+
+ virtual const char *MediaType(void) const;
+
+protected:
+ bool OpenList(cStringBuilder &sb, std::map<int, size_t> &Categories, size_t total, size_t start = 0, uint delta = 40);
+ bool AddElement(cStringBuilder &sb, void *ListElement, bool odd);
+ bool CloseList(cStringBuilder &sb, size_t total, size_t start = 0, uint delta = 40);
+
+private:
+ cStringBuilder &genHTMLPrefix(cStringBuilder &sb, const char *Title);
+ cStringBuilder &genDelim(cStringBuilder &sb);
+ cStringBuilder &genMediaLink(cStringBuilder &sb, void *ListElement, bool odd);
+ cStringBuilder &genNextLink(cStringBuilder &sb, int n);
+ cStringBuilder &genPreviousLink(cStringBuilder &sb, int n);
+ cStringBuilder &genTypeMenu(cStringBuilder &sb, std::map<int, size_t> &Categories);
+};
+
+#endif /* HTMLLISTASSEMBLER_H */
+
diff --git a/cmps/serverlib/include/HTTPMediaResponse.h b/cmps/serverlib/include/HTTPMediaResponse.h
new file mode 100644
index 0000000..1c7827e
--- /dev/null
+++ b/cmps/serverlib/include/HTTPMediaResponse.h
@@ -0,0 +1,43 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: HTTPMediaResponse.h
+ * Created: 6. Juli 2012, 07:44
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#ifndef HTTPMEDIARESPONSE_H
+#define HTTPMEDIARESPONSE_H
+
+#include <HTTPFileResponse.h>
+#include <AbstractMedia.h>
+
+class cHTTPMediaResponse : public cHTTPFileResponse {
+public:
+ cHTTPMediaResponse(cAbstractMedia *Media);
+ virtual ~cHTTPMediaResponse();
+
+ virtual size_t ReadContentChunk(char *Buf, size_t bufSize);
+
+private:
+ cAbstractMedia *media;
+};
+
+#endif /* HTTPMEDIARESPONSE_H */
+
diff --git a/cmps/serverlib/include/JSonListAssembler.h b/cmps/serverlib/include/JSonListAssembler.h
new file mode 100644
index 0000000..bfc68ed
--- /dev/null
+++ b/cmps/serverlib/include/JSonListAssembler.h
@@ -0,0 +1,46 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: JSonListAssembler.h
+ * Created: 6. Juli 2012, 09:53
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#ifndef JSONLISTASSEMBLER_H
+#define JSONLISTASSEMBLER_H
+
+#include <AbstractListAssembler.h>
+#include <map>
+
+class cStringBuilder;
+class cJSonListAssembler : public cAbstractListAssembler {
+public:
+ cJSonListAssembler();
+ virtual ~cJSonListAssembler();
+
+ virtual const char *MediaType(void) const;
+
+protected:
+ virtual bool OpenList(cStringBuilder &sb, std::map<int, size_t> &Categories, size_t total, size_t start = 0, uint delta = 40);
+ virtual bool AddElement(cStringBuilder &sb, void *ListElement, bool odd);
+ virtual bool CloseList(cStringBuilder &sb, size_t total, size_t start = 0, uint delta = 40);
+};
+
+#endif /* JSONLISTASSEMBLER_H */
+
diff --git a/cmps/serverlib/include/MediaFileHandler.h b/cmps/serverlib/include/MediaFileHandler.h
new file mode 100644
index 0000000..01c7b83
--- /dev/null
+++ b/cmps/serverlib/include/MediaFileHandler.h
@@ -0,0 +1,43 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: MediaFileHandler.h
+ * Created: 5. Juli 2012, 08:06
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#ifndef MEDIAFILEHANDLER_H
+#define MEDIAFILEHANDLER_H
+
+#include <AbstractMediaRequestHandler.h>
+
+class cHTTPRequest;
+class cHTTPResponse;
+class cStringBuilder;
+class cMediaFileHandler : public cAbstractMediaRequestHandler {
+public:
+ cMediaFileHandler();
+ virtual ~cMediaFileHandler();
+
+ virtual cHTTPResponse *ProcessRequest(cHTTPRequest &Request);
+ virtual void Usage(cStringBuilder &sb);
+ };
+
+#endif /* MEDIAFILEHANDLER_H */
+
diff --git a/cmps/serverlib/include/MediaListHandler.h b/cmps/serverlib/include/MediaListHandler.h
new file mode 100644
index 0000000..cc3127c
--- /dev/null
+++ b/cmps/serverlib/include/MediaListHandler.h
@@ -0,0 +1,58 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: MediaListHandler.h
+ * Created: 5. Juli 2012, 08:06
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#ifndef MEDIALISTHANDLER_H
+#define MEDIALISTHANDLER_H
+
+#include <AbstractMediaRequestHandler.h>
+#include <string>
+#include <tr1/unordered_map>
+
+class cHTTPRequest;
+class cHTTPResponse;
+class cAbstractListAssembler;
+class cStringBuilder;
+class cMediaListHandler : public cAbstractMediaRequestHandler {
+public:
+ typedef std::tr1::unordered_map<std::string, cAbstractListAssembler *> AssemblerList;
+
+ cMediaListHandler();
+ virtual ~cMediaListHandler();
+
+ virtual cHTTPResponse *ProcessRequest(cHTTPRequest &Request);
+ virtual void Usage(cStringBuilder &sb);
+
+ void SetListAssembler(const char *ID, cAbstractListAssembler *assembler);
+ void SetDefaultListAssembler(cAbstractListAssembler *assembler);
+
+protected:
+ cAbstractListAssembler *ListAssembler(const char *ID = NULL);
+
+private:
+ AssemblerList listAssemblers;
+ cAbstractListAssembler *defaultListAssembler;
+ };
+
+#endif /* MEDIALISTHANDLER_H */
+
diff --git a/cmps/serverlib/nbproject/Makefile-Debug.mk b/cmps/serverlib/nbproject/Makefile-Debug.mk
new file mode 100644
index 0000000..a19c3d9
--- /dev/null
+++ b/cmps/serverlib/nbproject/Makefile-Debug.mk
@@ -0,0 +1,121 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a -pre and a -post target defined where you can add customized code.
+#
+# This makefile implements configuration specific macros and targets.
+
+
+# Environment
+MKDIR=mkdir
+CP=cp
+GREP=grep
+NM=nm
+CCADMIN=CCadmin
+RANLIB=ranlib
+CC=gcc
+CCC=g++
+CXX=g++
+FC=gfortran
+AS=as
+
+# Macros
+CND_PLATFORM=GNU-Linux-x86
+CND_CONF=Debug
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+
+# Include project Makefile
+include Makefile
+
+# Object Directory
+OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
+
+# Object Files
+OBJECTFILES= \
+ ${OBJECTDIR}/src/JSonListAssembler.o \
+ ${OBJECTDIR}/src/CommandHandler.o \
+ ${OBJECTDIR}/src/HTMLListAssembler.o \
+ ${OBJECTDIR}/src/AbstractMediaRequestHandler.o \
+ ${OBJECTDIR}/src/HTTPMediaResponse.o \
+ ${OBJECTDIR}/src/MediaListHandler.o \
+ ${OBJECTDIR}/src/MediaFileHandler.o
+
+
+# C Compiler Flags
+CFLAGS=
+
+# CC Compiler Flags
+CCFLAGS=-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi
+CXXFLAGS=-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi
+
+# Fortran Compiler Flags
+FFLAGS=
+
+# Assembler Flags
+ASFLAGS=
+
+# Link Libraries and Options
+LDLIBSOPTIONS=
+
+# Build Targets
+.build-conf: ${BUILD_SUBPROJECTS}
+ "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a: ${OBJECTFILES}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+ ${AR} -rv ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a ${OBJECTFILES}
+ $(RANLIB) ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+
+${OBJECTDIR}/src/JSonListAssembler.o: nbproject/Makefile-${CND_CONF}.mk src/JSonListAssembler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -g -Wall -D_GNU_SOURCE=1 -D_REENTRANT -Iinclude -I../../libs/fsScan/include -I../../libs/networking/include -I../../libs/util/include -I../../libs/vdr/include -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/JSonListAssembler.o src/JSonListAssembler.cc
+
+${OBJECTDIR}/src/CommandHandler.o: nbproject/Makefile-${CND_CONF}.mk src/CommandHandler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -g -Wall -D_GNU_SOURCE=1 -D_REENTRANT -Iinclude -I../../libs/fsScan/include -I../../libs/networking/include -I../../libs/util/include -I../../libs/vdr/include -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/CommandHandler.o src/CommandHandler.cc
+
+${OBJECTDIR}/src/HTMLListAssembler.o: nbproject/Makefile-${CND_CONF}.mk src/HTMLListAssembler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -g -Wall -D_GNU_SOURCE=1 -D_REENTRANT -Iinclude -I../../libs/fsScan/include -I../../libs/networking/include -I../../libs/util/include -I../../libs/vdr/include -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/HTMLListAssembler.o src/HTMLListAssembler.cc
+
+${OBJECTDIR}/src/AbstractMediaRequestHandler.o: nbproject/Makefile-${CND_CONF}.mk src/AbstractMediaRequestHandler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -g -Wall -D_GNU_SOURCE=1 -D_REENTRANT -Iinclude -I../../libs/fsScan/include -I../../libs/networking/include -I../../libs/util/include -I../../libs/vdr/include -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/AbstractMediaRequestHandler.o src/AbstractMediaRequestHandler.cc
+
+${OBJECTDIR}/src/HTTPMediaResponse.o: nbproject/Makefile-${CND_CONF}.mk src/HTTPMediaResponse.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -g -Wall -D_GNU_SOURCE=1 -D_REENTRANT -Iinclude -I../../libs/fsScan/include -I../../libs/networking/include -I../../libs/util/include -I../../libs/vdr/include -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/HTTPMediaResponse.o src/HTTPMediaResponse.cc
+
+${OBJECTDIR}/src/MediaListHandler.o: nbproject/Makefile-${CND_CONF}.mk src/MediaListHandler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -g -Wall -D_GNU_SOURCE=1 -D_REENTRANT -Iinclude -I../../libs/fsScan/include -I../../libs/networking/include -I../../libs/util/include -I../../libs/vdr/include -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/MediaListHandler.o src/MediaListHandler.cc
+
+${OBJECTDIR}/src/MediaFileHandler.o: nbproject/Makefile-${CND_CONF}.mk src/MediaFileHandler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -g -Wall -D_GNU_SOURCE=1 -D_REENTRANT -Iinclude -I../../libs/fsScan/include -I../../libs/networking/include -I../../libs/util/include -I../../libs/vdr/include -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/MediaFileHandler.o src/MediaFileHandler.cc
+
+# Subprojects
+.build-subprojects:
+
+# Clean Targets
+.clean-conf: ${CLEAN_SUBPROJECTS}
+ ${RM} -r ${CND_BUILDDIR}/${CND_CONF}
+ ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+
+# Subprojects
+.clean-subprojects:
+
+# Enable dependency checking
+.dep.inc: .depcheck-impl
+
+include .dep.inc
diff --git a/cmps/serverlib/nbproject/Makefile-Release.mk b/cmps/serverlib/nbproject/Makefile-Release.mk
new file mode 100644
index 0000000..a423680
--- /dev/null
+++ b/cmps/serverlib/nbproject/Makefile-Release.mk
@@ -0,0 +1,121 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a -pre and a -post target defined where you can add customized code.
+#
+# This makefile implements configuration specific macros and targets.
+
+
+# Environment
+MKDIR=mkdir
+CP=cp
+GREP=grep
+NM=nm
+CCADMIN=CCadmin
+RANLIB=ranlib
+CC=gcc
+CCC=g++
+CXX=g++
+FC=gfortran
+AS=as
+
+# Macros
+CND_PLATFORM=GNU-Linux-x86
+CND_CONF=Release
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+
+# Include project Makefile
+include Makefile
+
+# Object Directory
+OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
+
+# Object Files
+OBJECTFILES= \
+ ${OBJECTDIR}/src/JSonListAssembler.o \
+ ${OBJECTDIR}/src/CommandHandler.o \
+ ${OBJECTDIR}/src/HTMLListAssembler.o \
+ ${OBJECTDIR}/src/AbstractMediaRequestHandler.o \
+ ${OBJECTDIR}/src/HTTPMediaResponse.o \
+ ${OBJECTDIR}/src/MediaListHandler.o \
+ ${OBJECTDIR}/src/MediaFileHandler.o
+
+
+# C Compiler Flags
+CFLAGS=
+
+# CC Compiler Flags
+CCFLAGS=
+CXXFLAGS=
+
+# Fortran Compiler Flags
+FFLAGS=
+
+# Assembler Flags
+ASFLAGS=
+
+# Link Libraries and Options
+LDLIBSOPTIONS=
+
+# Build Targets
+.build-conf: ${BUILD_SUBPROJECTS}
+ "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a: ${OBJECTFILES}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+ ${AR} -rv ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a ${OBJECTFILES}
+ $(RANLIB) ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+
+${OBJECTDIR}/src/JSonListAssembler.o: nbproject/Makefile-${CND_CONF}.mk src/JSonListAssembler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/JSonListAssembler.o src/JSonListAssembler.cc
+
+${OBJECTDIR}/src/CommandHandler.o: nbproject/Makefile-${CND_CONF}.mk src/CommandHandler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/CommandHandler.o src/CommandHandler.cc
+
+${OBJECTDIR}/src/HTMLListAssembler.o: nbproject/Makefile-${CND_CONF}.mk src/HTMLListAssembler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/HTMLListAssembler.o src/HTMLListAssembler.cc
+
+${OBJECTDIR}/src/AbstractMediaRequestHandler.o: nbproject/Makefile-${CND_CONF}.mk src/AbstractMediaRequestHandler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/AbstractMediaRequestHandler.o src/AbstractMediaRequestHandler.cc
+
+${OBJECTDIR}/src/HTTPMediaResponse.o: nbproject/Makefile-${CND_CONF}.mk src/HTTPMediaResponse.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/HTTPMediaResponse.o src/HTTPMediaResponse.cc
+
+${OBJECTDIR}/src/MediaListHandler.o: nbproject/Makefile-${CND_CONF}.mk src/MediaListHandler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/MediaListHandler.o src/MediaListHandler.cc
+
+${OBJECTDIR}/src/MediaFileHandler.o: nbproject/Makefile-${CND_CONF}.mk src/MediaFileHandler.cc
+ ${MKDIR} -p ${OBJECTDIR}/src
+ ${RM} $@.d
+ $(COMPILE.cc) -O2 -MMD -MP -MF $@.d -o ${OBJECTDIR}/src/MediaFileHandler.o src/MediaFileHandler.cc
+
+# Subprojects
+.build-subprojects:
+
+# Clean Targets
+.clean-conf: ${CLEAN_SUBPROJECTS}
+ ${RM} -r ${CND_BUILDDIR}/${CND_CONF}
+ ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+
+# Subprojects
+.clean-subprojects:
+
+# Enable dependency checking
+.dep.inc: .depcheck-impl
+
+include .dep.inc
diff --git a/cmps/serverlib/nbproject/Makefile-impl.mk b/cmps/serverlib/nbproject/Makefile-impl.mk
new file mode 100644
index 0000000..27d931c
--- /dev/null
+++ b/cmps/serverlib/nbproject/Makefile-impl.mk
@@ -0,0 +1,133 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a pre- and a post- target defined where you can add customization code.
+#
+# This makefile implements macros and targets common to all configurations.
+#
+# NOCDDL
+
+
+# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
+# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
+# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
+# and .clean-reqprojects-conf unless SUB has the value 'no'
+SUB_no=NO
+SUBPROJECTS=${SUB_${SUB}}
+BUILD_SUBPROJECTS_=.build-subprojects
+BUILD_SUBPROJECTS_NO=
+BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
+CLEAN_SUBPROJECTS_=.clean-subprojects
+CLEAN_SUBPROJECTS_NO=
+CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
+
+
+# Project Name
+PROJECTNAME=serverlib
+
+# Active Configuration
+DEFAULTCONF=Debug
+CONF=${DEFAULTCONF}
+
+# All Configurations
+ALLCONFS=Debug Release
+
+
+# build
+.build-impl: .build-pre .validate-impl .depcheck-impl
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf
+
+
+# clean
+.clean-impl: .clean-pre .validate-impl .depcheck-impl
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf
+
+
+# clobber
+.clobber-impl: .clobber-pre .depcheck-impl
+ @#echo "=> Running $@..."
+ for CONF in ${ALLCONFS}; \
+ do \
+ "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
+ done
+
+# all
+.all-impl: .all-pre .depcheck-impl
+ @#echo "=> Running $@..."
+ for CONF in ${ALLCONFS}; \
+ do \
+ "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \
+ done
+
+# build tests
+.build-tests-impl: .build-impl .build-tests-pre
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf
+
+# run tests
+.test-impl: .build-tests-impl .test-pre
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf
+
+# dependency checking support
+.depcheck-impl:
+ @echo "# This code depends on make tool being used" >.dep.inc
+ @if [ -n "${MAKE_VERSION}" ]; then \
+ echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
+ echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
+ echo "include \$${DEPFILES}" >>.dep.inc; \
+ echo "endif" >>.dep.inc; \
+ else \
+ echo ".KEEP_STATE:" >>.dep.inc; \
+ echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
+ fi
+
+# configuration validation
+.validate-impl:
+ @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
+ then \
+ echo ""; \
+ echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
+ echo "See 'make help' for details."; \
+ echo "Current directory: " `pwd`; \
+ echo ""; \
+ fi
+ @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
+ then \
+ exit 1; \
+ fi
+
+
+# help
+.help-impl: .help-pre
+ @echo "This makefile supports the following configurations:"
+ @echo " ${ALLCONFS}"
+ @echo ""
+ @echo "and the following targets:"
+ @echo " build (default target)"
+ @echo " clean"
+ @echo " clobber"
+ @echo " all"
+ @echo " help"
+ @echo ""
+ @echo "Makefile Usage:"
+ @echo " make [CONF=<CONFIGURATION>] [SUB=no] build"
+ @echo " make [CONF=<CONFIGURATION>] [SUB=no] clean"
+ @echo " make [SUB=no] clobber"
+ @echo " make [SUB=no] all"
+ @echo " make help"
+ @echo ""
+ @echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
+ @echo " also build subprojects."
+ @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
+ @echo " also clean subprojects."
+ @echo "Target 'clobber' will remove all built files from all configurations and,"
+ @echo " unless 'SUB=no', also from subprojects."
+ @echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
+ @echo " also build subprojects."
+ @echo "Target 'help' prints this message."
+ @echo ""
+
diff --git a/cmps/serverlib/nbproject/Makefile-variables.mk b/cmps/serverlib/nbproject/Makefile-variables.mk
new file mode 100644
index 0000000..1454d01
--- /dev/null
+++ b/cmps/serverlib/nbproject/Makefile-variables.mk
@@ -0,0 +1,35 @@
+#
+# Generated - do not edit!
+#
+# NOCDDL
+#
+CND_BASEDIR=`pwd`
+CND_BUILDDIR=build
+CND_DISTDIR=dist
+# Debug configuration
+CND_PLATFORM_Debug=GNU-Linux-x86
+CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux-x86
+CND_ARTIFACT_NAME_Debug=libserverlib.a
+CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux-x86/libserverlib.a
+CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux-x86/package
+CND_PACKAGE_NAME_Debug=serverlib.tar
+CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux-x86/package/serverlib.tar
+# Release configuration
+CND_PLATFORM_Release=GNU-Linux-x86
+CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux-x86
+CND_ARTIFACT_NAME_Release=libserverlib.a
+CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux-x86/libserverlib.a
+CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux-x86/package
+CND_PACKAGE_NAME_Release=serverlib.tar
+CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux-x86/package/serverlib.tar
+#
+# include compiler specific variables
+#
+# dmake command
+ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \
+ (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)
+#
+# gmake command
+.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk))
+#
+include nbproject/private/Makefile-variables.mk
diff --git a/cmps/serverlib/nbproject/Package-Debug.bash b/cmps/serverlib/nbproject/Package-Debug.bash
new file mode 100644
index 0000000..6d7c05b
--- /dev/null
+++ b/cmps/serverlib/nbproject/Package-Debug.bash
@@ -0,0 +1,75 @@
+#!/bin/bash -x
+
+#
+# Generated - do not edit!
+#
+
+# Macros
+TOP=`pwd`
+CND_PLATFORM=GNU-Linux-x86
+CND_CONF=Debug
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
+TMPDIRNAME=tmp-packaging
+OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+OUTPUT_BASENAME=libserverlib.a
+PACKAGE_TOP_DIR=serverlib/
+
+# Functions
+function checkReturnCode
+{
+ rc=$?
+ if [ $rc != 0 ]
+ then
+ exit $rc
+ fi
+}
+function makeDirectory
+# $1 directory path
+# $2 permission (optional)
+{
+ mkdir -p "$1"
+ checkReturnCode
+ if [ "$2" != "" ]
+ then
+ chmod $2 "$1"
+ checkReturnCode
+ fi
+}
+function copyFileToTmpDir
+# $1 from-file path
+# $2 to-file path
+# $3 permission
+{
+ cp "$1" "$2"
+ checkReturnCode
+ if [ "$3" != "" ]
+ then
+ chmod $3 "$2"
+ checkReturnCode
+ fi
+}
+
+# Setup
+cd "${TOP}"
+mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
+rm -rf ${NBTMPDIR}
+mkdir -p ${NBTMPDIR}
+
+# Copy files and create directories and links
+cd "${TOP}"
+makeDirectory "${NBTMPDIR}/serverlib/lib"
+copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}lib/${OUTPUT_BASENAME}" 0644
+
+
+# Generate tar file
+cd "${TOP}"
+rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/serverlib.tar
+cd ${NBTMPDIR}
+tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/serverlib.tar *
+checkReturnCode
+
+# Cleanup
+cd "${TOP}"
+rm -rf ${NBTMPDIR}
diff --git a/cmps/serverlib/nbproject/Package-Release.bash b/cmps/serverlib/nbproject/Package-Release.bash
new file mode 100644
index 0000000..a045c4a
--- /dev/null
+++ b/cmps/serverlib/nbproject/Package-Release.bash
@@ -0,0 +1,75 @@
+#!/bin/bash -x
+
+#
+# Generated - do not edit!
+#
+
+# Macros
+TOP=`pwd`
+CND_PLATFORM=GNU-Linux-x86
+CND_CONF=Release
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
+TMPDIRNAME=tmp-packaging
+OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libserverlib.a
+OUTPUT_BASENAME=libserverlib.a
+PACKAGE_TOP_DIR=serverlib/
+
+# Functions
+function checkReturnCode
+{
+ rc=$?
+ if [ $rc != 0 ]
+ then
+ exit $rc
+ fi
+}
+function makeDirectory
+# $1 directory path
+# $2 permission (optional)
+{
+ mkdir -p "$1"
+ checkReturnCode
+ if [ "$2" != "" ]
+ then
+ chmod $2 "$1"
+ checkReturnCode
+ fi
+}
+function copyFileToTmpDir
+# $1 from-file path
+# $2 to-file path
+# $3 permission
+{
+ cp "$1" "$2"
+ checkReturnCode
+ if [ "$3" != "" ]
+ then
+ chmod $3 "$2"
+ checkReturnCode
+ fi
+}
+
+# Setup
+cd "${TOP}"
+mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
+rm -rf ${NBTMPDIR}
+mkdir -p ${NBTMPDIR}
+
+# Copy files and create directories and links
+cd "${TOP}"
+makeDirectory "${NBTMPDIR}/serverlib/lib"
+copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}lib/${OUTPUT_BASENAME}" 0644
+
+
+# Generate tar file
+cd "${TOP}"
+rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/serverlib.tar
+cd ${NBTMPDIR}
+tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/serverlib.tar *
+checkReturnCode
+
+# Cleanup
+cd "${TOP}"
+rm -rf ${NBTMPDIR}
diff --git a/cmps/serverlib/nbproject/configurations.xml b/cmps/serverlib/nbproject/configurations.xml
new file mode 100644
index 0000000..5ca0eaf
--- /dev/null
+++ b/cmps/serverlib/nbproject/configurations.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configurationDescriptor version="80">
+ <logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
+ <logicalFolder name="HeaderFiles"
+ displayName="Header Files"
+ projectFiles="true">
+ <itemPath>include/AbstractMediaRequestHandler.h</itemPath>
+ <itemPath>include/CommandHandler.h</itemPath>
+ <itemPath>include/HTMLListAssembler.h</itemPath>
+ <itemPath>include/HTTPMediaResponse.h</itemPath>
+ <itemPath>include/JSonListAssembler.h</itemPath>
+ <itemPath>include/MediaFileHandler.h</itemPath>
+ <itemPath>include/MediaListHandler.h</itemPath>
+ </logicalFolder>
+ <logicalFolder name="ResourceFiles"
+ displayName="Resource Files"
+ projectFiles="true">
+ </logicalFolder>
+ <logicalFolder name="SourceFiles"
+ displayName="Source Files"
+ projectFiles="true">
+ <itemPath>src/AbstractMediaRequestHandler.cc</itemPath>
+ <itemPath>src/CommandHandler.cc</itemPath>
+ <itemPath>src/HTMLListAssembler.cc</itemPath>
+ <itemPath>src/HTTPMediaResponse.cc</itemPath>
+ <itemPath>src/JSonListAssembler.cc</itemPath>
+ <itemPath>src/MediaFileHandler.cc</itemPath>
+ <itemPath>src/MediaListHandler.cc</itemPath>
+ </logicalFolder>
+ <logicalFolder name="TestFiles"
+ displayName="Test Files"
+ projectFiles="false"
+ kind="TEST_LOGICAL_FOLDER">
+ </logicalFolder>
+ <logicalFolder name="ExternalFiles"
+ displayName="Important Files"
+ projectFiles="false"
+ kind="IMPORTANT_FILES_FOLDER">
+ <itemPath>Makefile</itemPath>
+ </logicalFolder>
+ </logicalFolder>
+ <projectmakefile>Makefile</projectmakefile>
+ <confs>
+ <conf name="Debug" type="3">
+ <toolsSet>
+ <remote-sources-mode>LOCAL_SOURCES</remote-sources-mode>
+ <compilerSet>default</compilerSet>
+ </toolsSet>
+ <compileType>
+ <ccTool>
+ <incDir>
+ <pElem>include</pElem>
+ <pElem>../../libs/fsScan/include</pElem>
+ <pElem>../../libs/networking/include</pElem>
+ <pElem>../../libs/util/include</pElem>
+ <pElem>../../libs/vdr/include</pElem>
+ </incDir>
+ <commandLine>-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi</commandLine>
+ <preprocessorList>
+ <Elem>_GNU_SOURCE=1</Elem>
+ <Elem>_REENTRANT</Elem>
+ </preprocessorList>
+ <warningLevel>2</warningLevel>
+ </ccTool>
+ <archiverTool>
+ </archiverTool>
+ </compileType>
+ </conf>
+ <conf name="Release" type="3">
+ <toolsSet>
+ <remote-sources-mode>LOCAL_SOURCES</remote-sources-mode>
+ <compilerSet>default</compilerSet>
+ </toolsSet>
+ <compileType>
+ <cTool>
+ <developmentMode>5</developmentMode>
+ </cTool>
+ <ccTool>
+ <developmentMode>5</developmentMode>
+ </ccTool>
+ <fortranCompilerTool>
+ <developmentMode>5</developmentMode>
+ </fortranCompilerTool>
+ <asmTool>
+ <developmentMode>5</developmentMode>
+ </asmTool>
+ <archiverTool>
+ </archiverTool>
+ </compileType>
+ </conf>
+ </confs>
+</configurationDescriptor>
diff --git a/cmps/serverlib/nbproject/private/Makefile-variables.mk b/cmps/serverlib/nbproject/private/Makefile-variables.mk
new file mode 100644
index 0000000..a64183e
--- /dev/null
+++ b/cmps/serverlib/nbproject/private/Makefile-variables.mk
@@ -0,0 +1,7 @@
+#
+# Generated - do not edit!
+#
+# NOCDDL
+#
+# Debug configuration
+# Release configuration
diff --git a/cmps/serverlib/nbproject/private/configurations.xml b/cmps/serverlib/nbproject/private/configurations.xml
new file mode 100644
index 0000000..fa15dc7
--- /dev/null
+++ b/cmps/serverlib/nbproject/private/configurations.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configurationDescriptor version="80">
+ <projectmakefile>Makefile</projectmakefile>
+ <confs>
+ <conf name="Debug" type="3">
+ <toolsSet>
+ <developmentServer>localhost</developmentServer>
+ <platform>2</platform>
+ </toolsSet>
+ <dbx_gdbdebugger version="1">
+ <gdb_pathmaps>
+ </gdb_pathmaps>
+ <gdb_interceptlist>
+ <gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
+ </gdb_interceptlist>
+ <gdb_options>
+ <DebugOptions>
+ </DebugOptions>
+ </gdb_options>
+ <gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
+ </dbx_gdbdebugger>
+ <nativedebugger version="1">
+ <engine>gdb</engine>
+ </nativedebugger>
+ <runprofile version="9">
+ <runcommandpicklist>
+ <runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
+ </runcommandpicklist>
+ <runcommand>"${OUTPUT_PATH}"</runcommand>
+ <rundir></rundir>
+ <buildfirst>true</buildfirst>
+ <terminal-type>0</terminal-type>
+ <remove-instrumentation>0</remove-instrumentation>
+ <environment>
+ </environment>
+ </runprofile>
+ </conf>
+ <conf name="Release" type="3">
+ <toolsSet>
+ <developmentServer>localhost</developmentServer>
+ <platform>2</platform>
+ </toolsSet>
+ <dbx_gdbdebugger version="1">
+ <gdb_pathmaps>
+ </gdb_pathmaps>
+ <gdb_interceptlist>
+ <gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
+ </gdb_interceptlist>
+ <gdb_options>
+ <DebugOptions>
+ </DebugOptions>
+ </gdb_options>
+ <gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
+ </dbx_gdbdebugger>
+ <nativedebugger version="1">
+ <engine>gdb</engine>
+ </nativedebugger>
+ <runprofile version="9">
+ <runcommandpicklist>
+ <runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
+ </runcommandpicklist>
+ <runcommand>"${OUTPUT_PATH}"</runcommand>
+ <rundir></rundir>
+ <buildfirst>true</buildfirst>
+ <terminal-type>0</terminal-type>
+ <remove-instrumentation>0</remove-instrumentation>
+ <environment>
+ </environment>
+ </runprofile>
+ </conf>
+ </confs>
+</configurationDescriptor>
diff --git a/cmps/serverlib/nbproject/private/private.xml b/cmps/serverlib/nbproject/private/private.xml
new file mode 100644
index 0000000..5ee2703
--- /dev/null
+++ b/cmps/serverlib/nbproject/private/private.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+ <data xmlns="http://www.netbeans.org/ns/make-project-private/1">
+ <activeConfTypeElem>3</activeConfTypeElem>
+ <activeConfIndexElem>0</activeConfIndexElem>
+ </data>
+ <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
+</project-private>
diff --git a/cmps/serverlib/nbproject/project.xml b/cmps/serverlib/nbproject/project.xml
new file mode 100644
index 0000000..564e561
--- /dev/null
+++ b/cmps/serverlib/nbproject/project.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.cnd.makeproject</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/make-project/1">
+ <name>serverlib</name>
+ <c-extensions/>
+ <cpp-extensions>cc</cpp-extensions>
+ <header-extensions>h</header-extensions>
+ <sourceEncoding>UTF-8</sourceEncoding>
+ <make-dep-projects/>
+ <sourceRootList/>
+ <confList>
+ <confElem>
+ <name>Debug</name>
+ <type>3</type>
+ </confElem>
+ <confElem>
+ <name>Release</name>
+ <type>3</type>
+ </confElem>
+ </confList>
+ </data>
+ </configuration>
+</project>
diff --git a/cmps/serverlib/serverlib.cbp b/cmps/serverlib/serverlib.cbp
new file mode 100644
index 0000000..92deaf4
--- /dev/null
+++ b/cmps/serverlib/serverlib.cbp
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+ <FileVersion major="1" minor="6" />
+ <Project>
+ <Option title="CMP.server.lib" />
+ <Option pch_mode="2" />
+ <Option compiler="gcc" />
+ <Build>
+ <Target title="Debug">
+ <Option output="libserverlib" prefix_auto="1" extension_auto="1" />
+ <Option working_dir="" />
+ <Option object_output="obj/Debug/" />
+ <Option type="2" />
+ <Option compiler="gcc" />
+ <Option createDefFile="1" />
+ <Compiler>
+ <Add option="-Wall" />
+ <Add option="-g" />
+ </Compiler>
+ </Target>
+ <Target title="Release">
+ <Option output="libserverlib" prefix_auto="1" extension_auto="1" />
+ <Option working_dir="" />
+ <Option object_output="obj/Release/" />
+ <Option type="2" />
+ <Option compiler="gcc" />
+ <Option createDefFile="1" />
+ <Compiler>
+ <Add option="-Wall" />
+ <Add option="-O2" />
+ </Compiler>
+ <Linker>
+ <Add option="-s" />
+ </Linker>
+ </Target>
+ </Build>
+ <Compiler>
+ <Add option="-std=gnu++0x -fomit-frame-pointer -fPIC -pthread -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -ansi" />
+ <Add option="-D_REENTRANT" />
+ <Add option="-D_GNU_SOURCE=1" />
+ <Add directory="include" />
+ <Add directory="../../libs/fsScan/include" />
+ <Add directory="../../libs/networking/include" />
+ <Add directory="../../libs/util/include" />
+ <Add directory="../../libs/vdr/include" />
+ </Compiler>
+ <Unit filename="include/AbstractMediaRequestHandler.h" />
+ <Unit filename="include/CommandHandler.h" />
+ <Unit filename="include/HTMLListAssembler.h" />
+ <Unit filename="include/HTTPMediaResponse.h" />
+ <Unit filename="include/JSonListAssembler.h" />
+ <Unit filename="include/MediaFileHandler.h" />
+ <Unit filename="include/MediaListHandler.h" />
+ <Unit filename="src/AbstractMediaRequestHandler.cc" />
+ <Unit filename="src/CommandHandler.cc" />
+ <Unit filename="src/HTMLListAssembler.cc" />
+ <Unit filename="src/HTTPMediaResponse.cc" />
+ <Unit filename="src/JSonListAssembler.cc" />
+ <Unit filename="src/MediaFileHandler.cc" />
+ <Unit filename="src/MediaListHandler.cc" />
+ <Extensions>
+ <code_completion />
+ <envvars />
+ <lib_finder disable_auto="1" />
+ <debugger />
+ </Extensions>
+ </Project>
+</CodeBlocks_project_file>
diff --git a/cmps/serverlib/serverlib.depend b/cmps/serverlib/serverlib.depend
new file mode 100644
index 0000000..c4ac310
--- /dev/null
+++ b/cmps/serverlib/serverlib.depend
@@ -0,0 +1 @@
+# depslib dependency file v1.0
diff --git a/cmps/serverlib/serverlib.layout b/cmps/serverlib/serverlib.layout
new file mode 100644
index 0000000..8102807
--- /dev/null
+++ b/cmps/serverlib/serverlib.layout
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_layout_file>
+ <ActiveTarget name="Debug" />
+ <File name="src/HTMLListAssembler.cc" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="0" topLine="0" />
+ </Cursor>
+ </File>
+ <File name="src/MediaListHandler.cc" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="0" topLine="0" />
+ </Cursor>
+ </File>
+ <File name="src/JSonListAssembler.cc" open="1" top="1" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="1138" topLine="0" />
+ </Cursor>
+ </File>
+ <File name="src/AbstractMediaRequestHandler.cc" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="0" topLine="0" />
+ </Cursor>
+ </File>
+</CodeBlocks_layout_file>
diff --git a/cmps/serverlib/serverlib.layout.save b/cmps/serverlib/serverlib.layout.save
new file mode 100644
index 0000000..2f5e283
--- /dev/null
+++ b/cmps/serverlib/serverlib.layout.save
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_layout_file>
+ <ActiveTarget name="Debug" />
+ <File name="src/JSonListAssembler.cc" open="1" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="0" topLine="0" />
+ </Cursor>
+ </File>
+ <File name="src/AbstractMediaRequestHandler.cc" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="0" topLine="0" />
+ </Cursor>
+ </File>
+ <File name="src/MediaListHandler.cc" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="0" topLine="0" />
+ </Cursor>
+ </File>
+ <File name="src/HTMLListAssembler.cc" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
+ <Cursor>
+ <Cursor1 position="0" topLine="0" />
+ </Cursor>
+ </File>
+</CodeBlocks_layout_file>
diff --git a/cmps/serverlib/src/AbstractMediaRequestHandler.cc b/cmps/serverlib/src/AbstractMediaRequestHandler.cc
new file mode 100644
index 0000000..b65ad13
--- /dev/null
+++ b/cmps/serverlib/src/AbstractMediaRequestHandler.cc
@@ -0,0 +1,46 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: AbstractMediaRequestHandler.cc
+ * Created: 5. Juli 2012, 07:58
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <AbstractMediaRequestHandler.h>
+#include <FilesystemScanner.h>
+
+static cFilesystemScanner *scanner = NULL;
+
+cAbstractMediaRequestHandler::cAbstractMediaRequestHandler()
+{
+}
+
+cAbstractMediaRequestHandler::~cAbstractMediaRequestHandler()
+{
+}
+
+cFilesystemScanner *cAbstractMediaRequestHandler::FileSystemScanner(void)
+{
+ return scanner;
+}
+
+void cAbstractMediaRequestHandler::SetFilesystemScanner(cFilesystemScanner* Scanner)
+{
+ scanner = Scanner;
+} \ No newline at end of file
diff --git a/cmps/serverlib/src/CommandHandler.cc b/cmps/serverlib/src/CommandHandler.cc
new file mode 100644
index 0000000..b1a17b8
--- /dev/null
+++ b/cmps/serverlib/src/CommandHandler.cc
@@ -0,0 +1,94 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: CommandHandler.cc
+ * Created: 5. Juli 2012, 16:06
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <CommandHandler.h>
+#include <tr1/unordered_map>
+#include <HTTPRequest.h>
+#include <HTTPResponse.h>
+#include <StringBuilder.h>
+#include <Logging.h>
+
+typedef struct {
+ CommandCallback callback;
+ void *opaque;
+} CallbackInfo;
+std::tr1::unordered_map<std::string, CallbackInfo *> supportedCommands;
+
+
+cCommandHandler::cCommandHandler()
+{
+}
+
+cCommandHandler::~cCommandHandler()
+{
+}
+
+void cCommandHandler::Cleanup()
+{
+ std::tr1::unordered_map<std::string, CallbackInfo *>::iterator it = supportedCommands.begin();
+
+ while (it != supportedCommands.end()) {
+ free(it->second);
+ ++it;
+ }
+}
+
+cHTTPResponse *cCommandHandler::ProcessRequest(cHTTPRequest& Request)
+{
+ const char *command = Request.GetHeader("what");
+ CallbackInfo *info;
+
+ isyslog("cCommandHandler::ProcessRequest ...");
+ if (!command) {
+ esyslog("ERROR: no command in request");
+ return new cHTTPResponse(HTTP_BadRequest);
+ }
+ info = supportedCommands[command];
+ if (!info) {
+ esyslog("ERROR: command not registered/supported!");
+ return new cHTTPResponse(HTTP_BadRequest);
+ }
+ if ((*info->callback)(info->opaque, Request)) {
+ esyslog("ERROR: failed to execute command!");
+ return new cHTTPResponse(HTTP_InternalServerError);
+ }
+ isyslog("OK - all went well?!?");
+
+ return new cHTTPResponse(HTTP_NoContent);
+}
+
+void cCommandHandler::Usage(cStringBuilder &sb)
+{
+
+}
+
+void cCommandHandler::RegisterCallback(const char* CommandID, CommandCallback cb, void* opaque)
+{
+ CallbackInfo *info = (CallbackInfo *)malloc(sizeof(CallbackInfo));
+
+ info->callback = cb;
+ info->opaque = opaque;
+ supportedCommands[CommandID] = info;
+}
+
diff --git a/cmps/serverlib/src/HTMLListAssembler.cc b/cmps/serverlib/src/HTMLListAssembler.cc
new file mode 100644
index 0000000..8ef3261
--- /dev/null
+++ b/cmps/serverlib/src/HTMLListAssembler.cc
@@ -0,0 +1,171 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: HTMLListAssembler.cc
+ * Created: 6. Juli 2012, 09:55
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <HTMLListAssembler.h>
+#include <AbstractMedia.h>
+#include <StringBuilder.h>
+#include <tools.h>
+
+cHTMLListAssembler::cHTMLListAssembler()
+{
+}
+
+cHTMLListAssembler::~cHTMLListAssembler()
+{
+}
+
+bool cHTMLListAssembler::OpenList(cStringBuilder &sb, std::map<int, size_t> &Categories, size_t total, size_t start, uint delta)
+{
+ genHTMLPrefix(sb, "Medien-Liste");
+
+ genPreviousLink(sb, !start ? -1 : max<size_t>(0, start - delta));
+ genNextLink(sb, start + delta >= total ? -1 : min(start + delta, total));
+ genDelim(sb);
+ genTypeMenu(sb, Categories);
+ genDelim(sb);
+
+ return true;
+}
+
+bool cHTMLListAssembler::AddElement(cStringBuilder &sb, void *ListElement, bool odd)
+{
+ genMediaLink(sb, ListElement, odd);
+
+ return true;
+}
+
+bool cHTMLListAssembler::CloseList(cStringBuilder &sb, size_t total, size_t start, uint delta)
+{
+ genDelim(sb);
+ genPreviousLink(sb, !start ? -1 : max<size_t>(0, start - delta));
+ genNextLink(sb, start + delta >= total ? -1 : min(start + delta, total));
+
+ return true;
+}
+
+cStringBuilder &cHTMLListAssembler::genHTMLPrefix(cStringBuilder& sb, const char *Title)
+{
+ sb.Append("<html><head><title>").Append(Title).Append("</title>");
+
+ sb.Append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
+ sb.Append("<style type=\"text/css\"><!--\n");
+ sb.Append("body { background: #eef; } ");
+ sb.Append("h1 { margin: 0; margin-top: 20px; padding: 0; text-align: center; } ");
+ sb.Append(".left { text-align: left; } ");
+ sb.Append(".right { margin-top: -1em; text-align: right; } ");
+ sb.Append(".center { text-align: center; } ");
+ sb.Append(".hmenu { padding: 1em; margin-left: 1em; } ");
+ sb.Append(".odd { display: block; background: #DDF; margin-left: 1em; margin-right: 1em; padding: 5px; padding-left: 1em; } ");
+ sb.Append(".even { display: block; background: #EEF; margin-left: 1em; margin-right: 1em; padding: 5px; padding-left: 1em; } ");
+ sb.Append("\n--></style>");
+ sb.Append("</head><body><h1>").Append(Title).Append("</h1>");
+
+ return sb;
+}
+
+const char *cHTMLListAssembler::MediaType() const
+{
+ return "text/html";
+}
+
+cStringBuilder &cHTMLListAssembler::genDelim(cStringBuilder &sb)
+{
+ return sb.Append("<div class=\"break\"><hr/></div>");
+}
+
+cStringBuilder &cHTMLListAssembler::genMediaLink(cStringBuilder &sb, void *Element, bool odd)
+{
+ cAbstractMedia *m = (cAbstractMedia *)Element;
+
+ sb.Append("<a class=\"");
+ sb.Append(odd ? "odd" : "even");
+ sb.Append("\" href=\"");
+ sb.Append(m->LogicalPath());
+ sb.Append("\">");
+ switch (m->MediaType()) {
+ case cAbstractMedia::Audio: sb.Append("[A] "); break;
+ case cAbstractMedia::Movie: sb.Append("[M] "); break;
+ case cAbstractMedia::DVDImage: sb.Append("[D] "); break;
+ case cAbstractMedia::LegacyVdrRecording: sb.Append("[L] "); break;
+ case cAbstractMedia::VdrRecording: sb.Append("[V] "); break;
+ case cAbstractMedia::Picture: sb.Append("[P] "); break;
+ default: ;
+ }
+ sb.Append(m->Name());
+ sb.Append("</a>");
+
+ return sb;
+}
+
+cStringBuilder &cHTMLListAssembler::genNextLink(cStringBuilder &sb, int n)
+{
+ sb.Append("<div class=\"right\">");
+ if (n < 0)
+ sb.Append("next");
+ else {
+ sb.Append("<a href=\"/?start=");
+ sb.Append(n);
+ sb.Append("\">");
+ sb.Append("next");
+ sb.Append("</a>");
+ }
+ sb.Append("</div>");
+
+ return sb;
+}
+
+cStringBuilder &cHTMLListAssembler::genPreviousLink(cStringBuilder &sb, int n)
+{
+ sb.Append("<div class=\"left\">");
+ if (n < 0)
+ sb.Append("previous");
+ else {
+ sb.Append("<a href=\"/?start=");
+ sb.Append(n);
+ sb.Append("\">");
+ sb.Append("previous");
+ sb.Append("</a>");
+ }
+ sb.Append("</div>");
+
+ return sb;
+}
+
+cStringBuilder &cHTMLListAssembler::genTypeMenu(cStringBuilder &sb, std::map<int, size_t> &Categories)
+{
+ sb.Append("<div class=\"topmenu\">");
+ std::map<int, size_t>::iterator it = Categories.begin();
+
+ while (it != Categories.end()) {
+ sb.Append("<a class=\"hmenu\" href=\"/?start=");
+ sb.Append(it->second);
+ sb.Append("\">");
+ sb.Append(cAbstractMedia::MediaType2Text(it->first));
+ sb.Append("</a>");
+ ++it;
+ }
+ sb.Append("</div>");
+
+ return sb;
+} \ No newline at end of file
diff --git a/cmps/serverlib/src/HTTPMediaResponse.cc b/cmps/serverlib/src/HTTPMediaResponse.cc
new file mode 100644
index 0000000..667d114
--- /dev/null
+++ b/cmps/serverlib/src/HTTPMediaResponse.cc
@@ -0,0 +1,50 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: HTTPMediaResponse.cc
+ * Created: 6. Juli 2012, 07:44
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <HTTPMediaResponse.h>
+#include <stdlib.h>
+
+cHTTPMediaResponse::cHTTPMediaResponse(cAbstractMedia *Media)
+ : cHTTPFileResponse()
+ , media(Media)
+{
+ if (media) {
+ char *lm = FormatTime(media->LastModified());
+
+ SetHeader("LastModified", lm);
+ free(lm);
+ SetContentSize(media->Size());
+ SetContentType(media->MimeType());
+ }
+}
+
+cHTTPMediaResponse::~cHTTPMediaResponse()
+{
+}
+
+size_t cHTTPMediaResponse::ReadContentChunk(char* Buf, size_t bufSize)
+{
+ if (!media) return 0;
+ return media->ReadChunk(Buf, bufSize);
+} \ No newline at end of file
diff --git a/cmps/serverlib/src/JSonListAssembler.cc b/cmps/serverlib/src/JSonListAssembler.cc
new file mode 100644
index 0000000..c5126a3
--- /dev/null
+++ b/cmps/serverlib/src/JSonListAssembler.cc
@@ -0,0 +1,73 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: JSonListAssembler.cc
+ * Created: 6. Juli 2012, 09:53
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <JSonListAssembler.h>
+#include <AbstractMedia.h>
+#include <JSonWriter.h>
+
+cJSonListAssembler::cJSonListAssembler()
+{
+}
+
+cJSonListAssembler::~cJSonListAssembler()
+{
+}
+
+bool cJSonListAssembler::OpenList(cStringBuilder &sb, std::map<int, size_t> &Categories, size_t total, size_t start, uint delta)
+{
+ cJSonWriter writer(sb);
+
+ writer.Object().Key("total").Value(total);
+ writer.Key("results").Array();
+
+ return true;
+}
+
+bool cJSonListAssembler::AddElement(cStringBuilder &sb, void *ListElement, bool odd)
+{
+ cJSonWriter writer(sb);
+ cAbstractMedia *m = (cAbstractMedia *)ListElement;
+
+ writer.Object();
+ writer.Key("name").Value(m->Name());
+ writer.Key("type").Value(m->MediaType());
+ writer.Key("path").Value(m->LogicalPath());
+ writer.EndObject();
+
+ return true;
+}
+
+bool cJSonListAssembler::CloseList(cStringBuilder &sb, size_t total, size_t start, uint delta)
+{
+ cJSonWriter writer(sb);
+
+ writer.EndArray().EndObject();
+
+ return true;
+}
+
+const char *cJSonListAssembler::MediaType(void) const
+{
+ return "application/json";
+} \ No newline at end of file
diff --git a/cmps/serverlib/src/MediaFileHandler.cc b/cmps/serverlib/src/MediaFileHandler.cc
new file mode 100644
index 0000000..d16a033
--- /dev/null
+++ b/cmps/serverlib/src/MediaFileHandler.cc
@@ -0,0 +1,62 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: MediaFileHandler.cc
+ * Created: 5. Juli 2012, 08:06
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <MediaFileHandler.h>
+#include <AbstractMedia.h>
+#include <FilesystemScanner.h>
+#include <HTTPRequest.h>
+#include <HTTPMediaResponse.h>
+#include <StringBuilder.h>
+#include <Logging.h>
+
+cMediaFileHandler::cMediaFileHandler()
+{
+}
+
+cMediaFileHandler::~cMediaFileHandler()
+{
+}
+
+cHTTPResponse *cMediaFileHandler::ProcessRequest(cHTTPRequest& Request)
+{
+ cAbstractMedia *media = FileSystemScanner()->FindMedia(Request.Url().Path());
+
+ isyslog("cMediaFileHandler::ProcessRequest ... %0X", media);
+
+ if (!media) return NULL;
+ media->Refresh();
+
+ return new cHTTPMediaResponse(media);
+}
+
+void cMediaFileHandler::Usage(cStringBuilder& sb)
+{
+ isyslog("start of cMediaFileHandler::Usage() ...");
+ sb.Append("<dl><dt><em>");
+ sb.Append("/any/path/to/media/file");
+ sb.Append("</em></dt><dd>");
+ sb.Append("returns the media-file ready to be played by client media-players.");
+ sb.Append("</dd></dl>");
+ isyslog("end of cMediaFileHandler::Usage() ...");
+} \ No newline at end of file
diff --git a/cmps/serverlib/src/MediaListHandler.cc b/cmps/serverlib/src/MediaListHandler.cc
new file mode 100644
index 0000000..029c137
--- /dev/null
+++ b/cmps/serverlib/src/MediaListHandler.cc
@@ -0,0 +1,101 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: MediaListHandler.cc
+ * Created: 5. Juli 2012, 08:06
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <MediaListHandler.h>
+#include <AbstractListAssembler.h>
+#include <FilesystemScanner.h>
+#include <HTTPRequest.h>
+#include <HTTPResponse.h>
+#include <StringBuilder.h>
+#include <Logging.h>
+
+cMediaListHandler::cMediaListHandler()
+{
+}
+
+cMediaListHandler::~cMediaListHandler()
+{
+ AssemblerList::iterator it = listAssemblers.begin();
+
+ while (it != listAssemblers.end()) {
+ delete it->second;
+ ++it;
+ }
+ if (defaultListAssembler) delete defaultListAssembler;
+}
+
+cAbstractListAssembler *cMediaListHandler::ListAssembler(const char* ID)
+{
+ if (!ID) return defaultListAssembler;
+ cAbstractListAssembler *rv = listAssemblers[ID];
+
+ if (rv) return rv;
+ return defaultListAssembler;
+}
+
+cHTTPResponse *cMediaListHandler::ProcessRequest(cHTTPRequest& Request)
+{
+ isyslog("cMediaListHandler::ProcessRequest ...");
+ cHTTPResponse *res = NULL;
+ cAbstractListAssembler *la = ListAssembler(Request.Url().Parameter("format"));
+ const char *hdStart = Request.Url().Parameter("start");
+ const char *hdDelta = Request.Url().Parameter("limit");
+ int start = 0;
+ int delta = 40;
+
+ if (hdStart) start = atol(hdStart);
+ if (hdDelta) delta = atol(hdDelta);
+ if (!la) return new cHTTPResponse(HTTP_NotFound);
+ res = new cHTTPResponse(HTTP_OK);
+ res->SetContentType(la->MediaType());
+ la->AssembleList(res->StringBuilder(), FileSystemScanner()->MediaPool(), FileSystemScanner()->Categories(), start, delta);
+
+ return res;
+}
+
+void cMediaListHandler::Usage(cStringBuilder& sb)
+{
+ isyslog("start of cMediaListHandler::Usage() ...");
+ sb.Append("returns a list of known/supported media on this machine. To access any media from the list, ");
+ sb.Append("use the path as uri (using the http protocol).<br/>");
+ sb.Append("<strong>supported parameters:</strong><ul>");
+ sb.Append("<dl><dt>start=#</dt>");
+ sb.Append("<dd>used to step list by chunks, where <em>#</em> stands for the index of the first element to retrieve</dd>");
+ sb.Append("<dt>limit=#</dt>");
+ sb.Append("<dd>gives the chunksize (default is 40), where <em>#</em> stands for the number of elements to retrieve</dd>");
+ sb.Append("<dt>format=json</dt>");
+ sb.Append("<dd>default format is html, so if you like to get the list in json format, use this parameter</dd>");
+ sb.Append("</dl></ul>");
+ isyslog("end of cMediaListHandler::Usage() ...");
+}
+
+void cMediaListHandler::SetDefaultListAssembler(cAbstractListAssembler* assembler)
+{
+ defaultListAssembler = assembler;
+}
+
+void cMediaListHandler::SetListAssembler(const char* ID, cAbstractListAssembler* assembler)
+{
+ listAssemblers[ID] = assembler;
+}
diff --git a/cmps/serverlib/summary.txt b/cmps/serverlib/summary.txt
new file mode 100644
index 0000000..c05645e
--- /dev/null
+++ b/cmps/serverlib/summary.txt
@@ -0,0 +1 @@
+libserverlib: classes for the backend (cmps) only
diff --git a/cmps/summary.txt b/cmps/summary.txt
new file mode 100644
index 0000000..d4d02ef
--- /dev/null
+++ b/cmps/summary.txt
@@ -0,0 +1 @@
+cmps - the backend (server) part of compound media player
diff --git a/cmps/tests/CodecTest.cc b/cmps/tests/CodecTest.cc
new file mode 100644
index 0000000..071ff7b
--- /dev/null
+++ b/cmps/tests/CodecTest.cc
@@ -0,0 +1,77 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: CodecTest.cc
+ * Created: 09.07.2012, 05:44:50
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <Codec.h>
+#include <stdlib.h>
+#include <iostream>
+
+static const char *TT[] = {
+ "130-H Karadayi featuring Fresh B. - Betüll Demir - Na Nay (2009).mp3"
+, " 36 130 - R.I.O. ft Jerry Ropero vs. Mendonca - Do Rio-De Janeiro Berinbau (Bootleg Edit).mp3"
+, "Das_Vermächtnis_der_Tempelritter (2012-07-02.22.10.36-0.rec)"
+, NULL
+, "http://localhost:12345/test/Mukke/130-H%20Karadayi%20featuring%20Fresh%20B.%20-%20Bet%C3%BCll%20Demir%20-%20Na%20Nay%20(2009).mp3"
+, "http://localhost:12345/test/Mukke/36%20%20%20130%20-%20R.I.O.%20ft%20Jerry%20Ropero%20vs.%20Mendonca%20-%20Do%20Rio-De%20Janeiro%20Berinbau%20(Bootleg%20Edit).mp3"
+, "http://localhost:12345/import/Das_Verm%C3%A4chtnis_der_Tempelritter/2012-07-02.22.10.36-0.rec"
+, NULL
+};
+
+void test1()
+{
+ std::cout << "CodecTest test 1" << std::endl;
+ cURLEncoder *ue = new cURLEncoder();
+ const char **p;
+ char *newText;
+
+ for (p = TT; p && *p; ++p) {
+ newText = ue->Encode(*p);
+ std::cout << "original: " << *p << std::endl;
+ std::cout << "encoded.: " << newText << std::endl << std::endl;
+ }
+}
+
+void test2()
+{
+ std::cout << "CodecTest test 2" << std::endl;
+ std::cout << "%TEST_FAILED% time=0 testname=test2 (CodecTest) message=error message sample" << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ std::cout << "%SUITE_STARTING% CodecTest" << std::endl;
+ std::cout << "%SUITE_STARTED%" << std::endl;
+
+ std::cout << "%TEST_STARTED% test1 (CodecTest)" << std::endl;
+ test1();
+ std::cout << "%TEST_FINISHED% time=0 test1 (CodecTest)" << std::endl;
+
+// std::cout << "%TEST_STARTED% test2 (CodecTest)\n" << std::endl;
+// test2();
+// std::cout << "%TEST_FINISHED% time=0 test2 (CodecTest)" << std::endl;
+
+ std::cout << "%SUITE_FINISHED% time=0" << std::endl;
+
+ return (EXIT_SUCCESS);
+}
+
diff --git a/cmps/tests/ConnectionHandlerTest.cc b/cmps/tests/ConnectionHandlerTest.cc
new file mode 100644
index 0000000..e32fbb3
--- /dev/null
+++ b/cmps/tests/ConnectionHandlerTest.cc
@@ -0,0 +1,153 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: ConnectionHandlerTest.cc
+ * Created: 10.07.2012, 05:48:23
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <ConnectionHandler.h>
+#include <ServerConfig.h>
+#include <FilesystemScanner.h>
+#include <MediaFactory.h>
+#include <MediaListHandler.h>
+#include <MediaFileHandler.h>
+#include <CommandHandler.h>
+#include <JSonListAssembler.h>
+#include <HTMLListAssembler.h>
+#include <HTTPRequest.h>
+#include <HTTPResponse.h>
+#include <TimeMs.h>
+#include <stdlib.h>
+#include <iostream>
+#include <stdio.h>
+#include <sys/types.h>
+
+class cTestUnit {
+public:
+ cTestUnit(const char *Name, cConnectionPoint &cp);
+ ~cTestUnit();
+
+ void test1(void);
+ void test2(void);
+
+ const char *Name(void) const { return name; }
+ void SetUp(void);
+
+private:
+ cServerConfig config;
+ cConnectionHandler ch;
+ const char *name;
+ cFilesystemScanner *scanner;
+};
+
+cTestUnit::cTestUnit(const char* Name, cConnectionPoint &cp)
+ : config(12345)
+ , ch(cp, config)
+ , name(Name)
+ , scanner(NULL)
+{
+ config.SetAuthorizationRequired(false);
+ config.SetDocumentRoot("/media/video");
+ config.SetAppIcon("/media/favicon.ico");
+
+ scanner = new cFilesystemScanner();
+ if (!scanner) {
+ fprintf(stderr, "could not initialize application! (1)");
+ exit(-1);
+ }
+ scanner->SetMediaFactory(new cMediaFactory(config.DocumentRoot()));
+
+ cAbstractMediaRequestHandler::SetFilesystemScanner(scanner);
+ cConnectionHandler::RegisterRequestHandler("/cmd", new cCommandHandler());
+ cMediaListHandler *listHandler = new cMediaListHandler();
+
+ listHandler->SetListAssembler("json", new cJSonListAssembler());
+ listHandler->SetDefaultListAssembler(new cHTMLListAssembler());
+ cConnectionHandler::RegisterRequestHandler("/", listHandler);
+ cConnectionHandler::RegisterDefaultHandler(new cMediaFileHandler());
+}
+
+cTestUnit::~cTestUnit()
+{
+ cCommandHandler::Cleanup();
+ delete scanner;
+}
+
+void cTestUnit::SetUp()
+{
+ if (scanner) scanner->Refresh();
+}
+
+void cTestUnit::test1()
+{
+ std::cout << "ConnectionHandlerTest test 1" << std::endl;
+
+ cHTTPRequest rq(cHTTPRequest::GET, "/");
+
+ rq.SetHeader("Host", "localhost:43567");
+ rq.SetHeader("User-Agent", "TestUnit");
+ rq.SetHeader("Accept", "image/png,image/*;q=0.8,*/*;q=0.5");
+ rq.SetHeader("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
+ rq.SetHeader("Accept-Encoding", "gzip,deflate");
+ rq.SetHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
+ rq.SetHeader("Keep-Alive", "300");
+ rq.SetHeader("Connection", "keep-alive");
+
+ rq.Dump();
+ cHTTPResponse *res = ch.ProcessRequest(rq);
+
+ std::cout << "response looks like ..." << std::endl;
+ res->Dump();
+ delete res;
+}
+
+void cTestUnit::test2()
+{
+ std::cout << "ConnectionHandlerTest test 2" << std::endl;
+ std::cout << "%TEST_FAILED% time=0 testname=test2 (ConnectionHandlerTest) message=error message sample" << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ uint64_t t0 = cTimeMs::Now();
+ cConnectionPoint localHost("localhost", 40902);
+ cTestUnit unit("ConnectionHandlerTest", localHost);
+
+ unit.SetUp();
+ std::cout << "%SUITE_STARTING% " << unit.Name() << std::endl;
+ std::cout << "%SUITE_STARTED%" << std::endl;
+
+ std::cout << "%TEST_STARTED% test1 (" << unit.Name() << ")" << std::endl;
+ uint64_t start = cTimeMs::Now();
+ unit.test1();
+ uint64_t end = cTimeMs::Now();
+ std::cout << "%TEST_FINISHED% time=" << (double)(end - start) / 1000 << " test1 (" << unit.Name() << ")" << std::endl;
+
+ std::cout << "%TEST_STARTED% test2 (" << unit.Name() << ")\n" << std::endl;
+ start = cTimeMs::Now();
+ unit.test2();
+ end = cTimeMs::Now();
+ std::cout << "%TEST_FINISHED% time=" << (double)(end - start) / 1000 << " test2 (" << unit.Name() << ")" << std::endl;
+
+ std::cout << "%SUITE_FINISHED% time=" << (double)(cTimeMs::Now() - t0) / 1000 << std::endl;
+
+ return (EXIT_SUCCESS);
+}
+
diff --git a/cmps/tests/DirTest.cc b/cmps/tests/DirTest.cc
new file mode 100644
index 0000000..4a1f1a7
--- /dev/null
+++ b/cmps/tests/DirTest.cc
@@ -0,0 +1,74 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: DirTest.cc
+ * Created: 02.07.2012, 18:07:18
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <stdlib.h>
+#include <iostream>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/dir.h>
+
+/*
+ * Simple C++ Test Suite
+ */
+
+void test1()
+{
+ struct direct *dirEntry;
+ DIR *dir = opendir("/media");
+
+ std::cout << "DirTest test 1" << std::endl;
+ if (!dir)
+ std::cout << "%TEST_FAILED% time=0 testname=test1 (DirTest) message=failed to open directory" << std::endl;
+
+ while ((dirEntry = readdir(dir))) {
+ if (*dirEntry->d_name == '.') continue;
+ std::cout << "dir-entry: " << dirEntry->d_name << std::endl;
+ }
+ closedir(dir);
+}
+
+void test2()
+{
+ std::cout << "DirTest test 2" << std::endl;
+ std::cout << "%TEST_FAILED% time=0 testname=test2 (DirTest) message=error message sample" << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ std::cout << "%SUITE_STARTING% DirTest" << std::endl;
+ std::cout << "%SUITE_STARTED%" << std::endl;
+
+ std::cout << "%TEST_STARTED% test1 (DirTest)" << std::endl;
+ test1();
+ std::cout << "%TEST_FINISHED% time=0 test1 (DirTest)" << std::endl;
+
+ std::cout << "%TEST_STARTED% test2 (DirTest)\n" << std::endl;
+ test2();
+ std::cout << "%TEST_FINISHED% time=0 test2 (DirTest)" << std::endl;
+
+ std::cout << "%SUITE_FINISHED% time=0" << std::endl;
+
+ return (EXIT_SUCCESS);
+}
+
diff --git a/cmps/tests/FScanTest.cc b/cmps/tests/FScanTest.cc
new file mode 100644
index 0000000..86f0895
--- /dev/null
+++ b/cmps/tests/FScanTest.cc
@@ -0,0 +1,137 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: FScanTest.cc
+ * Created: 02.07.2012, 16:57:48
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <stdlib.h>
+#include <iostream>
+#include <Audio.h>
+#include <Movie.h>
+#include <Picture.h>
+#include <FilesystemScanner.h>
+#include <MediaFactory.h>
+#include <TimeMs.h>
+
+class FScanTest {
+public:
+ static void test1(void);
+ static void test2(void);
+ static void test3(void);
+ static void test4(void);
+};
+
+void FScanTest::test1()
+{
+ std::cout << "FScanTest test 1" << std::endl;
+
+ for (SupportedExtension *se = cAudio::knownExtensions; se && se->extension; ++se) {
+ std::cout << "Audio: known extension \"" << se->extension << "\" has type: " << se->mimeType << std::endl;
+ }
+}
+
+void FScanTest::test2()
+{
+ std::cout << "FScanTest test 2" << std::endl;
+
+ for (SupportedExtension *se = cMovie::knownExtensions; se && se->extension; ++se) {
+ std::cout << "Video: known extension \"" << se->extension << "\" has type: " << se->mimeType << std::endl;
+ }
+}
+
+void FScanTest::test3()
+{
+ std::cout << "FScanTest test 3" << std::endl;
+
+ for (SupportedExtension *se = cPicture::knownExtensions; se && se->extension; ++se) {
+ std::cout << "Picture: known extension \"" << se->extension << "\" has type: " << se->mimeType << std::endl;
+ }
+}
+
+void FScanTest::test4()
+///< result from java pendant: FSScanner - scanning of 9970 media took 46 ms
+///< own result: found 9970 media, in 58 ms.
+///< file server (mostly recordings) found 2828 media, in 53525 ms.
+///< file server (added 18G audio) found 5698 media, in 44653 ms.
+///< file server (same files, fresh reboot) found 5698 media, in 54723 ms.
+{
+ cFilesystemScanner scanner;
+ cAbstractMedia *media;
+
+ std::cout << "FScanTest test 4" << std::endl;
+ scanner.SetMediaFactory(new cMediaFactory("/media"));
+
+ uint64_t start = cTimeMs::Now();
+ scanner.Refresh();
+ uint64_t end = cTimeMs::Now();
+
+ for (size_t i=0; i < scanner.MediaPool().size(); ++i) {
+ media = (cAbstractMedia *) scanner.MediaPool()[i];
+
+ std::cout << media->Name() << " [" << media->MimeType() << "] => " << media->LogicalPath() << std::endl;
+ }
+ std::cout << std::endl << "found " << scanner.MediaPool().size() << " media, in " << end - start << " ms." << std::endl;
+
+ const char *file2Search = "/pretty/unsupported/media/file/in/any/workstation.unknown";
+
+ // search (worst case)
+ start = cTimeMs::Now();
+ media = scanner.FindMedia(file2Search);
+ end = cTimeMs::Now();
+
+ std::cout << "array search took " << end - start << " ms." << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ uint64_t t0 = cTimeMs::Now();
+ std::cout << "%SUITE_STARTING% FScanTest" << std::endl;
+ std::cout << "%SUITE_STARTED%" << std::endl;
+
+ std::cout << "%TEST_STARTED% test1 (FScanTest)" << std::endl;
+ uint64_t start = cTimeMs::Now();
+ FScanTest::test1();
+ uint64_t end = cTimeMs::Now();
+ std::cout << "%TEST_FINISHED% time=" << (double)(end - start) / 1000 << " test1 (FScanTest)" << std::endl;
+
+ std::cout << "%TEST_STARTED% test2 (FScanTest)" << std::endl;
+ start = cTimeMs::Now();
+ FScanTest::test2();
+ end = cTimeMs::Now();
+ std::cout << "%TEST_FINISHED% time=" << (double)(end - start) / 1000 << " test2 (FScanTest)" << std::endl;
+
+ std::cout << "%TEST_STARTED% test3 (FScanTest)" << std::endl;
+ start = cTimeMs::Now();
+ FScanTest::test3();
+ end = cTimeMs::Now();
+ std::cout << "%TEST_FINISHED% time=" << (double)(end - start) / 1000 << " test3 (FScanTest)" << std::endl;
+
+ std::cout << "%TEST_STARTED% test4 (FScanTest)" << std::endl;
+ start = cTimeMs::Now();
+ FScanTest::test4();
+ end = cTimeMs::Now();
+ std::cout << "%TEST_FINISHED% time=" << (double)(end - start) / 1000 << " test4 (FScanTest)" << std::endl;
+
+ std::cout << "%SUITE_FINISHED% time=" << (double)(cTimeMs::Now() - t0) / 1000 << std::endl;
+
+ return (EXIT_SUCCESS);
+}
+
diff --git a/cmps/tests/JSonTest.cc b/cmps/tests/JSonTest.cc
new file mode 100644
index 0000000..21fc394
--- /dev/null
+++ b/cmps/tests/JSonTest.cc
@@ -0,0 +1,85 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: JSonTest.cc
+ * Created: 12.07.2012, 07:31:46
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <StringBuilder.h>
+#include <JSonWriter.h>
+#include <stdlib.h>
+#include <iostream>
+
+/*
+ * Simple C++ Test Suite
+ */
+
+void test1()
+{
+ char buf[512] = {0};
+ cStringBuilder sb;
+ cJSonWriter jw(sb);
+
+ std::cout << "JSonTest test 1" << std::endl;
+
+ jw.Object().Key("total").Value(123);
+ jw.Key("errorCode").Value(-1);
+ jw.Key("testmode").Value(true);
+ jw.Key("results").Array();
+
+ for (int i=0; i < 3; ++i) {
+ jw.Object().Key("counter").Value(i);
+ jw.Key("nase").Value("bär");
+ jw.EndObject();
+ }
+ jw.EndArray();
+ jw.Key("fasel").Value("blub");
+ jw.EndObject();
+
+ std::cout << "size of json-Object: " << sb.Size() << std::endl;
+ sb.Copy(buf, sizeof(buf));
+
+ std::cout << "json object looks like" << std::endl << buf << std::endl;
+}
+
+void test2()
+{
+ std::cout << "JSonTest test 2" << std::endl;
+ std::cout << "%TEST_FAILED% time=0 testname=test2 (JSonTest) message=error message sample" << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ std::cout << "%SUITE_STARTING% JSonTest" << std::endl;
+ std::cout << "%SUITE_STARTED%" << std::endl;
+
+ std::cout << "%TEST_STARTED% test1 (JSonTest)" << std::endl;
+ test1();
+ std::cout << "%TEST_FINISHED% time=0 test1 (JSonTest)" << std::endl;
+
+// std::cout << "%TEST_STARTED% test2 (JSonTest)\n" << std::endl;
+// test2();
+// std::cout << "%TEST_FINISHED% time=0 test2 (JSonTest)" << std::endl;
+
+ std::cout << "%SUITE_FINISHED% time=0" << std::endl;
+
+ return (EXIT_SUCCESS);
+}
+
diff --git a/cmps/tests/StringBuilderTest.cc b/cmps/tests/StringBuilderTest.cc
new file mode 100644
index 0000000..4a0443b
--- /dev/null
+++ b/cmps/tests/StringBuilderTest.cc
@@ -0,0 +1,124 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: StringBuilderTest.cc
+ * Created: 06.07.2012, 18:28:08
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <stdlib.h>
+#include <iostream>
+#include <StringBuilder.h>
+
+/*
+ * Simple C++ Test Suite
+ */
+
+void test1()
+{
+ cStringBuilder sb(16);
+ char buf[256] = {0};
+ int blah = 0;
+
+ std::cout << "StringBuilderTest test 1" << std::endl;
+
+ sb.Append("Alle ma herhören!\n").Append("Jetzt jibbet wat uff de Ohren!\n");
+ sb.Append("Ausgewählt: ").Append(true, "Ja", "Nein").Append("\n");
+ sb.Append("Dezimal: ").Append(3.1478910).Append("\n");
+ sb.Append("Integer: ").Append(127).Append("\n");
+ sb.Append("große Zahl: ").Append(98765432123456789l).Append("\n");
+
+ std::cout << "size of StringBuilder: " << sb.Size() << " bytes" << std::endl;
+ size_t bytesWritten = sb.Copy(buf, sizeof(buf));
+
+ if (bytesWritten != sb.Size())
+ std::cout << "%TEST_FAILED% time=0 testname=test1 (StringBuilderTest) message=length after copy differ." << std::endl;
+ else std::cout << "OK" << std::endl << "=====================" << std::endl << buf << "===================" << std::endl;
+}
+
+void test2()
+{
+ cStringBuilder sb;
+ char buf[512] = {0};
+ int blah=0;
+ std::cout << "StringBuilderTest test 2" << std::endl;
+// std::cout << "%TEST_FAILED% time=0 testname=test2 (StringBuilderTest) message=error message sample" << std::endl;
+
+ sb.Append("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore "
+ "et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. "
+ "Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit "
+ "amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna "
+ "aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd "
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur "
+ "sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam "
+ "voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
+ "takimata sanctus est Lorem ipsum dolor sit amet. ");
+ sb.Append("На берегу пустынных волн\n").Append("Стоял он, дум великих полн,\n");
+ sb.Append("И вдаль глядел. Пред ним широко\n").Append("Река неслася; бедный чёлн\n");
+ sb.Append("По ней стремился одиноко.\n").Append("По мшистым, топким берегам\n");
+ sb.Append("Чернели избы здесь и там,\n").Append("Приют убогого чухонца;\n");
+ sb.Append("И лес, неведомый лучам\n").Append("В тумане спрятанного солнца,\n");
+ sb.Append("Кругом шумел.\n");
+ sb.Append("Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore "
+ "eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum "
+ "zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer "
+ "adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. ");
+ sb.Append("Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex "
+ "ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie "
+ "consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim "
+ "qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. ");
+ sb.Append("Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat "
+ "facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh "
+ "euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis "
+ "nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. ");
+ sb.Append("Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore "
+ "eu feugiat nulla facilisis. ");
+
+ std::cout << "size of StringBuilder: " << sb.Size() << " bytes" << std::endl;
+ size_t bytesWritten = 0;
+ int chunkWritten = 0;
+
+ while ((chunkWritten = sb.Copy(buf, sizeof(buf))) > 0) {
+ bytesWritten += chunkWritten;
+ std::cout << "==========================================" << std::endl << buf;
+ std::cout << "==========================================" << std::endl;
+ }
+ if (bytesWritten != sb.Size())
+ std::cout << "%TEST_FAILED% time=0 testname=test2 (StringBuilderTest) message=size mismatch after write" << std::endl;
+ else std::cout << "OK" << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ std::cout << "%SUITE_STARTING% StringBuilderTest" << std::endl;
+ std::cout << "%SUITE_STARTED%" << std::endl;
+
+ std::cout << "%TEST_STARTED% test1 (StringBuilderTest)" << std::endl;
+ test1();
+ std::cout << "%TEST_FINISHED% time=0 test1 (StringBuilderTest)" << std::endl;
+
+ std::cout << "%TEST_STARTED% test2 (StringBuilderTest)\n" << std::endl;
+ test2();
+ std::cout << "%TEST_FINISHED% time=0 test2 (StringBuilderTest)" << std::endl;
+
+ std::cout << "%SUITE_FINISHED% time=0" << std::endl;
+
+ return (EXIT_SUCCESS);
+}
+
diff --git a/cmps/tests/URLTest.cc b/cmps/tests/URLTest.cc
new file mode 100644
index 0000000..9dc69c3
--- /dev/null
+++ b/cmps/tests/URLTest.cc
@@ -0,0 +1,105 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: URLTest.cc
+ * Created: 04.07.2012, 09:25:57
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <Url.h>
+#include <Codec.h>
+#include <stdlib.h>
+//#include <string>
+#include <string.h>
+#include <iostream>
+#include <stdio.h>
+#include <tr1/unordered_map>
+
+void test1()
+{
+ std::cout << "URLTest test 1" << std::endl;
+ cUrl url("/blah/fasel.html");
+
+ url.AddParameter("Übergewicht", "ja&nein");
+ url.AddParameter("test");
+ url.AddParameter("mir ist", "(ü)bel");
+ url.AddParameter("Ahnung", "keine < nennenswert");
+ url.AddParameter("sonst", "fällt mir =nix= \"mehr\" ein");
+ char *p = url.ToString();
+
+ url.Dump();
+ std::cout << std::endl << "url0 is [" << p << "]" << std::endl;
+ std::cout << "path....: " << url.Path() << std::endl << std::endl;
+
+ cUrl revURL(p);
+
+ revURL.Dump();
+ char *p1 = revURL.ToString();
+
+ std::cout << "url0 is [" << p << "]" << std::endl;
+ std::cout << "path....: " << url.Path() << std::endl;
+ std::cout << std::endl;
+ std::cout << "url1 is [" << p1 << "]" << std::endl;
+ std::cout << "path....: " << revURL.Path() << std::endl;
+
+ if (strcmp(p, p1))
+ std::cout << "%TEST_FAILED% time=0 testname=test1 (URLTest) message=initial url and reverse url did not match." << std::endl;
+
+ free(p1);
+ free(p);
+ cUrl::CleanUp();
+}
+
+void test2()
+{
+ std::cout << "URLTest test 2" << std::endl;
+ std::tr1::unordered_map<std::string, std::string> pool;
+
+ pool["blah"] = "fasel";
+ pool["blub"] = "oups";
+ pool["nase"] = "wasser";
+
+ std::string res = pool["fasel"];
+
+ if (res.empty())
+ std::cout << "lookup of not existing key returned empty string" << std::endl;
+ std::cout << "nase ist " << pool["nase"] << std::endl;
+ std::cout << "fasel ist " << res << std::endl;
+
+// std::cout << "%TEST_FAILED% time=0 testname=test2 (URLTest) message=error message sample" << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ std::cout << "%SUITE_STARTING% URLTest" << std::endl;
+ std::cout << "%SUITE_STARTED%" << std::endl;
+
+ std::cout << "%TEST_STARTED% test1 (URLTest)" << std::endl;
+ test1();
+ std::cout << "%TEST_FINISHED% time=0 test1 (URLTest)" << std::endl;
+
+ std::cout << "%TEST_STARTED% test2 (URLTest)\n" << std::endl;
+ test2();
+ std::cout << "%TEST_FINISHED% time=0 test2 (URLTest)" << std::endl;
+
+ std::cout << "%SUITE_FINISHED% time=0" << std::endl;
+
+ return (EXIT_SUCCESS);
+}
+
diff --git a/cmps/tests/UTF8Test.cc b/cmps/tests/UTF8Test.cc
new file mode 100644
index 0000000..70c7cc1
--- /dev/null
+++ b/cmps/tests/UTF8Test.cc
@@ -0,0 +1,96 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: UTF8Test.cc
+ * Created: 05.07.2012, 15:19:07
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmps - the backend (server) part of compound media player
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <stdlib.h>
+#include <iostream>
+#include <stdio.h>
+#include <string.h>
+
+static const char *testFile = "/usr/local/share/UTF8.Sample";
+
+void test1()
+{
+ char buf[128];
+ char *start, *end, *check0, *check1;
+ FILE *fp;
+ int bytesRead, bytes2Read, rest, i;
+
+ std::cout << "UTF8Test test 1" << std::endl;
+
+ if (fp = fopen(testFile, "r")) {
+ check0 = buf;
+ check1 = buf + sizeof(buf);
+ start = buf;
+ bytes2Read = sizeof(buf);
+ while (bytesRead = fread(start, sizeof(char), bytes2Read, fp)) {
+ start = buf;
+ while (start && start < (buf + sizeof(buf))) {
+ end = strchr(start, '\n');
+ if (!end) {
+ if (start > buf) {
+ rest = buf + sizeof(buf) - start;
+
+ for (i=0; i < rest; ++i) {
+ buf[i] = start[i];
+ }
+ start = buf + rest;
+ bytes2Read = sizeof(buf) - rest;
+ break;
+ }
+ else break;
+ }
+ *end = 0;
+ printf("line looks like: >%s<\n", start);
+ start = end + 1;
+ }
+ }
+ fclose(fp);
+ }
+ else std::cout << "%TEST_FAILED% time=0 testname=test1 (UTF8Test) message=could not open file" << std::endl;
+}
+
+void test2()
+{
+ std::cout << "UTF8Test test 2" << std::endl;
+ std::cout << "%TEST_FAILED% time=0 testname=test2 (UTF8Test) message=error message sample" << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+ std::cout << "%SUITE_STARTING% UTF8Test" << std::endl;
+ std::cout << "%SUITE_STARTED%" << std::endl;
+
+ std::cout << "%TEST_STARTED% test1 (UTF8Test)" << std::endl;
+ test1();
+ std::cout << "%TEST_FINISHED% time=0 test1 (UTF8Test)" << std::endl;
+
+ std::cout << "%TEST_STARTED% test2 (UTF8Test)\n" << std::endl;
+ test2();
+ std::cout << "%TEST_FINISHED% time=0 test2 (UTF8Test)" << std::endl;
+
+ std::cout << "%SUITE_FINISHED% time=0" << std::endl;
+
+ return (EXIT_SUCCESS);
+}
+