// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.feedback;

using fuchsia.math;
using fuchsia.mem;
using zx;

/// Provides data useful to attach in feedback reports (crash or user feedback).
[Discoverable]
protocol DataProvider {
    /// Returns all the feedback data except the screenshot, which is provided
    /// separately.
    GetData() -> (Data data) error zx.status;

    /// Returns an image of the current view encoded in the provided |encoding|.
    ///
    /// |screenshot| may be null if the encoding is not supported, the device
    /// does not have a display, or there is not enough memory to allocate the
    /// screenshot image.
    ///
    /// The screenshot is provided separately from the rest of the data as
    /// callers might want to block on it before changing the view.
    GetScreenshot(ImageEncoding encoding) -> (Screenshot? screenshot);
};


/// Data to attach to feedback reports.
///
/// Clients typically upload the data straight to servers without expecting some
/// particular fields. So the data comes in the form of arbitrary key-value pairs
/// that clients can directly forward to the servers.
table Data {
  /// A vector of key-value string pairs. Keys are guaranteed to be unique.
  1: vector<Annotation> annotations;

  /// A vector of key-value string-to-VMO pairs. Keys are guaranteed to be unique.
  2: vector<Attachment> attachments;
};

/// An annotation and its plain ASCII string key.
/// Annotations are short strings, e.g., the board name or the build version.
struct Annotation {
  string:128 key;
  string:1024 value;
};

/// An attachment and its plain ASCII string key.
/// Attachments are larger objects, e.g., log files. They may be binary or text
/// data.
struct Attachment {
  string:128 key;
  fuchsia.mem.Buffer value;
};

/// The encoding used for the image.
///
/// Today, only PNG is supported, but in the future the screenshot could be
/// returned in other encodings if need arises.
enum ImageEncoding {
  PNG = 0;
};

/// An encoded image of the screen.
struct Screenshot {
  fuchsia.mem.Buffer image;

  // While all encoded images contain their dimensions in their headers, some
  // clients still expect to receive the width and height separately, so we
  // also provide it separately so clients don't need to decode |image|.
  fuchsia.math.Size dimensions_in_px;
};

