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

// This file was automatically generated with:
// ../../ui/gfx/x/gen_xproto.py \
//    ../../third_party/xcbproto/src \
//    gen/ui/gfx/x \
//    bigreq \
//    composite \
//    damage \
//    dpms \
//    dri2 \
//    dri3 \
//    ge \
//    glx \
//    present \
//    randr \
//    record \
//    render \
//    res \
//    screensaver \
//    shape \
//    shm \
//    sync \
//    xc_misc \
//    xevie \
//    xf86dri \
//    xf86vidmode \
//    xfixes \
//    xinerama \
//    xinput \
//    xkb \
//    xprint \
//    xproto \
//    xselinux \
//    xtest \
//    xv \
//    xvmc

#ifndef UI_GFX_X_GENERATED_PROTOS_XPRINT_H_
#define UI_GFX_X_GENERATED_PROTOS_XPRINT_H_

#include <array>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <vector>

#include "base/component_export.h"
#include "base/files/scoped_file.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/x/error.h"
#include "ui/gfx/x/ref_counted_fd.h"
#include "xproto.h"

namespace x11 {

class Connection;

template <typename Reply>
struct Response;

template <typename Reply>
class Future;

class COMPONENT_EXPORT(X11) XPrint {
 public:
  static constexpr unsigned major_version = 1;
  static constexpr unsigned minor_version = 0;

  XPrint(Connection* connection, const x11::QueryExtensionReply& info);

  uint8_t present() const { return info_.present; }
  uint8_t major_opcode() const { return info_.major_opcode; }
  uint8_t first_event() const { return info_.first_event; }
  uint8_t first_error() const { return info_.first_error; }

  Connection* connection() const { return connection_; }

  enum class String8 : char {};

  enum class PContext : uint32_t {};

  enum class GetDoc : int {
    Finished = 0,
    SecondConsumer = 1,
  };

  enum class EvMask : int {
    NoEventMask = 0,
    PrintMask = 1 << 0,
    AttributeMask = 1 << 1,
  };

  enum class Detail : int {
    StartJobNotify = 1,
    EndJobNotify = 2,
    StartDocNotify = 3,
    EndDocNotify = 4,
    StartPageNotify = 5,
    EndPageNotify = 6,
  };

  enum class Attr : int {
    JobAttr = 1,
    DocAttr = 2,
    PageAttr = 3,
    PrinterAttr = 4,
    ServerAttr = 5,
    MediumAttr = 6,
    SpoolerAttr = 7,
  };

  struct Printer {
    std::vector<String8> name{};
    std::vector<String8> description{};
  };

  struct NotifyEvent {
    static constexpr int type_id = 50;
    static constexpr uint8_t opcode = 0;
    bool send_event{};
    uint8_t detail{};
    uint16_t sequence{};
    PContext context{};
    uint8_t cancel{};

    x11::Window* GetWindow() { return nullptr; }
  };

  struct AttributNotifyEvent {
    static constexpr int type_id = 51;
    static constexpr uint8_t opcode = 1;
    bool send_event{};
    uint8_t detail{};
    uint16_t sequence{};
    PContext context{};

    x11::Window* GetWindow() { return nullptr; }
  };

  struct BadContextError : public x11::Error {
    uint16_t sequence{};

    std::string ToString() const override;
  };

  struct BadSequenceError : public x11::Error {
    uint16_t sequence{};

    std::string ToString() const override;
  };

  struct PrintQueryVersionRequest {};

  struct PrintQueryVersionReply {
    uint16_t sequence{};
    uint16_t major_version{};
    uint16_t minor_version{};
  };

  using PrintQueryVersionResponse = Response<PrintQueryVersionReply>;

  Future<PrintQueryVersionReply> PrintQueryVersion(
      const PrintQueryVersionRequest& request);

  Future<PrintQueryVersionReply> PrintQueryVersion();

  struct PrintGetPrinterListRequest {
    std::vector<String8> printer_name{};
    std::vector<String8> locale{};
  };

  struct PrintGetPrinterListReply {
    uint16_t sequence{};
    std::vector<Printer> printers{};
  };

  using PrintGetPrinterListResponse = Response<PrintGetPrinterListReply>;

  Future<PrintGetPrinterListReply> PrintGetPrinterList(
      const PrintGetPrinterListRequest& request);

