170612ac450ac055992ee96555806c08d82f79a5
Stefan Schuermans implemnted operator connect...

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 <map>
7) #include <string>
8) 
9) #include "Directory.h"
10) #include "File.h"
11) #include "ListTracker.h"
12) #include "ListTracker_impl.h"
13) #include "Mgrs.h"
14) #include "Module.h"
15) #include "NameFile.h"
16) #include "OpConn.h"
17) #include "OpConnIf.h"
18) #include "OpMgr.h"
19) #include "OpSplitter.h"
20) #include "OpSplitterExtension.h"
21) #include "SettingFile.h"
22) #include "Time.h"
23) #include "TimeCallee.h"
Stefan Schuermans limit number of connections...

Stefan Schuermans authored 12 years ago

24) #include "UIntFile.h"
Stefan Schuermans implemnted operator connect...

Stefan Schuermans authored 12 years ago

25) 
26) namespace Blinker {
27) 
28) /**
29)  * @brief constructor
30)  * @param[in] name module name
31)  * @param[in] mgrs managers
32)  * @param[in] dirBase base directory
33)  */
34) OpSplitter::OpSplitter(const std::string &name, Mgrs &mgrs,
35)                          const Directory &dirBase):
36)   Module(name, mgrs, dirBase),
37)   m_fileSound(dirBase.getFile("sound")),
Stefan Schuermans limit number of connections...

Stefan Schuermans authored 12 years ago

38)   m_fileMaxConn(dirBase.getFile("maxconn")),
Stefan Schuermans implemnted operator connect...

Stefan Schuermans authored 12 years ago

39)   m_extListTracker(*this, dirBase.getSubdir("extensions"))
40) {
41)   // load extensions
42)   m_extListTracker.init();
43) 
44)   // open operator connection interface
45)   m_mgrs.m_opMgr.open(m_name, this);
46) }
47) 
48) /// virtual destructor
49) OpSplitter::~OpSplitter()
50) {
51)   // close operator connection interface
52)   m_mgrs.m_opMgr.close(m_name);
53) 
54)   // close all connections
55)   while (!m_mapLocal.empty()) {
56)     MapLocal::iterator it = m_mapLocal.begin();
57)     it->first->close();
58)     m_mapLocal.erase(it);
59)   }
60)   while (!m_mapInOut.empty()) {
61)     MapInOut::iterator it = m_mapInOut.begin();
62)     it->first->close();
63)     m_mapInOut.erase(it);
64)   }
65)   while (!m_mapOutIn.empty()) {
66)     MapOutIn::iterator it = m_mapOutIn.begin();
67)     it->first->close();
68)     m_mapOutIn.erase(it);
69)   }
70) 
71)   // unload extensions
72)   m_extListTracker.clear();
73) 
74)   // cancel time callback
75)   m_mgrs.m_callMgr.cancelTimeCall(this);
76) }
77) 
78) /// check for update of configuration
79) void OpSplitter::updateConfig()
80) {
81)   // sound name file was modified -> re-read sound name
82)   if (m_fileSound.checkModified())
83)     m_fileSound.update();
84) 
Stefan Schuermans limit number of connections...

Stefan Schuermans authored 12 years ago

85)   // max. number of conn. file was modified -> re-read max. number of conn.
86)   if (m_fileMaxConn.checkModified())
87)     m_fileMaxConn.update();
88) 
Stefan Schuermans implemnted operator connect...

Stefan Schuermans authored 12 years ago

89)   // extensions update
90)   m_extListTracker.updateConfig();
91) }
92) 
93) /// callback when requested time reached
94) void OpSplitter::timeCall()
95) {
96)   // send sound play request on marked local operator connection
97)   for (MapLocal::iterator it = m_mapLocal.begin();
98)        it != m_mapLocal.end(); ++it) {
99)     if (it->second.m_sendPlay) {
100)       it->second.m_sendPlay = false;
101)       if (m_fileSound.m_valid)
102)         it->first->sendPlay(m_fileSound.m_obj.m_str);
103)     }
104)   }
105) }
106) 
107) /**
108)  * @brief check if accepting new operator connction is possible
109)  * @param[in] name operator interface name
110)  * @return if accepting new connection is possible
111)  */
112) bool OpSplitter::acceptNewOpConn(const std::string &name)
113) {
Stefan Schuermans limit number of connections...

Stefan Schuermans authored 12 years ago

114)   // if maximum number of connections if limited, check it
115)   if (m_fileMaxConn.m_valid &&
116)       m_mapLocal.size() + m_mapInOut.size() >= m_fileMaxConn.m_obj.m_uint)
117)     return false; // too many connection
118)   return true;