// Copyright 2016 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 PDF_URL_LOADER_WRAPPER_IMPL_H_
#define PDF_URL_LOADER_WRAPPER_IMPL_H_

#include <memory>
#include <string>

#include "base/macros.h"
#include "base/timer/timer.h"
#include "pdf/url_loader_wrapper.h"
#include "ppapi/cpp/url_loader.h"
#include "ppapi/utility/completion_callback_factory.h"
#include "ui/gfx/range/range.h"

namespace pp {
class Instance;
}

namespace chrome_pdf {

class URLLoaderWrapperImpl : public URLLoaderWrapper {
 public:
  URLLoaderWrapperImpl(pp::Instance* plugin_instance,
                       const pp::URLLoader& url_loader);
  ~URLLoaderWrapperImpl() override;

  // URLLoaderWrapper overrides:
  int GetContentLength() const override;
  bool IsAcceptRangesBytes() const override;
  bool IsContentEncoded() const override;
  std::string GetContentType() const override;
  std::string GetContentDisposition() const override;
  int GetStatusCode() const override;
  bool IsMultipart() const override;
  bool GetByteRangeStart(int* start) const override;
  bool GetDownloadProgress(int64_t* bytes_received,
                           int64_t* total_bytes_to_be_received) const override;
  void Close() override;
  void OpenRange(const std::string& url,
                 const std::string& referrer_url,
                 uint32_t position,
                 uint32_t size,
                 const pp::CompletionCallback& cc) override;
  void ReadResponseBody(char* buffer,
                        int buffer_size,
                        const pp::CompletionCallback& cc) override;

  void SetResponseHeaders(const std::string& response_headers);

 private:
  void SetHeadersFromLoader();
  void ParseHeaders();
  void DidOpen(int32_t result);
  void DidRead(int32_t result);

  void ReadResponseBodyImpl();

  pp::Instance* const plugin_instance_;
  pp::URLLoader url_loader_;
  std::string response_headers_;

  int content_length_ = -1;
  bool accept_ranges_bytes_ = false;
  bool content_encoded_ = false;
  std::string content_type_;
  std::string content_disposition_;
  std::string multipart_boundary_;
  gfx::Range byte_range_ = gfx::Range::InvalidRange();
  bool is_multipart_ = false;
  char* buffer_ = nullptr;
  uint32_t buffer_size_ = 0;
  bool multi_part_processed_ = false;

  pp::CompletionCallback did_open_callback_;
  pp::CompletionCallback did_read_callback_;
  pp::CompletionCallbackFactory<URLLoaderWrapperImpl> callback_factory_;

  base::OneShotTimer read_starter_;

  DISALLOW_COPY_AND_ASSIGN(URLLoaderWrapperImpl);
};

}  // namespace chrome_pdf

#endif  // PDF_URL_LOADER_WRAPPER_IMPL_H_
