diff --git a/Makefile b/Makefile index 6a24bdf..b0f73df 100644 --- a/Makefile +++ b/Makefile @@ -11,14 +11,22 @@ DEFAULT_SERVERPORT=20010 CXX=g++ CXXFLAGS= -ggdb -fPIC -Wall -std=c++11 -I/usr/local/include -LDFLAGS= -lUDPTCPNetwork -L/usr/local/lib -ljpeg -OBJFILES= webserver.o configuration.o main.o inmemoryfile.o \ +LDFLAGS= -lUDPTCPNetwork -L/usr/local/lib -ljpeg -larchive +OBJFILES= webserver.o configuration.o main.o inmemoryfile.o inmemorytar.o \ convert.o debayer.o videoframe.o \ video.o videodevice_v4l2.o videodevice_dump.o all: dep miniwebcam -miniwebcam: $(OBJFILES) - $(CXX) $(OBJFILES) -o $@ -L./ -I./ $(LDFLAGS) +assets.obj: + tar cvf assets.tar www/* +# objcopy -I binary assets.tar assets.obj + objcopy -I binary -O elf64-littleaarch64 -B aarch64 assets.tar assets.obj +# objcopy -I binary -O elf64-x86-64 -B i386:x86-64 assets.tar assets.obj + rm -rf assets.tar + +miniwebcam: $(OBJFILES) assets.obj + $(CXX) $(OBJFILES) -o $@ assets.obj -L./ -I./ $(LDFLAGS) + rm -rf assets.obj install: miniwebcam cp -rf miniwebcam $(PREFIX)/bin @@ -50,6 +58,8 @@ keygen: openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout ssl-key.pem -out ssl-cert.pem clean: + rm *.obj -rf + rm *.tar -rf rm *.s -rf rm *.o -rf rm *.oo -rf diff --git a/inmemoryfile.cc b/inmemoryfile.cc index cc6bb4c..51276d8 100644 --- a/inmemoryfile.cc +++ b/inmemoryfile.cc @@ -4,6 +4,7 @@ #include "inmemoryfile.h" InMemoryFile::InMemoryFile() { + filename = ""; mem = malloc (INMEMORYFILE_ALLOCATEBLOCK); memallocsize = INMEMORYFILE_ALLOCATEBLOCK; memsize = 0; @@ -11,6 +12,7 @@ InMemoryFile::InMemoryFile() { InMemoryFile::~InMemoryFile() { if (mem != NULL) free (mem); + filename = ""; mem = NULL; memallocsize = 0; memsize = 0; @@ -41,6 +43,7 @@ InMemoryFile InMemoryFile::operator=(InMemoryFile rightside) { exit (1); } memcpy (mem, rightside.mem, memsize); + filename = rightside.filename; return *this; }; diff --git a/inmemoryfile.h b/inmemoryfile.h index 9243711..f0e7722 100644 --- a/inmemoryfile.h +++ b/inmemoryfile.h @@ -9,6 +9,7 @@ class InMemoryFile { public: void *mem; size_t memsize; + std::string filename; InMemoryFile operator=(InMemoryFile rightside); diff --git a/inmemorytar.cc b/inmemorytar.cc new file mode 100644 index 0000000..39fa90e --- /dev/null +++ b/inmemorytar.cc @@ -0,0 +1,60 @@ + +#include "miniwebcam.h" +#include "inmemorytar.h" +#include "inmemoryfile.h" + +InMemoryTar::InMemoryTar() { + struct archive *a; + struct archive_entry *entry; + size_t tar_size = _binary_assets_tar_end - _binary_assets_tar_start; + int r; + + debug (""); + + a = archive_read_new(); + archive_read_support_format_tar(a); + if (a == NULL) ErrorExit("error on archive new", -1); + + r = archive_read_open_memory(a, _binary_assets_tar_start, tar_size); + if (r != ARCHIVE_OK) ErrorExit("bindary asset could not been found in memory", -1); + + while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { + debug ("found file %s\n", archive_entry_pathname(entry)); + InMemoryFile *imf = new InMemoryFile(); + size_t size = archive_entry_size(entry); + imf->filename = archive_entry_pathname(entry); + imf->Allocate(size); + archive_read_data(a, imf->mem, size); + files.push_back(imf); + } + archive_read_free(a); +}; + +InMemoryTar::~InMemoryTar() { + std::list::iterator f; + + f = files.begin(); + while (f != files.end()) { + InMemoryFile *imf = *f; + delete imf; + f = files.begin(); + } +}; + + +/// @brief +/// @param file +/// @param imf - do not free the pointer!!!! +/// @return +int InMemoryTar::FindFile(std::string file, InMemoryFile **imf) { + std::list::iterator f; + + for (f = files.begin(); f != files.end(); f++) { + if (file.compare ((*f)->filename) == 0) { + *imf = *f; + return 1; + } + } + + return 0; +} \ No newline at end of file diff --git a/inmemorytar.h b/inmemorytar.h new file mode 100644 index 0000000..daf7311 --- /dev/null +++ b/inmemorytar.h @@ -0,0 +1,31 @@ + +#ifndef _INMEMORYTAR_H_ +#define _INMEMORYTAR_H_ + +#include +#include +#include +#include +#include + +#include "inmemoryfile.h" + +// Symbole vom Linker/objcopy +extern unsigned char _binary_assets_tar_start[]; +extern unsigned char _binary_assets_tar_end[]; + +/* + * this class will always read the assets_tar structure + */ +class InMemoryTar { + private: + std::list files; + protected: + public: + InMemoryTar(); + ~InMemoryTar(); + + int FindFile(std::string file, InMemoryFile **imf); +}; + +#endif diff --git a/webserver.cc b/webserver.cc index d3601e4..220faba 100644 --- a/webserver.cc +++ b/webserver.cc @@ -3,25 +3,21 @@ #include "miniwebcam.h" #include "UDPTCPNetwork.h" +#include "inmemorytar.h" std::string GenerateHtmlFile(); InMemoryFile GenerateJpgFile(VideoFrame *vf); +InMemoryTar assets; int WebCamServer::HandleRequest (WebRequestBuffer *requestbuffer, WebServerClient *webclient) { if (requestbuffer == NULL || webclient == NULL) return 0; std::string request = requestbuffer->GetRequest(); - printf ("SimpleWebServerClient::HandleRequest() Request:%s\n", request.c_str()); if (request.compare ("/") == 0) request = "/index.html"; - if (request.find("/index.html") != std::string::npos) { - std::string htmlfile = GenerateHtmlFile(); - if (webclient->SendResponseFileFromMemory(requestbuffer, request, "", - (void*) htmlfile.c_str(), - strlen(htmlfile.c_str())) != 1) return 0; - } - else if (request.find("/snapshot.jpg") != std::string::npos) { + InMemoryFile *imf_do_not_free = NULL; + if (request.find("/snapshot.jpg") != std::string::npos) { InMemoryFile jpgfile; Lock(); currentimage.ConvertToJpeg(&jpgfile, 99); @@ -39,6 +35,18 @@ int WebCamServer::HandleRequest (WebRequestBuffer *requestbuffer, WebServerClien (void*) jpgfile.mem, jpgfile.memsize) != 1) return 0; } + else if (assets.FindFile("www"+request, &imf_do_not_free)) { + if (imf_do_not_free == NULL) return 0; + if (webclient->SendResponseFileFromMemory(requestbuffer, request, "", + (void*) imf_do_not_free->mem, + imf_do_not_free->memsize) != 1) return 0; + } + else if (request.find("/index.html") != std::string::npos) { + std::string htmlfile = GenerateHtmlFile(); + if (webclient->SendResponseFileFromMemory(requestbuffer, request, "", + (void*) htmlfile.c_str(), + strlen(htmlfile.c_str())) != 1) return 0; + } else { return 0; } @@ -50,23 +58,7 @@ int WebCamServer::HandleRequest (WebRequestBuffer *requestbuffer, WebServerClien std::string GenerateHtmlFile() { std::string res; - res = "MiniWebCam"; - res += "
"; - res += ""; - res += "\n"; + res = "MiniWebCamERROR"; res += ""; return res; }; diff --git a/www/index.html b/www/index.html new file mode 100644 index 0000000..31c8d62 --- /dev/null +++ b/www/index.html @@ -0,0 +1,28 @@ + + + MiniWebCam + + + +
+ + + + + \ No newline at end of file