aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Pöschel <github@basicmaster.de>2017-08-22 18:15:02 +0200
committerStefan Pöschel <github@basicmaster.de>2017-08-22 18:19:12 +0200
commitdab43a8fb43c904cc316f327d8117beb102e04de (patch)
tree99005de6bc38574be3d530d2086a828035a397a9
parente6d419d20391361f167d2291dcdfa328131d97ed (diff)
downloadODR-PadEnc-dab43a8fb43c904cc316f327d8117beb102e04de.tar.gz
ODR-PadEnc-dab43a8fb43c904cc316f327d8117beb102e04de.tar.bz2
ODR-PadEnc-dab43a8fb43c904cc316f327d8117beb102e04de.zip
SLS: move slides dir scan to new slide store
-rw-r--r--src/odr-padenc.cpp65
-rw-r--r--src/sls.cpp61
-rw-r--r--src/sls.h17
3 files changed, 83 insertions, 60 deletions
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 <stdlib.h>
#include <signal.h>
#include <string>
-#include <list>
#include <thread>
#include <vector>
#include <sys/types.h>
#include <fcntl.h>
-#include <dirent.h>
#include <getopt.h>
#include "pad_common.h"
@@ -114,53 +112,6 @@ static std::string list_dls_files(std::vector<std::string> 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<slide_metadata_t>& 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<slide_metadata_t> 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 <dirent.h>
#include <sys/stat.h>
#include <deque>
#include <fstream>
#include <iostream>
+#include <list>
#include <algorithm>
@@ -183,6 +185,21 @@ class History {
};
+// --- SlideStore -----------------------------------------------------------------
+class SlideStore {
+private:
+ std::list<slide_metadata_t> 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: