05eaa37f2d869264ebe895ffbc3a3e29899d0c80
Stefan Schuermans 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) 
Stefan Schuermans minor typos in comment

Stefan Schuermans authored 12 years ago

121)   } // while itSubdir itIn