source: trunk/FACT++/src/DimState.cc@ 14797

Last change on this file since 14797 was 14234, checked in by tbretz, 12 years ago
Of course when a server gets added it should not be removed
File size: 3.5 KB
Line 
1#include "DimState.h"
2
3using namespace std;
4using namespace boost;
5
6void DimDnsServerList::HandlerServerImp(const EventImp &evt)
7{
8 if (evt.GetSize()==0)
9 return;
10
11 time = evt.GetTime();
12 msg = evt.GetString();
13
14 typedef char_separator<char> separator;
15 const tokenizer<separator> tok(msg, separator("|"));
16
17 for (auto it=tok.begin(); it!=tok.end(); it++)
18 {
19 const size_t p = it->find_first_of('@');
20 if (p==string::npos)
21 continue;
22
23 // The first part before the first @ is the server name
24 string server = it->substr(0, p);
25 if (server.empty())
26 continue;
27
28 // If it starts with a - we have to remove an entry
29 if (server[0]=='-')
30 {
31 fServerList.erase(server.substr(1));
32 CallbackServerRemove(server.substr(1));
33 continue;
34 }
35
36 // If it starts with a + we have to add an entry
37 if (server[0]=='+')
38 server = server.substr(1);
39
40 // Check if this server is already in the list.
41 // This should never happen if Dim works reliable
42 if (fServerList.insert(server).second)
43 CallbackServerAdd(server);
44 }
45}
46
47void DimDnsServiceList::HandlerServiceListImp(const EventImp &evt)
48{
49 if (evt.GetSize()==0)
50 return;
51
52 // Get the name of the service
53 //const string svc = getInfo()->getName();
54
55 // Get the server name from the service name
56 //const string server = svc.substr(0, svc.find_first_of('/'));
57 //const string service = svc.substr(svc.find_first_of('/')+1);
58
59 msg = evt.GetString();
60 time = evt.GetTime();
61
62 // Initialize the entry with an empty list
63 //if (msg[0]!='+' && msg[0]!='-')
64 // return;
65
66 typedef char_separator<char> separator;
67 const tokenizer<separator> tok(msg, separator("\n"));
68
69 for (auto it=tok.begin(); it!=tok.end(); it++)
70 {
71 if (it->at(0)=='-')
72 continue;
73
74 // Get the type and compare it with fType
75 const string type = it->substr(it->find_last_of('|')+1);
76 if (type=="RPC")
77 continue;
78
79 //const bool iscmd = type=="CMD";
80 //if (type!=fType && fType!="*")
81 // continue;
82
83 const size_t first_pipe = it->find_first_of('|');
84 const size_t first_slash = it->find_first_of('/');
85 const size_t last_pipe = it->find_last_of('|');
86
87 // Get format, name and command name
88 Service service;
89 service.server = it->substr(0, first_slash);
90 service.name = it->substr(0, first_pipe);
91 service.service = it->substr(first_slash+1, first_pipe-first_slash-1);
92 service.format = it->substr(first_pipe +1, last_pipe -first_pipe -1);
93 service.iscmd = type=="CMD";
94
95 //if (it->at(0)=='+')
96 //{
97 // // Check if this server is not found in the list.
98 // // This should never happen if Dim works reliable
99 // const TypeList::iterator v = list.find(name);
100 // if (v!=list.end())
101 // {
102 // stringstream err;
103 // err << "DimServiceInfoList: Service '" << server << "/" << name << "' already in list not as it ought to be.";
104 // throw runtime_error(err.str());
105 // }
106 //
107 // list[name] = make_pair(fmt, iscmd);
108 // fList->AddService(server, name, fmt, iscmd);
109 //}
110
111 const auto v = find(fServiceList.begin(), fServiceList.end(), service.name);
112 if (v!=fServiceList.end())
113 continue;
114
115 CallbackServiceAdd(service);
116 }
117}
Note: See TracBrowser for help on using the repository browser.