source: trunk/FACT++/src/DimNetwork.cc @ 10396

Last change on this file since 10396 was 10396, checked in by tbretz, 9 years ago
File size: 3.8 KB
Line 
1#include "DimNetwork.h"
2
3StateClient::StateClient(const std::string &name, MessageImp &imp) :
4    MessageDimRX(name, imp), fState(-2),
5    fInfoState((name + "/STATE").c_str(), const_cast<char*>(""), this)
6{
7}
8
9// --------------------------------------------------------------------------
10//
11//! Extract the information about the state and its message. Store the
12//! state and redirect the message to fMsg.
13//
14void StateClient::infoHandler()
15{
16    DimInfo *curr = getInfo(); // get current DimInfo address
17    if (!curr)
18        return;
19
20    if (curr==&fInfoState)
21    {
22        const char *txt = fInfoState.getString();
23
24        fState     = strlen(txt)==0 ? -2 : fInfoState.getQuality();
25        fStateTime = Time(fInfoState.getTimestamp(),
26                          fInfoState.getTimestampMillisecs());
27
28        const string name = fInfoState.getName();
29
30        fMsg.StateChanged(fStateTime, name.substr(0, name.length()-6), txt, fState);
31
32        return;
33    }
34
35    MessageDimRX::infoHandler();
36}
37
38// ==========================================================================
39
40// --------------------------------------------------------------------------
41//
42//! Delete all StateClient objects from teh list and clear the list.
43//
44void DimNetwork::DeleteClientList()
45{
46    for (ClientList::iterator i=fClientList.begin();
47         i!=fClientList.end(); i++)
48        delete i->second;
49
50    fClientList.clear();
51}
52
53// --------------------------------------------------------------------------
54//
55//! Adds the StateClient for the given server. Don't forget to
56//! call this function if it is overwritten in a derived class.
57//!
58//! @param s
59//!     server which should be added
60//!
61//! @throws
62//!     a runtime_error is the server is already in the list
63//
64void DimNetwork::AddServer(const string &s)
65{
66    DimServiceInfoList::AddServer(s);
67    if (s=="DIM_DNS")
68        return;
69
70    // Check if this server is already in the list.
71    // This should never happen if Dim works reliable
72    const ClientList::iterator v = fClientList.find(s);
73    if (v!=fClientList.end())
74    {
75        stringstream err;
76        err << "Server '" << s << "' in list not as it ought to be.";
77        throw runtime_error(err.str());
78    }
79
80    // Add the new server to the server list
81    fClientList[s] = new StateClient(s, *this);
82}
83
84// --------------------------------------------------------------------------
85//
86//! Removes the StateClient for the given server. Don't forget to
87//! call this function if it is overwritten in a derived class.
88//!
89//! @param s
90//!     server which should be removed
91//!
92//! @throws
93//!     a runtime_error is the server to be removed is not in the list
94//
95void DimNetwork::RemoveServer(const string &s)
96{
97    DimServiceInfoList::RemoveServer(s);
98    if (s=="DIM_DNS")
99        return;
100
101    const ClientList::iterator v = fClientList.find(s);
102    if (v==fClientList.end())
103    {
104        stringstream err;
105        err << "Server '" << s << "' not in list as it ought to be.";
106        throw runtime_error(err.str());
107    }
108
109    // Remove the server from the server list
110    delete v->second;
111
112    fClientList.erase(v);
113}
114
115// --------------------------------------------------------------------------
116//
117//! RemovesAll StateClients. Don't forget to call this function if it
118//! is overwritten in a derived class.
119//!
120void DimNetwork::RemoveAllServers()
121{
122    DimServiceInfoList::RemoveAllServers();
123    DeleteClientList();
124}
125
126// --------------------------------------------------------------------------
127//
128//! @param server
129//!    server for which the current state should be returned
130//!
131//! @returns
132//!    the current state of the given server, -2 if the server was not found
133//!
134int DimNetwork::GetCurrentState(const string &server) const
135{
136    const ClientList::const_iterator v = fClientList.find(server);
137    return v==fClientList.end() ? -2 : v->second->GetState();
138}
Note: See TracBrowser for help on using the repository browser.