// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_FILTER_HANDLER_H_
#define CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_FILTER_HANDLER_H_

#include <string>
#include <vector>

#include "chrome/common/extensions/api/log_private.h"

namespace extensions {
// This class contains multiple filtering methods to filter log entries
// by multiple fields.
class FilterHandler {
 public:
  explicit FilterHandler(const api::log_private::Filter& filter);
  ~FilterHandler();

  // This function decides if a log entry should be returned to user.
  // Returns true if the log entry meets the filtering conditions.
  bool IsValidLogEntry(const api::log_private::LogEntry& entry) const;
  // Filters log by timestamp.
  // Returns true if the timestamp is within the time range of the filter.
  bool IsValidTime(double time) const;
  // Filters log by source (syslog, network_event_log, etc).
  // Returns true if the log is from specified source in the filter.
  bool IsValidSource(const std::string& source) const;
  // Filters log by level (DEBUG, ERROR, WARNING).
  // Returns true if the log level is specified in the filter.
  bool IsValidLevel(const std::string& level) const;
  // Filters log by its process name.
  // Returns true if the process name is specified in the filter.
  bool IsValidProcess(const std::string& process) const;

  const api::log_private::Filter* GetFilter() const { return &filter_; }
 private:
  api::log_private::Filter filter_;

  DISALLOW_COPY_AND_ASSIGN(FilterHandler);
};

}  // namespace extensions

#endif  // CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_FILTER_HANDLER_H_
