+#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(); // defined as the transform to which input is attached
+ SecTransformRef FindLastTransform(); // defined as the transform to which the monitor is attached
+ SecTransformRef FindMonitor();
+ SecTransformRef GetAnyMember();
+
+ SecTransformRef FindByName(CFStringRef name);
+
+ // A group should delay destruction while excution is starting
+ 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