source: trunk/FACT++/src/MessageDim.cc@ 10350

Last change on this file since 10350 was 10274, checked in by tbretz, 14 years ago
Slight modification to logging output, by default now the output of unsuccessfull propagation via the dim service is suppressed.
File size: 4.6 KB
Line 
1#include "MessageDim.h"
2
3#include "tools.h"
4#include "Time.h"
5
6using namespace std;
7
8// **************************************************************************
9/** @class MessageDimTX
10
11@brief Based on MessageImp, redirects log-output to a Dim service MESSAGE
12
13This is a special DimService which offers SERVER/MESSAGE to the DimNetwork
14and redirects output issued via its base-class MessageImp to the Dim
15service. The severity of the message is send as qualiy of service of
16the service message.
17
18@section Examples
19
20 - A simple and usefull example can be found in \ref log.cc and \ref logtime.cc
21
22**/
23// **************************************************************************
24
25// --------------------------------------------------------------------------
26//
27//! Constructs a DimService with the name SERVER/MESSAGE. And passes the
28//! given ostream down to the MessageImp base.
29//!
30//! @param name
31//! Name of the message server to which we want to subscribe, e.g. DRIVE
32//!
33//! @param out
34//! ostream passed to MessageImp. It is used to redirect the output to.
35//
36MessageDimTX::MessageDimTX(const std::string &name, std::ostream &out)
37: DimService((name + "/MESSAGE").c_str(), const_cast<char*>("")),
38MessageImp(out), fDebug(false)
39{
40 // This is a message which will never arrive because
41 // the time to establish a client-sever connection is
42 // too short.
43 Message("MessageDimTX started.");
44}
45
46// --------------------------------------------------------------------------
47//
48//!
49//
50MessageDimTX::~MessageDimTX()
51{
52 Message("MessageDimTX shutting down..");
53}
54
55// --------------------------------------------------------------------------
56//
57//! First calls MessageImp::Write to output the message tobe transmitted
58//! also to a local logging stream. Then the Dim service is updated.
59//! If sending of the message failed a message is written to the
60//! logging stream stored in MessageImp. It is intentionally not
61//! output through Update to make it look different than usual
62//! transmitted messages.
63//
64int MessageDimTX::Write(const Time &t, const char *txt, int qos)
65{
66 MessageImp::Write(t, txt, qos);
67
68 // We have to use setData to make sure the DimService will
69 // hold a local copy of the data.
70 setQuality(qos);
71 setData(const_cast<char*>(txt));
72 const int rc = updateService();
73
74 if (rc==0 && fDebug)
75 Out() << " !! " << t.GetAsStr() << " - Sending failed!" << endl;
76
77 return rc;
78}
79
80
81
82// **************************************************************************
83/** @class MessageDimRX
84
85@brief Based on MessageImp, subscribes to a MESSAGE service in the Dim network
86
87This is a special DimInfoHandler. It subscribes to a service SERVER/MESSAGE
88on the DimNetwork and redirects all received output to its base class
89MessageImp view MessageImp::Write. the quality of service received with
90each service update is passed as severity.
91
92@section Examples
93
94 - A simple and usefull example can be found in \ref log.cc and \ref logtime.cc
95
96 @todo Maybe it is not a good idea that MessageImp is a base class,
97 maybe it should be a reference given in the constructor
98
99**/
100// **************************************************************************
101
102// --------------------------------------------------------------------------
103//
104//! Setup a DimStamedInfo service subscription for SERVER/MESSAGE
105//!
106//! @param name
107//! the name of the SERVER
108//!
109//! @param imp
110//! A reference to MessageImo to which messages will be redirected
111//
112MessageDimRX::MessageDimRX(const std::string &name, MessageImp &imp)
113: fMsg(imp),
114fDimMessage(Form("%s/MESSAGE", name.c_str()).c_str(), const_cast<char*>(""), this)
115{
116 fMinLogLevel = 0;
117}
118
119// --------------------------------------------------------------------------
120//
121//! If the server has been disconnected write a simple log-message.
122//! Skip all received messages which have a severity smaller than
123//! fMinLogLevel. Write any other message with MessageImp::Write.
124//
125void MessageDimRX::infoHandler()
126{
127 if (getInfo()!=&fDimMessage)
128 return;
129
130 // The server is diconnected. Do nothing
131 if (getInfo()->getTimestamp()==0)
132 {
133 fMsg.Message("Disconnected.");
134 return;
135 }
136
137 // skip all messages with a severity smaller than the minimum log level
138 if (getInfo()->getQuality()<fMinLogLevel)
139 return;
140
141 const string n = getInfo()->getName();
142
143 stringstream msg;
144 msg << n.substr(0, n.find_first_of('/')) << ": " << getInfo()->getString();
145
146 // Write the received message to the output
147 fMsg.Write(Time(getInfo()->getTimestamp(), getInfo()->getTimestampMillisecs()),
148 msg.str().c_str(), getInfo()->getQuality());
149}
Note: See TracBrowser for help on using the repository browser.