blob: c5d1c19af379f2330b01d072abfa4a0b83f9219f [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_TECHNOLOGY_H_
#define DEVICE_NFC_NFC_TAG_TECHNOLOGY_H_
#include "base/callback.h"
#include "device/nfc/nfc_ndef_record.h"
namespace device {
class NfcTag;
// NfcTagTechnology represents an NFC technology that allows a certain type of
// I/O operation on an NFC tag. NFC tags can support a wide array of protocols.
// The NfcTagTechnology hierarchy allows both raw and high-level I/O operations
// on NFC tags.
class NfcTagTechnology {
public:
// The various I/O technologies that an NFC tag can support.
enum TechnologyType {
kTechnologyTypeNfcA = 1 << 0,
kTechnologyTypeNfcB = 1 << 1,
kTechnologyTypeNfcF = 1 << 2,
kTechnologyTypeNfcV = 1 << 3,
kTechnologyTypeIsoDep = 1 << 4,
kTechnologyTypeNdef = 1 << 5
};
typedef uint32 TechnologyTypeMask;
virtual ~NfcTagTechnology();
// Returns true, if the underlying tag supports the NFC tag technology that
// this instance represents.
virtual bool IsSupportedByTag() const = 0;
// Returns a pointer to the associated NfcTag instance.
NfcTag* tag() const { return tag_; }
protected:
// Constructs a technology instance, where |tag| is the NFC tag that this
// instance will operate on. Clients aren't allowed to instantiate classes
// directly. They should use the static "Create" methods defined in each
// subclass to obtain the platform specific implementation.
explicit NfcTagTechnology(NfcTag* tag);
private:
NfcTagTechnology();
// The underlying NfcTag instance that data exchange operations through this
// instance are performed on.
NfcTag* tag_;
DISALLOW_COPY_AND_ASSIGN(NfcTagTechnology);
};
// NfcNdefTagTechnology allows reading and writing NDEF messages to a tag. This
// is the most commonly used data exchange format in NFC.
class NfcNdefTagTechnology : public NfcTagTechnology {
public:
// The ErrorCallback is used by methods to asynchronously report errors.
typedef base::Closure ErrorCallback;
virtual ~NfcNdefTagTechnology();
// NfcTagTechnology override.
virtual bool IsSupportedByTag() const OVERRIDE;
// Returns all NDEF records that were received from the tag in the form of an
// NDEF message. If the returned NDEF message contains no records, this only
// means that no records have yet been received from the tag. Users should
// use this method in conjunction with the NfcTag::Observer::RecordsReceived
// method to be notified when the records are ready.
virtual NfcNdefMessage GetNdefMessage() const = 0;
// Writes the given NDEF message to the underlying tag, overwriting any
// existing NDEF message on it. On success, |callback| will be invoked. On
// failure, |error_callback| will be invoked. This method can fail, if the
// underlying tag does not support NDEF as a technology.
virtual void WriteNdefMessage(const NfcNdefMessage& message,
const base::Closure& callback,
const ErrorCallback& error_callback) = 0;
// Static factory method for constructing an instance. The ownership of the
// returned instance belongs to the caller. Returns NULL, if NFC is not
// supported on the current platform.
static NfcNdefTagTechnology* Create(NfcTag* tag);
private:
// Constructs a technology instance, where |tag| is the NFC tag that this
// instance will operate on.
explicit NfcNdefTagTechnology(NfcTag* tag);
DISALLOW_COPY_AND_ASSIGN(NfcNdefTagTechnology);
};
} // namespace device
#endif // DEVICE_NFC_NFC_TAG_TECHNOLOGY_H_