// ********************************************************************** // // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #ifndef ICE_LOGGER_UTIL_H #define ICE_LOGGER_UTIL_H #include #include #include #include namespace Ice { class ICE_API LoggerOutputBase : private IceUtil::noncopyable { public: std::string str() const; std::ostringstream& __str(); // For internal use only. Don't use in your code. private: std::ostringstream _str; }; ICE_API LoggerOutputBase& loggerInsert(LoggerOutputBase& out, const IceUtil::Exception& ex); template struct IsException { static char testex(IceUtil::Exception*); static long testex(...); static const bool value = sizeof(testex(static_cast(0))) == sizeof(char); }; template struct LoggerOutputInserter { static inline LoggerOutputBase& insert(LoggerOutputBase& out, const T& val) { out.__str() << val; return out; } }; // Partial specialization template struct LoggerOutputInserter { static inline LoggerOutputBase& insert(LoggerOutputBase& out, const T& ex) { return loggerInsert(out, ex); } }; template inline LoggerOutputBase& operator<<(LoggerOutputBase& out, const T& val) { return LoggerOutputInserter::value>::insert(out, val); } template inline LoggerOutputBase& operator<<(LoggerOutputBase& os, const ::IceInternal::ProxyHandle& p) { return os << (p ? p->ice_toString() : ""); } inline LoggerOutputBase& operator<<(LoggerOutputBase& out, const ::std::exception& ex) { out.__str() << ex.what(); return out; } ICE_API LoggerOutputBase& operator<<(LoggerOutputBase&, std::ios_base& (*)(std::ios_base&)); template class LoggerOutput : public LoggerOutputBase { public: inline LoggerOutput(const LPtr& lptr) : _logger(lptr) {} inline ~LoggerOutput() { flush(); } inline void flush() { std::string s = __str().str(); if(!s.empty()) { L& ref = *_logger; (ref.*output)(s); } __str().str(""); } private: LPtr _logger; }; typedef LoggerOutput Print; typedef LoggerOutput Warning; typedef LoggerOutput Error; class ICE_API Trace : public LoggerOutputBase { public: Trace(const LoggerPtr&, const std::string&); ~Trace(); void flush(); private: LoggerPtr _logger; std::string _category; }; // // A special plug-in that installs a logger during a communicator's initialization. // Both initialize and destroy are no-op. See Ice::InitializationData. // class ICE_API LoggerPlugin : public Ice::Plugin { public: LoggerPlugin(const CommunicatorPtr& communicator, const LoggerPtr&); virtual void initialize(); virtual void destroy(); }; } #endif