Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Activities / StateMachineSubscription.cs / 1305376 / StateMachineSubscription.cs
#region Using directives using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Reflection; using System.Diagnostics; using System.Runtime.Remoting.Messaging; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.Runtime; using System.Workflow.Runtime.Hosting; #endregion Using directives namespace System.Workflow.Activities { #region StateMachineSubscription [Serializable] internal abstract class StateMachineSubscription : IActivityEventListener{ #region Member Variables private Guid _subscriptionId; #endregion Member Variables #region Properties internal Guid SubscriptionId { get { return _subscriptionId; } set { _subscriptionId = value; } } #endregion Properties void IActivityEventListener .OnEvent(object sender, QueueEventArgs e) { ActivityExecutionContext context = sender as ActivityExecutionContext; if (context == null) throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender"); Enqueue(context); } protected abstract void Enqueue(ActivityExecutionContext context); internal abstract void ProcessEvent(ActivityExecutionContext context); } #endregion StateMachineSubscription #region EventActivitySubscription [Serializable] internal class EventActivitySubscription : StateMachineSubscription { #region Member Variables private string _eventActivityName = String.Empty; private string _eventDrivenName = String.Empty; private string _stateName = String.Empty; private IComparable _queueName; #endregion Member Variables #region Properties internal string EventActivityName { get { return _eventActivityName; } } internal string StateName { get { return _stateName; } } internal IComparable QueueName { get { return _queueName; } } internal string EventDrivenName { get { return _eventDrivenName; } } #endregion Properties internal void Subscribe(ActivityExecutionContext context, StateActivity state, IEventActivity eventActivity) { eventActivity.Subscribe(context, this); Activity activity = (Activity)eventActivity; this._queueName = eventActivity.QueueName; this._eventActivityName = activity.QualifiedName; this._stateName = state.QualifiedName; this.SubscriptionId = Guid.NewGuid(); EventDrivenActivity eventDriven = StateMachineHelpers.GetParentEventDriven(eventActivity); this._eventDrivenName = eventDriven.QualifiedName; } internal void Unsubscribe(ActivityExecutionContext context, IEventActivity eventActivity) { eventActivity.Unsubscribe(context, this); } protected override void Enqueue(ActivityExecutionContext context) { StateActivity rootState = StateMachineHelpers.GetRootState((StateActivity)context.Activity); StateMachineExecutionState executionState = StateMachineExecutionState.Get(rootState); executionState.SubscriptionManager.Enqueue(context, this.QueueName); } internal override void ProcessEvent(ActivityExecutionContext context) { StateActivity rootState = StateMachineHelpers.GetRootState((StateActivity)context.Activity); StateMachineExecutionState executionState = StateMachineExecutionState.Get(rootState); ExternalEventAction action = new ExternalEventAction(this.StateName, this.EventDrivenName); Debug.Assert(!executionState.HasEnqueuedActions); executionState.EnqueueAction(action); executionState.ProcessActions(context); } } #endregion EventActivitySubscription #region SetStateSubscription [Serializable] internal class SetStateSubscription : StateMachineSubscription { private Guid _instanceId; internal SetStateSubscription(Guid instanceId) { this._instanceId = instanceId; } internal void CreateQueue(ActivityExecutionContext context) { if (!StateMachineHelpers.IsRootExecutionContext(context)) { // we only subscribe to the set state event if // we're at the root level. If this instance is // being called, it is not possible to set the // state from the host side directly return; } WorkflowQueuingService workflowQueuingService = context.GetService (); MessageEventSubscription subscription = new MessageEventSubscription( StateMachineWorkflowActivity.SetStateQueueName, this._instanceId); WorkflowQueue workflowQueue = workflowQueuingService.CreateWorkflowQueue( StateMachineWorkflowActivity.SetStateQueueName, true); this.SubscriptionId = subscription.SubscriptionId; } internal void DeleteQueue(ActivityExecutionContext context) { if (!StateMachineHelpers.IsRootExecutionContext(context)) { // we only subscribe to the set state event if // we're at the root level. If this instance is // being called, it is not possible to set the // state from the host side directly return; } WorkflowQueuingService workflowQueuingService = context.GetService (); WorkflowQueue workflowQueue = workflowQueuingService.GetWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); workflowQueuingService.DeleteWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); } internal void Subscribe(ActivityExecutionContext context) { WorkflowQueuingService workflowQueuingService = context.GetService (); WorkflowQueue workflowQueue = workflowQueuingService.GetWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); workflowQueue.RegisterForQueueItemAvailable(this); } internal void Unsubscribe(ActivityExecutionContext context) { WorkflowQueuingService workflowQueuingService = context.GetService (); WorkflowQueue workflowQueue = workflowQueuingService.GetWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); workflowQueue.UnregisterForQueueItemAvailable(this); } protected override void Enqueue(ActivityExecutionContext context) { StateActivity rootState = StateMachineHelpers.GetRootState((StateActivity)context.Activity); StateMachineExecutionState executionState = StateMachineExecutionState.Get(rootState); executionState.SubscriptionManager.Enqueue(context, this.SubscriptionId); } internal override void ProcessEvent(ActivityExecutionContext context) { WorkflowQueuingService workflowQueuingService = context.GetService (); WorkflowQueue workflowQueue = workflowQueuingService.GetWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); SetStateEventArgs eventArgs = workflowQueue.Dequeue() as SetStateEventArgs; StateActivity currentState = StateMachineHelpers.GetCurrentState(context); if (currentState == null) throw new InvalidOperationException(SR.GetStateMachineWorkflowMustHaveACurrentState()); StateActivity rootState = StateMachineHelpers.GetRootState((StateActivity)context.Activity); StateMachineExecutionState executionState = StateMachineExecutionState.Get(rootState); SetStateAction action = new SetStateAction(currentState.QualifiedName, eventArgs.TargetStateName); Debug.Assert(!executionState.HasEnqueuedActions); executionState.EnqueueAction(action); executionState.ProcessActions(context); } } #endregion SetStateSubscription } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. #region Using directives using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Reflection; using System.Diagnostics; using System.Runtime.Remoting.Messaging; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.Runtime; using System.Workflow.Runtime.Hosting; #endregion Using directives namespace System.Workflow.Activities { #region StateMachineSubscription [Serializable] internal abstract class StateMachineSubscription : IActivityEventListener { #region Member Variables private Guid _subscriptionId; #endregion Member Variables #region Properties internal Guid SubscriptionId { get { return _subscriptionId; } set { _subscriptionId = value; } } #endregion Properties void IActivityEventListener .OnEvent(object sender, QueueEventArgs e) { ActivityExecutionContext context = sender as ActivityExecutionContext; if (context == null) throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender"); Enqueue(context); } protected abstract void Enqueue(ActivityExecutionContext context); internal abstract void ProcessEvent(ActivityExecutionContext context); } #endregion StateMachineSubscription #region EventActivitySubscription [Serializable] internal class EventActivitySubscription : StateMachineSubscription { #region Member Variables private string _eventActivityName = String.Empty; private string _eventDrivenName = String.Empty; private string _stateName = String.Empty; private IComparable _queueName; #endregion Member Variables #region Properties internal string EventActivityName { get { return _eventActivityName; } } internal string StateName { get { return _stateName; } } internal IComparable QueueName { get { return _queueName; } } internal string EventDrivenName { get { return _eventDrivenName; } } #endregion Properties internal void Subscribe(ActivityExecutionContext context, StateActivity state, IEventActivity eventActivity) { eventActivity.Subscribe(context, this); Activity activity = (Activity)eventActivity; this._queueName = eventActivity.QueueName; this._eventActivityName = activity.QualifiedName; this._stateName = state.QualifiedName; this.SubscriptionId = Guid.NewGuid(); EventDrivenActivity eventDriven = StateMachineHelpers.GetParentEventDriven(eventActivity); this._eventDrivenName = eventDriven.QualifiedName; } internal void Unsubscribe(ActivityExecutionContext context, IEventActivity eventActivity) { eventActivity.Unsubscribe(context, this); } protected override void Enqueue(ActivityExecutionContext context) { StateActivity rootState = StateMachineHelpers.GetRootState((StateActivity)context.Activity); StateMachineExecutionState executionState = StateMachineExecutionState.Get(rootState); executionState.SubscriptionManager.Enqueue(context, this.QueueName); } internal override void ProcessEvent(ActivityExecutionContext context) { StateActivity rootState = StateMachineHelpers.GetRootState((StateActivity)context.Activity); StateMachineExecutionState executionState = StateMachineExecutionState.Get(rootState); ExternalEventAction action = new ExternalEventAction(this.StateName, this.EventDrivenName); Debug.Assert(!executionState.HasEnqueuedActions); executionState.EnqueueAction(action); executionState.ProcessActions(context); } } #endregion EventActivitySubscription #region SetStateSubscription [Serializable] internal class SetStateSubscription : StateMachineSubscription { private Guid _instanceId; internal SetStateSubscription(Guid instanceId) { this._instanceId = instanceId; } internal void CreateQueue(ActivityExecutionContext context) { if (!StateMachineHelpers.IsRootExecutionContext(context)) { // we only subscribe to the set state event if // we're at the root level. If this instance is // being called, it is not possible to set the // state from the host side directly return; } WorkflowQueuingService workflowQueuingService = context.GetService (); MessageEventSubscription subscription = new MessageEventSubscription( StateMachineWorkflowActivity.SetStateQueueName, this._instanceId); WorkflowQueue workflowQueue = workflowQueuingService.CreateWorkflowQueue( StateMachineWorkflowActivity.SetStateQueueName, true); this.SubscriptionId = subscription.SubscriptionId; } internal void DeleteQueue(ActivityExecutionContext context) { if (!StateMachineHelpers.IsRootExecutionContext(context)) { // we only subscribe to the set state event if // we're at the root level. If this instance is // being called, it is not possible to set the // state from the host side directly return; } WorkflowQueuingService workflowQueuingService = context.GetService (); WorkflowQueue workflowQueue = workflowQueuingService.GetWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); workflowQueuingService.DeleteWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); } internal void Subscribe(ActivityExecutionContext context) { WorkflowQueuingService workflowQueuingService = context.GetService (); WorkflowQueue workflowQueue = workflowQueuingService.GetWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); workflowQueue.RegisterForQueueItemAvailable(this); } internal void Unsubscribe(ActivityExecutionContext context) { WorkflowQueuingService workflowQueuingService = context.GetService (); WorkflowQueue workflowQueue = workflowQueuingService.GetWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); workflowQueue.UnregisterForQueueItemAvailable(this); } protected override void Enqueue(ActivityExecutionContext context) { StateActivity rootState = StateMachineHelpers.GetRootState((StateActivity)context.Activity); StateMachineExecutionState executionState = StateMachineExecutionState.Get(rootState); executionState.SubscriptionManager.Enqueue(context, this.SubscriptionId); } internal override void ProcessEvent(ActivityExecutionContext context) { WorkflowQueuingService workflowQueuingService = context.GetService (); WorkflowQueue workflowQueue = workflowQueuingService.GetWorkflowQueue(StateMachineWorkflowActivity.SetStateQueueName); SetStateEventArgs eventArgs = workflowQueue.Dequeue() as SetStateEventArgs; StateActivity currentState = StateMachineHelpers.GetCurrentState(context); if (currentState == null) throw new InvalidOperationException(SR.GetStateMachineWorkflowMustHaveACurrentState()); StateActivity rootState = StateMachineHelpers.GetRootState((StateActivity)context.Activity); StateMachineExecutionState executionState = StateMachineExecutionState.Get(rootState); SetStateAction action = new SetStateAction(currentState.QualifiedName, eventArgs.TargetStateName); Debug.Assert(!executionState.HasEnqueuedActions); executionState.EnqueueAction(action); executionState.ProcessActions(context); } } #endregion SetStateSubscription } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DynamicDataManager.cs
- ListViewGroupConverter.cs
- StrokeCollection2.cs
- ForAllOperator.cs
- CodeDOMProvider.cs
- SqlProfileProvider.cs
- MultiTargetingUtil.cs
- WindowsPrincipal.cs
- MatrixAnimationBase.cs
- FirstMatchCodeGroup.cs
- SchemaCollectionCompiler.cs
- WorkflowRuntimeService.cs
- DataGridViewCellEventArgs.cs
- CompositeControl.cs
- ServiceInfoCollection.cs
- UriParserTemplates.cs
- ItemDragEvent.cs
- XslNumber.cs
- DiagnosticTrace.cs
- InternalUserCancelledException.cs
- ToolBarButtonClickEvent.cs
- HtmlShimManager.cs
- Maps.cs
- UInt64Converter.cs
- OdbcStatementHandle.cs
- SingleAnimation.cs
- ToolStripArrowRenderEventArgs.cs
- httpserverutility.cs
- SQLDoubleStorage.cs
- SingleBodyParameterMessageFormatter.cs
- SmiEventSink_Default.cs
- RSAOAEPKeyExchangeFormatter.cs
- Bold.cs
- MemoryPressure.cs
- WsdlImporterElement.cs
- AssemblyHash.cs
- StorageAssociationTypeMapping.cs
- DataError.cs
- MailWebEventProvider.cs
- DataGridViewCheckBoxColumn.cs
- VBCodeProvider.cs
- HostedTransportConfigurationBase.cs
- CompilationUtil.cs
- PropertyValueChangedEvent.cs
- LineGeometry.cs
- TypeDescriptionProviderAttribute.cs
- WindowsSpinner.cs
- AspProxy.cs
- PassportIdentity.cs
- Bits.cs
- UndirectedGraph.cs
- AdditionalEntityFunctions.cs
- TraceListeners.cs
- SqlRecordBuffer.cs
- WebPartHelpVerb.cs
- ContentElement.cs
- namescope.cs
- EasingKeyFrames.cs
- InplaceBitmapMetadataWriter.cs
- CultureInfoConverter.cs
- DataGridCellAutomationPeer.cs
- IISUnsafeMethods.cs
- TdsParserHelperClasses.cs
- D3DImage.cs
- NullReferenceException.cs
- DBBindings.cs
- FilterableAttribute.cs
- TreeViewImageKeyConverter.cs
- DataGridViewTextBoxColumn.cs
- Stroke2.cs
- WSFederationHttpSecurityElement.cs
- RawStylusSystemGestureInputReport.cs
- SizeAnimation.cs
- ValidationErrorEventArgs.cs
- MetadataPropertyCollection.cs
- SerializerWriterEventHandlers.cs
- ThemeDirectoryCompiler.cs
- MLangCodePageEncoding.cs
- MatrixValueSerializer.cs
- Parser.cs
- DateTimeConverter2.cs
- StylusPointPropertyId.cs
- WebPartVerbCollection.cs
- XmlSecureResolver.cs
- DataGridRowClipboardEventArgs.cs
- ExpressionEditorAttribute.cs
- COSERVERINFO.cs
- MediaContext.cs
- SmtpException.cs
- Timer.cs
- ListMarkerLine.cs
- Span.cs
- SqlXml.cs
- AffineTransform3D.cs
- TextReturnReader.cs
- DataBindingHandlerAttribute.cs
- odbcmetadatafactory.cs
- TabItem.cs
- _ListenerResponseStream.cs
- NameValueCollection.cs