/*
* 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.Smartcard
{
///
/// A class for Smartcard reader informations. It allows applications to handle reader informations.
///
/// http://tizen.org/privilege/secureelement
public class SmartcardReader : IDisposable
{
private int _readerHandle = -1;
private int _session;
private bool disposed = false;
private List _sessionList = new List();
///
/// The name of reader.
///
public string Name
{
get
{
IntPtr strPtr;
int ret = Interop.Smartcard.Reader.ReaderGetName(_readerHandle, out strPtr);
if (ret != (int)SmartcardError.None)
{
Log.Error(Globals.LogTag, "Failed to get reader name, Error - " + (SmartcardError)ret);
return "";
}
return Marshal.PtrToStringAnsi(strPtr);
}
}
///
/// The existence of secure element.
///
public bool IsSecureElementPresent
{
get
{
bool isPresent;
int ret = Interop.Smartcard.Reader.ReaderIsSecureElementPresent(_readerHandle, out isPresent);
if (ret != (int)SmartcardError.None)
{
Log.Error(Globals.LogTag, "Failed to get present, Error - " + (SmartcardError)ret);
}
return isPresent;
}
}
internal SmartcardReader(int handle)
{
_readerHandle = handle;
}
~SmartcardReader()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
// Free managed objects.
foreach (SmartcardSession session in _sessionList)
{
session.Dispose();
_sessionList.Remove(session);
}
}
//Free unmanaged objects
disposed = true;
}
internal int GetHandle()
{
return _readerHandle;
}
internal int GetSession()
{
return _session;
}
///
/// Connects to a Secure Element in the given reader.
///
/// The SmartcardSession object.
public SmartcardSession OpenSession()
{
int ret = Interop.Smartcard.Reader.ReaderOpenSession(_readerHandle, out _session);
if (ret != (int)SmartcardError.None)
{
Log.Error(Globals.LogTag, "Failed to get session handle, Error - " + (SmartcardError)ret);
}
SmartcardSession session = new SmartcardSession(this, _session);
_sessionList.Add(session);
return session;
}
///
/// Closes all the sessions opened on the given reader.
///
public void CloseSessions()
{
int ret = Interop.Smartcard.Reader.ReaderCloseSessions(_readerHandle);
if (ret != (int)SmartcardError.None)
{
Log.Error(Globals.LogTag, "Failed to close sessions, Error - " + (SmartcardError)ret);
SmartcardErrorFactory.ThrowSmartcardException(ret);
}
foreach (SmartcardSession session in _sessionList)
{
session.Dispose();
_sessionList.Remove(session);
}
}
}
}