/*
 * 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_
