UniSet  2.2.1
LogSession.h
00001 // -------------------------------------------------------------------------
00002 #ifndef LogSession_H_
00003 #define LogSession_H_
00004 // -------------------------------------------------------------------------
00005 #include <string>
00006 #include <memory>
00007 #include <deque>
00008 #include <cc++/socket.h>
00009 #include <condition_variable>
00010 #include <mutex>
00011 #include "Mutex.h"
00012 #include "DebugStream.h"
00013 #include "LogAgregator.h"
00014 #include "PassiveTimer.h"
00015 // -------------------------------------------------------------------------
00017 class LogSession:
00018     public std::enable_shared_from_this<LogSession>,
00019     public ost::TCPSession
00020 {
00021     public:
00022 
00023         LogSession( ost::TCPSocket& server, std::shared_ptr<DebugStream>& log, timeout_t sessTimeout = 10000, timeout_t cmdTimeout = 2000, timeout_t outTimeout = 2000, timeout_t delay = 2000 );
00024         virtual ~LogSession();
00025 
00026         typedef sigc::slot<void, std::shared_ptr<LogSession>> FinalSlot;
00027         void connectFinalSession( FinalSlot sl );
00028 
00029         inline void cancel()
00030         {
00031             cancelled = true;
00032         }
00033         inline std::string getClientAddress()
00034         {
00035             return caddr;
00036         }
00037 
00038         inline void setSessionLogLevel( Debug::type t )
00039         {
00040             slog.level(t);
00041         }
00042         inline void addSessionLogLevel( Debug::type t )
00043         {
00044             slog.addLevel(t);
00045         }
00046         inline void delSessionLogLevel( Debug::type t )
00047         {
00048             slog.delLevel(t);
00049         }
00050 
00051     protected:
00052         LogSession( ost::TCPSocket& server );
00053 
00054         virtual void run();
00055         virtual void final();
00056         void logOnEvent( const std::string& s );
00057         void readStream();
00058 
00059         // msec
00060         timeout_t sessTimeout = { 10000 };
00061         timeout_t cmdTimeout = { 2000 };
00062         timeout_t outTimeout = { 2000 };
00063         timeout_t delayTime = { 2000 };
00064 
00065     private:
00066         typedef std::deque<std::string> LogBuffer;
00067         LogBuffer lbuf;
00068         std::string peername = { "" };
00069         std::string caddr = { "" };
00070         std::shared_ptr<DebugStream> log;
00071         std::shared_ptr<LogAgregator> alog;
00072         sigc::connection conn;
00073 
00074         std::shared_ptr<LogSession> myptr;
00075 
00076         //        PassiveTimer ptSessionTimeout;
00077         FinalSlot slFin;
00078         std::atomic_bool cancelled = { false };
00079 
00080         DebugStream slog;
00081         std::ostringstream sbuf;
00082 
00083         std::mutex              log_mutex;
00084         std::condition_variable log_event;
00085         std::atomic_bool log_notify = ATOMIC_VAR_INIT(0);
00086 };
00087 // -------------------------------------------------------------------------
00089 class NullLogSession:
00090     public ost::Thread
00091 {
00092     public:
00093 
00094         NullLogSession( const std::string& _msg );
00095         ~NullLogSession();
00096 
00097         void add( ost::TCPSocket& server );
00098         void setMessage( const std::string& _msg );
00099 
00100         inline void cancel()
00101         {
00102             cancelled = true;
00103         }
00104 
00105     protected:
00106 
00107         virtual void run();
00108         virtual void final();
00109 
00110     private:
00111         std::string msg;
00112 
00113         typedef std::list< std::shared_ptr<ost::TCPStream> > TCPStreamList;
00114         TCPStreamList slist;
00115         UniSetTypes::uniset_rwmutex smutex;
00116         std::atomic_bool cancelled;
00117 };
00118 // -------------------------------------------------------------------------
00119 #endif // LogSession_H_
00120 // -------------------------------------------------------------------------