  Future<PrintGetPrinterListReply> PrintGetPrinterList(
      const std::vector<String8>& printer_name = {},
      const std::vector<String8>& locale = {});

  struct PrintRehashPrinterListRequest {};

  using PrintRehashPrinterListResponse = Response<void>;

  Future<void> PrintRehashPrinterList(
      const PrintRehashPrinterListRequest& request);

  Future<void> PrintRehashPrinterList();

  struct CreateContextRequest {
    uint32_t context_id{};
    std::vector<String8> printerName{};
    std::vector<String8> locale{};
  };

  using CreateContextResponse = Response<void>;

  Future<void> CreateContext(const CreateContextRequest& request);

  Future<void> CreateContext(const uint32_t& context_id = {},
                             const std::vector<String8>& printerName = {},
                             const std::vector<String8>& locale = {});

  struct PrintSetContextRequest {
    uint32_t context{};
  };

  using PrintSetContextResponse = Response<void>;

  Future<void> PrintSetContext(const PrintSetContextRequest& request);

  Future<void> PrintSetContext(const uint32_t& context = {});

  struct PrintGetContextRequest {};

  struct PrintGetContextReply {
    uint16_t sequence{};
    uint32_t context{};
  };

  using PrintGetContextResponse = Response<PrintGetContextReply>;

  Future<PrintGetContextReply> PrintGetContext(
      const PrintGetContextRequest& request);

  Future<PrintGetContextReply> PrintGetContext();

  struct PrintDestroyContextRequest {
    uint32_t context{};
  };

  using PrintDestroyContextResponse = Response<void>;

  Future<void> PrintDestroyContext(const PrintDestroyContextRequest& request);

  Future<void> PrintDestroyContext(const uint32_t& context = {});

  struct PrintGetScreenOfContextRequest {};

  struct PrintGetScreenOfContextReply {
    uint16_t sequence{};
    Window root{};
  };

  using PrintGetScreenOfContextResponse =
      Response<PrintGetScreenOfContextReply>;

  Future<PrintGetScreenOfContextReply> PrintGetScreenOfContext(
      const PrintGetScreenOfContextRequest& request);

  Future<PrintGetScreenOfContextReply> PrintGetScreenOfContext();

  struct PrintStartJobRequest {
    uint8_t output_mode{};
  };

  using PrintStartJobResponse = Response<void>;

  Future<void> PrintStartJob(const PrintStartJobRequest& request);

  Future<void> PrintStartJob(const uint8_t& output_mode = {});

  struct PrintEndJobRequest {
    uint8_t cancel{};
  };

  using PrintEndJobResponse = Response<void>;

  Future<void> PrintEndJob(const PrintEndJobRequest& request);

  Future<void> PrintEndJob(const uint8_t& cancel = {});

  struct PrintStartDocRequest {
    uint8_t driver_mode{};
  };

  using PrintStartDocResponse = Response<void>;

  Future<void> PrintStartDoc(const PrintStartDocRequest& request);

  Future<void> PrintStartDoc(const uint8_t& driver_mode = {});

  struct PrintEndDocRequest {
    uint8_t cancel{};
  };

  using PrintEndDocResponse = Response<void>;

  Future<void> PrintEndDoc(const PrintEndDocRequest& request);

  Future<void> PrintEndDoc(const uint8_t& cancel = {});

  struct PrintPutDocumentDataRequest {
    Drawable drawable{};
    std::vector<uint8_t> data{};
    std::vector<String8> doc_format{};
    std::vector<String8> options{};
  };

  using PrintPutDocumentDataResponse = Response<void>;

  Future<void> PrintPutDocumentData(const PrintPutDocumentDataRequest& request);

  Future<void> PrintPutDocumentData(const Drawable& drawable = {},
                                    const std::vector<uint8_t>& data = {},
                                    const std::vector<String8>& doc_format = {},
                                    const std::vector<String8>& options = {});

  struct PrintGetDocumentDataRequest {
    PContext context{};
    uint32_t max_bytes{};
  };

  struct PrintGetDocumentDataReply {
    uint16_t sequence{};
    uint32_t status_code{};
    uint32_t finished_flag{};
    std::vector<uint8_t> data{};
  };

  using PrintGetDocumentDataResponse = Response<PrintGetDocumentDataReply>;

