| // Copyright 2015 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_BASE_LOG_MESSAGE_HANDLER_H_ |
| #define COBALT_BASE_LOG_MESSAGE_HANDLER_H_ |
| |
| #include <map> |
| #include <string> |
| |
| #include "base/callback.h" |
| #include "base/logging.h" |
| #include "base/memory/singleton.h" |
| #include "base/synchronization/lock.h" |
| |
| namespace base { |
| |
| // Provides functionality for any component to receive log messages. |
| // base::logging supports a single global log message handler. |
| // This class extends that by implementing a log message handler |
| // that can relay the log messages to an arbitrary number of callbacks. |
| // |
| // Client code that wants to receive log messages should define a callback |
| // function and pass it to the AddCallback method. The returned CallbackId |
| // can be used to remove the callback later if necessary. |
| // |
| // By default, log messages are still sent to the regular log destinations |
| // after the callbacks (if any) have been invoked. This can be changed globally |
| // by calling the SetSuppressLogOutput() method. |
| // Callbacks can individually suppress messages as well, by returning true |
| // that they have handled the message. |
| // |
| // This class is designed to be a singleton, instanced only through the methods |
| // of the base::Singleton class. For example, |
| // LogMessageHandler::GetInstance()->AddCallback(...) |
| class LogMessageHandler { |
| public: |
| // Type for callback function. Return true to suppress the message, false |
| // to continue dispatch to the default handler. |
| typedef Callback<bool(int severity, const char* file, int line, |
| size_t message_start, const std::string& str)> |
| OnLogMessageCallback; |
| |
| // Type for callback function ID. |
| typedef int CallbackId; |
| |
| // Method to get the singleton instance of this class. |
| static LogMessageHandler* GetInstance(); |
| |
| // Public methods that operate on the singleton instance. |
| CallbackId AddCallback(const OnLogMessageCallback& callback); |
| void RemoveCallback(CallbackId callback_id); |
| void SetSuppressLogOutput(bool suppress_log_output); |
| bool GetSuppressLogOutput(); |
| |
| private: |
| // Type for map of callbacks. |
| typedef std::map<LogMessageHandler::CallbackId, |
| LogMessageHandler::OnLogMessageCallback> CallbackMap; |
| |
| // This class should only be instanced by the Singleton. |
| LogMessageHandler(); |
| ~LogMessageHandler(); |
| |
| // The global message handler function used by this class. |
| static bool OnLogMessage(int severity, const char* file, int line, |
| size_t message_start, const std::string& str); |
| |
| friend struct StaticMemorySingletonTraits<LogMessageHandler>; |
| |
| // The previous global log message handler, restored when the singleton |
| // instance is destroyed. |
| logging::LogMessageHandlerFunction old_log_message_handler_; |
| |
| // Map used to store the registered callbacks. |
| // This map is expected to be relatively small, but is still useful |
| // to simplify the code and provide somewhat more thread-safe access. |
| CallbackMap callbacks_; |
| |
| base::Lock lock_; |
| |
| CallbackId next_callback_id_; |
| |
| bool suppress_log_output_; |
| |
| DISALLOW_COPY_AND_ASSIGN(LogMessageHandler); |
| }; |
| |
| } // namespace base |
| |
| #endif // COBALT_BASE_LOG_MESSAGE_HANDLER_H_ |