This directory contains the backbone of the control system. See directory Doc for documentation. 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. With ActivateSignal() a signal can be set that is send to main thread upon configuration file change, the build-in signal handler then invokes the (virtual) method ConfigChanged(). 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. The general exitHandler() will react in a special way to code 0: it will reset the message severity. This feature is used by Alarm if it receives a command to reset an alarm level.