/* * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Runtime.InteropServices; using System.Collections.Generic; using Tizen.Network; namespace Tizen.Network.Nfc { /// /// A class for Ndef Message information. It allows applications to use Ndef Message information. /// public class NfcNdefMessage : IDisposable { private bool disposed = false; private IntPtr _messageHandle = IntPtr.Zero; private List _recordList = new List(); /// /// The number of record in NDEF message. /// public int RecordCount { get { int recordCount; int ret = Interop.Nfc.NdefMessage.GetRecordCount(_messageHandle, out recordCount); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to get record count, Error - " + (NfcError)ret); } return recordCount; } } /// /// The serial bytes array of NDEF message. /// public byte[] Rawdata { get { IntPtr rawData; uint rawDataSize; int ret = Interop.Nfc.NdefMessage.GetRawData(_messageHandle, out rawData, out rawDataSize); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to get rawdata, Error - " + (NfcError)ret); return null; } return NfcConvertUtil.UintLengthIntPtrToByteArray(rawData, rawDataSize); } } /// /// Creates a object for the access point. /// public NfcNdefMessage() { int ret = Interop.Nfc.NdefMessage.Create(out _messageHandle); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to create Ndef message, Error - " + (NfcError)ret); NfcErrorFactory.ThrowNfcException(ret); } } /// /// Creates NDEF message handle from raw serial bytes. /// /// The NDEF message in form of bytes array. /// The size of bytes array. public NfcNdefMessage(byte[] rawData, uint rawDataSize) { int ret = Interop.Nfc.NdefMessage.CreateRawData(out _messageHandle, rawData, rawDataSize); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to create Ndef Rawdata message, Error - " + (NfcError)ret); NfcErrorFactory.ThrowNfcException(ret); } } internal NfcNdefMessage(IntPtr messageHandle) { _messageHandle = messageHandle; } ~NfcNdefMessage() { int ret = Interop.Nfc.NdefMessage.Destroy(_messageHandle); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to destroy ndef message, Error - " + (NfcError)ret); NfcErrorFactory.ThrowNfcException(ret); } Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (disposed) return; if (disposing) { // Free managed objects. } //Free unmanaged objects disposed = true; } /// /// Appends a record into NDEF message. /// /// Whether appending the record succeeded. /// The NfcNdefRecord object that will be appended into NDEF message. public bool AppendRecord(NfcNdefRecord record) { bool isSuccess = true; int ret = Interop.Nfc.NdefMessage.AppendRecord(_messageHandle, record.GetHandle()); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to append record, Error - " + (NfcError)ret); isSuccess = false; } else { _recordList.Add(record); } return isSuccess; } /// /// Inserts a record at index into NDEF message. /// /// Whether insterting the record succeeded. /// The index of record ( starts from 0 ). /// The NfcNdefRecord object that will be appended into NDEF message. public bool InsertRecord(int index, NfcNdefRecord record) { bool isSuccess = true; int ret = Interop.Nfc.NdefMessage.InsertRecord(_messageHandle, index, record.GetHandle()); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to insert record, Error - " + (NfcError)ret); isSuccess = false; } else { _recordList.Add(record); } return isSuccess; } /// /// Inserts a record at index into NDEF message. /// /// Whether removing the record succeeded. /// The index of record ( starts from 0 ). public bool RemoveRecord(int index) { bool isSuccess = true; int ret = Interop.Nfc.NdefMessage.RemoveRecord(_messageHandle, index); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to remove record, Error - " + (NfcError)ret); isSuccess = false; } return isSuccess; } /// /// Gets record by index. /// /// The NfcNdefRecord object. /// The index of record ( starts from 0 ). public NfcNdefRecord GetRecord(int index) { IntPtr recordHandle; NfcNdefRecord recordObject = null; int ret = Interop.Nfc.NdefMessage.GetRecord(_messageHandle, index, out recordHandle); if (ret != (int)NfcError.None) { Log.Error(Globals.LogTag, "Failed to remove record, Error - " + (NfcError)ret); } foreach (NfcNdefRecord recordElement in _recordList) { if(recordElement.GetHandle() == recordHandle) { Log.Debug(Globals.LogTag, "Find record handle"); recordObject = recordElement; break; } } return recordObject; } internal IntPtr GetHandle() { return _messageHandle; } } }