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

// TODO(rockot): This should probably be moved to nfc.mojom.
module device.nfc.mojom;

enum NFCErrorType {
  SECURITY,
  NOT_SUPPORTED,
  DEVICE_DISABLED,
  NOT_FOUND,
  INVALID_MESSAGE,
  OPERATION_CANCELLED,
  TIMER_EXPIRED,
  CANNOT_CANCEL,
  IO_ERROR
};

enum NFCRecordType {
  EMPTY,
  TEXT,
  URL,
  JSON,
  OPAQUE_RECORD
};

enum NFCPushTarget {
  // The target of a push operation must be the NFC tag.
  TAG,
  // The target of a push operation must be the NFC peer (device to device).
  PEER,
  // The target of a push operation must be either NFC tag or peer.
  ANY
};

enum NFCWatchMode {
  // Restricts scope of the watch operation. Only Web NFC messages must be
  // used by matching algorithm.
  WEBNFC_ONLY,
  // Allows performing watch operation for all NFC messages. For example, NFC
  // tags with valid NDEF messages.
  ANY
};

struct NFCError {
  NFCErrorType error_type;
};

struct NFCRecord {
  // The type of NFCRecord.
  NFCRecordType record_type;

  // Represents the IANA media type of the NFCRecord data field.
  string? media_type;

  // Payload of the NFCRecord.
  array<uint8> data;
};

struct NFCMessage {
  // The body of the NFCMessage is a collection of NFCRecord objects.
  array<NFCRecord> data;

  // The |url| field is an ASCII serialized origin, optionally followed by a URL
  // path. It represents Web NFC id, that can be used for matching Web NFC
  // content with the filter specified by |url| field in NFCWatchOptions.
  string? url;

  // Maximum size of NFC message that can be sent over IPC is 32KB.
  const uint32 kMaxSize = 32768;
};

struct NFCPushOptions {
  // The target of the push operation.
  NFCPushTarget target;

  // The timeout for the push operation, in milliseconds.
  double timeout;

  // If the property is true, the push operation will suspend active watchers
  // until its completion.
  bool ignore_read;
};

struct NFCRecordTypeFilter {
  NFCRecordType record_type;
};

struct NFCWatchOptions {
  // Defines filtering constraint for NFC messages with specified |url|.
  string? url;

  // Defines filtering constraint for NFC records with specified record type.
  NFCRecordTypeFilter? record_filter;

  // Defines media type filtering constraint.
  string? media_type;

  // Defines mode of watch operation.
  NFCWatchMode mode;
};

interface NFC {
  // NFCClient interface is used to notify |client| when NFCMessage matches one
  // or more pending watch operations.
  SetClient(NFCClient client);

  // Pushes data to NFC device.
  // NFCPushOptions specify timeout and type of device where data should be
  // pushed. If timeout is defined and data is not pushed before timeout is
  // expired, callback with corresponding error is called.
  Push(NFCMessage message, NFCPushOptions? options) => (NFCError? error);

  // Cancels pending push request.
  CancelPush(NFCPushTarget target) => (NFCError? error);

  // Starts watching for nearby NFC devices with data that matches
  // NFCWatchOptions filtering criteria. On success, watch id is returned.
  Watch(NFCWatchOptions options) => (uint32 id, NFCError? error);

  // Cancels watch operation with provided id.
  CancelWatch (uint32 id) => (NFCError? error);

  // Cancels all watch operations.
  CancelAllWatches () => (NFCError? error);

  // Suspends all pending NFC operations. Could be used when web page
  // visibility or focus is lost.
  SuspendNFCOperations();

  // Resumes all suspended NFC operations.
  ResumeNFCOperations();
};

interface NFCClient {
  OnWatch(array<uint32> watch_ids, NFCMessage message);
};
