converted sender to use list tracker
Stefan Schuermans

Stefan Schuermans commited on 2011-12-11 01:03:08
Showing 4 changed files, with 26 additions and 128 deletions.

... ...
@@ -19,6 +19,7 @@
19 19
 #include "InStreamFile.h"
20 20
 #include "IoCallee.h"
21 21
 #include "Module.h"
22
+#include "ListTracker.h"
22 23
 #include "Protocol.h"
23 24
 #include "ProtocolFile.h"
24 25
 #include "SettingFile.h"
... ...
@@ -41,15 +42,8 @@ protected:
41 42
   /// static destination
42 43
   class Dest;
43 44
 
44
-  /// static destination list entry
45
-  struct DestEntry {
46
-    std::string m_name;   ///< name of static destination
47
-    Dest        *m_pDest; ///< static destination object
48
-    DestEntry(const std::string &name); ///< constructor
49
-  };
50
-
51
-  /// static destinations
52
-  typedef std::list<DestEntry> DestList;
45
+  /// static destination list tracker
46
+  typedef ListTracker<Sender, Dest, Directory> DestListTracker;
53 47
 
54 48
   /// dynamic destinations: address -> time of last request
55 49
   typedef std::map<ADDR, Time> DynDests;
... ...
@@ -109,18 +103,6 @@ protected:
109 103
   /// destroy socket
110 104
   void destroySock();
111 105
 
112
-  /**
113
-   * @brief light update of static destinations,
114
-   *        i.e. stat all files in current static destination directory
115
-   */
116
-  void updateDestsLight();
117
-
118
-  /**
119
-   * @brief full update of static destinations,
120
-   *        i.e. scan files in playlist directory
121
-   */
122
-  void updateDestsFull();
123
-
124 106
   /// remove timed-out dynamic destinations
125 107
   void removeTimedOutDynDests();
126 108
 
... ...
@@ -157,9 +139,8 @@ protected:
157 139
   InStreamFile    m_fileInStream;    ///< input stream name file
158 140
   AddrFile        m_fileBind;        ///< bind address file
159 141
   ProtocolFile    m_fileProtocol;    ///< protocol file
160
-  Directory    m_dirDests;     ///< static destinations directory
161 142
   SOCK            *m_pSock;          ///< socket to use for sending streams
162
-  DestList     m_destList;     ///< static destinations
143
+  DestListTracker m_destListTracker; ///< static destinations tracker
163 144
   DynDests        m_dynDests;        ///< dynamic destinations
164 145
   std::string     m_noFrameData;     ///< "no frame" protocol data (empty if unknown)
165 146
   std::string     m_data;            ///< current protocol data (empty if unknown)
... ...
@@ -24,12 +24,10 @@ public:
24 24
   /**
25 25
    * @brief constructor
26 26
    * @param[in] sender owning sender object
27
+   * @param[in] name destination name
27 28
    * @param[in] dirBase base directory
28
-   * @param[in] pNoFrameData protocol data for "no frame" packet
29
-   *                         (empty if unknown)
30 29
    */
31
-  Dest(Sender &sender, const Directory &dirBase,
32
-       const std::string *pNoFrameData);
30
+  Dest(Sender &sender, const std::string &name, const Directory &dirBase);
33 31
 
34 32
   /// destructor
35 33
   ~Dest();
... ...
@@ -63,8 +61,8 @@ protected:
63 61
 
64 62
 protected:
65 63
   Sender            &m_sender;  ///< owning sender object
64
+  std::string       m_name;     ///< destination name
66 65
   AddrFile          m_fileAddr; ///< address file
67
-  const std::string *m_pNoFrameData; ///< protocol data for "no frame" packet
68 66
   const std::string *m_pData;   ///< protocol data to send to address
69 67
 }; // class Sender<ADDr, SOCK>::Dest
70 68
 
