//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
SPErr PIUGetInfoByIndex(uint32 index,
						DescriptorClassID desiredClass,
						DescriptorKeyID desiredKey,
						void * returnData,
						void * returnExtraData)
{
	SPErr error = kSPNoError;
    PIActionReference reference = NULL;
    PIActionDescriptor result = NULL;
	PIActionDescriptor * data;

	if (returnData == NULL)
		error = kSPBadParameterError;
	if (error) goto returnError;

	error = sPSActionReference->Make(&reference);
	if (error) goto returnError;
	
	if (desiredKey)
	{
		error = sPSActionReference->PutProperty(reference, 
												classProperty, 
												desiredKey);
		if (error) goto returnError;
	}
	
	error = sPSActionReference->PutIndex(reference, 
										 desiredClass, 
										 index);
	if (error) goto returnError;
	
	error = sPSActionControl->Get(&result, reference);
	if (error) goto returnError;

	if (desiredKey)
	{
		error = PIUGetSingleItemFromDescriptor(result, 
			                                   desiredKey, 
											   returnData, 
											   returnExtraData);
		if (error) goto returnError;
	} else {
		data = (PIActionDescriptor *)returnData;
		*data = result;
		result = NULL;
	}

returnError:

	if (reference != NULL) sPSActionReference->Free(reference);
	if (result != NULL) sPSActionDescriptor->Free(result);
	
	return error;
}
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
SPErr PIUGetBackgroundInfo(DescriptorKeyID desiredKey, 
						   void * returnData,
						   void * returnExtraData)
{
	SPErr error = kSPNoError;
    PIActionReference reference = NULL;
    PIActionDescriptor result = NULL;
	PIActionDescriptor * data;

	if (returnData == NULL)
		error = kSPBadParameterError;
	if (error) goto returnError;

	error = sPSActionReference->Make(&reference);
	if (error) goto returnError;

	error = sPSActionReference->PutProperty(reference, 
 	                                        classBackgroundLayer, 
											keyBackground);
	if (error) goto returnError;
	
	error = sPSActionReference->PutEnumerated(reference, 
											  classDocument, 
											  typeOrdinal, 
											  enumTarget);
	if (error) goto returnError;
	
	error = sPSActionControl->Get(&result, reference);
	if (error) goto returnError;

	if (desiredKey)
	{
		error = PIUGetSingleItemFromDescriptor(result, 
											   desiredKey, 
											   returnData, 
											   returnExtraData);
		if (error) goto returnError;
	} else {
		data = (PIActionDescriptor *)returnData;
		*data = result;
		result = NULL;
	}

returnError:
	
	if (reference != NULL) sPSActionReference->Free(reference);
	if (result != NULL)	sPSActionDescriptor->Free(result);
	
	return error;
}
//-------------------------------------------------------------------------------
//
//	GetActionInfo
//
// This gets all the keys that the classAction and classActionSet
//
//-------------------------------------------------------------------------------
SPErr GetActionInfo(char* logfilename)
{
	PIActionDescriptor	result = NULL;
	uint32				setCounter = 1;
	int32				actionSetCount, actionsInSet;
	SPErr				error = kSPNoError;
	DescriptorTypeID	typeID = 0;
	DescriptorTypeID	actionTypeID = 0;

	sPSActionControl->StringIDToTypeID("Getting Action Set Info", &typeID);
	sPSActionControl->StringIDToTypeID("Getting Action Info", &actionTypeID);

	while (setCounter)
	{
		// the action stuff doesn't work so well
		// try to get information out of each set until we fail
		// then exit gracefully
		error = PIUGetInfoByIndex(setCounter, classActionSet, 0, &result, 0);
		if (error)
		{ 
			error = 0;
			break;
		}
	
		PIUDumpDescriptor(typeID, result, logfilename);

		//this should give me the same answer
		error = PIUGetSingleItemFromDescriptor(result, 
			                                   keyCount, 
											   &actionSetCount, 
											   NULL);

		// redudancy check for my sanity, yep it works the same.
		error = sPSActionDescriptor->GetInteger(result, 
			                                    keyCount, 
												&actionSetCount);
		if (error) goto returnError;
		
		// looks like it is not counting itself		
		actionSetCount++;

		//this should give me the same answer
		error = PIUGetSingleItemFromDescriptor(result, 
			                                   keyNumberOfChildren, 
											   &actionsInSet, 
											   NULL);

		// redudancy check for my sanity, yep it works the same.
		error = sPSActionDescriptor->GetInteger(result, 
			                                    keyNumberOfChildren, 
												&actionsInSet);
		if (error) goto returnError;

		if (result) sPSActionDescriptor->Free(result);
		result = NULL;
		
		for (int32 counter = 1; counter <= actionsInSet; counter++)
		{
			error = PIUGetInfoByIndexIndex(counter, 
				                           setCounter, 
										   classAction, 
										   classActionSet, 
										   0, 
										   &result, 
										   NULL);


			PIUDumpDescriptor(actionTypeID, result, logfilename);
	
			if (result) sPSActionDescriptor->Free(result);
			result = NULL;
		}
		setCounter++;
	}

returnError:
	if (result) sPSActionDescriptor->Free(result);

	return (error);
}