/*
* 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;
namespace Tizen.Network.Nfc
{
///
/// A class for Ndef Message information. It allows applications to use Ndef Message information.
///
/// 3
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.
///
/// 3
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;
}
}
///
/// Creates a object for the access point.
///
/// 3
/// Thrown when Nfc is not supported.
/// Thrown when the method failed due to invalid operation.
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);
}
}
internal NfcNdefMessage(IntPtr messageHandle)
{
_messageHandle = messageHandle;
}
~NfcNdefMessage()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
// Free managed objects.
int ret = Interop.Nfc.NdefMessage.Destroy(_messageHandle);
if (ret != (int)NfcError.None)
{
Log.Error(Globals.LogTag, "Failed to destroy ndef message, Error - " + (NfcError)ret);
}
}
//Free unmanaged objects
disposed = true;
}
///
/// Appends a record into NDEF message.
///
/// 3
/// 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.
///
/// 3
/// 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.
///
/// 3
/// 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.
///
/// 3
/// 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;
}
}
}