From dab43a8fb43c904cc316f327d8117beb102e04de Mon Sep 17 00:00:00 2001 From: Stefan Pöschel Date: Tue, 22 Aug 2017 18:15:02 +0200 Subject: SLS: move slides dir scan to new slide store --- src/odr-padenc.cpp | 65 +++++------------------------------------------------- src/sls.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/sls.h | 17 ++++++++++++++ 3 files changed, 83 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/odr-padenc.cpp b/src/odr-padenc.cpp index 091cf5c..6536999 100644 --- a/src/odr-padenc.cpp +++ b/src/odr-padenc.cpp @@ -32,12 +32,10 @@ #include #include #include -#include #include #include #include #include -#include #include #include "pad_common.h" @@ -114,53 +112,6 @@ static std::string list_dls_files(std::vector dls_files) { } -static int filter_slides(const struct dirent* file) { - std::string name = file->d_name; - - // skip '.'/'..' dirs - if(name == "." || name == "..") - return 0; - - // skip slide params files - if(SLSManager::isSlideParamFileFilename(name)) - return 0; - - return 1; -} - - -static bool read_slides_dir(const std::string& dir, History& history, std::list& slides) { - struct dirent** dir_entries; - int dir_count = scandir(dir.c_str(), &dir_entries, filter_slides, alphasort); - if(dir_count < 0) { - fprintf(stderr, "ODR-PadEnc Error: cannot open directory '%s'\n", dir.c_str()); - return false; - } - - // add new slides to transmit to list - for(int i = 0; i < dir_count; i++) { - std::string imagepath = dir + "/" + std::string(dir_entries[i]->d_name); - free(dir_entries[i]); - - slide_metadata_t md; - md.filepath = imagepath; - md.fidx = history.get_fidx(imagepath.c_str()); - slides.push_back(md); - - if (verbose) - fprintf(stderr, "ODR-PadEnc found slide '%s', fidx %d\n", imagepath.c_str(), md.fidx); - } - - free(dir_entries); - -#ifdef DEBUG - slides_history.disp_database(); -#endif - - return true; -} - - int main(int argc, char *argv[]) { size_t padlen = 58; bool erase_after_tx = false; @@ -316,9 +267,7 @@ int main(int argc, char *argv[]) { PADPacketizer pad_packetizer(padlen); DLSManager dls_manager(&pad_packetizer); SLSManager sls_manager(&pad_packetizer); - - std::list slides_to_transmit; - History slides_history; + SlideStore slides; std::chrono::steady_clock::time_point next_run = std::chrono::steady_clock::now(); @@ -338,18 +287,14 @@ int main(int argc, char *argv[]) { while(!do_exit) { // try to read slides dir (if present) - if (sls_dir && slides_to_transmit.empty()) { - if(!read_slides_dir(sls_dir, slides_history, slides_to_transmit)) + if (sls_dir && slides.Empty()) { + if (!slides.InitFromDir(sls_dir)) return 1; - - // sort the list in fidx order - slides_to_transmit.sort(); } // if slides available, encode the first one - if (!slides_to_transmit.empty()) { - slide_metadata_t slide = slides_to_transmit.front(); - slides_to_transmit.pop_front(); + if (!slides.Empty()) { + slide_metadata_t slide = slides.GetSlide(); if (!sls_manager.encodeFile(slide.filepath, slide.fidx, raw_slides)) fprintf(stderr, "ODR-PadEnc Error: cannot encode file '%s'\n", slide.filepath.c_str()); diff --git a/src/sls.cpp b/src/sls.cpp index 1111088..f11cee1 100644 --- a/src/sls.cpp +++ b/src/sls.cpp @@ -99,6 +99,67 @@ int History::get_fidx(const char* filepath) } +// --- SlideStore ----------------------------------------------------------------- +int SlideStore::FilterSlides(const struct dirent* file) { + std::string name = file->d_name; + + // skip '.'/'..' dirs + if(name == "." || name == "..") + return 0; + + // skip slide params files + if(SLSManager::isSlideParamFileFilename(name)) + return 0; + + return 1; +} + +bool SlideStore::InitFromDir(const std::string& dir) { + // start with empty list + slides.clear(); + + struct dirent** dir_entries; + int dir_count = scandir(dir.c_str(), &dir_entries, FilterSlides, alphasort); + if(dir_count < 0) { + fprintf(stderr, "ODR-PadEnc Error: cannot open directory '%s'\n", dir.c_str()); + return false; + } + + // add new slides to transmit to list + for(int i = 0; i < dir_count; i++) { + std::string imagepath = dir + "/" + std::string(dir_entries[i]->d_name); + free(dir_entries[i]); + + slide_metadata_t md; + md.filepath = imagepath; + md.fidx = history.get_fidx(imagepath.c_str()); + slides.push_back(md); + + if (verbose) + fprintf(stderr, "ODR-PadEnc found slide '%s', fidx %d\n", imagepath.c_str(), md.fidx); + } + + free(dir_entries); + +#ifdef DEBUG + history.disp_database(); +#endif + + // sort the list in fidx order + slides.sort(); + + return true; +} + +slide_metadata_t SlideStore::GetSlide() { + // pre-condition: list non-empty + + slide_metadata_t slide = slides.front(); + slides.pop_front(); + return slide; +} + + // --- MOTHeader ----------------------------------------------------------------- MOTHeader::MOTHeader(size_t body_size, int content_type, int content_subtype) : header_size(0), data(uint8_vector_t(7, 0x00)) { diff --git a/src/sls.h b/src/sls.h index 0b5fae2..3519522 100644 --- a/src/sls.h +++ b/src/sls.h @@ -41,10 +41,12 @@ # endif #endif +#include #include #include #include #include +#include #include @@ -183,6 +185,21 @@ class History { }; +// --- SlideStore ----------------------------------------------------------------- +class SlideStore { +private: + std::list slides; + History history; + + static int FilterSlides(const struct dirent* file); +public: + bool InitFromDir(const std::string& dir); + + bool Empty() {return slides.empty();} + slide_metadata_t GetSlide(); +}; + + // --- MOTHeader ----------------------------------------------------------------- class MOTHeader { private: -- cgit v1.2.3