fix operator connection printer: close active connections on module destruction
Stefan Schuermans

Stefan Schuermans commited on 2011-12-22 21:22:09
Showing 2 changed files, with 19 additions and 0 deletions.

... ...
@@ -28,13 +28,22 @@ OpPrinter::OpPrinter(const std::string &name, Mgrs &mgrs,
28 28
                      const Directory &dirBase):
29 29
   Module(name, mgrs, dirBase)
30 30
 {
31
+  // open operator connection interface
31 32
   m_mgrs.m_opMgr.open(m_name, this);
32 33
 }
33 34
 
34 35
 /// virtual destructor
35 36
 OpPrinter::~OpPrinter()
36 37
 {
38
+  // close operator connection interface
37 39
   m_mgrs.m_opMgr.close(m_name);
40
+
41
+  // close open operator connections
42
+  while (!m_opConns.empty()) {
43
+    OpConns::iterator itOpConn = m_opConns.begin();
44
+    (*itOpConn)->close();
45
+    m_opConns.erase(itOpConn);
46
+  }
38 47
 }
39 48
 
40 49
 /// check for update of configuration
... ...
@@ -61,6 +70,7 @@ bool OpPrinter::acceptNewOpConn(const std::string &name)
61 70
  */
62 71
 void OpPrinter::newOpConn(const std::string &name, OpConn *pConn)
63 72
 {
73
+  m_opConns.insert(pConn);
64 74
   std::cout << "new connection " << pConn << std::endl;
65 75
   (void)name; // unused
66 76
 }
... ...
@@ -100,6 +110,7 @@ void OpPrinter::opConnRecvPlay(OpConn *pConn, const std::string &sound)
100 110
 void OpPrinter::opConnClose(OpConn *pConn)
101 111
 {
102 112
   std::cout << "connection " << pConn << " closed" << std::endl;
113
+  m_opConns.erase(pConn);
103 114
 }
104 115
 
105 116
 } // namespace Blinker
... ...
@@ -6,6 +6,7 @@
6 6
 #ifndef BLINKER_OPPRINTER_H
7 7
 #define BLINKER_OPPRINTER_H
8 8
 
9
+#include <set>
9 10
 #include <string>
10 11
 
11 12
 #include "Directory.h"
... ...
@@ -21,6 +22,10 @@ namespace Blinker {
21 22
 /// a operator connection printer
22 23
 class OpPrinter: public Module, public OpReqIf
23 24
 {
25
+public:
26
+  /// type for set of open operator connections
27
+  typedef std::set<OpConn *> OpConns;
28
+
24 29
 public:
25 30
   /**
26 31
    * @brief constructor
... ...
@@ -77,6 +82,9 @@ public:
77 82
    * @param[in] pConn operator connection object
78 83
    */
79 84
   virtual void opConnClose(OpConn *pConn);
85
+
86
+protected:
87
+  OpConns m_opConns; ///< open operator connections
80 88
 }; // class OpPrinter
81 89
 
82 90
 } // namespace Blinker
83 91