  Future<PrintGetDocumentDataReply> PrintGetDocumentData(
      const PrintGetDocumentDataRequest& request);

  Future<PrintGetDocumentDataReply> PrintGetDocumentData(
      const PContext& context = {},
      const uint32_t& max_bytes = {});

  struct PrintStartPageRequest {
    Window window{};
  };

  using PrintStartPageResponse = Response<void>;

  Future<void> PrintStartPage(const PrintStartPageRequest& request);

  Future<void> PrintStartPage(const Window& window = {});

  struct PrintEndPageRequest {
    uint8_t cancel{};
  };

  using PrintEndPageResponse = Response<void>;

  Future<void> PrintEndPage(const PrintEndPageRequest& request);

  Future<void> PrintEndPage(const uint8_t& cancel = {});

  struct PrintSelectInputRequest {
    PContext context{};
    uint32_t event_mask{};
  };

  using PrintSelectInputResponse = Response<void>;

  Future<void> PrintSelectInput(const PrintSelectInputRequest& request);

  Future<void> PrintSelectInput(const PContext& context = {},
                                const uint32_t& event_mask = {});

  struct PrintInputSelectedRequest {
    PContext context{};
  };

  struct PrintInputSelectedReply {
    uint16_t sequence{};
    uint32_t event_mask{};
    uint32_t all_events_mask{};
  };

  using PrintInputSelectedResponse = Response<PrintInputSelectedReply>;

  Future<PrintInputSelectedReply> PrintInputSelected(
      const PrintInputSelectedRequest& request);

  Future<PrintInputSelectedReply> PrintInputSelected(
      const PContext& context = {});

  struct PrintGetAttributesRequest {
    PContext context{};
    uint8_t pool{};
  };

  struct PrintGetAttributesReply {
    uint16_t sequence{};
    std::vector<String8> attributes{};
  };

  using PrintGetAttributesResponse = Response<PrintGetAttributesReply>;

  Future<PrintGetAttributesReply> PrintGetAttributes(
      const PrintGetAttributesRequest& request);

  Future<PrintGetAttributesReply> PrintGetAttributes(
      const PContext& context = {},
      const uint8_t& pool = {});

  struct PrintGetOneAttributesRequest {
    PContext context{};
    uint8_t pool{};
    std::vector<String8> name{};
  };

  struct PrintGetOneAttributesReply {
    uint16_t sequence{};
    std::vector<String8> value{};
  };

  using PrintGetOneAttributesResponse = Response<PrintGetOneAttributesReply>;

  Future<PrintGetOneAttributesReply> PrintGetOneAttributes(
      const PrintGetOneAttributesRequest& request);

  Future<PrintGetOneAttributesReply> PrintGetOneAttributes(
      const PContext& context = {},
      const uint8_t& pool = {},
      const std::vector<String8>& name = {});

  struct PrintSetAttributesRequest {
    PContext context{};
    uint32_t stringLen{};
    uint8_t pool{};
    uint8_t rule{};
    std::vector<String8> attributes{};
  };

  using PrintSetAttributesResponse = Response<void>;

  Future<void> PrintSetAttributes(const PrintSetAttributesRequest& request);

  Future<void> PrintSetAttributes(const PContext& context = {},
                                  const uint32_t& stringLen = {},
                                  const uint8_t& pool = {},
                                  const uint8_t& rule = {},
                                  const std::vector<String8>& attributes = {});

  struct PrintGetPageDimensionsRequest {
    PContext context{};
  };

  struct PrintGetPageDimensionsReply {
    uint16_t sequence{};
    uint16_t width{};
    uint16_t height{};
    uint16_t offset_x{};
    uint16_t offset_y{};
    uint16_t reproducible_width{};
    uint16_t reproducible_height{};
  };

  using PrintGetPageDimensionsResponse = Response<PrintGetPageDimensionsReply>;

  Future<PrintGetPageDimensionsReply> PrintGetPageDimensions(
      const PrintGetPageDimensionsRequest& request);

  Future<PrintGetPageDimensionsReply> PrintGetPageDimensions(
      const PContext& context = {});

  struct PrintQueryScreensRequest {};

  struct PrintQueryScreensReply {
    uint16_t sequence{};
    std::vector<Window> roots{};
  };

