// Copyright 2017 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 "content/browser/download/mhtml_extra_parts_impl.h"

namespace {
// Only the address of this variable is used.  It is used as a key to UserData.
const int kMHTMLExtraPartsKey = 0;
}

namespace content {

MHTMLExtraDataPart::MHTMLExtraDataPart() = default;
MHTMLExtraDataPart::MHTMLExtraDataPart(const MHTMLExtraDataPart& other) =
    default;
MHTMLExtraDataPart::MHTMLExtraDataPart(MHTMLExtraDataPart&& other) = default;
MHTMLExtraDataPart& MHTMLExtraDataPart::operator=(
    const MHTMLExtraDataPart& other) = default;
MHTMLExtraDataPart& MHTMLExtraDataPart::operator=(MHTMLExtraDataPart&& other) =
    default;
MHTMLExtraDataPart::~MHTMLExtraDataPart() = default;

MHTMLExtraPartsImpl::MHTMLExtraPartsImpl() = default;

MHTMLExtraPartsImpl::~MHTMLExtraPartsImpl() = default;

MHTMLExtraParts* MHTMLExtraParts::FromWebContents(WebContents* contents) {
  // Get the MHTMLExtraPartsImpl from the web contents.
  MHTMLExtraPartsImpl* extra_data_impl = static_cast<MHTMLExtraPartsImpl*>(
      contents->GetUserData(&kMHTMLExtraPartsKey));

  // If we did not have one on the web contents already, make one and put it on
  // the web contents.
  if (extra_data_impl == nullptr) {
    extra_data_impl = new MHTMLExtraPartsImpl();
    contents->SetUserData(&kMHTMLExtraPartsKey,
                          std::unique_ptr<MHTMLExtraParts>(
                              static_cast<MHTMLExtraParts*>(extra_data_impl)));
  }
  return static_cast<MHTMLExtraParts*>(extra_data_impl);
}

int64_t MHTMLExtraPartsImpl::size() {
  return parts_.size();
}

void MHTMLExtraPartsImpl::AddExtraMHTMLPart(const std::string& content_type,
                                            const std::string& content_location,
                                            const std::string& extra_headers,
                                            const std::string& body) {
  MHTMLExtraDataPart part;
  part.content_type = content_type;
  part.content_location = content_location;
  part.extra_headers = extra_headers;
  part.body = body;

  // Add this part to the list of parts to be saved out when the file is
  // written.
  parts_.emplace_back(std::move(part));
}

}  // namespace content
