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

Last change on this file since 10365 was 10350, checked in by tbretz, 10 years ago
Throw logic_error instead of runtime_error and throw in case the description contains a EOL character.
File size: 3.9 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
27I:1          should contain one description chunks
28I:1;F:1      should contain two description chunks
29I:2;F:1      should contain two description chunks
30I: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
40using namespace std;
41
42DimService *DimDescriptionService::fService = 0;
43int         DimDescriptionService::fCount   = 0;
44std::string DimDescriptionService::fData    = "";
45
46// --------------------------------------------------------------------------
47//
48//! When the constructor is first called, a service with the name
49//! SERVER/SERVICE_DESC is created. The server name SERVER is retrieved
50//! from DimServer::itsName. If DimServer::itsName is empty, the
51//! server name is extracted from the given name as the part before the
52//! first '/'. A string "name=format\n" is added to fData and stored
53//! in fDescription.
54//!
55//! A counter fCount for the number of instantiations is increased.
56//!
57//! @param name
58//!     The name of the service or command to be described, e.g. SERVER/COMMAND
59//!
60//! @param desc
61//!     A description string. For details see class reference
62//!
63//! @throws
64//!     If a server name couldn't be reliably determined a logic_error
65//!     exception is thrown; if the given description contains a '\n'
66//!     also a logic_error is thrown.
67//
68DimDescriptionService::DimDescriptionService(const std::string &name, const std::string &desc)
69{
70    string service = DimServer::itsName;
71    if (service.empty())
72    {
73        const size_t p = name.find_first_of('/');
74        if (p==string::npos)
75            throw logic_error("Could not determine server name");
76
77        service = name.substr(0, p);
78    }
79
80    if (desc.find_first_of('\n')!=string::npos)
81            throw logic_error("Description for "+name+" contains '\\n'");
82
83    service += "/SERVICE_DESC";
84    if (!fService)
85        fService = new DimService(service.c_str(), const_cast<char*>(""));
86
87    fCount++;
88
89    fDescription = name + '=' + desc;
90
91    if (fData.find(fDescription+'\n')!=std::string::npos)
92        return;
93
94    fData += fDescription + '\n';
95
96    fService->setData(const_cast<char*>(fData.c_str()));
97    fService->updateService();
98}
99
100
101// --------------------------------------------------------------------------
102//
103//! If fDescription is found in fData it is removed from fData.
104//! The counter fCount is decreased and fService deleted if the counter
105//! reached 0.
106//
107DimDescriptionService::~DimDescriptionService()
108{
109    const size_t pos = fData.find(fDescription+'\n');
110    if (pos!=std::string::npos)
111        fData.replace(pos, fDescription.size()+1, "");
112
113    if (--fCount>0)
114        return;
115
116    delete fService;
117    fService=0;
118}
Note: See TracBrowser for help on using the repository browser.