• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef DEVICE_NFC_NFC_TAG_TECHNOLOGY_H_
6 #define DEVICE_NFC_NFC_TAG_TECHNOLOGY_H_
7 
8 #include "base/callback.h"
9 #include "device/nfc/nfc_ndef_record.h"
10 
11 namespace device {
12 
13 class NfcTag;
14 
15 // NfcTagTechnology represents an NFC technology that allows a certain type of
16 // I/O operation on an NFC tag. NFC tags can support a wide array of protocols.
17 // The NfcTagTechnology hierarchy allows both raw and high-level I/O operations
18 // on NFC tags.
19 class NfcTagTechnology {
20  public:
21   // The various I/O technologies that an NFC tag can support.
22   enum TechnologyType {
23     kTechnologyTypeNfcA = 1 << 0,
24     kTechnologyTypeNfcB = 1 << 1,
25     kTechnologyTypeNfcF = 1 << 2,
26     kTechnologyTypeNfcV = 1 << 3,
27     kTechnologyTypeIsoDep = 1 << 4,
28     kTechnologyTypeNdef = 1 << 5
29   };
30   typedef uint32 TechnologyTypeMask;
31 
32   virtual ~NfcTagTechnology();
33 
34   // Returns true, if the underlying tag supports the NFC tag technology that
35   // this instance represents.
36   virtual bool IsSupportedByTag() const = 0;
37 
38   // Returns a pointer to the associated NfcTag instance.
tag()39   NfcTag* tag() const { return tag_; }
40 
41  protected:
42   // Constructs a technology instance, where |tag| is the NFC tag that this
43   // instance will operate on. Clients aren't allowed to instantiate classes
44   // directly. They should use the static "Create" methods defined in each
45   // subclass to obtain the platform specific implementation.
46   explicit NfcTagTechnology(NfcTag* tag);
47 
48  private:
49   NfcTagTechnology();
50 
51   // The underlying NfcTag instance that data exchange operations through this
52   // instance are performed on.
53   NfcTag* tag_;
54 
55   DISALLOW_COPY_AND_ASSIGN(NfcTagTechnology);
56 };
57 
58 // NfcNdefTagTechnology allows reading and writing NDEF messages to a tag. This
59 // is the most commonly used data exchange format in NFC.
60 class NfcNdefTagTechnology : public NfcTagTechnology {
61  public:
62   // The ErrorCallback is used by methods to asynchronously report errors.
63   typedef base::Closure ErrorCallback;
64 
65   virtual ~NfcNdefTagTechnology();
66 
67   // NfcTagTechnology override.
68   virtual bool IsSupportedByTag() const OVERRIDE;
69 
70   // Returns all NDEF records that were received from the tag in the form of an
71   // NDEF message. If the returned NDEF message contains no records, this only
72   // means that no records have yet been received from the tag. Users should
73   // use this method in conjunction with the NfcTag::Observer::RecordsReceived
74   // method to be notified when the records are ready.
75   virtual NfcNdefMessage GetNdefMessage() const = 0;
76 
77   // Writes the given NDEF message to the underlying tag, overwriting any
78   // existing NDEF message on it. On success, |callback| will be invoked. On
79   // failure, |error_callback| will be invoked. This method can fail, if the
80   // underlying tag does not support NDEF as a technology.
81   virtual void WriteNdefMessage(const NfcNdefMessage& message,
82                                 const base::Closure& callback,
83                                 const ErrorCallback& error_callback) = 0;
84 
85   // Static factory method for constructing an instance. The ownership of the
86   // returned instance belongs to the caller. Returns NULL, if NFC is not
87   // supported on the current platform.
88   static NfcNdefTagTechnology* Create(NfcTag* tag);
89 
90  private:
91   // Constructs a technology instance, where |tag| is the NFC tag that this
92   // instance will operate on.
93   explicit NfcNdefTagTechnology(NfcTag* tag);
94 
95   DISALLOW_COPY_AND_ASSIGN(NfcNdefTagTechnology);
96 };
97 
98 }  // namespace device
99 
100 #endif  // DEVICE_NFC_NFC_TAG_TECHNOLOGY_H_
101