// Copyright 2020 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.

#include "components/subresource_filter/content/browser/unindexed_ruleset_stream_generator.h"

#include "base/check.h"
#include "base/check_op.h"
#include "base/files/file_path.h"
#include "components/subresource_filter/content/browser/ruleset_version.h"
#include "components/subresource_filter/core/browser/copying_file_stream.h"
#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h"
#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h"
#include "ui/base/resource/resource_bundle.h"

namespace subresource_filter {

UnindexedRulesetStreamGenerator::UnindexedRulesetStreamGenerator(
    const UnindexedRulesetInfo& ruleset_info) {
  bool has_ruleset_file = !ruleset_info.ruleset_path.empty();

  DCHECK(has_ruleset_file || ruleset_info.resource_id);
  DCHECK(!(has_ruleset_file && ruleset_info.resource_id));

  if (has_ruleset_file) {
    GenerateStreamFromFile(ruleset_info.ruleset_path);
  } else {
    GenerateStreamFromResourceId(ruleset_info.resource_id);
  }
}

UnindexedRulesetStreamGenerator::~UnindexedRulesetStreamGenerator() = default;

void UnindexedRulesetStreamGenerator::GenerateStreamFromFile(
    base::FilePath ruleset_path) {
  DCHECK(!ruleset_stream_);
  DCHECK(!copying_stream_);
  DCHECK_EQ(ruleset_size_, -1);

  base::File unindexed_ruleset_file(
      ruleset_path, base::File::FLAG_OPEN | base::File::FLAG_READ);

  if (!unindexed_ruleset_file.IsValid()) {
    return;
  }

  ruleset_size_ = unindexed_ruleset_file.GetLength();

  copying_stream_ = std::make_unique<CopyingFileInputStream>(
      std::move(unindexed_ruleset_file));
  ruleset_stream_ =
      std::make_unique<google::protobuf::io::CopyingInputStreamAdaptor>(
          copying_stream_.get(), 4096 /* buffer_size */);
}

void UnindexedRulesetStreamGenerator::GenerateStreamFromResourceId(
    int resource_id) {
  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
  std::string data_as_string = bundle.LoadDataResourceString(resource_id);
  ruleset_size_ = data_as_string.size();

  string_stream_.str(data_as_string);
  ruleset_stream_ = std::make_unique<google::protobuf::io::IstreamInputStream>(
      &string_stream_);
}

}  // namespace subresource_filter
