blob: 0432358e013cd195b5f14ea6ca3338e130ce5391 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_ROUTER_LOGGER_LIST_H_
#define CHROME_BROWSER_MEDIA_ROUTER_LOGGER_LIST_H_
#include <set>
#include "components/media_router/browser/logger_impl.h"
#include "content/public/browser/browser_thread.h"
namespace media_router {
// This class uses a list of LoggerImpl instances to handle logging from within
// MediaSinkService component. It allows a client to log to multiple LoggerImpl
// instances at once, where each instance is typically associated with a
// Profile. It is used as a singleton that is never freed. All methods must be
// called on the UI thread except for GetInstance() and Log() as it also handles
// logging for MediaSinkService classes that are on IO thread.
class LoggerList {
public:
// Can be called on any thread.
// Returns the lazily-created singleton instance.
static LoggerList* GetInstance();
LoggerList(const LoggerList&) = delete;
LoggerList& operator=(const LoggerList&) = delete;
// Only on the UI thread.
void AddLogger(LoggerImpl* logger_impl);
void RemoveLogger(LoggerImpl* logger_impl);
// Can be called on any thread.
void Log(LoggerImpl::Severity severity,
mojom::LogCategory category,
const std::string& component,
const std::string& message,
const std::string& sink_id,
const std::string& media_source,
const std::string& session_id);
// Used by tests.
int GetLoggerCount() const;
private:
LoggerList();
~LoggerList();
// Only on the UI thread.
void LogOnUiThread(LoggerImpl::Severity severity,
mojom::LogCategory category,
base::Time time,
const std::string& component,
const std::string& message,
const std::string& sink_id,
const std::string& media_source,
const std::string& session_id);
std::set<raw_ptr<LoggerImpl>> loggers_;
};
} // namespace media_router
#endif // CHROME_BROWSER_MEDIA_ROUTER_LOGGER_LIST_H_