diff --git a/src/ebusd/Makefile.am b/src/ebusd/Makefile.am index bf57211a..804fd608 100644 --- a/src/ebusd/Makefile.am +++ b/src/ebusd/Makefile.am @@ -6,8 +6,7 @@ AM_CXXFLAGS = -fpic \ bin_PROGRAMS = ebusd -ebusd_SOURCES = message.h \ - connection.cpp \ +ebusd_SOURCES = connection.cpp \ connection.h \ network.cpp \ network.h \ @@ -15,6 +14,7 @@ ebusd_SOURCES = message.h \ ebusloop.h \ baseloop.cpp \ baseloop.h \ + netmessage.h \ ebusd.cpp ebusd_LDADD = $(top_srcdir)/src/lib/utils/libutils.a \ diff --git a/src/ebusd/baseloop.cpp b/src/ebusd/baseloop.cpp index 4b66a047..25a25b22 100644 --- a/src/ebusd/baseloop.cpp +++ b/src/ebusd/baseloop.cpp @@ -22,7 +22,7 @@ #include "logger.h" #include "appl.h" -extern LogInstance& L; +extern Logger& L; extern Appl& A; BaseLoop::BaseLoop() @@ -67,7 +67,7 @@ void BaseLoop::start() std::string result; // recv new message from client - Message* message = m_msgQueue.remove(); + NetMessage* message = m_msgQueue.remove(); std::string data = message->getData(); data.erase(std::remove(data.begin(), data.end(), '\r'), data.end()); @@ -86,7 +86,7 @@ void BaseLoop::start() // send result to client result += '\n'; Connection* connection = message->getConnection(); - connection->addResult(Message(result)); + connection->addResult(NetMessage(result)); delete message; diff --git a/src/ebusd/baseloop.h b/src/ebusd/baseloop.h index 1ef4426e..6dcad253 100644 --- a/src/ebusd/baseloop.h +++ b/src/ebusd/baseloop.h @@ -36,14 +36,14 @@ public: void start(); - void addMessage(Message* message) { m_msgQueue.add(message); } + void addMessage(NetMessage* message) { m_msgQueue.add(message); } private: Commands* m_commands; EBusLoop* m_ebusloop; Network* m_network; - WQueue m_msgQueue; + WQueue m_msgQueue; enum ClientCommand { get, // get ebus data diff --git a/src/ebusd/connection.cpp b/src/ebusd/connection.cpp index b82011cf..49912bbe 100644 --- a/src/ebusd/connection.cpp +++ b/src/ebusd/connection.cpp @@ -22,13 +22,13 @@ #include #include -extern LogInstance& L; +extern Logger& L; int Connection::m_sum = 0; -void Connection::addResult(Message message) +void Connection::addResult(NetMessage message) { - Message* tmp = new Message(Message(message)); + NetMessage* tmp = new NetMessage(NetMessage(message)); m_result.add(tmp); } @@ -80,11 +80,11 @@ void* Connection::run() // send data data[datalen] = '\0'; - m_data->add(new Message(data, this)); + m_data->add(new NetMessage(data, this)); // wait for result L.log(net, debug, "[%05d] wait for result", getID()); - Message* message = m_result.remove(); + NetMessage* message = m_result.remove(); L.log(net, debug, "[%05d] result added", getID()); std::string result(message->getData()); diff --git a/src/ebusd/connection.h b/src/ebusd/connection.h index 5e9b160c..b7c538f4 100644 --- a/src/ebusd/connection.h +++ b/src/ebusd/connection.h @@ -24,16 +24,16 @@ #include "wqueue.h" #include "notify.h" #include "thread.h" -#include "message.h" +#include "netmessage.h" class Connection : public Thread { public: - Connection(TCPSocket* socket, WQueue* data) + Connection(TCPSocket* socket, WQueue* data) : m_socket(socket), m_data(data), m_running(false) { m_sum++; m_id = m_sum;} - void addResult(Message message); + void addResult(NetMessage message); void* run(); void stop() const { m_notify.notify(); } @@ -43,8 +43,8 @@ public: private: TCPSocket* m_socket; - WQueue* m_data; - WQueue m_result; + WQueue* m_data; + WQueue m_result; Notify m_notify; bool m_running; int m_id; diff --git a/src/ebusd/ebusd.cpp b/src/ebusd/ebusd.cpp index 88e69330..b991cd7d 100644 --- a/src/ebusd/ebusd.cpp +++ b/src/ebusd/ebusd.cpp @@ -32,7 +32,7 @@ using namespace libebus; Appl& A = Appl::Instance(); Daemon& D = Daemon::Instance(); -LogInstance& L = LogInstance::Instance(); +Logger& L = Logger::Instance(); BaseLoop* baseloop; diff --git a/src/ebusd/ebusloop.cpp b/src/ebusd/ebusloop.cpp index f26174da..833bf47e 100644 --- a/src/ebusd/ebusloop.cpp +++ b/src/ebusd/ebusloop.cpp @@ -22,7 +22,7 @@ #include "appl.h" #include -extern LogInstance& L; +extern Logger& L; extern Appl& A; EBusLoop::EBusLoop(Commands* commands) diff --git a/src/ebusd/message.h b/src/ebusd/netmessage.h similarity index 86% rename from src/ebusd/message.h rename to src/ebusd/netmessage.h index 55ee0f68..60a54053 100644 --- a/src/ebusd/message.h +++ b/src/ebusd/netmessage.h @@ -17,8 +17,8 @@ * along with ebusd. If not, see http://www.gnu.org/licenses/. */ -#ifndef MESSAGE_H_ -#define MESSAGE_H_ +#ifndef NETMESSAGE_H_ +#define NETMESSAGE_H_ #include @@ -28,7 +28,7 @@ class Connection; /** * @brief class for data/message transfer between connection and baseloop */ -class Message +class NetMessage { public: @@ -37,14 +37,14 @@ public: * @param data from client * @param connection to return result to correct client */ - Message(const std::string data, Connection* connection=NULL) + NetMessage(const std::string data, Connection* connection=NULL) : m_data(data), m_connection(connection) {} /** * @brief copy constructor. * @param src message object for copy */ - Message(const Message& src) : m_data(src.m_data), m_connection(src.m_connection) {} + NetMessage(const NetMessage& src) : m_data(src.m_data), m_connection(src.m_connection) {} /** * @brief data from client @@ -61,10 +61,11 @@ public: private: /** the data/message string */ std::string m_data; + /** the source connection */ Connection* m_connection; }; -#endif // MESSAGE_H_ +#endif // NETMESSAGE_H_ diff --git a/src/ebusd/network.cpp b/src/ebusd/network.cpp index 2762a09e..325a8934 100644 --- a/src/ebusd/network.cpp +++ b/src/ebusd/network.cpp @@ -22,11 +22,11 @@ #include "appl.h" #include -extern LogInstance& L; +extern Logger& L; extern Appl& A; -Network::Network(const bool localhost, WQueue* msgQueue) +Network::Network(const bool localhost, WQueue* msgQueue) : m_msgQueue(msgQueue), m_listening(false), m_running(false) { if (localhost == true) diff --git a/src/ebusd/network.h b/src/ebusd/network.h index 1bc9a26d..c62af478 100644 --- a/src/ebusd/network.h +++ b/src/ebusd/network.h @@ -26,7 +26,7 @@ class Network : public Thread { public: - Network(const bool localhost, WQueue* msgQueue); + Network(const bool localhost, WQueue* msgQueue); ~Network(); void* run(); @@ -34,7 +34,7 @@ public: private: std::list m_connections; - WQueue* m_msgQueue; + WQueue* m_msgQueue; TCPServer* m_tcpServer; Notify m_notify; bool m_listening; diff --git a/src/lib/ebus/configfile.h b/src/lib/ebus/configfile.h index 4d5183b1..9be9a622 100644 --- a/src/lib/ebus/configfile.h +++ b/src/lib/ebus/configfile.h @@ -31,14 +31,14 @@ namespace libebus enum FileType { CSV, XML }; /** - * @brief Base class for config files. + * @brief base class for config files. */ class ConfigFile { public: /** - * @brief Destructor. + * @brief destructor. */ virtual ~ConfigFile() {} @@ -52,14 +52,14 @@ public: }; /** - * @brief Class for CSV config files. + * @brief class for CSV config files. */ class ConfigFileCSV : public ConfigFile { public: /** - * @brief Destructor. + * @brief destructor. */ ~ConfigFileCSV() {} @@ -73,14 +73,14 @@ public: }; /** - * @brief Class for XML config files. + * @brief class for XML config files. */ class ConfigFileXML : public ConfigFile { public: /** - * @brief Destructor. + * @brief destructor. */ ~ConfigFileXML() {} @@ -95,32 +95,32 @@ public: /** - * @brief Class for class Device. + * @brief class for class device. */ class ConfigCommands { public: /** - * @brief Set file type and add recursive files from given path. + * @brief set file type and add recursive files from given path. * @param path to configuration files. - * @param Filetype to parse. + * @param filetype to parse. */ ConfigCommands(const std::string path, const FileType type); /** - * @brief Destructor. + * @brief destructor. */ ~ConfigCommands() { delete m_configfile; } /** * @brief setter for file type. - * @param FileType of files. + * @param filetype of files. */ void setType(const FileType type); /** - * @brief Parse files for commands and store them into commands instance. + * @brief parse files for commands and store them into commands instance. * @return a commands instance */ Commands* getCommands(); @@ -128,10 +128,13 @@ public: private: /** the configfile instance */ ConfigFile* m_configfile; + /** main path for configuration files */ std::string m_path; + /** valid file extension */ std::string m_extension; + /** vector of configuration files */ std::vector m_files; diff --git a/src/lib/ebus/dump.h b/src/lib/ebus/dump.h index 34418139..e64c6356 100644 --- a/src/lib/ebus/dump.h +++ b/src/lib/ebus/dump.h @@ -62,6 +62,7 @@ public: private: /** the name of dump file*/ std::string m_filename; + /** max. size of dump file */ long m_filesize; diff --git a/src/lib/ebus/port.h b/src/lib/ebus/port.h index b8097af0..edcf1889 100644 --- a/src/lib/ebus/port.h +++ b/src/lib/ebus/port.h @@ -39,19 +39,19 @@ enum DeviceType { SERIAL, NETWORK }; /** - * @brief Base class for input devices. + * @brief base class for input devices. */ class Device { public: /** - * @brief Constructs a new instance. + * @brief constructs a new instance. */ Device() : m_fd(-1), m_open(false), m_noDeviceCheck(false) {} /** - * @brief Destructor. + * @brief destructor. */ virtual ~Device() {} @@ -104,12 +104,16 @@ public: protected: /** if of file descriptor */ int m_fd; + /** state of device*/ bool m_open; + /** state of device check */ bool m_noDeviceCheck; + /** queue for received bytes */ std::queue m_recvBuffer; + /** receive buffer */ unsigned char m_buffer[MAX_READ_SIZE]; @@ -123,14 +127,14 @@ private: }; /** - * @brief Class for serial input device. + * @brief class for serial input device. */ class DeviceSerial : public Device { public: /** - * @brief Destructor. + * @brief destructor. */ ~DeviceSerial() { closeDevice(); } @@ -153,14 +157,14 @@ private: }; /** - * @brief Class for network input device. + * @brief class for network input device. */ class DeviceNetwork : public Device { public: /** - * @brief Destructor. + * @brief destructor. */ ~DeviceNetwork() { closeDevice(); } @@ -181,21 +185,21 @@ private: }; /** - * @brief Wrapper class for class Device. + * @brief wrapper class for class device. */ class Port { public: /** - * @brief Constructs a new instance and determine device type. + * @brief constructs a new instance and determine device type. * @param deviceName to determine device type. * @param noDeviceCheck en-/disable device check. */ Port(const std::string deviceName, const bool noDeviceCheck); /** - * @brief Destructor. + * @brief destructor. */ ~Port() { delete m_device; } @@ -248,8 +252,10 @@ public: private: /** the device name */ std::string m_deviceName; + /** the device instance */ Device* m_device; + /** true if device check is disabled */ bool m_noDeviceCheck; diff --git a/src/lib/utils/appl.h b/src/lib/utils/appl.h index b9b79478..2a04bb11 100644 --- a/src/lib/utils/appl.h +++ b/src/lib/utils/appl.h @@ -76,7 +76,7 @@ class Appl public: /** - * @brief create an appl instance and return the reference. + * @brief create an instance and return the reference. * @param command is true if an command is needed. * @return the reference to instance. */ @@ -89,32 +89,32 @@ public: /** * @brief save application version string. - * @param version string + * @param version string. */ void setVersion(const char* version) { m_version = version; } /** * @brief create new entry of application option only for help page. - * @param text string to print + * @param text string to print. */ void addText(const char* text); /** * @brief create new entry of application option. - * @param name the long name - * @param shortname optional short name - * @param optval value of option - * @param datatype data type of option value - * @param optiontype type of given option - * @param description hint text for help page + * @param name the long name. + * @param shortname optional short name. + * @param optval value of option. + * @param datatype data type of option value. + * @param optiontype type of given option. + * @param description hint text for help page. */ void addOption(const char* name, const char* shortname, OptVal optval, DataType datatype, OptionType optiontype, const char* description); /** - * @brief returns the value of the interested option - * @param name the interested option - * @return casted value + * @brief returns the value of the interested option. + * @param name the interested option. + * @return casted value. */ template T getOptVal(const char* name) @@ -125,26 +125,26 @@ public: /** * @brief parse application arguments. - * @param argc the number of options - * @param argv the given options + * @param argc the number of options. + * @param argv the given options. */ void parseArgs(int argc, char* argv[]); /** - * @brief returns the number of saved commands and arguments - * @return number of commands and arguments + * @brief returns the number of saved commands and arguments. + * @return number of commands and arguments. */ int numArgs() const { return m_arguments.size(); } /** - * @brief returns the string of an interested argument (0 = command) - * @param num number of interested argument - * @return string value + * @brief returns the string of an interested argument (0 = command). + * @param num number of interested argument. + * @return string value. */ std::string getArg(const int num) const { return m_arguments[num]; } private: - /** private constructor - singleton pattern*/ + /** private constructor - singleton pattern */ Appl(const bool command) : m_needCommand(command) {} Appl(const Appl&); Appl& operator=(const Appl&); @@ -171,16 +171,16 @@ private: /** * @brief checks the passed parameter if this is a valid option. - * @param option to check - * @param value to save if paramter is a valid option + * @param option to check. + * @param value to save if paramter is a valid option. */ bool checkOption(const std::string& option, const std::string& value); /** * @brief save the passed value to option. - * @param option name - * @param value to save - * @param datatype of given option + * @param option name. + * @param value to save. + * @param datatype of given option. */ void setOptVal(const char* option, const std::string value, DataType datatype); diff --git a/src/lib/utils/daemon.h b/src/lib/utils/daemon.h index 4ce8780a..d7f3fdbd 100644 --- a/src/lib/utils/daemon.h +++ b/src/lib/utils/daemon.h @@ -28,7 +28,7 @@ class Daemon public: /** - * @brief create an daemon instance and return the reference. + * @brief create an instance and return the reference. * @return the reference to instance. */ static Daemon& Instance(); @@ -58,8 +58,10 @@ private: /** status of process; true if we are a daemon */ bool m_status; + /** name of the pid file*/ const char* m_pidfile; + /** file descriptor of the pid file */ int m_pidfd; diff --git a/src/lib/utils/logger.cpp b/src/lib/utils/logger.cpp index 7921851e..12fb49f8 100644 --- a/src/lib/utils/logger.cpp +++ b/src/lib/utils/logger.cpp @@ -28,7 +28,10 @@ #include #include +/** */ static const char* AreaNames[Size_of_Areas] = { "bas", "net", "bus" }; + +/** */ static const char* LevelNames[Size_of_Level] = { "error", "event", "trace", "debug" }; int calcAreas(const std::string areas) @@ -66,8 +69,8 @@ int calcLevel(const std::string level) } -LogMessage::LogMessage(const int area, const int level, const std::string text, const bool run) - : m_area(area), m_level(level), m_text(text), m_run(run) +LogMessage::LogMessage(const int area, const int level, const std::string text, const bool running) + : m_area(area), m_level(level), m_text(text), m_running(running) { char time[24]; struct timeval tv; @@ -89,17 +92,17 @@ LogMessage::LogMessage(const int area, const int level, const std::string text, void LogSink::addMessage(const LogMessage& message) { LogMessage* tmp = new LogMessage(LogMessage(message)); - m_queue.add((tmp)); + m_logMessages.add((tmp)); } void* LogSink::run() { while (1) { - LogMessage* message = m_queue.remove(); + LogMessage* message = m_logMessages.remove(); if (message->isRunning() == false) { delete message; - while (m_queue.size() == true) { - LogMessage* message = m_queue.remove(); + while (m_logMessages.size() == true) { + LogMessage* message = m_logMessages.remove(); write(*message); delete message; } @@ -114,8 +117,6 @@ void* LogSink::run() -int LogConsole::m_numInstance = 0; - void LogConsole::write(const LogMessage& message) const { std::cout << message.getTime() << " [" @@ -126,11 +127,9 @@ void LogConsole::write(const LogMessage& message) const -int LogFile::m_numInstance = 0; - void LogFile::write(const LogMessage& message) const { - std::fstream file(m_filename.c_str(), std::ios::out | std::ios::app); + std::fstream file(m_file.c_str(), std::ios::out | std::ios::app); if (file.is_open() == true) { file << message.getTime() << " [" @@ -143,19 +142,19 @@ void LogFile::write(const LogMessage& message) const -LogInstance& LogInstance::Instance() +Logger& Logger::Instance() { - static LogInstance instance; + static Logger instance; return (instance); } -LogInstance::~LogInstance() +Logger::~Logger() { while (m_sinks.empty() == false) *this -= *(m_sinks.begin()); } -LogInstance& LogInstance::operator+= (LogSink* sink) +Logger& Logger::operator+=(LogSink* sink) { sinkCI_t itEnd = m_sinks.end(); sinkCI_t it = std::find(m_sinks.begin(), itEnd, sink); @@ -166,7 +165,7 @@ LogInstance& LogInstance::operator+= (LogSink* sink) return (*this); } -LogInstance& LogInstance::operator-= (const LogSink* sink) +Logger& Logger::operator-=(const LogSink* sink) { sinkCI_t itEnd = m_sinks.end(); sinkCI_t it = std::find(m_sinks.begin(), itEnd, sink); @@ -181,7 +180,7 @@ LogInstance& LogInstance::operator-= (const LogSink* sink) return (*this); } -void LogInstance::log(const int area, const int level, const std::string& data, ...) +void Logger::log(const int area, const int level, const std::string& data, ...) { if (m_running == true) { char* tmp; @@ -190,7 +189,7 @@ void LogInstance::log(const int area, const int level, const std::string& data, if (vasprintf(&tmp, data.c_str(), ap) != -1) { std::string buffer(tmp); - m_messages.add(new LogMessage(LogMessage(area, level, buffer))); + m_logMessages.add(new LogMessage(LogMessage(area, level, buffer))); } va_end(ap); @@ -199,12 +198,12 @@ void LogInstance::log(const int area, const int level, const std::string& data, } -void* LogInstance::run() +void* Logger::run() { m_running = true; while (m_running == true) { - LogMessage* message = m_messages.remove(); + LogMessage* message = m_logMessages.remove(); sinkCI_t iter = m_sinks.begin(); @@ -213,12 +212,13 @@ void* LogInstance::run() if (((*iter)->getAreas() & message->getArea() && (*iter)->getLevel() >= message->getLevel()) - && message->isRunning() == true) { + && message->isRunning() == true) (*iter)->addMessage(*message); - } else if (message->isRunning() == false) { + + else if (message->isRunning() == false) (*iter)->addMessage(*message); m_running = false; - } + } } @@ -229,8 +229,8 @@ void* LogInstance::run() return NULL; } -void LogInstance::stop() +void Logger::stop() { - m_messages.add(new LogMessage(LogMessage(bas, error, "", false))); + m_logMessages.add(new LogMessage(LogMessage(bas, error, "", false))); usleep(100000); } diff --git a/src/lib/utils/logger.h b/src/lib/utils/logger.h index adae3738..10891949 100644 --- a/src/lib/utils/logger.h +++ b/src/lib/utils/logger.h @@ -28,142 +28,309 @@ #include #include -enum Areas { bas=1, net=2, bus=4, all=7, Size_of_Areas=3 }; -enum Level { error=0, event, trace, debug, Size_of_Level }; +/** available types for all subsystems */ +enum AreasType { + bas=1, // basis + net=2, // network + bus=4, // ebus + all=7, // type for all subsystems + Size_of_Areas=3, // number of possible areas +}; +/** available logging levels */ +enum LevelType { + error=0, // + event, // + trace, // + debug, // + Size_of_Level, // number of possible levels +}; + +/** global function to get calculate logging areas */ int calcAreas(const std::string areas); + +/** global function to get calculate logging level */ int calcLevel(const std::string level); - +/** + * @brief class which describes a logging message itself. + */ class LogMessage { public: - LogMessage(const int area, const int level, const std::string text, const bool run=true); + /** + * @brief creates a new logging message. + * @param area the logging area of the message. + * @param level the logging level of the message. + * @param text the logging message. + * @param running the status of logging subsystem. + */ + LogMessage(const int area, const int level, const std::string text, const bool running=true); + /** + * @brief copy constructor to duplicate a logging message. + * @param src a reference to logging message. + */ LogMessage(const LogMessage& src) : m_area(src.m_area), m_level(src.m_level), m_text(src.m_text), - m_run(src.m_run), m_time(src.m_time) {} + m_running(src.m_running), m_time(src.m_time) {} - void operator= (const LogMessage& src) + /** + * @brief copy operator to duplicate a logging message. + * @param src a reference to logging message. + */ + void operator=(const LogMessage& src) { m_area = src.m_area; m_level = src.m_level; m_text = src.m_text; - m_run = src.m_run; m_time = src.m_time; } + m_running = src.m_running; m_time = src.m_time; } + /** + * @brief get the logging area. + * @return the logging area. + */ int getArea() const { return (m_area); } + + /** + * @brief get the logging level. + * @return the logging level. + */ int getLevel() const { return(m_level); } + + /** + * @brief get the logging text. + * @return the logging text. + */ std::string getText() const { return (m_text.c_str()); } - bool isRunning() const { return (m_run); } + + /** + * @brief status of logging subsystem. + * @return false if logging subsystem is going down. + */ + bool isRunning() const { return m_running; } + + /** + * @brief get the logging timestamp. + * @return the logging timestamp. + */ std::string getTime() const { return (m_time.c_str()); } private: + /** the logging area */ int m_area; + + /** the logging level */ int m_level; + + /** the logging message */ std::string m_text; - bool m_run; + + /** true if this instance is running */ + bool m_running; + + /** the logging timestamp */ std::string m_time; }; -enum Type { Console, Logfile }; - +/** + * @brief base class for all type of logging sinks. + */ class LogSink : public Thread { public: - LogSink(const int areas, const int level, const Type type, const char* name) - : m_areas(areas), m_level(level), m_type(type), m_name(name) {} + /** + * @brief creates a virtual logging sink. + * @param areas the logging areas. + * @param level the logging level. + */ + LogSink(const int areas, const int level) : m_areas(areas), m_level(level) {} + /** + * @brief adds the logging message to internal message queue. + * @param message a reference to logging message. + */ void addMessage(const LogMessage& message); + /** + * @brief endless loop for logging sink instance. + * @return void pointer. + */ void* run(); + /** + * @brief get the logging areas. + * @return the logging areas. + */ int getAreas() const { return (m_areas); } + + /** + * @brief set the logging areas. + * @param areas the logging areas. + */ void setAreas(const int& areas) { m_areas = areas; } + /** + * @brief get the logging level. + * @return the logging level. + */ int getLevel() const { return (m_level); } + + /** + * @brief set the logging level. + * @param level the logging level. + */ void setLevel(const int& level) { m_level = level; } - Type getType() const { return (m_type); } - const char* getName() const { return (m_name.c_str()); } - protected: - WQueue m_queue; + /** queue for logging messages */ + WQueue m_logMessages; private: + /** the logging areas */ int m_areas; - int m_level; - Type m_type; - std::string m_name; + /** the logging level */ + int m_level; + + /** + * @brief virtual function for writing the logging message. + * @param message the logging message. + */ virtual void write(const LogMessage& message) const = 0; }; +/** + * @brief class for console logging sink type. + */ class LogConsole : public LogSink { public: + /** + * @brief creates a console logging sink. + * @param areas the logging areas. + * @param level the logging level. + * @param name the thread name for logging sink. + */ LogConsole(const int areas, const int level, const char* name) - : LogSink(areas, level, Console, name), m_instance(++m_numInstance) - { this->start(name); } + : LogSink(areas, level) { this->start(name); } private: - const int m_instance; - static int m_numInstance; - + /** + * @brief write the logging message to stdout. + * @param message the logging message. + */ void write(const LogMessage& message) const; }; +/** + * @brief class for logfile logging sink type. + */ class LogFile : public LogSink { public: - LogFile(const int areas, const int level, const char* name, const char* filename) - : LogSink(areas, level, Logfile, name), m_filename(filename), m_instance(++m_numInstance) - { this->start(name); } + /** + * @brief creates a log file logging sink. + * @param areas the logging areas. + * @param level the logging level. + * @param name the thread name for logging sink. + * @param file the log file. + */ + LogFile(const int areas, const int level, const char* name, const char* file) + : LogSink(areas, level), m_file(file) { this->start(name); } private: - std::string m_filename; - const int m_instance; - static int m_numInstance; + /** the logging file */ + std::string m_file; + /** + * @brief write the logging message to specific log file. + * @param message the logging message. + */ void write(const LogMessage& message) const; }; -class LogInstance : public Thread +/** + * @brief logger base class which provide the logging interface. + */ +class Logger : public Thread { public: - static LogInstance& Instance(); + /** + * @brief create an instance and return the reference. + * @return the reference to instance. + */ + static Logger& Instance(); - ~LogInstance(); + /** + * @brief destructor. + */ + ~Logger(); - LogInstance& operator+= (LogSink* sink); - LogInstance& operator-= (const LogSink* sink); + /** + * @brief adds a logging sink and returns the reference to logger. + * @param pointer of logging sink. + * @return the reference to logger. + */ + Logger& operator+=(LogSink* sink); + /** + * @brief removes a logging sink and returns the reference to logger. + * @param pointer of logging sink. + * @return the reference to logger. + */ + Logger& operator-=(const LogSink* sink); + + /** + * @brief creates a logging message and add them to internal message queue. + * @param area the logging area of the message. + * @param level the logging level of the message. + * @param text the logging message. + * @param ... possible 'variable argument lists'. + */ void log(const int area, const int level, const std::string& text, ...); - int getNumberOfSinks() const { return(m_sinks.size()); } - LogSink* getSink(const int Index) const { return(m_sinks[Index]); } + /** + * @brief returns the sink at the specified index. + * @param index the index of the sink to return. + * @return the sink at the specified index. + */ + LogSink* getSink(const int index) const { return(m_sinks[index]); } + /** + * @brief endless loop for logger instance. + * @return void pointer. + */ void* run(); + /** + * @brief shutdown logger subsystem. + */ void stop(); private: - LogInstance() {} - LogInstance(const LogInstance&); - LogInstance& operator=(const LogInstance&); + /** private constructor - singleton pattern */ + Logger() {} + Logger(const Logger&); + Logger& operator=(const Logger&); + /** typedefs for a vector of type LogSink* */ typedef std::vector sink_t; typedef std::vector::iterator sinkCI_t; + /** vector of available logging sinks */ sink_t m_sinks; - WQueue m_messages; + /** queue for logging messages */ + WQueue m_logMessages; + /** true if this instance is running */ bool m_running; }; diff --git a/src/lib/utils/notify.h b/src/lib/utils/notify.h index 05b1491b..188040a1 100644 --- a/src/lib/utils/notify.h +++ b/src/lib/utils/notify.h @@ -42,21 +42,22 @@ public: /** * @brief file descriptor to watch for notify event. - * @return the notification value + * @return the notification value. */ int notifyFD() { return m_recvfd; } /** * @brief write notify event to file descriptor. - * @return result of writing notification + * @return result of writing notification. */ int notify() const { return write(m_sendfd,"1",1); } private: /** file descriptor to watch */ - int m_recvfd; - /** file descriptor to notify */ - int m_sendfd; + int m_recvfd; + + /** file descriptor to notify */ + int m_sendfd; }; diff --git a/src/lib/utils/tcpsocket.h b/src/lib/utils/tcpsocket.h index cf9d974b..f7861bdb 100644 --- a/src/lib/utils/tcpsocket.h +++ b/src/lib/utils/tcpsocket.h @@ -24,7 +24,7 @@ #include /** - * @brief class for low level tcp socket operations. (open, close, send, receive) + * @brief class for low level tcp socket operations. (open, close, send, receive). */ class TCPSocket { @@ -82,8 +82,10 @@ public: private: /** file descriptor from tcp socket */ int m_sfd; + /** port of tcp socket */ int m_port; + /** ip address of tcp socket */ std::string m_ip; @@ -122,8 +124,8 @@ class TCPServer public: /** * @brief creates a new instance of a listening tcp server. - * @param port the tcp port - * @param address the ip address + * @param port the tcp port. + * @param address the ip address. */ TCPServer(const int port, const std::string address) : m_lfd(0), m_port(port), m_address(address), m_listening(false) {} @@ -153,10 +155,13 @@ public: private: /** file descriptor from listening tcp socket */ int m_lfd; + /** listening tcp port */ int m_port; + /** listening tcp socket ip address */ std::string m_address; + /** true if object is already listening */ bool m_listening; diff --git a/src/lib/utils/thread.h b/src/lib/utils/thread.h index 4d4e15dc..e18e4062 100644 --- a/src/lib/utils/thread.h +++ b/src/lib/utils/thread.h @@ -65,7 +65,7 @@ public: pthread_t self() {return m_threadid; } /** - * @brief virtul function which must be implented in derived class. + * @brief virtul function which must be implemented in derived class. * @return void pointer. */ virtual void* run() = 0; @@ -73,8 +73,10 @@ public: private: /** own thread id */ pthread_t m_threadid; + /** true if thread is running */ bool m_running; + /** true if thread is detached */ bool m_detached; diff --git a/src/lib/utils/wqueue.h b/src/lib/utils/wqueue.h index cf696370..468885a4 100644 --- a/src/lib/utils/wqueue.h +++ b/src/lib/utils/wqueue.h @@ -51,7 +51,7 @@ public: /** * @brief add a new item to the end of queue. - * @param item + * @param item to add. */ void add(T item) { @@ -65,7 +65,7 @@ public: /** * @brief remove the first item from queue. - * @return the item + * @return the item. */ T remove() { @@ -84,7 +84,7 @@ public: /** * @brief return the first item from queue without remove. - * @return the item + * @return the item. */ T next() { @@ -102,7 +102,7 @@ public: /** * @brief the number of entries inside queue. - * @return the size + * @return the size. */ int size() { @@ -118,8 +118,10 @@ public: private: /** the queue itself */ std::list m_queue; + /** mutex variable for exclusive lock */ pthread_mutex_t m_mutex; + /** condition variable for exclusive lock */ pthread_cond_t m_cond;