#include "KCOperation.h"
#include <Security/cssmerr.h>
vector<KCRef> KCOperation::sKCRefList;
vector<KCItemRef> KCItemOperation::sKCItemRefList;
vector<KCSearchRef> KCSearchOperation::sKCSearchRefList;
vector<AliasHandle> KCOperation::sAliasList;
void
Operation::SetClient(void *inClient)
{
if(inClient == NULL) return;
CTestApp *aTestApp = static_cast<CTestApp*>(inClient);
if(aTestApp == NULL) return;
mClient = aTestApp;
}
void
Operation::ReadArguments(
FILE *inFile)
{
tParamList::iterator aIterator = mParamList.begin();
CParam * aParam = *aIterator;
while(aIterator != mParamList.end()){
aParam->Read(inFile);
aParam = *(++aIterator);
}
}
void
Operation::WriteArguments(
FILE *inFile)
{
tParamList::iterator aIterator = mParamList.begin();
CParam * aParam = *aIterator;
while(aIterator != mParamList.end()){
aParam->Write(inFile);
aParam = *(++aIterator);
}
}
void
Operation::WriteResults(
FILE *inFile)
{
if (CSSM_BASE_ERROR <= mStatus && mStatus < CSSM_AC_BASE_ERROR + CSSM_ERRORCODE_MODULE_EXTENT)
printf("Error");
else
fprintf(inFile, " OSStatus %ld\n", mStatus);
tParamList::iterator aIterator = mResultList.begin();
CParam * aParam = *aIterator;
while(aIterator != mResultList.end()){
aParam->Write(inFile);
aParam = *(++aIterator);
}
}
int
Operation::ReadScript(
FILE *inFile,
eKCOperationID &outID)
{
UInt32 aID;
char aBuffer[1024];
char aName[256];
int aResult;
while(UNIX_fgets(aBuffer, sizeof(aBuffer)-1, inFile)){
if(aBuffer[0] == '/' && aBuffer[1] == '/') continue;
if(aBuffer[0] == '#' && aBuffer[0] == '#'){
for(UInt16 i=0; i<strlen(aBuffer)+4; i++) fprintf(stdout, "-");
fprintf(stdout, "\n%s", aBuffer);
for(UInt16 i=0; i<strlen(aBuffer)+4; i++) fprintf(stdout, "-");
fprintf(stdout, "\n");
continue;
}
aResult = sscanf(aBuffer, "%ld %s\n", &aID, aName);
outID = (eKCOperationID)aID;
return aResult;
}
return(EOF);
}
void
Operation::ReadScript(
FILE *inFile)
{
UInt32 aNumArgs = 0;
UInt32 aSize = 0;
fscanf(inFile, " Input Arguments : %ld\n", &aNumArgs);
ReadArguments(inFile);
fscanf(inFile, " Results : %ld\n", &aSize);
}
void
Operation::WriteScript(
FILE *inFile)
{
fprintf(inFile, "%d %s\n", GetID(), COpRegister::GetOperationName(GetID()));
fprintf(inFile, " Input Arguments : %ld\n", mParamList.size());
WriteArguments(inFile);
fprintf(inFile, " Results : %ld\n", mResultList.size()+1);
WriteResults(inFile);
}
void
Operation::GenerateScript(
FILE *inFile)
{
WriteScript(inFile);
}
bool
Operation::RunScript(
FILE *inFile)
{
ReadScript(inFile);
Operate();
return CompareResults(inFile);
}
bool
Operation::CompareResults(
FILE *inFile)
{
OSStatus aStatus;
fscanf(inFile, " OSStatus %ld\n", &aStatus);
bool aResult = true;
if(aStatus != mStatus){
if(!mClient->IsRelaxErrorChecking()) aResult = false;
if(mClient->IsRelaxErrorChecking() && ((aStatus == noErr) || (mStatus == noErr))) aResult = false;
}
tParamList::iterator aIterator = mResultList.begin();
CParam * aParam = *aIterator;
while(aIterator != mResultList.end()){
if(aParam->Compare(inFile) == false)
aResult = false;
aParam = *(++aIterator);
}
return aResult;
}