public QueueItem(System.Activities.Activity element, TransactedReceiveScope parent, TransactedReceiveScope rootTransactedReceiveScope) { this.activity = element; this.parent = parent; this.rootTransactedReceiveScope = rootTransactedReceiveScope; }
private void WalkActivityTree() { if (this.knownServiceActivities == null) { if (this.Body == null) { throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new ValidationException(System.ServiceModel.Activities.SR.MissingBodyInWorkflowService)); } WorkflowInspectionServices.CacheMetadata(this.Body); this.knownServiceActivities = new List <Receive>(); this.receiveAndReplyPairs = new HashSet <ReceiveAndReplyTuple>(); Queue <QueueItem> queue = new Queue <QueueItem>(); queue.Enqueue(new QueueItem(this.Body, null, null)); while (queue.Count > 0) { QueueItem item = queue.Dequeue(); Activity activity = item.Activity; TransactedReceiveScope parentTransactedReceiveScope = item.ParentTransactedReceiveScope; TransactedReceiveScope rootTransactedReceiveScope = item.RootTransactedReceiveScope; if (activity is Receive) { Receive receive = (Receive)activity; if (rootTransactedReceiveScope != null) { receive.InternalReceive.AdditionalData.IsInsideTransactedReceiveScope = true; if ((receive == parentTransactedReceiveScope.Request) && (parentTransactedReceiveScope == rootTransactedReceiveScope)) { receive.InternalReceive.AdditionalData.IsFirstReceiveOfTransactedReceiveScopeTree = true; } } this.knownServiceActivities.Add(receive); } else if (activity is SendReply) { SendReply reply = (SendReply)activity; Receive request = reply.Request; if (reply.InternalContent.IsFault) { request.FollowingFaults.Add(reply); } else { if (request.HasReply) { SendReply reply2 = request.FollowingReplies[0]; ContractValidationHelper.ValidateSendReplyWithSendReply(reply2, reply); } request.FollowingReplies.Add(reply); } ReceiveAndReplyTuple tuple = new ReceiveAndReplyTuple(request, reply); this.receiveAndReplyPairs.Add(tuple); } if (activity is TransactedReceiveScope) { parentTransactedReceiveScope = activity as TransactedReceiveScope; if (rootTransactedReceiveScope == null) { rootTransactedReceiveScope = parentTransactedReceiveScope; } } foreach (Activity activity2 in WorkflowInspectionServices.GetActivities(activity)) { QueueItem item2 = new QueueItem(activity2, parentTransactedReceiveScope, rootTransactedReceiveScope); queue.Enqueue(item2); } } } }