1 //------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //------------------------------------------------------------
4 namespace System.ServiceModel.Activities.Dispatcher
5 {
6     using System.Globalization;
7     using System.ServiceModel;
8     using System.ServiceModel.Channels;
9     using System.Xml;
10     using SR2 = System.ServiceModel.Activities.SR;
11 
12     class OperationExecutionFault : MessageFault
13     {
14         static FaultCode instanceAbortedCode;
15         static FaultCode instanceCompletedCode;
16         static FaultCode instanceTerminatedCode;
17         static FaultCode instanceSuspendedFaultCode;
18         static FaultCode instanceUnloadedFaultCode;
19         static FaultCode instanceNotFoundCode;
20         static FaultCode instanceLockedFaultCode;
21         static FaultCode operationNotAvailableFaultCode;
22         static FaultCode updatedFailedFaultCode;
23 
24         FaultCode faultCode;
25         FaultReason faultReason;
26 
OperationExecutionFault(string description, FaultCode subcode)27         OperationExecutionFault(string description, FaultCode subcode)
28         {
29             this.faultCode = FaultCode.CreateSenderFaultCode(subcode);
30             this.faultReason = new FaultReason(new FaultReasonText(
31                 description, CultureInfo.CurrentCulture));
32         }
33 
34         public override FaultCode Code
35         {
36             get
37             {
38                 return this.faultCode;
39             }
40         }
41 
42         public override bool HasDetail
43         {
44             get
45             {
46                 return false;
47             }
48         }
49 
50         public override FaultReason Reason
51         {
52             get
53             {
54                 return this.faultReason;
55             }
56         }
57 
CreateTransactedLockException(Guid instanceId, string operationName)58         public static OperationExecutionFault CreateTransactedLockException(Guid instanceId, string operationName)
59         {
60             if (instanceLockedFaultCode == null)
61             {
62                 instanceLockedFaultCode = new FaultCode(XD2.WorkflowControlServiceFaults.InstanceLockedUnderTransaction, XD2.WorkflowServices.Namespace);
63             }
64             return new OperationExecutionFault(SR2.InstanceLockedUnderTransaction(operationName, instanceId), instanceLockedFaultCode);
65         }
66 
CreateInstanceUnloadedFault(string description)67         public static OperationExecutionFault CreateInstanceUnloadedFault(string description)
68         {
69             if (instanceUnloadedFaultCode == null)
70             {
71                 instanceUnloadedFaultCode = new FaultCode(XD2.WorkflowControlServiceFaults.InstanceUnloaded, XD2.WorkflowServices.Namespace);
72             }
73             return new OperationExecutionFault(description, instanceUnloadedFaultCode);
74         }
75 
CreateInstanceNotFoundFault(string description)76         public static OperationExecutionFault CreateInstanceNotFoundFault(string description)
77         {
78             if (instanceNotFoundCode == null)
79             {
80                 instanceNotFoundCode = new FaultCode(XD2.WorkflowControlServiceFaults.InstanceNotFound, XD2.WorkflowServices.Namespace);
81             }
82             return new OperationExecutionFault(description, instanceNotFoundCode);
83         }
84 
CreateCompletedFault(string description)85         public static OperationExecutionFault CreateCompletedFault(string description)
86         {
87             if (instanceCompletedCode == null)
88             {
89                 instanceCompletedCode = new FaultCode(XD2.WorkflowControlServiceFaults.InstanceCompleted, XD2.WorkflowServices.Namespace);
90             }
91             return new OperationExecutionFault(description, instanceCompletedCode);
92         }
93 
CreateTerminatedFault(string description)94         public static OperationExecutionFault CreateTerminatedFault(string description)
95         {
96             if (instanceTerminatedCode == null)
97             {
98                 instanceTerminatedCode = new FaultCode(XD2.WorkflowControlServiceFaults.InstanceTerminated, XD2.WorkflowServices.Namespace);
99             }
100             return new OperationExecutionFault(description, instanceTerminatedCode);
101         }
102 
CreateSuspendedFault(Guid instanceId, string operationName)103         public static OperationExecutionFault CreateSuspendedFault(Guid instanceId, string operationName)
104         {
105             if (instanceSuspendedFaultCode == null)
106             {
107                 instanceSuspendedFaultCode = new FaultCode(XD2.WorkflowControlServiceFaults.InstanceSuspended, XD2.WorkflowServices.Namespace);
108             }
109             return new OperationExecutionFault(SR2.InstanceSuspended(operationName, instanceId), instanceSuspendedFaultCode);
110         }
111 
CreateOperationNotAvailableFault(Guid instanceId, string operationName)112         public static OperationExecutionFault CreateOperationNotAvailableFault(Guid instanceId, string operationName)
113         {
114             if (operationNotAvailableFaultCode == null)
115             {
116                 operationNotAvailableFaultCode = new FaultCode(XD2.WorkflowControlServiceFaults.OperationNotAvailable, XD2.WorkflowServices.Namespace);
117             }
118             return new OperationExecutionFault(SR2.OperationNotAvailable(operationName, instanceId), operationNotAvailableFaultCode);
119         }
120 
CreateAbortedFault(string description)121         public static OperationExecutionFault CreateAbortedFault(string description)
122         {
123             if (instanceAbortedCode == null)
124             {
125                 instanceAbortedCode = new FaultCode(XD2.WorkflowControlServiceFaults.InstanceAborted, XD2.WorkflowServices.Namespace);
126             }
127             return new OperationExecutionFault(description, instanceAbortedCode);
128         }
129 
CreateUpdateFailedFault(string description)130         public static OperationExecutionFault CreateUpdateFailedFault(string description)
131         {
132             if (updatedFailedFaultCode == null)
133             {
134                 updatedFailedFaultCode = new FaultCode(XD2.WorkflowControlServiceFaults.UpdateFailed, XD2.WorkflowServices.Namespace);
135             }
136             return new OperationExecutionFault(description, updatedFailedFaultCode);
137         }
138 
IsAbortedFaultException(FaultException exception)139         public static bool IsAbortedFaultException(FaultException exception)
140         {
141             if (exception.Code != null && exception.Code.SubCode != null &&
142                 exception.Code.SubCode.Name == instanceAbortedCode.Name && exception.Code.SubCode.Namespace == instanceAbortedCode.Namespace)
143             {
144                 return true;
145             }
146             else
147             {
148                 return false;
149             }
150         }
151 
OnWriteDetailContents(XmlDictionaryWriter writer)152         protected override void OnWriteDetailContents(XmlDictionaryWriter writer)
153         {
154             throw FxTrace.Exception.AsError(new NotImplementedException());
155         }
156     }
157 }
158