
Version history
---------------

19/5/2010	Service histories now available via DimRpc from DColl, not via .hist service
			When regular expression compiling results in error, State is set to ERROR, not
			FATAL. The erroneous expression is ignored in the following.
25/5/2010	Service history remains available if service itself become unavailable. If not
			yet in memory, reading from file is tried. Improved error handling of
			history files.
28/5/2010	Changed name of 'State' service to 'Message' to better reflect its functionality.
			Added client information to log file entries.			
30/5/2010	Created Bridge server that repeats services from one DNS to another.
			Service quality now also written to slow data file.
31/5/2010	Configuration file format follows semi-standard INI format.
7/6/2010	Separated History service from DColl. History format changed, now includes
			service format (allows history access also when service is unavailable).
11/6/2010	Bridge does not forward history service
17/6/2010	Added SendToLog() method. Changed severity encoding of Message service to
			use standard DIM structure of format "I:1;C"
18/6/2010	Alarm server configuration accepts now one email address per server. A new
			service for each observed server SERVERNAME/AlarmLevel contains the highest
			level that occurred in the past. Reset of alarm level only via a DIM command.
19/6/2010	ToString() now returns std::string
23/6/2010	GetConfig() returns std::string. Non-blocking configuration request in case
			GetConfig() not called from main thread. Access to configuration information
			internally mutex protected.
24/6/2010	Workaround for erroneous /SERVICE_LIST updates. Added static tokenize method to
			Evidence class.
30/6/2010	Made Lock()/Unlock() publicly available (mutex of type PTHREAD_MUTEX_ERRORCHECK),
			in case signal is set with ActivateSignal() this signal will be blocked while locked.
			Implemented experimental automatic full configuration tracking for Bridge.
7/7/2010	All commandHandler() and rpcHandler() safely translates data into string
			using ToString(). EvidenceServer class constructor now takes std::string as argument.
			Removed default configuration file from Config.
19/7/2010	Added documentation. Replaced std::vector by std::map at several locations. Access to
			class-wide pointer in Message() protected by mutex (currently the memory of the
			second-last message will not be freed correctly if severity is FATAL). Added
			History server configuration parameters to adjust buffer size.
20/7/2010	SendToLog() does not call Message() in case of error, but writes error message to log.
21/7/2010	Lock()/Unlock() do not report errors via Message(), but print to console and use 
			SendToLog(). That avoids a recursion problem since Message() also uses locking.
26/7/2010	General command '/ResetMessage' will reset message text and severity. This feature is
			used by Alarm if it receives a command to reset an alarm level.
			ConfigChanged() is called as separate thread when configuration file changes. Thread ID
			is checked in GetConfig() and also from this thread it will make blocking requests.
12/8/2010	Added command to switch alarm server on/off (command 'Alarm/Switch').
9/12/2010	Minimum period for checking server status in Alarm set to 5 seconds.
2/2/2011	Changed encoding of WARN, ERROR and FATAL to 10,20,30 to allow intermediate values.
			Non-blocking configuration request with default value was not working.
			Signal handler calls abort() if invoked three times or more.
10/6/2011	Services can be excluded from History buffer (mainly for large event data services)
20/6/2011	History buffers periodically saved to file (in case program crash or computer reboot)
6/7/2011	Missing pthread_mutexattr_init() in Evidence constructor caused spurious errors when
			locking mutex
