#include "reader.h"
#include "eventhandler.h"
#include "pcsclite.h"
#include <security_utilities/debugging.h>
static PCSCD::Readers *mReaders;
namespace PCSCD {
Readers::Readers()
{
}
Readers::~Readers()
{
}
bool Readers::find(const char *name, XReaderContext &rc) const
{
return false;
}
bool Readers::find(uint32_t port, const char *name, XReaderContext &rc) const
{
return false;
}
bool Readers::find(uint32_t id, XReaderContext &rc) const
{
return false;
}
}
#pragma mark ---------- C Interface ----------
LONG XRFAllocateReaderSpace(DWORD dwAllocNum)
{
try
{
mReaders = new PCSCD::Readers();
}
catch (...)
{
secdebug("pcscd", "failed to allocate Readers");
return -1;
}
return EHInitializeEventStructures();
}
LONG XRFReaderInfo(LPSTR lpcReader, PREADER_CONTEXT *sReader)
{
PCSCD::XReaderContext rc; if (!sReader)
return SCARD_E_INVALID_PARAMETER;
if (!mReaders->find(lpcReader, rc))
return SCARD_E_UNKNOWN_READER;
*sReader = &rc; return SCARD_S_SUCCESS;
}
LONG XRFReaderInfoNamePort(DWORD dwPort, LPSTR lpcReader, PREADER_CONTEXT *sReader)
{
PCSCD::XReaderContext rc;
if (!sReader)
return SCARD_E_INVALID_PARAMETER;
if (!mReaders->find(dwPort, lpcReader, rc))
return SCARD_E_UNKNOWN_READER;
*sReader = &rc; return SCARD_S_SUCCESS;
}
LONG XRFReaderInfoById(DWORD dwIdentity, PREADER_CONTEXT * sReader)
{
PCSCD::XReaderContext rc;
if (!sReader)
return SCARD_E_INVALID_PARAMETER;
if (!mReaders->find(dwIdentity, rc))
return SCARD_E_INVALID_VALUE;
*sReader = &rc; return SCARD_S_SUCCESS;
}
LONG XRFCheckSharing(DWORD hCard)
{
PCSCD::XReaderContext rc;
if (!mReaders->find(hCard, rc))
return SCARD_E_INVALID_VALUE;
return (rc.dwLockId == 0 || rc.dwLockId == hCard)?SCARD_S_SUCCESS:SCARD_E_SHARING_VIOLATION;
}
LONG XRFLockSharing(DWORD hCard)
{
PCSCD::XReaderContext rc;
if (!mReaders->find(hCard, rc))
return SCARD_E_INVALID_VALUE;
if (rc.dwLockId != 0 && rc.dwLockId != hCard)
{
secdebug("pcscd", "XRFLockSharing: Lock ID invalid: %d", rc.dwLockId);
return SCARD_E_SHARING_VIOLATION;
}
EHSetSharingEvent(&rc, 1);
rc.dwLockId = hCard;
return SCARD_S_SUCCESS;
}
LONG XRFUnlockSharing(DWORD hCard)
{
PCSCD::XReaderContext rc;
if (!mReaders->find(hCard, rc))
return SCARD_E_INVALID_VALUE;
if (rc.dwLockId != 0 && rc.dwLockId != hCard)
{
secdebug("pcscd", "XRFUnlockSharing: Lock ID invalid: %d", rc.dwLockId);
return SCARD_E_SHARING_VIOLATION;
}
EHSetSharingEvent(&rc, 0);
rc.dwLockId = 0;
return SCARD_S_SUCCESS;
}