void TokenDatabase::findNext(Database::Search *rSearch, CssmDbRecordAttributeData *inAttributes, mach_msg_type_number_t inAttributesLength, CssmData *data, RefPointer<Key> &key, RefPointer<Database::Record> &rRecord, CssmDbRecordAttributeData * &outAttributes, mach_msg_type_number_t &outAttributesLength) { Access access(token()); RefPointer<Record> record = new Record(*this); Search *search = safe_cast<Search *>(rSearch); TRY KeyHandle hKey = noKey; validate(CSSM_ACL_AUTHORIZATION_DB_READ, openCreds()); GUARD record->tokenHandle() = access().Tokend::ClientSession::findNext( search->tokenHandle(), inAttributes, inAttributesLength, NULL, hKey, outAttributes, outAttributesLength); if (!record->tokenHandle()) { // no more matches releaseSearch(*search); // release search handle (consumed by EOD) rRecord = NULL; // return null record return; } if (data) { if (!hKey) record->validate(CSSM_ACL_AUTHORIZATION_DB_READ, openCreds()); CssmDbRecordAttributeData *noAttributes; mach_msg_type_number_t noAttributesLength; access().Tokend::ClientSession::findRecordHandle(record->tokenHandle(), NULL, 0, data, hKey, noAttributes, noAttributesLength); if (hKey) { // tokend returned a key reference & data CssmKey &keyForm = *data->interpretedAs<CssmKey>(CSSMERR_CSP_INVALID_KEY); key = new TokenKey(*this, hKey, keyForm.header()); } } rRecord = record->commit(); DONE }