#ifndef __GROUP_TRANSFORM__
#define __GROUP_TRANSFORM__
#include "Transform.h"
#include "TransformFactory.h"
extern CFStringRef kSecGroupTransformType;
class GroupTransform : public Transform
{
protected:
std::string DebugDescription();
virtual void FinalizePhase2();
virtual bool validConnectionPoint(CFStringRef attributeName);
GroupTransform();
CFMutableArrayRef mMembers;
dispatch_group_t mAllChildrenFinalized;
dispatch_group_t mPendingStartupActivity;
void RecurseForAllNodes(dispatch_group_t group, CFErrorRef *errorOut, bool parallel, bool opExecutesOnGroups, Transform::TransformOperation op);
public:
virtual ~GroupTransform();
static CFTypeRef Make();
static TransformFactory* MakeTransformFactory();
static CFTypeID GetCFTypeID();
void AddMemberToGroup(SecTransformRef member);
void RemoveMemberFromGroup(SecTransformRef member);
bool HasMember(SecTransformRef member);
void AddAllChildrenFinalizedCallback(dispatch_queue_t run_on, dispatch_block_t callback);
void ChildStartedFinalization(Transform *child);
SecTransformRef FindFirstTransform(); SecTransformRef FindLastTransform(); SecTransformRef FindMonitor();
SecTransformRef GetAnyMember();
SecTransformRef FindByName(CFStringRef name);
void StartingExecutionInGroup();
void StartedExecutionInGroup(bool succesful);
virtual CFDictionaryRef Externalize(CFErrorRef* error);
CFErrorRef ForAllNodes(bool parallel, bool opExecutesOnGroups, Transform::TransformOperation op);
void ForAllNodesAsync(bool opExecutesOnGroups, dispatch_group_t group, Transform::TransformAsyncOperation op);
CFStringRef DotForDebugging();
};
#endif