2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Runtime.InteropServices;
19 using System.Collections.Generic;
20 using System.Threading.Tasks;
22 namespace Tizen.Network.Nfc
25 /// A class for managing the Tag information.
27 /// <since_tizen> 3 </since_tizen>
28 public class NfcTag : IDisposable
30 private bool disposed = false;
31 private IntPtr _tagHandle = IntPtr.Zero;
34 /// The type of NFC tag.
36 /// <since_tizen> 3 </since_tizen>
37 public NfcTagType Type
42 int ret = Interop.Nfc.Tag.GetType(_tagHandle, out type);
43 if (ret != (int)NfcError.None)
45 Log.Error(Globals.LogTag, "Failed to get tag type, Error - " + (NfcError)ret);
47 return (NfcTagType)type;
52 /// Whether the given NFC tag supports NDEF messages.
54 /// <since_tizen> 3 </since_tizen>
55 public bool IsSupportNdef
60 int ret = Interop.Nfc.Tag.IsSupportNdef(_tagHandle, out isSupport);
61 if (ret != (int)NfcError.None)
63 Log.Error(Globals.LogTag, "Failed to get support state, Error - " + (NfcError)ret);
71 /// The maximum NDEF message size that can be stored in NFC tag.
73 /// <since_tizen> 3 </since_tizen>
74 public uint MaximumNdefSize
79 int ret = Interop.Nfc.Tag.GetMaximumNdefSize(_tagHandle, out maxSize);
80 if (ret != (int)NfcError.None)
82 Log.Error(Globals.LogTag, "Failed to get max ndef size, Error - " + (NfcError)ret);
89 /// The size of NDEF message that stored in the tag.
91 /// <since_tizen> 3 </since_tizen>
97 int ret = Interop.Nfc.Tag.GetNdefSize(_tagHandle, out ndefSize);
98 if (ret != (int)NfcError.None)
100 Log.Error(Globals.LogTag, "Failed to get ndef size, Error - " + (NfcError)ret);
106 internal NfcTag(IntPtr handle)
116 public void Dispose()
119 GC.SuppressFinalize(this);
122 private void Dispose(bool disposing)
129 // Free managed objects.
131 //Free unmanaged objects
136 /// Retrieves all tag information.
138 /// <since_tizen> 3 </since_tizen>
139 /// <returns>List of NfcTagInformation objects.</returns>
140 /// <exception cref="NotSupportedException">Thrown when Nfc is not supported.</exception>
141 /// <exception cref="InvalidOperationException">Thrown when the method failed due to invalid operation.</exception>
142 public IEnumerable<NfcTagInformation> ForeachInformation()
144 List<NfcTagInformation> infoList = new List<NfcTagInformation>();
145 Interop.Nfc.TagInformationCallback callback = (IntPtr key, IntPtr infoValue, int valueSize, IntPtr userData) =>
147 if (key != IntPtr.Zero && infoValue != IntPtr.Zero)
149 NfcTagInformation tagInfo = new NfcTagInformation(Marshal.PtrToStringAnsi(key), new byte[valueSize]);
151 Marshal.Copy(infoValue, tagInfo.InformationValue, 0, valueSize);
153 infoList.Add(tagInfo);
160 int ret = Interop.Nfc.Tag.ForeachInformation(_tagHandle, callback, IntPtr.Zero);
161 if (ret != (int)NfcError.None)
163 Log.Error(Globals.LogTag, "Failed to get all Tag information, Error - " + (NfcError)ret);
164 NfcErrorFactory.ThrowNfcException(ret);
171 /// Transceives the data of the raw format card.
173 /// <since_tizen> 3 </since_tizen>
174 /// <param name="buffer">The binary data for parameter or additional commands.</param>
175 /// <exception cref="NotSupportedException">Thrown when Nfc is not supported.</exception>
176 /// <exception cref="ArgumentException">Thrown when method is failed due to an invalid parameter.</exception>
177 /// <exception cref="InvalidOperationException">Thrown when the method failed due to invalid operation.</exception>
178 public Task<byte[]> TransceiveAsync(byte[] buffer)
180 var task = new TaskCompletionSource<byte[]>();
182 byte[] resultBuffer = null;
183 Interop.Nfc.TagTransceiveCompletedCallback callback = (int result, IntPtr resultData, int dataSize, IntPtr userData) =>
185 if (result == (int)NfcError.None)
187 resultBuffer = new byte[dataSize];
188 Marshal.Copy(resultData, resultBuffer, 0, dataSize);
189 task.SetResult(resultBuffer);
194 int ret = Interop.Nfc.Tag.Transceive(_tagHandle, buffer, buffer.Length, callback, IntPtr.Zero);
195 if (ret != (int)NfcError.None)
197 Log.Error(Globals.LogTag, "Failed to transceive data, Error - " + (NfcError)ret);
198 NfcErrorFactory.ThrowNfcException(ret);
205 /// Reads NDEF formatted data from NFC tag.
207 /// <since_tizen> 3 </since_tizen>
208 /// <exception cref="NotSupportedException">Thrown when Nfc is not supported.</exception>
209 /// <exception cref="InvalidOperationException">Thrown when the method failed due to invalid operation.</exception>
210 public Task<NfcNdefMessage> ReadNdefMessageAsync()
212 var task = new TaskCompletionSource<NfcNdefMessage>();
214 NfcNdefMessage ndefMsg = null;
215 Interop.Nfc.TagReadCompletedCallback callback = (int result, IntPtr ndefMessage, IntPtr userData) =>
217 if (result == (int)NfcError.None)
219 ndefMsg = new NfcNdefMessage(ndefMessage);
220 task.SetResult(ndefMsg);
227 int ret = Interop.Nfc.Tag.ReadNdef(_tagHandle, callback, IntPtr.Zero);
228 if (ret != (int)NfcError.None)
230 Log.Error(Globals.LogTag, "Failed to read ndef message, Error - " + (NfcError)ret);
231 NfcErrorFactory.ThrowNfcException(ret);
238 /// Writes NDEF formatted data.
240 /// <since_tizen> 3 </since_tizen>
241 /// <param name="ndefMessage">The NfcNdefMessage object.</param>
242 /// <exception cref="NotSupportedException">Thrown when Nfc is not supported.</exception>
243 /// <exception cref="ArgumentException">Thrown when method is failed due to an invalid parameter.</exception>
244 /// <exception cref="InvalidOperationException">Thrown when the method failed due to invalid operation.</exception>
245 public Task<NfcError> WriteNdefMessageAsync(NfcNdefMessage ndefMessage)
247 var task = new TaskCompletionSource<NfcError>();
249 Interop.Nfc.VoidCallback callback = (int result, IntPtr userData) =>
251 task.SetResult((NfcError)result);
255 int ret = Interop.Nfc.Tag.WriteNdef(_tagHandle, ndefMessage.GetHandle(), callback, IntPtr.Zero);
256 if (ret != (int)NfcError.None)
258 Log.Error(Globals.LogTag, "Failed to write ndef message, Error - " + (NfcError)ret);
259 NfcErrorFactory.ThrowNfcException(ret);
266 /// Formats the detected tag that can store NDEF message.
268 /// <since_tizen> 3 </since_tizen>
269 /// <param name="keyValue">The key value that may need to format the tag.</param>
270 /// <exception cref="NotSupportedException">Thrown when Nfc is not supported.</exception>
271 /// <exception cref="ArgumentException">Thrown when method is failed due to an invalid parameter.</exception>
272 /// <exception cref="InvalidOperationException">Thrown when the method failed due to invalid operation.</exception>
273 public Task<NfcError> FormatNdefMessageAsync(byte[] keyValue)
275 var task = new TaskCompletionSource<NfcError>();
277 Interop.Nfc.VoidCallback callback = (int result, IntPtr userData) =>
279 task.SetResult((NfcError)result);
283 int ret = Interop.Nfc.Tag.FormatNdef(_tagHandle, keyValue, keyValue.Length, callback, IntPtr.Zero);
284 if (ret != (int)NfcError.None)
286 Log.Error(Globals.LogTag, "Failed to format ndef message, Error - " + (NfcError)ret);
287 NfcErrorFactory.ThrowNfcException(ret);