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 /// The 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 the 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 the 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 the 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 the NDEF message 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)
112 /// NfcTag destructor.
122 public void Dispose()
125 GC.SuppressFinalize(this);
128 private void Dispose(bool disposing)
135 // Free managed objects.
137 //Free unmanaged objects
142 /// Retrieves all the tag information.
144 /// <since_tizen> 3 </since_tizen>
145 /// <returns>The list of the NfcTagInformation objects.</returns>
146 /// <privilege>http://tizen.org/privilege/nfc</privilege>
147 /// <exception cref="NotSupportedException">Thrown when the NFC is not supported.</exception>
148 /// <exception cref="InvalidOperationException">Thrown when the method fails due to an invalid operation.</exception>
149 public IEnumerable<NfcTagInformation> ForeachInformation()
151 List<NfcTagInformation> infoList = new List<NfcTagInformation>();
152 Interop.Nfc.TagInformationCallback callback = (IntPtr key, IntPtr infoValue, int valueSize, IntPtr userData) =>
154 if (key != IntPtr.Zero && infoValue != IntPtr.Zero)
156 NfcTagInformation tagInfo = new NfcTagInformation(Marshal.PtrToStringAnsi(key), new byte[valueSize]);
158 Marshal.Copy(infoValue, tagInfo.InformationValue, 0, valueSize);
160 infoList.Add(tagInfo);
167 int ret = Interop.Nfc.Tag.ForeachInformation(_tagHandle, callback, IntPtr.Zero);
168 if (ret != (int)NfcError.None)
170 Log.Error(Globals.LogTag, "Failed to get all Tag information, Error - " + (NfcError)ret);
171 NfcErrorFactory.ThrowNfcException(ret);
178 /// Transceives the data of the raw format card.
180 /// <since_tizen> 3 </since_tizen>
181 /// <param name="buffer">The binary data for a parameter or additional commands.</param>
182 /// <privilege>http://tizen.org/privilege/nfc</privilege>
183 /// <exception cref="NotSupportedException">Thrown when the NFC is not supported.</exception>
184 /// <exception cref="ArgumentException">Thrown when the method fails due to an invalid parameter.</exception>
185 /// <exception cref="InvalidOperationException">Thrown when the the method fails due to an invalid operation.</exception>
186 public Task<byte[]> TransceiveAsync(byte[] buffer)
188 var task = new TaskCompletionSource<byte[]>();
190 byte[] resultBuffer = null;
191 Interop.Nfc.TagTransceiveCompletedCallback callback = (int result, IntPtr resultData, int dataSize, IntPtr userData) =>
193 if (result == (int)NfcError.None)
195 resultBuffer = new byte[dataSize];
196 Marshal.Copy(resultData, resultBuffer, 0, dataSize);
197 task.SetResult(resultBuffer);
202 int ret = Interop.Nfc.Tag.Transceive(_tagHandle, buffer, buffer.Length, callback, IntPtr.Zero);
203 if (ret != (int)NfcError.None)
205 Log.Error(Globals.LogTag, "Failed to transceive data, Error - " + (NfcError)ret);
206 NfcErrorFactory.ThrowNfcException(ret);
213 /// Reads the NDEF formatted data from the NFC tag.
215 /// <since_tizen> 3 </since_tizen>
216 /// <privilege>http://tizen.org/privilege/nfc</privilege>
217 /// <exception cref="NotSupportedException">Thrown when the NFC is not supported.</exception>
218 /// <exception cref="InvalidOperationException">Thrown when the method fails due to an invalid operation.</exception>
219 public Task<NfcNdefMessage> ReadNdefMessageAsync()
221 var task = new TaskCompletionSource<NfcNdefMessage>();
223 NfcNdefMessage ndefMsg = null;
224 Interop.Nfc.TagReadCompletedCallback callback = (int result, IntPtr ndefMessage, IntPtr userData) =>
226 if (result == (int)NfcError.None)
228 ndefMsg = new NfcNdefMessage(ndefMessage);
229 task.SetResult(ndefMsg);
236 int ret = Interop.Nfc.Tag.ReadNdef(_tagHandle, callback, IntPtr.Zero);
237 if (ret != (int)NfcError.None)
239 Log.Error(Globals.LogTag, "Failed to read ndef message, Error - " + (NfcError)ret);
240 NfcErrorFactory.ThrowNfcException(ret);
247 /// Writes the NDEF formatted data.
249 /// <since_tizen> 3 </since_tizen>
250 /// <param name="ndefMessage">The NfcNdefMessage object.</param>
251 /// <privilege>http://tizen.org/privilege/nfc</privilege>
252 /// <exception cref="NotSupportedException">Thrown when the NFC is not supported.</exception>
253 /// <exception cref="ArgumentException">Thrown when the method fails due to an invalid parameter.</exception>
254 /// <exception cref="InvalidOperationException">Thrown when the method fails due to an invalid operation.</exception>
255 public Task<NfcError> WriteNdefMessageAsync(NfcNdefMessage ndefMessage)
257 var task = new TaskCompletionSource<NfcError>();
259 Interop.Nfc.VoidCallback callback = (int result, IntPtr userData) =>
261 task.SetResult((NfcError)result);
265 int ret = Interop.Nfc.Tag.WriteNdef(_tagHandle, ndefMessage.GetHandle(), callback, IntPtr.Zero);
266 if (ret != (int)NfcError.None)
268 Log.Error(Globals.LogTag, "Failed to write ndef message, Error - " + (NfcError)ret);
269 NfcErrorFactory.ThrowNfcException(ret);
276 /// Formats the detected tag that can store the NDEF message.
278 /// <since_tizen> 3 </since_tizen>
279 /// <param name="keyValue">The key value that may need to format the tag.</param>
280 /// <privilege>http://tizen.org/privilege/nfc</privilege>
281 /// <exception cref="NotSupportedException">Thrown when the NFC is not supported.</exception>
282 /// <exception cref="ArgumentException">Thrown when method fails due to an invalid parameter.</exception>
283 /// <exception cref="InvalidOperationException">Thrown when the method fails due to an invalid operation.</exception>
284 public Task<NfcError> FormatNdefMessageAsync(byte[] keyValue)
286 var task = new TaskCompletionSource<NfcError>();
288 Interop.Nfc.VoidCallback callback = (int result, IntPtr userData) =>
290 task.SetResult((NfcError)result);
294 int ret = Interop.Nfc.Tag.FormatNdef(_tagHandle, keyValue, keyValue.Length, callback, IntPtr.Zero);
295 if (ret != (int)NfcError.None)
297 Log.Error(Globals.LogTag, "Failed to format ndef message, Error - " + (NfcError)ret);
298 NfcErrorFactory.ThrowNfcException(ret);