... ...
@@ -20,17 +20,16 @@ namespace Blinker {
20 20
 /**
21 21
  * @brief constructor
22 22
  * @param[in] sender owning sender object
23
+ * @param[in] name destination name
23 24
  * @param[in] dirBase base directory
24
- * @param[in] pNoFrameData protocol data for "no frame" packet
25
- *                         (empty if unknown)
26 25
  */
27 26
 template<typename ADDR, typename SOCK>
28
-Sender<ADDR, SOCK>::Dest::Dest(Sender &sender, const Directory &dirBase,
29
-                               const std::string *pNoFrameData):
27
+Sender<ADDR, SOCK>::Dest::Dest(Sender &sender, const std::string &name,
28
+                               const Directory &dirBase):
30 29
   m_sender(sender),
30
+  m_name(name),
31 31
   m_fileAddr(dirBase.getFile("addr")),
32
-  m_pNoFrameData(pNoFrameData),
33
-  m_pData(pNoFrameData)
32
+  m_pData(&sender.m_noFrameData)
34 33
 {
35 34
   // set up
36 35
   getAddr();
... ...
@@ -41,7 +40,7 @@ template<typename ADDR, typename SOCK>
41 40
 Sender<ADDR, SOCK>::Dest::~Dest()
42 41
 {
43 42
   // send "no frame" protocol data to old address
44
-  send(m_pNoFrameData);
43
+  send(&m_sender.m_noFrameData);
45 44
 }
46 45
 
47 46
 /// check for update of configuration
... ...
@@ -74,7 +73,7 @@ void Sender<ADDR, SOCK>::Dest::getAddr()
74 73
   std::string strAddr;
75 74
 
76 75
   // send "no frame" protocol data to old address
77
-  send(m_pNoFrameData);
76
+  send(&m_sender.m_noFrameData);
78 77
 
79 78
   // get new address from file
80 79
   m_fileAddr.update();
... ...
@@ -18,6 +18,8 @@
18 18
 #include "File.h"
19 19
 #include "InStreamFile.h"
20 20
 #include "IoCallee.h"
21
+#include "ListTracker.h"
22
+#include "ListTracker_impl.h"
21 23
 #include "Module.h"
22 24
 #include "Protocol.h"
23 25
 #include "ProtocolFile.h"
... ...
@@ -45,8 +47,8 @@ Sender<ADDR, SOCK>::Sender(CallMgr &callMgr, StreamMgr &streamMgr,
45 47
   m_fileInStream(dirBase.getFile("instream"), streamMgr),
46 48
   m_fileBind(dirBase.getFile("bind")),
47 49
   m_fileProtocol(dirBase.getFile("protocol")),
48
-  m_dirDests(dirBase.getSubdir("destinations")),
49
-  m_pSock(NULL)
50
+  m_pSock(NULL),
51
+  m_destListTracker(*this, dirBase.getSubdir("destinations"))
50 52
 {
51 53
   // read protocol
52 54
   readProto();
... ...
@@ -57,7 +59,7 @@ Sender<ADDR, SOCK>::Sender(CallMgr &callMgr, StreamMgr &streamMgr,
57 59
   createSock();
58 60
 
59 61
   // load static destinations
60
-  updateDestsFull();
62
+  m_destListTracker.init();
61 63
 }
62 64
 
63 65
 /// virtual destructor
... ...
@@ -67,11 +69,8 @@ Sender<ADDR, SOCK>::~Sender()
67 69
   // send "no frame" to all destinations
68 70
   sendAllNoFrame();
69 71
 
70
-  // free static destination lists
71
-  while (!m_destList.empty()) {
72
-    delete m_destList.back().m_pDest;
73
-    m_destList.pop_back();
74
-  }
72
+  // free static destinations
73
+  m_destListTracker.clear();
75 74
 
76 75
   // destroy socket
77 76
   destroySock();
... ...
@@ -100,11 +99,7 @@ void Sender<ADDR, SOCK>::updateConfig()
100 99
     readProto();
101 100
 
102 101
   // static destinations update
103
-  // (directory modified -> full, otherwise -> light)
104
-  if (m_dirDests.checkModified())
105
-    updateDestsFull();
106
-  else
107
-    updateDestsLight();
102
+  m_destListTracker.updateConfig();
108 103
 }
109 104
 
110 105
 /**
... ...
@@ -237,70 +232,6 @@ void Sender<ADDR, SOCK>::destroySock()
237 232
   }
238 233
 }
239 234
 
240
-/**
241
- * @brief light update of static destinations,
242
- *        i.e. stat all files in current static destination directory
243
- */
244
-template<typename ADDR, typename SOCK>
245
-void Sender<ADDR, SOCK>::updateDestsLight()
246
-{
247
-  // walk through all files in static dest dir and check for modification
248
-  typename DestList::iterator itDest;
249
-  for (itDest = m_destList.begin(); itDest != m_destList.end(); ++itDest)
250
-    itDest->m_pDest->updateConfig();
251
-}
252
-
253
-/**
254
- * @brief full update of static destinations,
255
- *        i.e. scan files in playlist directory
256
- */
257
-template<typename ADDR, typename SOCK>
258
-void Sender<ADDR, SOCK>::updateDestsFull()
259
-{
260
-  // get list of subdirs in input directory
261
-  typedef std::list<std::string> Subdirlist;
262
-  Subdirlist curSubdirs;
263
-  m_dirDests.getEntries(Directory::TypeSubdir, curSubdirs);
264
-
265
-  // walk through current static destinations and subdir list simultaneously
266
-  Subdirlist::const_iterator  itSubdir = curSubdirs.begin();
267
-  typename DestList::iterator itDest   = m_destList.begin();
268
-  while (itSubdir != curSubdirs.end() || itDest != m_destList.end()) {
269
-
270
-    // new static destination inserted
271
-    if (itDest == m_destList.end() ||
272
-        (itSubdir != curSubdirs.end() && *itSubdir < itDest->m_name)) {
273
-      // create static destination object
274
-      DestEntry destEntry(*itSubdir);
275
-      destEntry.m_pDest = new Dest(*this, m_dirDests.getSubdir(*itSubdir),
276
-                                   &m_noFrameData);
277
-      if (destEntry.m_pDest)
278
-        // insert static destination entry
279
-        m_destList.insert(itDest, destEntry);
280
-      // advance to next subdir
281
-      ++itSubdir;
282
-    }
283
-
284
-    // static destination removed
285
-    else if (itSubdir == curSubdirs.end() || *itSubdir > itDest->m_name) {
286
-      // remove static destination
287
-      delete itDest->m_pDest;
288
-      itDest = m_destList.erase(itDest);
289
-      // do not advance to next subdir
290
-    }
291
-
292
-    // static sestination stayed in input list
293
-    else {
294
-      // check for update
295
-      itDest->m_pDest->updateConfig();
296
-      // advance to next file and next entry
297
-      ++itSubdir;
298
-      ++itDest;
299
-    }
300
-
301
-  } // while itSubdir itDest
302
-}
303
-
304 235
 /// remove timed-out dynamic destinations
305 236
 template<typename ADDR, typename SOCK>
306 237
 void Sender<ADDR, SOCK>::removeTimedOutDynDests()
... ...
@@ -354,9 +285,10 @@ template<typename ADDR, typename SOCK>
354 285
 void Sender<ADDR, SOCK>::sendDests(const std::string *pData)
355 286
 {
356 287
   // send data to static destinations
357
-  typename DestList::const_iterator itDest;
358
-  for (itDest = m_destList.begin(); itDest != m_destList.end(); ++itDest)
359
-    itDest->m_pDest->setProtoData(pData);
288
+  typename DestListTracker::ListIt itDest;
289
+  for (itDest = m_destListTracker.m_list.begin();
290
+       itDest != m_destListTracker.m_list.end(); ++itDest)
291
+    itDest->m_pObj->setProtoData(pData);
360 292
 
361 293
   // send data to all dynamic destinations
362 294
   typename DynDests::const_iterator itDyn;
... ...
@@ -450,18 +382,6 @@ void Sender<ADDR, SOCK>::receiveFromSock()
450 382
 
451 383
 }
452 384
 
453
-/* #####################
454
-   # Sender::DestEntry #
455
-   ##################### */
456
-
457
-/// constructor
458
-template<typename ADDR, typename SOCK>
459
-Sender<ADDR, SOCK>::DestEntry::DestEntry(const std::string &name):
460
-  m_name(name),
461
-  m_pDest(NULL)
462
-{
463
-}
464
-
465 385
 } // namespace Blinker
466 386
 
467 387
 #endif // #ifndef SENDER_H
468 388