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

#ifndef CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_STRUCT_TRAITS_H_
#define CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_STRUCT_TRAITS_H_

#include <string>
#include <vector>

#include "content/common/background_fetch/background_fetch_types.h"
#include "content/common/content_export.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "third_party/blink/public/common/manifest/manifest.h"
#include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h"

namespace mojo {

template <>
struct CONTENT_EXPORT StructTraits<blink::mojom::BackgroundFetchOptionsDataView,
                                   content::BackgroundFetchOptions> {
  static const std::vector<blink::Manifest::ImageResource>& icons(
      const content::BackgroundFetchOptions& options) {
    return options.icons;
  }
  static const std::string& title(
      const content::BackgroundFetchOptions& options) {
    return options.title;
  }
  static uint64_t download_total(
      const content::BackgroundFetchOptions& options) {
    return options.download_total;
  }

  static bool Read(blink::mojom::BackgroundFetchOptionsDataView data,
                   content::BackgroundFetchOptions* options);
};

template <>
struct CONTENT_EXPORT
    StructTraits<blink::mojom::BackgroundFetchRegistrationDataView,
                 content::BackgroundFetchRegistration> {
  static const std::string& developer_id(
      const content::BackgroundFetchRegistration& registration) {
    return registration.developer_id;
  }
  static const std::string& unique_id(
      const content::BackgroundFetchRegistration& registration) {
    return registration.unique_id;
  }
  static uint64_t upload_total(
      const content::BackgroundFetchRegistration& registration) {
    return registration.upload_total;
  }
  static uint64_t uploaded(
      const content::BackgroundFetchRegistration& registration) {
    return registration.uploaded;
  }
  static uint64_t download_total(
      const content::BackgroundFetchRegistration& registration) {
    return registration.download_total;
  }
  static uint64_t downloaded(
      const content::BackgroundFetchRegistration& registration) {
    return registration.downloaded;
  }
  static blink::mojom::BackgroundFetchState state(
      const content::BackgroundFetchRegistration& registration) {
    return registration.state;
  }

  static bool Read(blink::mojom::BackgroundFetchRegistrationDataView data,
                   content::BackgroundFetchRegistration* registration);
};

template <>
struct CONTENT_EXPORT
    StructTraits<blink::mojom::BackgroundFetchSettledFetchDataView,
                 content::BackgroundFetchSettledFetch> {
  static const content::ServiceWorkerFetchRequest& request(
      const content::BackgroundFetchSettledFetch& fetch) {
    return fetch.request;
  }
  static blink::mojom::FetchAPIResponsePtr response(
      const content::BackgroundFetchSettledFetch& fetch) {
    return content::BackgroundFetchSettledFetch::CloneResponse(fetch.response);
  }

  static bool Read(blink::mojom::BackgroundFetchSettledFetchDataView data,
                   content::BackgroundFetchSettledFetch* definition);
};

}  // namespace mojo

#endif  // CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_STRUCT_TRAITS_H_
