#include "transit.h"
namespace Security {
namespace Tokend {
void relocate(Context &context, void *base, Context::Attr *attrs, uint32 attrSize)
{
ReconstituteWalker relocator(attrs, base);
context.ContextAttributes = attrs; for (uint32 n = 0; n < context.attributesInUse(); n++)
walk(relocator, context[n]);
}
DataRetrieval::DataRetrieval(CssmDbRecordAttributeData *inAttributes, bool getData)
{
this->attributes = inAttributes;
this->data = getData ? &mData : NULL;
this->record = CSSM_INVALID_HANDLE;
this->keyhandle = CSSM_INVALID_HANDLE;
}
DataRetrieval::~DataRetrieval()
{
}
void DataRetrieval::returnData(KeyHandle &hKey, RecordHandle &hRecord,
void *&outData, mach_msg_type_number_t &outDataLength,
CssmDbRecordAttributeData *&outAttributes, mach_msg_type_number_t &outAttributesLength,
CssmDbRecordAttributeData *&outAttributesBase)
{
Copier<CssmDbRecordAttributeData> outCopy(CssmDbRecordAttributeData::overlay(this->attributes));
outAttributesLength = outCopy.length();
outAttributes = outAttributesBase = outCopy.keep();
if (this->data) {
outData = this->data->Data;
outDataLength = this->data->Length;
} else {
outData = NULL;
outDataLength = 0;
}
hKey = (this->keyhandle)?TokendHandleObject::make(this->keyhandle)->ipcHandle():0;
hRecord = (this->record)?TokendHandleObject::make(this->record)->ipcHandle():0;
server->freeRetrievedData(this);
}
TokendHandleObject::TokendHandleObject(CSSM_HANDLE cssmh) : mTokendHandle(cssmh)
{
thmstate().add(ipcHandle(), this);
}
TokendHandleObject::~TokendHandleObject()
{
thmstate().erase(ipcHandle());
}
ModuleNexus<TokendHandleObject::TokendHandleMapState> TokendHandleObject::thmstate;
TokendHandleObject::TokendHandleMapState::TokendHandleMapState()
{
}
TokendHandleObject *TokendHandleObject::make(CSSM_HANDLE cssmh)
{
if (!cssmh)
CssmError::throwMe(CSSMERR_CSSM_INVALID_ADDIN_HANDLE);
return new TokendHandleObject(cssmh);
}
CSSM_HANDLE TokendHandleObject::findTDHandle(TokendHandleObject::TransitHandle thdl)
{
const CSSM_HANDLE knownBadHandle = 0;
if (!thdl)
return knownBadHandle;
TokendHandleMap::const_iterator it = thmstate().find(thdl);
return (it == thmstate().end()) ? knownBadHandle : it->second->tokendHandle();
}
void TokendHandleObject::TokendHandleMapState::add(TransitHandle thdl, TokendHandleObject *tho)
{
StLock<Mutex> _(*this);
thmstate().insert(thmstate().end(), make_pair(thdl,tho));
}
void TokendHandleObject::TokendHandleMapState::erase(TransitHandle thdl)
{
StLock<Mutex> _(*this);
TokendHandleMap::erase(thdl);
}
} }