root/device/nfc/nfc_tag.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Copyright 2013 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 DEVICE_NFC_NFC_TAG_H_
#define DEVICE_NFC_NFC_TAG_H_

#include "device/nfc/nfc_tag_technology.h"

namespace device {

// NfcTag represents a remote NFC tag. An NFC tag is a passive NFC device,
// powered by the NFC field of the local adapter while it is in range. Tags
// can come in many forms, such as stickers, key fobs, or even embedded in a
// more sofisticated device.
//
// Tags can have a wide range of capabilities. Simple tags just offer
// read/write semantics, and contain some one time programmable areas to make
// read-only. More complex tags offer math operations and per-sector access
// control and authentication. The most sophisticated tags contain operating
// environments allowing complex interactions with the code executing on the
// tag.
//
// The NfcTag class facilitates possible interactions with a tag. The most
// common usage of a tag is to exchange NDEF messages, but different kinds of
// I/O can be performed using the NfcTagTechnology classes.
class NfcTag {
 public:
  // NFC tag types.
  enum TagType {
    kTagType1,
    kTagType2,
    kTagType3,
    kTagType4,
    kTagTypeUnknown,
  };

  // NFC protocols that a tag can support. A tag will usually support only one
  // of these.
  enum Protocol {
    kProtocolFelica,
    kProtocolIsoDep,
    kProtocolJewel,
    kProtocolMifare,
    kProtocolNfcDep,
    kProtocolUnknown
  };

  // Interface for observing changes from NFC tags.
  class Observer {
   public:
    virtual ~Observer() {}

    // Called when the tag type has been determined.
    virtual void TagTypeChanged(NfcTag* tag, TagType type) {}

    // Called when the write access to the tag has been determined or changed.
    virtual void TagWritePermissionChanged(NfcTag* tag, bool read_only) {}

    // Called when the underlying NFC protocol has been determined.
    virtual void TagSupportedProtocolChanged(NfcTag* tag, Protocol protocol) {}

    // Called when all initial values of the tag properties have been received
    // from the remote tag and |tag| is ready to use.
    virtual void TagReady(NfcTag* tag) {}
  };

  virtual ~NfcTag();

  // Adds and removes observers for events on this NFC tag. If monitoring
  // multiple tags, check the |tag| parameter of observer methods to determine
  // which tag is issuing the event.
  virtual void AddObserver(Observer* observer) = 0;
  virtual void RemoveObserver(Observer* observer) = 0;

  // Returns the unique identifier assigned to this tag.
  virtual std::string GetIdentifier() const = 0;

  // Returns the current tag's NFC forum specified "type".
  virtual TagType GetType() const = 0;

  // Returns true, if this tag is read-only and cannot be written to.
  virtual bool IsReadOnly() const = 0;

  // Returns the current tag's supported NFC protocol.
  virtual Protocol GetSupportedProtocol() const = 0;

  // Returns a bitmask of the tag I/O technologies supported by this tag.
  virtual NfcTagTechnology::TechnologyTypeMask
      GetSupportedTechnologies() const = 0;

  // Returns true, if all tag properties have been received from the remote tag
  // and this object is ready to use.
  virtual bool IsReady() const = 0;

  // Returns a pointer to the NDEF technology object that allows I/O on NDEF
  // records. If NDEF is not supported by this tag, operations that are
  // performed on the returned instance may not succeed. Users can determine
  // support by calling NfcTagTechnology::IsSupportedByTag. The returned
  // instance is owned by this tag.
  virtual NfcNdefTagTechnology* GetNdefTagTechnology() = 0;

 protected:
  NfcTag();

 private:
  DISALLOW_COPY_AND_ASSIGN(NfcTag);
};

}  // namespace device

#endif  // DEVICE_NFC_NFC_TAG_H_

/* [<][>][^][v][top][bottom][index][help] */