blob: 039fc78133df437eb462aa25fc3b44fa68c73849 [file] [log] [blame]
// 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_