KCOperation.cpp   [plain text]


// ======================================================================
//	File:		KCOperation.cpp
//
//	pure virtual base class for performing operations in KeychainLib
//  (based on Dave Akhond's Operation for CDSA
//
//	Copyright:	Copyright (c) 2000,2003 Apple Computer, Inc. All Rights Reserved.
//
//	Change History (most recent first):
//
//		 <1>	3/28/00	em		Created.
// ======================================================================

#include "KCOperation.h"

#include <Security/cssmerr.h>

vector<KCRef>			KCOperation::sKCRefList;
vector<KCItemRef>		KCItemOperation::sKCItemRefList;
vector<KCSearchRef>		KCSearchOperation::sKCSearchRefList;
vector<AliasHandle>		KCOperation::sAliasList;

//vector<SecKeychainRef>		SecOperation::sSecRefList;
//vector<AliasHandle>		SecOperation::sAliasList;

// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ SetClient
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
void				
Operation::SetClient(void *inClient)
{
	if(inClient == NULL) return;
	CTestApp	*aTestApp = static_cast<CTestApp*>(inClient);
	if(aTestApp == NULL) return;
	mClient = aTestApp;
}
								

// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ ReadArguments
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
void				
Operation::ReadArguments(
    FILE	*inFile)
{
    
    tParamList::iterator		aIterator = mParamList.begin();
    CParam *					aParam = *aIterator;
    
    while(aIterator != mParamList.end()){
        
        aParam->Read(inFile);
        aParam = *(++aIterator);
    }
}

// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ WriteArguments
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
void				
Operation::WriteArguments(
    FILE	*inFile)
{
    tParamList::iterator		aIterator = mParamList.begin();
    CParam *					aParam = *aIterator;
    while(aIterator != mParamList.end()){
        aParam->Write(inFile);
        aParam = *(++aIterator);
    }	
}

// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ WriteResults
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
void
Operation::WriteResults(
    FILE	*inFile)
{
	if (CSSM_BASE_ERROR <= mStatus && mStatus < CSSM_AC_BASE_ERROR + CSSM_ERRORCODE_MODULE_EXTENT)
		//fprintf(inFile, "     OSStatus CSSMERR_%s (0x%08lx)\n", cssmErrorString(mStatus).c_str(), mStatus);
                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);
    }	
}

// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ ReadScript
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
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)){	
									// Read off comment lines
		if(aBuffer[0] == '/' && aBuffer[1] == '/') continue;
									// instructional comments
		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);
}

// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ ReadScript
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
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);
}

// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ WriteScript
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
void
Operation::WriteScript(
	FILE 	*inFile)
{
    fprintf(inFile, "%d %s\n", GetID(), COpRegister::GetOperationName(GetID()));
    fprintf(inFile, "   Input Arguments : %ld\n", mParamList.size());
    WriteArguments(inFile);
										// Count OSStatus as one of the result values
    fprintf(inFile, "   Results : %ld\n", mResultList.size()+1);
    WriteResults(inFile);
}


// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ GenerateScript
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
void
Operation::GenerateScript(
	FILE 	*inFile)
{
                                    // By default, just generate one script
    WriteScript(inFile);
}

// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ RunScript
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
bool
Operation::RunScript(
	FILE 	*inFile)
{
    ReadScript(inFile);
    Operate();
    return CompareResults(inFile);
}


// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
// 	₯ CompareResults
// ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ
bool
Operation::CompareResults(
	FILE 	*inFile)
{
    OSStatus	aStatus;
    fscanf(inFile, "     OSStatus %ld\n", &aStatus);

	bool		aResult = true;
										// if gRelaxErrorChecking is on, don't bother
										// checking the actual error code, just check
										// for noErr-ness. 
	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;
}