// 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_LOADER_EMBEDDED_FETCHER_H_
#define COBALT_LOADER_EMBEDDED_FETCHER_H_

#include <limits>
#include <string>

#include "base/memory/weak_ptr.h"
#include "cobalt/csp/content_security_policy.h"
#include "cobalt/loader/fetcher.h"

namespace cobalt {
namespace loader {

const char kEmbeddedScheme[] = "h5vcc-embedded";

// EmbeddedFetcher is for fetching data embedded in the binary, probably
// generated using generate_data_header.py. Data will be in the form of a
// map entry, so the first constructor parameter is the map key. The map will
// be defined within a header file that must be included in the source file.
class EmbeddedFetcher : public Fetcher {
 public:
  struct Options {
   public:
    Options()
        : start_offset(0), bytes_to_read(std::numeric_limits<int64>::max()) {}

    int64 start_offset;
    int64 bytes_to_read;
  };

  EmbeddedFetcher(const GURL& url,
                  const csp::SecurityCallback& security_callback,
                  Handler* handler, const Options& options);

  ~EmbeddedFetcher() OVERRIDE;

 private:
  void Fetch(const Options& options);
  void GetEmbeddedData(const std::string& key, int64 start_offset,
                       int64 bytes_to_read);
  bool IsAllowedByCsp();

  GURL url_;
  csp::SecurityCallback security_callback_;
  base::WeakPtrFactory<EmbeddedFetcher> weak_ptr_factory_;
};

}  // namespace loader
}  // namespace cobalt

#endif  // COBALT_LOADER_EMBEDDED_FETCHER_H_