  using PrintQueryScreensResponse = Response<PrintQueryScreensReply>;

  Future<PrintQueryScreensReply> PrintQueryScreens(
      const PrintQueryScreensRequest& request);

  Future<PrintQueryScreensReply> PrintQueryScreens();

  struct PrintSetImageResolutionRequest {
    PContext context{};
    uint16_t image_resolution{};
  };

  struct PrintSetImageResolutionReply {
    uint8_t status{};
    uint16_t sequence{};
    uint16_t previous_resolutions{};
  };

  using PrintSetImageResolutionResponse =
      Response<PrintSetImageResolutionReply>;

  Future<PrintSetImageResolutionReply> PrintSetImageResolution(
      const PrintSetImageResolutionRequest& request);

  Future<PrintSetImageResolutionReply> PrintSetImageResolution(
      const PContext& context = {},
      const uint16_t& image_resolution = {});

  struct PrintGetImageResolutionRequest {
    PContext context{};
  };

  struct PrintGetImageResolutionReply {
    uint16_t sequence{};
    uint16_t image_resolution{};
  };

  using PrintGetImageResolutionResponse =
      Response<PrintGetImageResolutionReply>;

  Future<PrintGetImageResolutionReply> PrintGetImageResolution(
      const PrintGetImageResolutionRequest& request);

  Future<PrintGetImageResolutionReply> PrintGetImageResolution(
      const PContext& context = {});

 private:
  Connection* const connection_;
  x11::QueryExtensionReply info_{};
};

}  // namespace x11

inline constexpr x11::XPrint::GetDoc operator|(x11::XPrint::GetDoc l,
                                               x11::XPrint::GetDoc r) {
  using T = std::underlying_type_t<x11::XPrint::GetDoc>;
  return static_cast<x11::XPrint::GetDoc>(static_cast<T>(l) |
                                          static_cast<T>(r));
}

inline constexpr x11::XPrint::GetDoc operator&(x11::XPrint::GetDoc l,
                                               x11::XPrint::GetDoc r) {
  using T = std::underlying_type_t<x11::XPrint::GetDoc>;
  return static_cast<x11::XPrint::GetDoc>(static_cast<T>(l) &
                                          static_cast<T>(r));
}

inline constexpr x11::XPrint::EvMask operator|(x11::XPrint::EvMask l,
                                               x11::XPrint::EvMask r) {
  using T = std::underlying_type_t<x11::XPrint::EvMask>;
  return static_cast<x11::XPrint::EvMask>(static_cast<T>(l) |
                                          static_cast<T>(r));
}

inline constexpr x11::XPrint::EvMask operator&(x11::XPrint::EvMask l,
                                               x11::XPrint::EvMask r) {
  using T = std::underlying_type_t<x11::XPrint::EvMask>;
  return static_cast<x11::XPrint::EvMask>(static_cast<T>(l) &
                                          static_cast<T>(r));
}

inline constexpr x11::XPrint::Detail operator|(x11::XPrint::Detail l,
                                               x11::XPrint::Detail r) {
  using T = std::underlying_type_t<x11::XPrint::Detail>;
  return static_cast<x11::XPrint::Detail>(static_cast<T>(l) |
                                          static_cast<T>(r));
}

inline constexpr x11::XPrint::Detail operator&(x11::XPrint::Detail l,
                                               x11::XPrint::Detail r) {
  using T = std::underlying_type_t<x11::XPrint::Detail>;
  return static_cast<x11::XPrint::Detail>(static_cast<T>(l) &
                                          static_cast<T>(r));
}

inline constexpr x11::XPrint::Attr operator|(x11::XPrint::Attr l,
                                             x11::XPrint::Attr r) {
  using T = std::underlying_type_t<x11::XPrint::Attr>;
  return static_cast<x11::XPrint::Attr>(static_cast<T>(l) | static_cast<T>(r));
}

inline constexpr x11::XPrint::Attr operator&(x11::XPrint::Attr l,
                                             x11::XPrint::Attr r) {
  using T = std::underlying_type_t<x11::XPrint::Attr>;
  return static_cast<x11::XPrint::Attr>(static_cast<T>(l) & static_cast<T>(r));
}

#endif  // UI_GFX_X_GENERATED_PROTOS_XPRINT_H_
