implemented priority based...
Stefan Schuermans authored 12 years ago
|
1) /* Blinker
2) Copyright 2011 Stefan Schuermans <stefan@blinkenarea.org>
3) Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
4) a blinkenarea.org project */
5)
6) #include <list>
7) #include <string>
8)
9) #include <BlinkenLib/BlinkenFrame.h>
10)
11) #include "CallMgr.h"
12) #include "Directory.h"
13) #include "File.h"
14) #include "Module.h"
15) #include "Priority.h"
16) #include "PriorityInput.h"
17) #include "SettingFile.h"
18) #include "StreamMgr.h"
19) #include "StreamRecv.h"
20)
21) namespace Blinker {
22)
23) /**
24) * @brief constructor
25) * @param[in] callMgr callback manager
26) * @param[in] streamMgr stream manager
27) * @param[in] dirBase base directory
28) */
29) Priority::Priority(CallMgr &callMgr, StreamMgr &streamMgr, const Directory &dirBase):
30) Module(callMgr, streamMgr, dirBase),
31) m_dirInputs(dirBase.getSubdir("inputs")),
32) m_fileOutStream(dirBase.getFile("outstream")),
33) m_itCurIn(m_inList.rend()),
34) m_pOutStream(NULL)
35) {
36) // set up
37) updateInListFull();
38) getOutStream();
39) }
40)
41) /// virtual destructor
42) Priority::~Priority()
43) {
44) // clean up
45) releaseOutStream();
46) while (!m_inList.empty()) {
47) delete m_inList.back().m_pInput;
48) m_inList.pop_back();
49) }
50) }
51)
52) /// check for update of configuration
53) void Priority::updateConfig()
54) {
55) // input list update (directory modified -> full, otherwise -> light)
56) if (m_dirInputs.checkModified())
57) updateInListFull();
58) else
59) updateInListLight();
60)
61) // output stream name file was modified -> re-get output stream
62) if (m_fileOutStream.checkModified()) {
63) releaseOutStream();
64) getOutStream();
65) }
66) }
67)
68) /// light update of input list, i.e. check all entries in current input list
69) void Priority::updateInListLight()
70) {
71) // walk through all inputs in input list and check for modification
72) InList::iterator itIn;
73) for (itIn = m_inList.begin(); itIn != m_inList.end(); ++itIn)
74) itIn->m_pInput->updateConfig();
75) }
76)
77) /// full update of input list, i.e. scan subdirs in input list directory
78) void Priority::updateInListFull()
79) {
80) // get list of subdirs in input directory
81) typedef std::list<std::string> Subdirlist;
82) Subdirlist curSubdirs;
83) m_dirInputs.getEntries(Directory::TypeSubdir, curSubdirs);
84)
85) // walk through current input list and subdir list simultaneously
86) Subdirlist::const_iterator itSubdir = curSubdirs.begin();
87) InList::iterator itIn = m_inList.begin();
88) while (itSubdir != curSubdirs.end() || itIn != m_inList.end()) {
89)
90) // new input inserted
91) if (itIn == m_inList.end() ||
92) (itSubdir != curSubdirs.end() && *itSubdir < itIn->m_name)) {
93) // create input object
94) InEntry inEntry(*itSubdir);
95) inEntry.m_pInput = new Input(*this, *itSubdir,
96) m_dirInputs.getSubdir(*itSubdir));
97) if (inEntry.m_pInput)
98) // insert input list entry
99) m_inList.insert(itIn, inEntry);
100) // advance to next subdir
101) ++itSubdir;
102) }
103)
104) // input removed
105) else if (itSubdir == curSubdirs.end() || *itSubdir > itIn->m_name) {
106) // remove input
107) delete itIn->m_pInput;
108) itIn = m_inList.erase(itIn);
109) // do not advance to next subdir
110) }
111)
112) // input stayed in input list
113) else {
114) // check for update
115) itIn->m_pInput->updateConfig();
116) // advance to next file and next entry
117) ++itSubdir;
118) ++itIn;
119) }
120)
|