source: trunk/FACT++/src/DimDescriptionService.cc@ 12105

Last change on this file since 12105 was 11837, checked in by tbretz, 13 years ago
Changed Dim services to ensure they send the time.
File size: 5.8 KB
Line 
1// **************************************************************************
2/** @class DimDescriptionService
3
4@brief A DimService which broadcasts descriptions for services and commands
5
6The DimDescriptionService creates a service with the name of the server like
7SERVER/SERVICE_DESC. This is meant in addition to the SERVICE_LIST service
8of each node to contain a description of the service and its arguments.
9
10Assume you have created a service (or command) with the format I:2;F:1
11a valid description string would look like
12
13 Description|int[addr]:Address range (from - to)|val[byte]:Value to be set
14
15Description is a general description of the command or service itself,
16int and val are the names of the arguments (e.g. names of FITS columns),
17addr and byte have the meaning of a unit (e.g. unit of FITS column)
18and the text after the colon is a description of the arguments
19(e.g. comment of a FITS column). The description must not contain a
20line-break character \n.
21
22You can omit either the name, the unit or the comment or any combination of them.
23The descriptions of the individual format strings are separated by a vertical line.
24
25The description should contain as many descriptions as format chunks, e.g.
26
27 - I:1 should contain one description chunks
28 - I:1;F:1 should contain two description chunks
29 - I:2;F:1 should contain two description chunks
30 - I:2;I:1;F:1 should contain three description chunks
31
32*/
33// **************************************************************************
34#include "DimDescriptionService.h"
35
36#include <stdexcept>
37
38#include "dis.hxx"
39#include "Time.h"
40
41using namespace std;
42
43DimService *DimDescriptionService::fService = 0;
44int DimDescriptionService::fCount = 0;
45std::string DimDescriptionService::fData = "";
46
47// --------------------------------------------------------------------------
48//
49//! When the constructor is first called, a service with the name
50//! SERVER/SERVICE_DESC is created. The server name SERVER is retrieved
51//! from DimServer::itsName. If DimServer::itsName is empty, the
52//! server name is extracted from the given name as the part before the
53//! first '/'. A string "name=format\n" is added to fData and stored
54//! in fDescription.
55//!
56//! A counter fCount for the number of instantiations is increased.
57//!
58//! @param name
59//! The name of the service or command to be described, e.g. SERVER/COMMAND
60//!
61//! @param desc
62//! A description string. For details see class reference
63//!
64//! @throws
65//! If a server name couldn't be reliably determined a logic_error
66//! exception is thrown; if the given description contains a '\n'
67//! also a logic_error is thrown.
68//
69DimDescriptionService::DimDescriptionService(const std::string &name, const std::string &desc)
70{
71 string server = DimServer::itsName ? DimServer::itsName : "";
72 if (server.empty())
73 {
74 const size_t p = name.find_first_of('/');
75 if (p==string::npos)
76 throw logic_error("Could not determine server name");
77
78 server = name.substr(0, p);
79 }
80
81 if (desc.find_first_of('\n')!=string::npos)
82 throw logic_error("Description for "+name+" contains '\\n'");
83
84 if (!fService)
85 {
86 fService = new DimService((server+"/SERVICE_DESC").c_str(), const_cast<char*>(""));
87 fData =
88 server + "/SERVICE_DESC"
89 "=This service holds a descriptions for services or command "
90 "and there arguments|Description[string]:For a detailed "
91 "explanation of the descriptive string see the class reference "
92 "of DimDescriptionService.\n" +
93 server + "/CLIENT_LIST"
94 "=This is a native Dim service. It contains a list "
95 "of all clients currently connected.\n" +
96 server + "/VERSION_NUMBER"
97 "=This is a native Dim service. It contains the version number "
98 "of Dim in use and can be used to check if a client is connected."
99 "|DimVer[int]:Version*100+Release (e.g. V19r17 = 1917)\n" +
100 server + "/EXIT"
101 "=This is a native Dim service. It allows to exit the program "
102 "remotely. FACT++ programs use the given number as return code."
103 "|Rc[int]:Return code (42 will call exit() directly, 0x4242 will call abort() directly.\n" +
104 server + "/SERVICE_LIST"
105 "=This is a native Dim service. It provides a list of all "
106 "commands and services together with their formats currently "
107 "provided by the server."
108 "|ServiceList[string]:For details see the Dim manual.\n";
109 }
110
111
112 fCount++;
113
114 fDescription = name + '=' + desc;
115
116 if (fData.find(fDescription+'\n')!=std::string::npos)
117 return;
118
119 fData += fDescription + '\n';
120
121 const Time t;
122 fService->setTimestamp(t.Time_t(), t.ms());
123 fService->setData(const_cast<char*>(fData.c_str()));
124 fService->updateService();
125}
126
127
128// --------------------------------------------------------------------------
129//
130//! If fDescription is found in fData it is removed from fData.
131//! The counter fCount is decreased and fService deleted if the counter
132//! reached 0.
133//
134DimDescriptionService::~DimDescriptionService()
135{
136 const size_t pos = fData.find(fDescription+'\n');
137 if (pos!=std::string::npos)
138 fData.replace(pos, fDescription.size()+1, "");
139
140 if (--fCount>0)
141 return;
142
143 delete fService;
144 fService=0;
145}
146
147void DimDescribedService::setTime(const Time &t)
148{
149 setTimestamp(t.Time_t(), t.ms());
150}
151
152void DimDescribedService::setTime()
153{
154 setTime(Time());
155}
156
157int DimDescribedService::Update(const Time &t)
158{
159 setTime(t);
160 return updateService();
161}
162
163int DimDescribedService::Update()
164{
165 return Update(Time());
166}
167
168int DimDescribedService::Update(const string &data)
169{
170 return Update(data.data());
171}
172
173int DimDescribedService::Update(const char *data)
174{
175 DimService::setData(const_cast<char*>(data));
176 return Update();
177}
Note: See TracBrowser for help on using the repository browser.