diff options
Diffstat (limited to 'cmps')
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); +} + |